Merge branch 'master' of git://repo.or.cz/factor/jcg
Conflicts: basis/ui/cocoa/cocoa.factordb4
commit
4f20c0813f
|
@ -55,10 +55,9 @@ PRIVATE>
|
|||
: with-multisample ( quot -- )
|
||||
t +multisample+ pick with-variable ; inline
|
||||
|
||||
: <PixelFormat> ( -- pixelfmt )
|
||||
NSOpenGLPixelFormat -> alloc [
|
||||
NSOpenGLPFAWindow ,
|
||||
NSOpenGLPFADoubleBuffer ,
|
||||
: <PixelFormat> ( attributes -- pixelfmt )
|
||||
NSOpenGLPixelFormat -> alloc swap [
|
||||
%
|
||||
NSOpenGLPFADepthSize , 16 ,
|
||||
+software-renderer+ get [
|
||||
NSOpenGLPFARendererID , kCGLRendererGenericFloatID ,
|
||||
|
@ -74,7 +73,8 @@ PRIVATE>
|
|||
-> autorelease ;
|
||||
|
||||
: <GLView> ( class dim -- view )
|
||||
[ -> alloc 0 0 ] dip first2 <NSRect> <PixelFormat>
|
||||
[ -> alloc 0 0 ] dip first2 <NSRect>
|
||||
NSOpenGLPFAWindow NSOpenGLPFADoubleBuffer 2array <PixelFormat>
|
||||
-> initWithFrame:pixelFormat:
|
||||
dup 1 -> setPostsBoundsChangedNotifications:
|
||||
dup 1 -> setPostsFrameChangedNotifications: ;
|
||||
|
|
|
@ -17,11 +17,17 @@ 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 -- )
|
||||
|
||||
GENERIC: offscreen-pixels ( handle -- alien )
|
||||
|
||||
HOOK: beep ui-backend ( -- )
|
||||
|
||||
|
|
|
@ -3,15 +3,18 @@
|
|||
USING: accessors math arrays assocs cocoa cocoa.application
|
||||
command-line kernel memory namespaces cocoa.messages
|
||||
cocoa.runtime cocoa.subclassing cocoa.pasteboard cocoa.types
|
||||
cocoa.windows cocoa.classes cocoa.application cocoa.nibs
|
||||
sequences system ui ui.backend ui.clipboards ui.gadgets
|
||||
ui.gadgets.worlds ui.cocoa.views core-foundation threads
|
||||
math.geometry.rect fry ;
|
||||
cocoa.windows cocoa.classes sequences system
|
||||
ui ui.backend ui.clipboards ui.gadgets ui.gadgets.worlds
|
||||
ui.cocoa.views core-foundation threads math.geometry.rect fry
|
||||
libc generalizations alien.c-types cocoa.views combinators ;
|
||||
IN: ui.cocoa
|
||||
|
||||
TUPLE: handle view window ;
|
||||
TUPLE: handle ;
|
||||
TUPLE: window-handle < handle view window ;
|
||||
TUPLE: offscreen-handle < handle context buffer ;
|
||||
|
||||
C: <handle> handle
|
||||
C: <window-handle> window-handle
|
||||
C: <offscreen-handle> offscreen-handle
|
||||
|
||||
SINGLETON: cocoa-ui-backend
|
||||
|
||||
|
@ -39,7 +42,8 @@ M: pasteboard set-clipboard-contents
|
|||
: gadget-window ( world -- )
|
||||
dup <FactorView>
|
||||
2dup swap world>NSRect <ViewWindow>
|
||||
[ [ -> release ] [ install-window-delegate ] bi* ] [ <handle> ] 2bi
|
||||
[ [ -> release ] [ install-window-delegate ] bi* ]
|
||||
[ <window-handle> ] 2bi
|
||||
>>handle drop ;
|
||||
|
||||
M: cocoa-ui-backend set-title ( string world -- )
|
||||
|
@ -88,11 +92,39 @@ 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 <int> [ 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 * ] } 3cleave ;
|
||||
|
||||
: gadget-offscreen-context ( world -- context buffer )
|
||||
NSOpenGLPFAOffScreen 1array <PixelFormat>
|
||||
[ nip NSOpenGLContext -> alloc swap f -> initWithFormat:shareContext: dup ]
|
||||
[ offscreen-buffer ] 2bi
|
||||
4 npick [ -> setOffScreen:width:height:rowbytes: ] dip ;
|
||||
|
||||
M: cocoa-ui-backend (open-offscreen-buffer) ( world -- )
|
||||
dup gadget-offscreen-context <offscreen-handle> >>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: offscreen-handle offscreen-pixels ( handle -- alien )
|
||||
buffer>> ;
|
||||
|
||||
M: cocoa-ui-backend beep ( -- )
|
||||
NSBeep ;
|
||||
|
|
|
@ -13,6 +13,8 @@ title status
|
|||
fonts handle
|
||||
window-loc ;
|
||||
|
||||
TUPLE: offscreen-world < world ;
|
||||
|
||||
: find-world ( gadget -- world/f ) [ world? ] find-parent ;
|
||||
|
||||
: show-status ( string/f gadget -- )
|
||||
|
@ -38,8 +40,8 @@ M: world request-focus-on ( child gadget -- )
|
|||
2dup eq?
|
||||
[ 2drop ] [ dup focused?>> (request-focus) ] if ;
|
||||
|
||||
: <world> ( gadget title status -- world )
|
||||
{ 0 1 } world new-track
|
||||
: new-world ( gadget title status class -- world )
|
||||
{ 0 1 } swap new-track
|
||||
t >>root?
|
||||
t >>active?
|
||||
H{ } clone >>fonts
|
||||
|
@ -49,6 +51,11 @@ M: world request-focus-on ( child gadget -- )
|
|||
swap 1 track-add
|
||||
dup request-focus ;
|
||||
|
||||
: <world> ( gadget title status -- world )
|
||||
world new-world ;
|
||||
: <offscreen-world> ( gadget title status -- world )
|
||||
offscreen-world new-world ;
|
||||
|
||||
M: world layout*
|
||||
dup call-next-method
|
||||
dup glass>> [
|
||||
|
|
|
@ -60,23 +60,26 @@ SYMBOL: stop-after-last-window?
|
|||
focus-path f swap focus-gestures ;
|
||||
|
||||
M: world graft*
|
||||
dup (open-window)
|
||||
dup title>> over set-title
|
||||
request-focus ;
|
||||
[ (open-window) ]
|
||||
[ [ title>> ] keep set-title ]
|
||||
[ request-focus ] tri ;
|
||||
|
||||
: reset-world ( world -- )
|
||||
#! This is used when a window is being closed, but also
|
||||
#! when restoring saved worlds on image startup.
|
||||
dup fonts>> clear-assoc
|
||||
dup unfocus-world
|
||||
f >>handle drop ;
|
||||
[ fonts>> clear-assoc ]
|
||||
[ unfocus-world ]
|
||||
[ f >>handle drop ] tri ;
|
||||
|
||||
: (ungraft-world) ( world -- )
|
||||
[ free-fonts ]
|
||||
[ hand-clicked close-global ]
|
||||
[ hand-gadget close-global ] tri ;
|
||||
|
||||
M: world ungraft*
|
||||
dup free-fonts
|
||||
dup hand-clicked close-global
|
||||
dup hand-gadget close-global
|
||||
dup handle>> (close-window)
|
||||
reset-world ;
|
||||
[ (ungraft-world) ]
|
||||
[ handle>> (close-window) ]
|
||||
[ reset-world ] tri ;
|
||||
|
||||
: find-window ( quot -- world )
|
||||
windows get values
|
||||
|
|
|
@ -70,9 +70,11 @@ M: pasteboard set-clipboard-contents drop copy ;
|
|||
<pasteboard> clipboard set-global
|
||||
<clipboard> selection set-global ;
|
||||
|
||||
! world-handle is a <win>
|
||||
TUPLE: win hWnd hDC hRC world title ;
|
||||
TUPLE: win-base hDC hRC ;
|
||||
TUPLE: win hWnd < win-base world title ;
|
||||
TUPLE: win-offscreen < win-base hBitmap bits ;
|
||||
C: <win> win
|
||||
C: <win-offscreen> win-offscreen
|
||||
|
||||
SYMBOLS: msg-obj class-name-ptr mouse-captured ;
|
||||
|
||||
|
@ -479,7 +481,7 @@ M: windows-ui-backend do-events
|
|||
f class-name-ptr set-global
|
||||
f msg-obj set-global ;
|
||||
|
||||
: setup-pixel-format ( hdc -- )
|
||||
: setup-pixel-format ( hdc flags -- )
|
||||
16 make-pfd [ ChoosePixelFormat dup win32-error=0/f ] 2keep
|
||||
swapd SetPixelFormat win32-error=0/f ;
|
||||
|
||||
|
@ -490,7 +492,7 @@ M: windows-ui-backend do-events
|
|||
[ wglMakeCurrent win32-error=0/f ] keep ;
|
||||
|
||||
: setup-gl ( hwnd -- hDC hRC )
|
||||
get-dc dup setup-pixel-format dup get-rc ;
|
||||
get-dc dup windowed-pfd-dwFlags setup-pixel-format dup get-rc ;
|
||||
|
||||
M: windows-ui-backend (open-window) ( world -- )
|
||||
[ create-window dup setup-gl ] keep
|
||||
|
@ -499,12 +501,51 @@ M: windows-ui-backend (open-window) ( world -- )
|
|||
dupd (>>handle)
|
||||
hWnd>> show-window ;
|
||||
|
||||
M: windows-ui-backend select-gl-context ( handle -- )
|
||||
M: win-base select-gl-context ( handle -- )
|
||||
[ hDC>> ] keep hRC>> wglMakeCurrent win32-error=0/f ;
|
||||
|
||||
M: windows-ui-backend flush-gl-context ( handle -- )
|
||||
M: win-base flush-gl-context ( handle -- )
|
||||
hDC>> SwapBuffers win32-error=0/f ;
|
||||
|
||||
: (bitmap-info) ( dim -- BITMAPINFO )
|
||||
"BITMAPINFO" <c-object> [
|
||||
BITMAPINFO-bmiHeader {
|
||||
[ nip "BITMAPINFOHEADER" heap-size swap set-BITMAPINFOHEADER-biSize ]
|
||||
[ [ first ] dip set-BITMAPINFOHEADER-biWidth ]
|
||||
[ [ second ] dip set-BITMAPINFOHEADER-biHeight ]
|
||||
[ nip 1 swap set-BITMAPINFOHEADER-biPlanes ]
|
||||
[ nip 32 swap set-BITMAPINFOHEADER-biBitCount ]
|
||||
[ nip BI_RGB swap set-BITMAPINFOHEADER-biCompression ]
|
||||
[ [ first2 * 4 * ] dip swap set-BITMAPINFOHEADER-biSizeImage ]
|
||||
[ nip 72 swap set-BITMAPINFOHEADER-biXPelsPerMeter ]
|
||||
[ nip 72 swap set-BITMAPINFOHEADER-biYPelsPerMeter ]
|
||||
[ nip 0 swap set-BITMAPINFOHEADER-biClrUsed ]
|
||||
[ nip 0 swap set-BITMAPINFOHEADER-biClrImportant ]
|
||||
} 2cleave
|
||||
] keep ;
|
||||
|
||||
: make-offscreen-dc-and-bitmap ( dim -- hDC hBitmap bits )
|
||||
f CreateCompatibleDC
|
||||
swap (bitmap-info) DIB_RGB_COLORS f <void*>
|
||||
[ f 0 CreateDIBSection ] keep *void*
|
||||
[ 2dup SelectObject drop ] dip ;
|
||||
|
||||
: setup-offscreen-gl ( dim -- hDC hRC hBitmap bits )
|
||||
make-offscreen-dc-and-bitmap [
|
||||
[ dup offscreen-pfd-dwFlags setup-pixel-format ]
|
||||
[ get-rc ] bi
|
||||
] 2dip ;
|
||||
|
||||
M: windows-ui-backend (open-offscreen-buffer) ( world -- )
|
||||
dup dim>> setup-offscreen-gl <win-offscreen>
|
||||
>>handle drop ;
|
||||
M: windows-ui-backend (close-offscreen-buffer) ( handle -- )
|
||||
[ hDC>> DeleteObject drop ]
|
||||
[ hBitmap>> DeleteObject drop ] bi ;
|
||||
|
||||
M: win-offscreen offscreen-pixels ( handle -- alien )
|
||||
bits>> ;
|
||||
|
||||
! Move window to front
|
||||
M: windows-ui-backend raise-window* ( world -- )
|
||||
handle>> [
|
||||
|
|
|
@ -248,12 +248,12 @@ M: x11-ui-backend raise-window* ( world -- )
|
|||
dpy get swap window>> XRaiseWindow drop
|
||||
] when* ;
|
||||
|
||||
M: x11-ui-backend select-gl-context ( handle -- )
|
||||
M: x11-handle select-gl-context ( handle -- )
|
||||
dpy get swap
|
||||
dup window>> swap glx>> glXMakeCurrent
|
||||
[ "Failed to set current GLX context" throw ] unless ;
|
||||
|
||||
M: x11-ui-backend flush-gl-context ( handle -- )
|
||||
M: x11-handle flush-gl-context ( handle -- )
|
||||
dpy get swap window>> glXSwapBuffers ;
|
||||
|
||||
M: x11-ui-backend ui ( -- )
|
||||
|
|
|
@ -71,15 +71,17 @@ IN: windows.opengl32
|
|||
: WGL_SWAP_UNDERLAY14 HEX: 20000000 ; inline
|
||||
: WGL_SWAP_UNDERLAY15 HEX: 40000000 ; inline
|
||||
|
||||
: pfd-dwFlags ( -- n )
|
||||
: windowed-pfd-dwFlags ( -- n )
|
||||
{ PFD_DRAW_TO_WINDOW PFD_SUPPORT_OPENGL PFD_DOUBLEBUFFER } flags ;
|
||||
: offscreen-pfd-dwFlags ( -- n )
|
||||
{ PFD_DRAW_TO_BITMAP PFD_SUPPORT_OPENGL PFD_SUPPORT_GDI } flags ;
|
||||
|
||||
! TODO: compare to http://www.nullterminator.net/opengl32.html
|
||||
: make-pfd ( bits -- pfd )
|
||||
: make-pfd ( flags bits -- pfd )
|
||||
"PIXELFORMATDESCRIPTOR" <c-object>
|
||||
"PIXELFORMATDESCRIPTOR" heap-size over set-PIXELFORMATDESCRIPTOR-nSize
|
||||
1 over set-PIXELFORMATDESCRIPTOR-nVersion
|
||||
pfd-dwFlags over set-PIXELFORMATDESCRIPTOR-dwFlags
|
||||
rot over set-PIXELFORMATDESCRIPTOR-dwFlags
|
||||
PFD_TYPE_RGBA over set-PIXELFORMATDESCRIPTOR-iPixelType
|
||||
[ set-PIXELFORMATDESCRIPTOR-cColorBits ] keep
|
||||
16 over set-PIXELFORMATDESCRIPTOR-cDepthBits
|
||||
|
|
|
@ -4,24 +4,35 @@
|
|||
USING: alien arrays byte-arrays combinators summary io.backend
|
||||
graphics.viewer io io.binary io.files kernel libc math
|
||||
math.functions math.bitwise namespaces opengl opengl.gl
|
||||
prettyprint sequences strings ui ui.gadgets.panes
|
||||
io.encodings.binary accessors grouping ;
|
||||
prettyprint sequences strings ui ui.gadgets.panes fry
|
||||
io.encodings.binary accessors grouping macros alien.c-types ;
|
||||
IN: graphics.bitmap
|
||||
|
||||
! Currently can only handle 24bit bitmaps.
|
||||
! Currently can only handle 24/32bit bitmaps.
|
||||
! Handles row-reversed bitmaps (their height is negative)
|
||||
|
||||
TUPLE: bitmap magic size reserved offset header-length width
|
||||
height planes bit-count compression size-image
|
||||
x-pels y-pels color-used color-important rgb-quads color-index array ;
|
||||
|
||||
: (array-copy) ( bitmap array -- bitmap array' )
|
||||
over size-image>> abs memory>byte-array ;
|
||||
|
||||
MACRO: (nbits>bitmap) ( bits -- )
|
||||
[ -3 shift ] keep '[
|
||||
bitmap new
|
||||
2over * _ * >>size-image
|
||||
swap >>height
|
||||
swap >>width
|
||||
swap (array-copy) [ >>array ] [ >>color-index ] bi
|
||||
_ >>bit-count
|
||||
] ;
|
||||
|
||||
: bgr>bitmap ( array height width -- bitmap )
|
||||
bitmap new
|
||||
2over * 3 * >>size-image
|
||||
swap >>height
|
||||
swap >>width
|
||||
swap [ >>array ] [ >>color-index ] bi
|
||||
24 >>bit-count ;
|
||||
24 (nbits>bitmap) ;
|
||||
|
||||
: bgra>bitmap ( array height width -- bitmap )
|
||||
32 (nbits>bitmap) ;
|
||||
|
||||
: 8bit>array ( bitmap -- array )
|
||||
[ rgb-quads>> 4 <sliced-groups> [ 3 head-slice ] map ]
|
||||
|
@ -124,7 +135,7 @@ M: bitmap draw-image ( bitmap -- )
|
|||
[
|
||||
[ height>> abs ] keep
|
||||
bit-count>> {
|
||||
! { 32 [ GL_BGRA GL_UNSIGNED_INT_8_8_8_8 ] } ! broken
|
||||
{ 32 [ GL_BGRA GL_UNSIGNED_BYTE ] }
|
||||
{ 24 [ GL_BGR GL_UNSIGNED_BYTE ] }
|
||||
{ 8 [ GL_BGR GL_UNSIGNED_BYTE ] }
|
||||
{ 4 [ GL_BGR GL_UNSIGNED_BYTE ] }
|
||||
|
|
|
@ -139,7 +139,7 @@ TUPLE: key-caps-gadget < gadget keys alarm ;
|
|||
: make-key-gadget ( scancode dim array -- )
|
||||
[
|
||||
swap [
|
||||
" " [ ] <bevel-button>
|
||||
" " [ drop ] <bevel-button>
|
||||
swap [ first >>loc ] [ second >>dim ] bi
|
||||
] [ execute ] bi*
|
||||
] dip set-nth ;
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
USING: kernel literals tools.test ;
|
||||
IN: literals.tests
|
||||
|
||||
<<
|
||||
: five 5 ;
|
||||
: seven-eleven 7 11 ;
|
||||
: six-six-six 6 6 6 ;
|
||||
>>
|
||||
|
||||
[ { 5 } ] [ { $ five } ] unit-test
|
||||
[ { 7 11 } ] [ { $ seven-eleven } ] unit-test
|
||||
[ { 6 6 6 } ] [ { $ six-six-six } ] unit-test
|
|
@ -0,0 +1,4 @@
|
|||
USING: continuations kernel parser words ;
|
||||
IN: literals
|
||||
|
||||
: $ scan-word [ execute ] curry with-datastack ; parsing
|
|
@ -0,0 +1,31 @@
|
|||
USING: accessors continuations graphics.bitmap kernel math
|
||||
sequences ui.gadgets ui.gadgets.worlds ui ui.backend ;
|
||||
IN: ui.offscreen
|
||||
|
||||
TUPLE: offscreen-world < world ;
|
||||
|
||||
: <offscreen-world> ( gadget title status -- world )
|
||||
offscreen-world new-world ;
|
||||
|
||||
M: offscreen-world graft*
|
||||
(open-offscreen-buffer) ;
|
||||
|
||||
M: offscreen-world ungraft*
|
||||
[ (ungraft-world) ]
|
||||
[ handle>> (close-offscreen-buffer) ]
|
||||
[ reset-world ] tri ;
|
||||
|
||||
: open-offscreen ( gadget -- world )
|
||||
"" f <offscreen-world> [ open-world-window ] keep
|
||||
notify-queued ;
|
||||
|
||||
: close-offscreen ( world -- )
|
||||
ungraft notify-queued ;
|
||||
|
||||
: offscreen-world>bitmap ( world -- bitmap )
|
||||
[ handle>> offscreen-pixels ] [ dim>> first2 neg ] bi
|
||||
bgra>bitmap ;
|
||||
|
||||
: do-offscreen ( gadget quot: ( offscreen-world -- ) -- )
|
||||
[ open-offscreen ] dip
|
||||
over [ slip ] [ close-offscreen ] [ ] cleanup ;
|
Loading…
Reference in New Issue