Sub GW_DrawArc
' GraphicsWindow | Draw arc
' param["x"] - center x coordinate [px]
' param["y"] - center y coordinate [px]
' param["r"] - radius [px]
' param["a1"] - start angle [°]
' param["a2"] - end angle [°]
' param["da"] - delta (step) angle [°]
' param["ct"] - cap type ("Round" for round, otherwise for flat)
Stack.PushValue("local", local)
Stack.PushValue("local", a)
local["pw"] = GraphicsWindow.PenWidth
local["bc"] = GraphicsWindow.BrushColor
GraphicsWindow.BrushColor = GraphicsWindow.PenColor
For a = param["a1"] To param["a2"] Step param["da"]
local["rad"] = Math.GetRadians(a)
local["x2"] = param["x"] + param["a"] * Math.Cos(local["rad"])
local["y2"] = param["y"] + param["b"] * Math.Sin(local["rad"])
If param["a1"] < a Then
GraphicsWindow.DrawLine(local["x1"], local["y1"], local["x2"], local["y2"])
EndIf
If ((param ["a1"] < a) And (a < param["a2"])) Or Text.ConvertToLowerCase(param["ct"]) = "round" Then
GraphicsWindow.PenWidth = 0
GraphicsWindow.FillEllipse(local["x2"] - local["pw"] / 2, local["y2"] - local["pw"] / 2, local["pw"], local["pw"])
GraphicsWindow.PenWidth = local["pw"]
EndIf
local["x1"] = local["x2"]
local["y1"] = local["y2"]
EndFor
GraphicsWindow.BrushColor = local["bc"]
a = Stack.PopValue("local")
local = Stack.PopValue("local")
EndSub
Sub GW_FillLinearGradientRectangle
' GraphicsWindow | Fill linear gradient rectangle
' param["x"], param["y"] - position of the rectangle
' param["width"], param["height"] - size of the rectangle
' param["angle"] - angle of gradient
' param["0"]..param["100"] - 0% to 100% colors
x0 = param["x"]
y0 = param["y"]
width = param["width"]
height = param["height"]
angle = param["angle"]
n = Array.GetItemCount(param)
index = Array.GetAllIndices(param)
color = ""
For i = 1 To n
If index[i] + 0 = index[i] And 0 <= index[i] And index[i] <= 100 Then
color[index[i]] = param[index[i]]
EndIf
EndFor
If color[0] = "" Then
color[0] = GraphicsWindow.BrushColor
EndIf
If color[100] = "" Then
color[100] = GraphicsWindow.BrushColor
EndIf
n = Array.GetItemCount(color)
index = Array.GetAllIndices(color)
a45 = Math.Remainder(angle, 45)
If 0 <= angle And angle < 45 Then
w45 = width
h45 = height
ElseIf 45 <= angle And angle < 90 Then
w45 = height
h45 = width
a45 = 45 - a45
ElseIf 90 <= angle And angle < 135 Then
w45 = height
h45 = width
ElseIf 135 <= angle And angle < 180 Then
w45 = width
h45 = height
a45 = 45 - a45
ElseIf 180 <= angle And angle < 225 Then
w45 = width
h45 = height
ElseIf 225 <= angle And angle < 270 Then
w45 = height
h45 = width
a45 = 45 - a45
ElseIf 270 <= angle And angle < 315 Then
w45 = height
h45 = width
ElseIf 315 <= angle And angle < 360 Then
w45 = width
h45 = height
a45 = 45 - a45
EndIf
If a45 = 0 Then
For x = 0 To w45
percent = Math.Floor(x * 100 / w45)
Color_PercentToRGB()
x1 = x
y1 = 0
x2 = x
y2 = h45
GW_DrawLine()
EndFor
ElseIf 0 < a45 And a45 <= 45 Then
tan = Math.Tan(Math.GetRadians(a45))
If h45 <= w45 Then
dx = Math.Floor(h45 * tan)
For x = 0 To dx
percent = Math.Floor(x * 100 / (w45 + dx))
Color_PercentToRGB()
x1 = x
y1 = 0
x2 = 0
y2 = Math.Floor(x / tan)
GW_DrawLine()
EndFor
For x = dx To w45
percent = Math.Floor(x * 100 / (w45 + dx))
Color_PercentToRGB()
x1 = x
y1 = 0
x2 = x - dx
y2 = h45
GW_DrawLine()
EndFor
For x = w45 To w45 + dx
percent = Math.Floor(x * 100 / (w45 + dx))
Color_PercentToRGB()
x1 = x - dx
y1 = h45
x2 = w45
y2 = Math.Floor((x - w45) / tan)
GW_DrawLine()
EndFor
Else ' width < height
dx = Math.Floor(h45 * tan - w45)
dy = Math.Floor(w45 / tan)
For x = 0 To w45
percent = Math.Floor(x * 100 / (2 * w45 + dx))
Color_PercentToRGB()
x1 = x
y1 = 0
x2 = 0
y2 = Math.Floor(x / tan)
GW_DrawLine()
EndFor
For x = 0 To dx
percent = Math.Floor((x + w45) * 100 / (2 * w45 + dx))
Color_PercentToRGB()
x1 = w45
y1 = Math.Floor(x / tan)
x2 = 0
y2 = y1 + dy
GW_DrawLine()
EndFor
dy = h45 - Math.Floor(w45 / tan)
For x = 0 To w45
percent = Math.Floor((x + w45 + dx) * 100 / (2 * w45 + dx))
Color_PercentToRGB()
x1 = x
y1 = h45
x2 = w45
y2 = dy + Math.Floor(x / tan)
GW_DrawLine()
EndFor
EndIf
EndIf
EndSub
Sub GW_DrawLine
' GraphicsWindow | Draw line
' param r, g, b - red, green blue
' param angle
' param x1, y1, x2, y2 - edges of line
GraphicsWindow.PenColor = GraphicsWindow.GetColorFromRGB(r, g, b)
If 0 <= angle And angle < 45 Then
GraphicsWindow.DrawLine(x1 + x0, y1 + y0, x2 + x0, y2 + y0)
ElseIf 45 <= angle And angle < 90 Then
GraphicsWindow.DrawLine(y1 + x0, x1 + y0, y2 + x0, x2 + y0)
ElseIf 90 <= angle And angle < 135 Then
GraphicsWindow.DrawLine(-y1 + x0 + width, x1 + y0, -y2 + x0 + width, x2 + y0)
ElseIf 135 <= angle And angle < 180 Then
GraphicsWindow.DrawLine(-x1 + x0 + width, y1 + y0, -x2 + x0 + width, y2 + y0)
ElseIf 180 <= angle And angle < 225 Then
GraphicsWindow.DrawLine(-x1 + x0 + width, -y1 + y0 + height, -x2 + x0 + width, -y2 + y0 + height)
ElseIf 225 <= angle And angle < 270 Then
GraphicsWindow.DrawLine(-y1 + x0 + width, -x1 + y0 + height, -y2 + x0 + width, -x2 + y0 + height)
ElseIf 270 <= angle And angle < 315 Then
GraphicsWindow.DrawLine(y1 + x0, -x1 + y0 + height, y2 + x0, -x2 + y0 + height)
ElseIf 315 <= angle And angle < 360 Then
GraphicsWindow.DrawLine(x1 + x0, -y1 + y0 + height, x2 + x0, -y2 + y0 + height)
EndIf
EndSub
Sub Color_PercentToRGB
' Color | Convert percent to RGB
' param percent - percent
' param color[] - color table indexed percent
' param n - item count of color[]
' param index[] - all indices of color[]
For i = 1 To n
p1 = index[i]
If index[i] = percent Then
p2 = index[i]
i = n + 1 ' break
ElseIf index[i] < percent And percent < index[i + 1] Then
p2 = index[i + 1]
i = n + 1 ' break
EndIf
EndFor
c = color[p1]
Color_ColorToRGB()
If p1 <> p2 Then
r1 = r
g1 = g
b1 = b
c = color[p2]
Color_ColorToRGB()
r2 = r
g2 = g
b2 = b
r = Math.Floor(r1 + (r2 - r1) * (percent - p1) / (p2 - p1))
g = Math.Floor(g1 + (g2 - g1) * (percent - p1) / (p2 - p1))
b = Math.Floor(b1 + (b2 - b1) * (percent - p1) / (p2 - p1))
EndIf
EndSub
Sub Color_ColorToRGB
' Color | Convert color to RGB
' param c - color
' returns r, g, b - red, green and blue values
If Text.StartsWith(c, "#") Then
c = Text.ConvertToUpperCase(c)
Else
c = Text.ConvertToLowerCase(c)
c = colors[c]
EndIf
sHex = Text.GetSubText(c, 2, 2)
Math_Hex2Dec()
r = iDec
sHex = Text.GetSubText(c, 4, 2)
Math_Hex2Dec()
g = iDec
sHex = Text.GetSubText(c, 6, 2)
Math_Hex2Dec()
b = iDec
EndSub
Sub Math_Hex2Dec
' Math | Convert hexadecimal to decimal
' param sHex
' returns iDec
iDec = 0
iLen = Text.GetLength(sHex)
For iPtr = 1 To iLen
iDec = iDec * 16 + Text.GetIndexOf("0123456789ABCDEF", Text.GetSubText(sHex, iPtr, 1)) - 1
EndFor
EndSub
Sub Text_Split
' Text | Split text to array by delimiter
' param txt - to split
' param delim - delimiter
' return arry - splitted
len = Text.GetLength(txt)
p = 1
n = 0
d = Text.GetIndexOf(Text.GetSubTextToEnd(txt, p), delim)
While (0 < d) And (p <= len)
n = n + 1
arry[n] = Text.GetSubText(txt, p, d - 1)
p = p + d
d = Text.GetIndexOf(Text.GetSubTextToEnd(txt, p), delim)
EndWhile
n = n + 1
arry[n] = Text.GetSubTextToEnd(txt, p)
EndSub