summaryrefslogtreecommitdiff
path: root/src/nigui
diff options
context:
space:
mode:
authortrustable-code <krauter.simon@arcor.de>2018-12-06 21:09:47 +0100
committertrustable-code <krauter.simon@arcor.de>2018-12-06 21:09:47 +0100
commit6049a7e7cd89d0bdd758e93bf832ec5e657323bd (patch)
treed4b5b12b887a948afe77cfc287ed99d2b0d572fb /src/nigui
parent3a3d374837dc04ab6c67794fe09798489beea9c4 (diff)
downloadNiGui-6049a7e7cd89d0bdd758e93bf832ec5e657323bd.tar.gz
NiGui-6049a7e7cd89d0bdd758e93bf832ec5e657323bd.zip
Add drawing methods drawEllipseArea(), drawEllipseOutline() and drawArcOutline()
Diffstat (limited to 'src/nigui')
-rwxr-xr-xsrc/nigui/private/gtk3/gtk3.nim1
-rwxr-xr-xsrc/nigui/private/gtk3/platform_impl.nim45
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim30
-rwxr-xr-xsrc/nigui/private/windows/windows.nim3
4 files changed, 79 insertions, 0 deletions
diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim
index d4d1c8e..292bb09 100755
--- a/src/nigui/private/gtk3/gtk3.nim
+++ b/src/nigui/private/gtk3/gtk3.nim
@@ -462,6 +462,7 @@ proc cairo_set_source_surface*(cr, surface: pointer, x, y: cdouble) {.importc: "
proc cairo_fill*(cr: pointer) {.importc: "cairo_fill", libgtk3.}
proc cairo_stroke*(cr: pointer) {.importc: "cairo_stroke", libgtk3.}
proc cairo_rectangle*(cr: pointer, x, y, width, height: cdouble) {.importc: "cairo_rectangle", libgtk3.}
+proc cairo_arc*(cr: pointer, xc, yc, radius, angle1, angle2: cdouble) {.importc: "cairo_arc", libgtk3.}
proc cairo_line_to*(cr: pointer, x, y: cdouble) {.importc: "cairo_line_to", libgtk3.}
proc cairo_move_to*(cr: pointer, x, y: cdouble) {.importc: "cairo_move_to", libgtk3.}
proc cairo_set_line_width*(cr: pointer, width: cdouble) {.importc: "cairo_set_line_width", libgtk3.}
diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim
index 1a94e70..e535255 100755
--- a/src/nigui/private/gtk3/platform_impl.nim
+++ b/src/nigui/private/gtk3/platform_impl.nim
@@ -475,6 +475,51 @@ method drawRectOutline(canvas: Canvas, x, y, width, height: int) =
cairo_set_line_width(cr, canvas.lineWidth)
cairo_stroke(cr)
+method drawEllipseArea(canvas: Canvas, x, y, width, height: int) =
+ let cr = cast[CanvasImpl](canvas).fCairoContext
+ if cr == nil:
+ raiseError("Canvas is not in drawing state.")
+ var rgba: GdkRGBA
+ canvas.areaColor.pColorToGdkRGBA(rgba)
+ gdk_cairo_set_source_rgba(cr, rgba)
+ cairo_save(cr)
+ let centerX = x.float + width.float / 2
+ let centerY = y.float + height.float / 2
+ cairo_translate(cr, centerX, centerY)
+ cairo_scale(cr, width.float / 2, height.float / 2)
+ cairo_arc(cr, 0, 0, 1, 0, 2 * PI)
+ cairo_fill(cr)
+ cairo_restore(cr)
+
+method drawEllipseOutline(canvas: Canvas, x, y, width, height: int) =
+ let cr = cast[CanvasImpl](canvas).fCairoContext
+ if cr == nil:
+ raiseError("Canvas is not in drawing state.")
+ var rgba: GdkRGBA
+ canvas.lineColor.pColorToGdkRGBA(rgba)
+ gdk_cairo_set_source_rgba(cr, rgba)
+ cairo_save(cr)
+ let centerX = x.float + width.float / 2
+ let centerY = y.float + height.float / 2
+ cairo_translate(cr, centerX, centerY)
+ cairo_scale(cr, width.float / 2, height.float / 2)
+ cairo_arc(cr, 0, 0, 1, 0, 2 * PI)
+ cairo_set_line_width(cr, canvas.lineWidth / width.float * 2)
+ # problem: width of horizontal line and vertical line is not the same
+ cairo_stroke(cr)
+ cairo_restore(cr)
+
+method drawArcOutline(canvas: Canvas, centerX, centerY: int, radius, startAngle, sweepAngle: float) =
+ let cr = cast[CanvasImpl](canvas).fCairoContext
+ if cr == nil:
+ raiseError("Canvas is not in drawing state.")
+ var rgba: GdkRGBA
+ canvas.lineColor.pColorToGdkRGBA(rgba)
+ gdk_cairo_set_source_rgba(cr, rgba)
+ cairo_arc(cr, centerX.float, centerY.float, radius, startAngle, sweepAngle)
+ cairo_set_line_width(cr, canvas.lineWidth)
+ cairo_stroke(cr)
+
method drawImage(canvas: Canvas, image: Image, x, y = 0, width, height = -1) =
let cr = cast[CanvasImpl](canvas).fCairoContext
if cr == nil:
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim
index 6a051c1..dfbad5e 100755
--- a/src/nigui/private/windows/platform_impl.nim
+++ b/src/nigui/private/windows/platform_impl.nim
@@ -619,6 +619,36 @@ method drawRectOutline(canvas: Canvas, x, y, width, height: int) =
pCheckGdiplusStatus(GdipCreatePen1(canvas.lineColor.pColorToARGB(), canvasImpl.lineWidth, UnitPixel, pen))
pCheckGdiplusStatus(GdipDrawRectangleI(canvasImpl.fGraphics, pen, x.int32, y.int32, width.int32, height.int32))
+method drawEllipseArea(canvas: Canvas, x, y, width, height: int) =
+ let canvasImpl = cast[CanvasImpl](canvas)
+ if canvasImpl.fGraphics == nil:
+ raiseError("Canvas is not in drawing state.")
+ if canvasImpl.fAreaBrush == nil:
+ pCheckGdiplusStatus(GdipCreateSolidFill(canvas.areaColor.pColorToARGB(), canvasImpl.fAreaBrush))
+ pCheckGdiplusStatus(GdipFillEllipseI(canvasImpl.fGraphics, canvasImpl.fAreaBrush, x.int32, y.int32, width.int32, height.int32))
+
+method drawEllipseOutline(canvas: Canvas, x, y, width, height: int) =
+ let canvasImpl = cast[CanvasImpl](canvas)
+ if canvasImpl.fGraphics == nil:
+ raiseError("Canvas is not in drawing state.")
+ var pen: pointer
+ pCheckGdiplusStatus(GdipCreatePen1(canvas.lineColor.pColorToARGB(), canvasImpl.lineWidth, UnitPixel, pen))
+ pCheckGdiplusStatus(GdipDrawEllipseI(canvasImpl.fGraphics, pen, x.int32, y.int32, width.int32, height.int32))
+
+proc pRadToDegree(angleRad: float): float = angleRad / 2 / PI * 360
+
+method drawArcOutline(canvas: Canvas, centerX, centerY: int, radius, startAngle, sweepAngle: float) =
+ let canvasImpl = cast[CanvasImpl](canvas)
+ if canvasImpl.fGraphics == nil:
+ raiseError("Canvas is not in drawing state.")
+ var pen: pointer
+ pCheckGdiplusStatus(GdipCreatePen1(canvas.lineColor.pColorToARGB(), canvasImpl.lineWidth, UnitPixel, pen))
+ let x = centerX.float - radius
+ let y = centerY.float - radius
+ let width = radius * 2
+ let height = radius * 2
+ pCheckGdiplusStatus(GdipDrawArc(canvasImpl.fGraphics, pen, x, y, width, height, startAngle.pRadToDegree(), sweepAngle.pRadToDegree()))
+
method drawImage(canvas: Canvas, image: Image, x, y = 0, width, height = -1) =
var drawWith = image.width
var drawHeight = image.height
diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim
index 537a40f..f35e603 100755
--- a/src/nigui/private/windows/windows.nim
+++ b/src/nigui/private/windows/windows.nim
@@ -489,6 +489,9 @@ proc GdipDisposeImage*(image: pointer): int32 {.importc: "GdipDisposeImage", lib
proc GdipFillRectangleI*(graphics, brush: pointer, x, y, width, height: int32): int32 {.importc: "GdipFillRectangleI", libGdiplus.}
proc GdipDrawRectangleI*(graphics, pen: pointer, x, y, width, height: int32): int32 {.importc: "GdipDrawRectangleI", libGdiplus.}
proc GdipDrawLineI*(graphics, pen: pointer, x1, y1, x2, y2: int32): int32 {.importc: "GdipDrawLineI", libGdiplus.}
+proc GdipDrawArc*(graphics, pen: pointer, x, y, width, height, startAngle, sweepAngle: cfloat): int32 {.importc: "GdipDrawArc", libGdiplus.}
+proc GdipFillEllipseI*(graphics, brush: pointer, x, y, width, height: int32): int32 {.importc: "GdipFillEllipseI", libGdiplus.}
+proc GdipDrawEllipseI*(graphics, pen: pointer, x, y, width, height: int32): int32 {.importc: "GdipDrawEllipseI", libGdiplus.}
proc GdipCreateSolidFill*(color: ARGB, brush: var pointer): int32 {.importc: "GdipCreateSolidFill", libGdiplus.}
proc GdipDeleteBrush*(brush: pointer): int32 {.importc: "GdipDeleteBrush", libGdiplus.}
proc GdipCreatePen1*(color: ARGB, width: cfloat, unit: int32, pen: var pointer): int32 {.importc: "GdipCreatePen1", libGdiplus.}