diff --git a/basis/cocoa/views/views.factor b/basis/cocoa/views/views.factor index be67f03184..f8e95dad40 100644 --- a/basis/cocoa/views/views.factor +++ b/basis/cocoa/views/views.factor @@ -55,8 +55,11 @@ PRIVATE> : with-multisample ( quot -- ) t +multisample+ pick with-variable ; inline -: ( -- pixelfmt ) + + +: ( attributes -- pixelfmt ) NSOpenGLPixelFormat -> alloc [ + % NSOpenGLPFAWindow , NSOpenGLPFADoubleBuffer , NSOpenGLPFADepthSize , 16 , @@ -74,7 +77,7 @@ PRIVATE> -> autorelease ; : ( class dim -- view ) - [ -> alloc 0 0 ] dip first2 + [ -> alloc 0 0 ] dip first2 { } -> initWithFrame:pixelFormat: dup 1 -> setPostsBoundsChangedNotifications: dup 1 -> setPostsFrameChangedNotifications: ; diff --git a/basis/ui/backend/backend.factor b/basis/ui/backend/backend.factor index 0840d07cbc..8d5109ac7f 100644 --- a/basis/ui/backend/backend.factor +++ b/basis/ui/backend/backend.factor @@ -17,11 +17,15 @@ HOOK: (open-window) ui-backend ( world -- ) HOOK: (close-window) ui-backend ( handle -- ) +HOOK: (open-offscreen-buffer) ui-backend ( world -- ) + +HOOK: (close-offscreen-buffer) ui-backend ( handle -- ) + HOOK: raise-window* ui-backend ( world -- ) -HOOK: select-gl-context ui-backend ( handle -- ) +GENERIC: select-gl-context ( handle -- ) -HOOK: flush-gl-context ui-backend ( handle -- ) +GENERIC: flush-gl-context ( handle -- ) HOOK: beep ui-backend ( -- ) diff --git a/basis/ui/cocoa/cocoa.factor b/basis/ui/cocoa/cocoa.factor index a9b3b03b75..8861f8ffa2 100644 --- a/basis/ui/cocoa/cocoa.factor +++ b/basis/ui/cocoa/cocoa.factor @@ -5,12 +5,19 @@ command-line kernel memory namespaces cocoa.messages cocoa.runtime cocoa.subclassing cocoa.pasteboard cocoa.types cocoa.windows cocoa.classes cocoa.application sequences system ui ui.backend ui.clipboards ui.gadgets ui.gadgets.worlds -ui.cocoa.views core-foundation threads math.geometry.rect fry ; +ui.cocoa.views core-foundation threads math.geometry.rect fry +libc generalizations ; IN: ui.cocoa -TUPLE: handle view window ; +TUPLE: handle ; +TUPLE: window-handle < handle view window ; +TUPLE: offscreen-handle < handle context buffer ; -C: handle +C: window-handle +C: offscreen-handle + +M: offscreen-handle window>> f ; +M: offscreen-handle view>> f ; SINGLETON: cocoa-ui-backend @@ -38,7 +45,8 @@ M: pasteboard set-clipboard-contents : gadget-window ( world -- ) dup 2dup swap world>NSRect - [ [ -> release ] [ install-window-delegate ] bi* ] [ ] 2bi + [ [ -> release ] [ install-window-delegate ] bi* ] + [ ] 2bi >>handle drop ; M: cocoa-ui-backend set-title ( string world -- ) @@ -87,11 +95,36 @@ M: cocoa-ui-backend raise-window* ( world -- ) NSApp 1 -> activateIgnoringOtherApps: ] when* ; -M: cocoa-ui-backend select-gl-context ( handle -- ) - view>> -> openGLContext -> makeCurrentContext ; +: pixel-size ( pixel-format -- size ) + 0 [ NSOpenGLPFAColorSize 0 -> getValues:forAttribute:forVirtualScreen: ] + keep *int -3 shift ; -M: cocoa-ui-backend flush-gl-context ( handle -- ) - view>> -> openGLContext -> flushBuffer ; +: offscreen-buffer ( world pixel-format -- alien w h pitch ) + [ dim>> first2 ] [ pixel-size ] bi* + { [ * * malloc ] [ 2drop ] [ drop nip ] [ nip * ] } cleave ; + +: gadget-offscreen-context ( world -- context buffer ) + { NSOpenGLPFAOffscreen } + [ NSOpenGLContext -> alloc swap f -> initWithFormat:shareContext: ] + [ offscreen-buffer ] bi + 4 npick [ setOffScreen:width:height:rowbytes: ] dip ; + +M: cocoa-ui-backend (open-offscreen-buffer) ( world -- ) + dup gadget-offscreen-context >>handle drop ; + +M: cocoa-ui-backend (close-offscreen-buffer) ( handle -- ) + [ context>> -> release ] + [ buffer>> free ] bi ; + +GENERIC: gl-context ( handle -- context ) +M: window-handle gl-context view>> -> openGLContext ; +M: offscreen-handle gl-context context>> ; + +M: handle select-gl-context ( handle -- ) + gl-context -> makeCurrentContext ; + +M: handle flush-gl-context ( handle -- ) + gl-context -> flushBuffer ; M: cocoa-ui-backend beep ( -- ) NSBeep ;