diff options
| author | trustable-code <krauter.simon@arcor.de> | 2018-12-06 21:09:47 +0100 |
|---|---|---|
| committer | trustable-code <krauter.simon@arcor.de> | 2018-12-06 21:09:47 +0100 |
| commit | 6049a7e7cd89d0bdd758e93bf832ec5e657323bd (patch) | |
| tree | d4b5b12b887a948afe77cfc287ed99d2b0d572fb | |
| parent | 3a3d374837dc04ab6c67794fe09798489beea9c4 (diff) | |
| download | NiGui-6049a7e7cd89d0bdd758e93bf832ec5e657323bd.tar.gz NiGui-6049a7e7cd89d0bdd758e93bf832ec5e657323bd.zip | |
Add drawing methods drawEllipseArea(), drawEllipseOutline() and drawArcOutline()
| -rwxr-xr-x | src/nigui.nim | 6 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/gtk3.nim | 1 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/platform_impl.nim | 45 | ||||
| -rwxr-xr-x | src/nigui/private/windows/platform_impl.nim | 30 | ||||
| -rwxr-xr-x | src/nigui/private/windows/windows.nim | 3 |
5 files changed, 85 insertions, 0 deletions
diff --git a/src/nigui.nim b/src/nigui.nim index e8878f7..7f49a71 100755 --- a/src/nigui.nim +++ b/src/nigui.nim @@ -463,6 +463,12 @@ method drawRectArea*(canvas: Canvas, x, y, width, height: int) method drawRectOutline*(canvas: Canvas, x, y, width, height: int) +method drawEllipseArea*(canvas: Canvas, x, y, width, height: int) + +method drawEllipseOutline*(canvas: Canvas, x, y, width, height: int) + +method drawArcOutline*(canvas: Canvas, centerX, centerY: int, radius, startAngle, sweepAngle: float) + method fill*(canvas: Canvas) method drawImage*(canvas: Canvas, image: Image, x, y = 0, width, height = -1) 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.} |
