gtk win32 canvas back-end

original commit: d094fff51e578b7d6c12eca8bbd4a0ca87ca2480
This commit is contained in:
Matthew Flatt 2010-09-15 15:13:55 -06:00
parent 5c533a1695
commit 5eee7343aa
2 changed files with 64 additions and 5 deletions

View File

@ -5,6 +5,7 @@
"types.rkt"
"window.rkt"
"x11.rkt"
"win32.rkt"
"../../lock.rkt"
"../common/backing-dc.rkt"
racket/draw/cairo
@ -46,6 +47,32 @@
(gobject-unref pixmap)
(set! s #f)))))
(define win32-bitmap%
(class bitmap%
(init w h gdk-win)
(super-make-object (make-alternate-bitmap-kind w h))
(define s
(if gdk-win
(cairo_win32_surface_create_with_dib CAIRO_FORMAT_RGB24 w h)
(atomically
(let ([hdc (GetDC (gdk_win32_drawable_get_handle gdk-win))])
(begin0
(cairo_win32_surface_create_with_ddb hdc
CAIRO_FORMAT_RGB24 w h)
(ReleaseDC hdc))))))
(define/override (ok?) #t)
(define/override (is-color?) #t)
(define/override (has-alpha-channel?) #f)
(define/override (get-cairo-surface) s)
(define/override (release-bitmap-storage)
(atomically
(cairo_surface_destroy s)
(set! s #f)))))
(define dc%
(class backing-dc%
(init [(cnvs canvas)])
@ -54,11 +81,17 @@
(super-new)
(define/override (make-backing-bitmap w h [any-bg? #f])
(if (and (or any-bg?
(send canvas get-canvas-background))
(eq? 'unix (system-type)))
(make-object x11-bitmap% w h (widget-window (send canvas get-client-gtk)))
(super make-backing-bitmap w h)))
(cond
[(and (eq? 'unix (system-type))
(or any-bg?
(send canvas get-canvas-background)))
(make-object x11-bitmap% w h (widget-window (send canvas get-client-gtk)))]
[(and (eq? 'windows (system-type))
(or any-bg?
(send canvas get-canvas-background)))
(make-object win32-bitmap% w h (widget-window (send canvas get-client-gtk)))]
[else
(super make-backing-bitmap w h)]))
(define/override (get-backing-size xb yb)
(send canvas get-client-size xb yb))

View File

@ -0,0 +1,26 @@
#lang racket/base
(require ffi/unsafe
ffi/unsafe/define
"utils.rkt")
(provide gdk_win32_drawable_get_handle
GetDC
ReleaseDC)
(define user32-lib
(cond
[(eq? 'windows (system-type))
(ffi-lib "user32.dll")]
[else #f]))
(define-ffi-definer define-user32 user32-lib)
(define _GdkDrawable _pointer)
(define-gdk gdk_win32_drawable_get_handle (_fun _GdkDrawable -> _pointer)
#:make-fail make-not-available)
(define-user32 GetDC (_fun #:abi 'stdcall _pointer -> _pointer)
#:make-fail make-not-available)
(define-user32 ReleaseDC (_fun #:abi 'stdcall _pointer -> _void)
#:make-fail make-not-available)