summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrustable-code <krauter.simon@arcor.de>2020-02-09 19:18:53 +0100
committertrustable-code <krauter.simon@arcor.de>2020-02-09 19:18:53 +0100
commit0aa3a6ff714e19d6fa102d4ad9fccd2062785fdd (patch)
treeb87a97d6d362449cd89a7cda0e05cac981fb0cd9
parent7d0bcd12dd14661737023f324840e39c77f961ad (diff)
downloadNiGui-0aa3a6ff714e19d6fa102d4ad9fccd2062785fdd.tar.gz
NiGui-0aa3a6ff714e19d6fa102d4ad9fccd2062785fdd.zip
Add support for different interpolation modes for drawImage()
-rwxr-xr-xsrc/nigui.nim13
-rwxr-xr-xsrc/nigui/private/gtk3/gtk3.nim6
-rwxr-xr-xsrc/nigui/private/gtk3/platform_impl.nim4
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim11
-rwxr-xr-xsrc/nigui/private/windows/windows.nim4
5 files changed, 38 insertions, 0 deletions
diff --git a/src/nigui.nim b/src/nigui.nim
index aa668cc..3529965 100755
--- a/src/nigui.nim
+++ b/src/nigui.nim
@@ -201,6 +201,11 @@ type
Key_NumpadEnter
Key_AltGr
+ InterpolationMode* = enum
+ InterpolationMode_Default
+ InterpolationMode_NearestNeighbor
+ InterpolationMode_Bilinear
+
const
inactiveTimer* = 0
@@ -277,6 +282,7 @@ type
fLineColor: Color
fLineWidth: float
fAreaColor: Color
+ fInterpolationMode: InterpolationMode
Image* = ref object of RootObj
fCanvas: Canvas
@@ -577,6 +583,9 @@ method getTextLineHeight*(canvas: Canvas): int {.base, locks: "unknown".}
method getTextWidth*(canvas: Canvas, text: string): int {.base.}
+method interpolationMode*(canvas: Canvas): InterpolationMode {.base.}
+method `interpolationMode=`*(canvas: Canvas, mode: InterpolationMode) {.base.}
+
# ----------------------------------------------------------------------------------------
# Image
@@ -1317,6 +1326,10 @@ method drawTextCentered(canvas: Canvas, text: string, x, y = 0, width, height =
method fill(canvas: Canvas) = canvas.drawRectArea(0, 0, canvas.width, canvas.height)
+method interpolationMode(canvas: Canvas): InterpolationMode = canvas.fInterpolationMode
+
+method `interpolationMode=`(canvas: Canvas, mode: InterpolationMode) = canvas.fInterpolationMode = mode
+
# ----------------------------------------------------------------------------------------
# Image
diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim
index 3627396..82b555a 100755
--- a/src/nigui/private/gtk3/gtk3.nim
+++ b/src/nigui/private/gtk3/gtk3.nim
@@ -179,6 +179,10 @@ const
CAIRO_FORMAT_ARGB32* = 0
# [..]
+ # cairo_filter_t:
+ CAIRO_FILTER_NEAREST* = 3
+ CAIRO_FILTER_BILINEAR* = 4
+
# GtkFileChooserAction:
GTK_FILE_CHOOSER_ACTION_OPEN* = 0
GTK_FILE_CHOOSER_ACTION_SAVE* = 1
@@ -482,6 +486,8 @@ proc cairo_create*(target: pointer): pointer {.importc, libgtk3.}
proc cairo_get_target*(cr: pointer): pointer {.importc, libgtk3.}
proc cairo_set_source_rgb*(cr: pointer, red, green, blue: cdouble) {.importc, libgtk3.}
proc cairo_set_source_surface*(cr, surface: pointer, x, y: cdouble) {.importc, libgtk3.}
+proc cairo_get_source*(cr: pointer): pointer {.importc, libgtk3.}
+proc cairo_pattern_set_filter*(pattern: pointer, filter: cint) {.importc, libgtk3.}
proc cairo_fill*(cr: pointer) {.importc, libgtk3.}
proc cairo_stroke*(cr: pointer) {.importc, libgtk3.}
proc cairo_rectangle*(cr: pointer, x, y, width, height: cdouble) {.importc, libgtk3.}
diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim
index 80176be..514ba4f 100755
--- a/src/nigui/private/gtk3/platform_impl.nim
+++ b/src/nigui/private/gtk3/platform_impl.nim
@@ -623,6 +623,10 @@ method drawImage(canvas: Canvas, image: Image, x, y = 0, width, height = -1) =
cairo_translate(cr, x.cdouble, y.cdouble)
cairo_scale(cr, drawWith / image.width, drawHeight / image.height)
cairo_set_source_surface(cr, imageCanvas.fSurface, 0, 0)
+ case canvas.interpolationMode:
+ of InterpolationMode_Default: discard
+ of InterpolationMode_NearestNeighbor: cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_NEAREST)
+ of InterpolationMode_Bilinear: cairo_pattern_set_filter(cairo_get_source(cr), CAIRO_FILTER_BILINEAR)
cairo_paint(cr)
cairo_restore(cr)
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim
index bdba314..4c6b8d5 100755
--- a/src/nigui/private/windows/platform_impl.nim
+++ b/src/nigui/private/windows/platform_impl.nim
@@ -748,6 +748,17 @@ method getTextLineWidth(canvas: CanvasImpl, text: string): int = canvas.pGetText
method getTextLineHeight(canvas: CanvasImpl): int = canvas.pGetTextSize("a").cy
+method `interpolationMode=`(canvas: CanvasImpl, mode: InterpolationMode) =
+ procCall canvas.Canvas.`interpolationMode=`(mode)
+ if canvas.fGraphics == nil:
+ raiseError("Canvas is not in drawing state.")
+ let nativeMode =
+ case mode:
+ of InterpolationMode_Default: windows.InterpolationMode_Default
+ of InterpolationMode_NearestNeighbor: windows.InterpolationMode_NearestNeighbor
+ of InterpolationMode_Bilinear: windows.InterpolationMode_Bilinear
+ pCheckGdiplusStatus(GdipSetInterpolationMode(canvas.fGraphics, nativeMode.int32))
+
# ----------------------------------------------------------------------------------------
# Image
diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim
index e7e1be9..6ab983e 100755
--- a/src/nigui/private/windows/windows.nim
+++ b/src/nigui/private/windows/windows.nim
@@ -75,6 +75,9 @@ const
ICON_BIG* = 1
IDC_ARROW* = 32512
INVALID_HANDLE_VALUE* = cast[pointer](-1)
+ InterpolationMode_Default* = 0
+ InterpolationMode_Bilinear* = 3
+ InterpolationMode_NearestNeighbor* = 5
IMAGE_BITMAP* = 0
IMAGE_ICON* = 1
# LR_LOADFROMFILE* = 16
@@ -542,6 +545,7 @@ proc GdipDeleteFontFamily*(fontFamily: pointer): int32 {.importc, libGdiplus.}
proc GdipBitmapLockBits*(bitmap: pointer, rect: var Rect, flags: int32, format: int32, lockedBitmapData: var BitmapData): int32 {.importc, libGdiplus.}
proc GdipBitmapUnlockBits*(bitmap: pointer, lockedBitmapData: var BitmapData): int32 {.importc, libGdiplus.}
proc GdipSetTextRenderingHint*(graphics: pointer, mode: int32): int32 {.importc, libGdiplus.}
+proc GdipSetInterpolationMode*(graphics: pointer, interpolationMode: int32): int32 {.importc, libGdiplus.}
# ----------------------------------------------------------------------------------------