diff --git a/collects/mred/private/wx/cocoa/clipboard.rkt b/collects/mred/private/wx/cocoa/clipboard.rkt index e1e7ebf8..d72d854a 100644 --- a/collects/mred/private/wx/cocoa/clipboard.rkt +++ b/collects/mred/private/wx/cocoa/clipboard.rkt @@ -4,6 +4,7 @@ ffi/unsafe/objc "utils.rkt" "types.rkt" + "image.rkt" "../common/bstr.rkt" "../../syntax.rkt" "../../lock.rkt") @@ -11,7 +12,7 @@ (provide clipboard-driver% has-x-selection?) -(import-class NSPasteboard NSArray NSData) +(import-class NSPasteboard NSArray NSData NSImage NSGraphicsContext) (import-protocol NSPasteboardOwner) (define (has-x-selection?) #f) @@ -85,4 +86,12 @@ (and data (let ([len (tell #:type _NSUInteger data length)] [bstr (tell #:type _pointer data bytes)]) - (scheme_make_sized_byte_string bstr len 1)))))))) + (scheme_make_sized_byte_string bstr len 1))))))) + + (define/public (get-bitmap-data) + (atomically + (with-autorelease + (let ([i (tell (tell NSImage alloc) + initWithPasteboard: (tell NSPasteboard generalPasteboard))]) + (and i + (image->bitmap i))))))) diff --git a/collects/mred/private/wx/cocoa/dc.rkt b/collects/mred/private/wx/cocoa/dc.rkt index aaa1bc4d..cd44ad58 100644 --- a/collects/mred/private/wx/cocoa/dc.rkt +++ b/collects/mred/private/wx/cocoa/dc.rkt @@ -8,6 +8,7 @@ racket/draw/gl-context "types.rkt" "utils.rkt" + "bitmap.rkt" "window.rkt" "../../lock.rkt" "../common/queue.rkt" @@ -20,36 +21,6 @@ (import-class NSOpenGLContext) -(define quartz-bitmap% - (class bitmap% - (init w h) - (super-make-object (make-alternate-bitmap-kind w h)) - - (define s - (let ([s (cairo_quartz_surface_create CAIRO_FORMAT_ARGB32 - w - h)]) - ;; initialize bitmap to empty - needed? - #; - (let ([cr (cairo_create s)]) - (cairo_set_operator cr CAIRO_OPERATOR_CLEAR) - (cairo_set_source_rgba cr 1.0 1.0 1.0 1.0) - (cairo_paint cr) - (cairo_destroy cr)) - s)) - - (define/override (ok?) #t) - (define/override (is-color?) #t) - - (define/override (get-cairo-surface) s) - (define/override (get-cairo-alpha-surface) s) - - (define/override (release-bitmap-storage) - (atomically - (when s - (cairo_surface_destroy s) - (set! s #f)))))) - (define dc% (class backing-dc% (init [(cnvs canvas)]) diff --git a/collects/mred/private/wx/cocoa/image.rkt b/collects/mred/private/wx/cocoa/image.rkt index ba1251db..e8ebe30f 100644 --- a/collects/mred/private/wx/cocoa/image.rkt +++ b/collects/mred/private/wx/cocoa/image.rkt @@ -2,18 +2,24 @@ (require ffi/unsafe ffi/unsafe/objc racket/class + racket/draw/cairo + racket/draw/local "../common/bstr.rkt" "utils.rkt" "types.rkt" "const.rkt" "cg.rkt" + "bitmap.rkt" "../../lock.rkt" (only-in '#%foreign ffi-callback)) -(provide bitmap->image) +(provide bitmap->image + image->bitmap) (import-class NSImage NSGraphicsContext) +(define NSCompositeCopy 1) + (define _CGImageRef (_cpointer 'CGImageRef)) (define _CGColorSpaceRef (_cpointer 'CGColorSpaceRef)) (define _CGDataProviderRef (_cpointer 'GCDataProviderRef)) @@ -103,3 +109,28 @@ (tellv i unlockFocus) i)))))) +(define (image->bitmap i) + (let* ([s (tell #:type _NSSize i size)] + [w (NSSize-width s)] + [h (NSSize-height s)] + [bm (make-object quartz-bitmap% + (inexact->exact (ceiling w)) + (inexact->exact (ceiling h)))] + [surface (let ([s (send bm get-cairo-surface)]) + (cairo_surface_flush s) + s)] + [cg (cairo_quartz_surface_get_cg_context surface)] + [gc (tell NSGraphicsContext + graphicsContextWithGraphicsPort: #:type _pointer cg + flipped: #:type _BOOL #f)]) + (CGContextSaveGState cg) + (CGContextTranslateCTM cg 0 h) + (CGContextScaleCTM cg 1 -1) + (tellv NSGraphicsContext saveGraphicsState) + (tellv NSGraphicsContext setCurrentContext: gc) + (let ([r (make-NSRect (make-NSPoint 0 0) (make-NSSize w h))]) + (tellv i drawInRect: #:type _NSRect r fromRect: #:type _NSRect r + operation: #:type _int NSCompositeCopy fraction: #:type _CGFloat 1.0)) + (tellv NSGraphicsContext restoreGraphicsState) + (CGContextRestoreGState cg) + bm)) diff --git a/collects/mred/private/wx/common/clipboard.rkt b/collects/mred/private/wx/common/clipboard.rkt index 7d96c062..caee9e65 100644 --- a/collects/mred/private/wx/common/clipboard.rkt +++ b/collects/mred/private/wx/common/clipboard.rkt @@ -37,7 +37,7 @@ (eq? c (send driver get-client))) (def/public (get-clipboard-bitmap [exact-integer? timestamp]) - #f) + (send driver get-bitmap-data)) (def/public-unimplemented set-clipboard-bitmap) (def/public (get-clipboard-data [string? type] [exact-integer? timestamp]) diff --git a/collects/mred/private/wx/gtk/clipboard.rkt b/collects/mred/private/wx/gtk/clipboard.rkt index fc25fa0c..8c2557c2 100644 --- a/collects/mred/private/wx/gtk/clipboard.rkt +++ b/collects/mred/private/wx/gtk/clipboard.rkt @@ -171,5 +171,8 @@ (define/public (get-text-data) (or (gtk_clipboard_wait_for_text cb) "")) + (define/public (get-bitmap-data) + #f) + (super-new)) diff --git a/collects/mred/private/wx/win32/clipboard.rkt b/collects/mred/private/wx/win32/clipboard.rkt index 355cbc53..f55884c4 100644 --- a/collects/mred/private/wx/win32/clipboard.rkt +++ b/collects/mred/private/wx/win32/clipboard.rkt @@ -152,5 +152,8 @@ (define/public (get-text-data) (or (get-data "TEXT" #t) "")) + + (define/public (get-bitmap-data) + #f) (super-new))