diff options
| -rwxr-xr-x | src/nigui.nim | 4 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/gtk3.nim | 2 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/platform_impl.nim | 16 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/platform_types1.nim | 2 | ||||
| -rwxr-xr-x | src/nigui/private/windows/platform_impl.nim | 18 | ||||
| -rwxr-xr-x | src/nigui/private/windows/platform_types1.nim | 3 | ||||
| -rwxr-xr-x | src/nigui/private/windows/windows.nim | 15 |
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.} # ---------------------------------------------------------------------------------------- |
