summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/nigui.nim4
-rwxr-xr-xsrc/nigui/private/gtk3/gtk3.nim2
-rwxr-xr-xsrc/nigui/private/gtk3/platform_impl.nim16
-rwxr-xr-xsrc/nigui/private/gtk3/platform_types1.nim2
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim18
-rwxr-xr-xsrc/nigui/private/windows/platform_types1.nim3
-rwxr-xr-xsrc/nigui/private/windows/windows.nim15
7 files changed, 53 insertions, 7 deletions
diff --git a/src/nigui.nim b/src/nigui.nim
index f4e49ef..d0281b6 100755
--- a/src/nigui.nim
+++ b/src/nigui.nim
@@ -487,6 +487,10 @@ method height*(image: Image): int
method canvas*(image: Image): Canvas
+method beginPixelDataAccess*(image: Image): ptr UncheckedArray[byte]
+
+method endPixelDataAccess*(image: Image)
+
# ----------------------------------------------------------------------------------------
# Window
diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim
index f9c666f..108a310 100755
--- a/src/nigui/private/gtk3/gtk3.nim
+++ b/src/nigui/private/gtk3/gtk3.nim
@@ -438,7 +438,7 @@ proc cairo_image_surface_create*(format: cint, width, height: cint): pointer {.i
proc cairo_image_surface_get_width*(surface: pointer): cint {.importc: "cairo_image_surface_get_width", libgtk3.}
proc cairo_image_surface_get_height*(surface: pointer): cint {.importc: "cairo_image_surface_get_height", libgtk3.}
proc cairo_image_surface_get_stride*(surface: pointer): cint {.importc: "cairo_image_surface_get_stride", libgtk3.}
-proc cairo_image_surface_get_data*(surface: pointer): cstring {.importc: "cairo_image_surface_get_data", libgtk3.}
+proc cairo_image_surface_get_data*(surface: pointer): ptr UncheckedArray[byte] {.importc: "cairo_image_surface_get_data", libgtk3.}
proc cairo_surface_flush*(surface: pointer) {.importc: "cairo_surface_flush", libgtk3.}
proc cairo_surface_mark_dirty*(surface: pointer) {.importc: "cairo_surface_mark_dirty", libgtk3.}
proc cairo_surface_destroy*(surface: pointer) {.importc: "cairo_surface_destroy", libgtk3.}
diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim
index 0d0c420..09db57c 100755
--- a/src/nigui/private/gtk3/platform_impl.nim
+++ b/src/nigui/private/gtk3/platform_impl.nim
@@ -468,10 +468,10 @@ method setPixel(canvas: Canvas, x, y: int, color: Color) =
raiseError("Pixel is out of range.")
cairo_surface_flush(canvasImpl.fSurface)
let i = y * canvasImpl.fStride + x * 4
- canvasImpl.fData[i + 0] = color.blue.chr
- canvasImpl.fData[i + 1] = color.green.chr
- canvasImpl.fData[i + 2] = color.red.chr
- canvasImpl.fData[i + 3] = 255.chr
+ canvasImpl.fData[i + 0] = color.blue
+ canvasImpl.fData[i + 1] = color.green
+ canvasImpl.fData[i + 2] = color.red
+ canvasImpl.fData[i + 3] = 255
cairo_surface_mark_dirty(canvasImpl.fSurface)
method `fontFamily=`(canvas: CanvasImpl, fontFamily: string) =
@@ -555,6 +555,14 @@ method saveToJpegFile(image: Image, filePath: string, quality = 80) =
if not gdk_pixbuf_save(pixbuf, filePath, "jpeg", error.addr, "quality", $quality, nil):
pRaiseGError(error)
+method beginPixelDataAccess(image: Image): ptr UncheckedArray[byte] =
+ let canvas = cast[CanvasImpl](image.canvas)
+ result = canvas.fData
+
+method endPixelDataAccess(image: Image) =
+ let canvas = cast[CanvasImpl](image.canvas)
+ cairo_surface_mark_dirty(canvas.fSurface)
+
# ----------------------------------------------------------------------------------------
# Window
diff --git a/src/nigui/private/gtk3/platform_types1.nim b/src/nigui/private/gtk3/platform_types1.nim
index d0178cd..505013b 100755
--- a/src/nigui/private/gtk3/platform_types1.nim
+++ b/src/nigui/private/gtk3/platform_types1.nim
@@ -17,7 +17,7 @@ type
CanvasImpl* = ref object of Canvas
fSurface: pointer
- fData: cstring
+ fData: ptr UncheckedArray[byte]
fStride: int
fCairoContext: pointer
fFont: pointer
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim
index 4ca99bc..052b482 100755
--- a/src/nigui/private/windows/platform_impl.nim
+++ b/src/nigui/private/windows/platform_impl.nim
@@ -708,6 +708,24 @@ method saveToJpegFile(image: Image, filePath: string, quality = 80) =
# TODO: pass quality
pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil), false)
+method beginPixelDataAccess(image: Image): ptr UncheckedArray[byte] =
+ let imageImpl = cast[ImageImpl](image)
+ let canvas = cast[CanvasImpl](image.canvas)
+ var rect: Rect
+ rect.left = 0
+ rect.top = 0
+ rect.right = image.width.int32
+ rect.bottom = image.height.int32
+ pCheckGdiplusStatus(GdipBitmapLockBits(canvas.fBitmap, rect, ImageLockModeWrite, PixelFormat32bppARGB, imageImpl.bitmapDataLockBits))
+ result = imageImpl.bitmapDataLockBits.Scan0
+
+method endPixelDataAccess(image: Image) =
+ let imageImpl = cast[ImageImpl](image)
+ let canvas = cast[CanvasImpl](image.canvas)
+ pCheckGdiplusStatus(GdipBitmapUnlockBits(canvas.fBitmap, imageImpl.bitmapDataLockBits))
+
+
+
# ----------------------------------------------------------------------------------------
# Window
diff --git a/src/nigui/private/windows/platform_types1.nim b/src/nigui/private/windows/platform_types1.nim
index ddf36cf..52470d4 100755
--- a/src/nigui/private/windows/platform_types1.nim
+++ b/src/nigui/private/windows/platform_types1.nim
@@ -1,3 +1,5 @@
+import windows
+
# NiGui - Win32 platform-specific code - part 1
# This file will be included in "nigui.nim".
@@ -21,3 +23,4 @@ type
fAreaBrush: pointer
ImageImpl* = ref object of Image
+ bitmapDataLockBits: BitmapData
diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim
index ea0bef2..473b727 100755
--- a/src/nigui/private/windows/windows.nim
+++ b/src/nigui/private/windows/windows.nim
@@ -163,6 +163,9 @@ const
# UnitDocument* = 5
# UnitMillimeter* = 6
GMEM_MOVEABLE* = 2
+ PixelFormat32bppARGB* = 2498570
+ ImageLockModeWrite* = 2
+
# ----------------------------------------------------------------------------------------
@@ -285,12 +288,20 @@ type
# dwReserved: int32
# FlagsEx*: int32
- GUID * = object
+ GUID* = object
Data1*: int32
Data2*: int32
Data3*: int32
Data4*: int32
+ BitmapData* = object
+ Width*: int32
+ Height*: int32
+ Stride*: int32
+ PixelFormat*: int32
+ Scan0*: ptr UncheckedArray[byte]
+ Reserved: pointer
+
# ----------------------------------------------------------------------------------------
# Replacement for Windows Macros
@@ -463,6 +474,8 @@ proc GdipCreateFont*(fontFamily: pointer, emSize: cfloat, style, unit: int32, fo
proc GdipDeleteFont*(font: pointer): int32 {.importc: "GdipDeleteFont", libGdiplus.}
proc GdipCreateFontFamilyFromName*(name: cstring, fontCollection: pointer, fontFamily: var pointer): int32 {.importc: "GdipCreateFontFamilyFromName", libGdiplus.}
proc GdipDeleteFontFamily*(fontFamily: pointer): int32 {.importc: "GdipDeleteFontFamily", libGdiplus.}
+proc GdipBitmapLockBits*(bitmap: pointer, rect: var Rect, flags: int32, format: int32, lockedBitmapData: var BitmapData): int32 {.importc: "GdipBitmapLockBits", libGdiplus.}
+proc GdipBitmapUnlockBits*(bitmap: pointer, lockedBitmapData: var BitmapData): int32 {.importc: "GdipBitmapUnlockBits", libGdiplus.}
# ----------------------------------------------------------------------------------------