From 7d8c59edebb74579a68be523ff8dddb5aae5918b Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 20 Jun 2009 19:30:34 -0500 Subject: [PATCH 1/5] more action gestures. btw "redo" is ^y (not ^Z) outside of OS X --- basis/ui/gestures/gestures-docs.factor | 41 ++++++++++++++++++++++++-- basis/ui/gestures/gestures.factor | 15 ++++++++-- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/basis/ui/gestures/gestures-docs.factor b/basis/ui/gestures/gestures-docs.factor index ebffb0bfbc..91c5ea8312 100644 --- a/basis/ui/gestures/gestures-docs.factor +++ b/basis/ui/gestures/gestures-docs.factor @@ -86,6 +86,30 @@ HELP: select-all-action { $class-description "Gesture sent when the " { $emphasis "select all" } " standard window system action is invoked." } { $examples { $code "select-all-action" } } ; +HELP: new-action +{ $class-description "Gesture sent when the " { $emphasis "new" } " standard window system action is invoked." } +{ $examples { $code "new-action" } } ; + +HELP: open-action +{ $class-description "Gesture sent when the " { $emphasis "open" } " standard window system action is invoked." } +{ $examples { $code "open-action" } } ; + +HELP: save-action +{ $class-description "Gesture sent when the " { $emphasis "save" } " standard window system action is invoked." } +{ $examples { $code "save-action" } } ; + +HELP: save-as-action +{ $class-description "Gesture sent when the " { $emphasis "save as" } " standard window system action is invoked." } +{ $examples { $code "save-as-action" } } ; + +HELP: revert-action +{ $class-description "Gesture sent when the " { $emphasis "revert" } " standard window system action is invoked." } +{ $examples { $code "revert-action" } } ; + +HELP: close-action +{ $class-description "Gesture sent when the " { $emphasis "close" } " standard window system action is invoked." } +{ $examples { $code "close-action" } } ; + HELP: C+ { $description "Control key modifier." } ; @@ -350,21 +374,34 @@ $nl { $subsection zoom-out-action } ; ARTICLE: "action-gestures" "Action gestures" -"Action gestures exist to keep keyboard shortcuts for common clipboard operations consistent." +"Action gestures exist to keep keyboard shortcuts for common application operations consistent." +{ $subsection undo-action } +{ $subsection redo-action } { $subsection cut-action } { $subsection copy-action } { $subsection paste-action } { $subsection delete-action } { $subsection select-all-action } +{ $subsection new-action } +{ $subsection open-action } +{ $subsection save-action } +{ $subsection save-as-action } +{ $subsection revert-action } +{ $subsection close-action } "The following keyboard gestures, if not handled directly, send action gestures:" { $table { { $strong "Keyboard gesture" } { $strong "Action gesture" } } { { $snippet "T{ key-down f { C+ } \"z\" }" } { $snippet "undo-action" } } - { { $snippet "T{ key-down f { C+ } \"Z\" }" } { $snippet "redo-action" } } + { { $snippet "T{ key-down f { C+ } \"y\" }" } { $snippet "redo-action" } } { { $snippet "T{ key-down f { C+ } \"x\" }" } { $snippet "cut-action" } } { { $snippet "T{ key-down f { C+ } \"c\" }" } { $snippet "copy-action" } } { { $snippet "T{ key-down f { C+ } \"v\" }" } { $snippet "paste-action" } } { { $snippet "T{ key-down f { C+ } \"a\" }" } { $snippet "select-all-action" } } + { { $snippet "T{ key-down f { C+ } \"n\" }" } { $snippet "new-action" } } + { { $snippet "T{ key-down f { C+ } \"o\" }" } { $snippet "open-action" } } + { { $snippet "T{ key-down f { C+ } \"s\" }" } { $snippet "save-action" } } + { { $snippet "T{ key-down f { C+ } \"S\" }" } { $snippet "save-as-action" } } + { { $snippet "T{ key-down f { C+ } \"w\" }" } { $snippet "close-action" } } } "Action gestures should be used in place of the above keyboard gestures if possible. For example, on Mac OS X, the standard " { $strong "Edit" } " menu items send action gestures." ; diff --git a/basis/ui/gestures/gestures.factor b/basis/ui/gestures/gestures.factor index 073b2d5e26..dcfb8d4d66 100644 --- a/basis/ui/gestures/gestures.factor +++ b/basis/ui/gestures/gestures.factor @@ -82,23 +82,32 @@ undo-action redo-action cut-action copy-action paste-action delete-action select-all-action left-action right-action up-action down-action -zoom-in-action zoom-out-action ; +zoom-in-action zoom-out-action +new-action open-action save-action save-as-action +revert-action close-action ; UNION: action undo-action redo-action cut-action copy-action paste-action delete-action select-all-action left-action right-action up-action down-action -zoom-in-action zoom-out-action ; +zoom-in-action zoom-out-action +new-action open-action save-action save-as-action +revert-action close-action ; CONSTANT: action-gestures { { "z" undo-action } - { "Z" redo-action } + { "y" redo-action } { "x" cut-action } { "c" copy-action } { "v" paste-action } { "a" select-all-action } + { "n" new-action } + { "o" open-action } + { "s" save-action } + { "S" save-as-action } + { "w" close-action } } ! Modifiers From 032b5e7835c8ead68bc4bca5868ae65afd33c56d Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 20 Jun 2009 21:26:39 -0500 Subject: [PATCH 2/5] give Factor.app a typical File menu --- .../English.lproj/Factor.nib/info.nib | 6 +-- .../English.lproj/Factor.nib/keyedobjects.nib | Bin 14002 -> 14018 bytes .../English.lproj/MiniFactor.nib/classes.nib | 49 ++++++++++++------ .../English.lproj/MiniFactor.nib/info.nib | 19 +++---- .../MiniFactor.nib/keyedobjects.nib | Bin 9369 -> 12505 bytes 5 files changed, 43 insertions(+), 31 deletions(-) diff --git a/Factor.app/Contents/Resources/English.lproj/Factor.nib/info.nib b/Factor.app/Contents/Resources/English.lproj/Factor.nib/info.nib index 1096a1224a..03b5496717 100644 --- a/Factor.app/Contents/Resources/English.lproj/Factor.nib/info.nib +++ b/Factor.app/Contents/Resources/English.lproj/Factor.nib/info.nib @@ -3,15 +3,15 @@ IBFramework Version - 629 + 677 IBOldestOS 5 IBOpenObjects - 305 + 344 IBSystem Version - 9G55 + 9J61 targetFramework IBCocoaFramework diff --git a/Factor.app/Contents/Resources/English.lproj/Factor.nib/keyedobjects.nib b/Factor.app/Contents/Resources/English.lproj/Factor.nib/keyedobjects.nib index c30c9e4bfda079b3069b7a323ccf59063fcf199f..52d86b9b0751c321b0ed2d750a70112ff59a35a2 100644 GIT binary patch literal 14018 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 Pn9x;TFLVumr}p?i7^$gq literal 14002 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 L9y`|j&Ft|%$gN+f diff --git a/Factor.app/Contents/Resources/English.lproj/MiniFactor.nib/classes.nib b/Factor.app/Contents/Resources/English.lproj/MiniFactor.nib/classes.nib index bf3d2a6560..34be3452ee 100644 --- a/Factor.app/Contents/Resources/English.lproj/MiniFactor.nib/classes.nib +++ b/Factor.app/Contents/Resources/English.lproj/MiniFactor.nib/classes.nib @@ -1,17 +1,32 @@ -{ - IBClasses = ( - { - ACTIONS = { - newFactorWorkspace = id; - runFactorFile = id; - saveFactorImage = id; - saveFactorImageAs = id; - showFactorHelp = id; - }; - CLASS = FirstResponder; - LANGUAGE = ObjC; - SUPERCLASS = NSObject; - } - ); - IBVersion = 1; -} \ No newline at end of file + + + + + IBClasses + + + ACTIONS + + newFactorWorkspace + id + runFactorFile + id + saveFactorImage + id + saveFactorImageAs + id + showFactorHelp + id + + CLASS + FirstResponder + LANGUAGE + ObjC + SUPERCLASS + NSObject + + + IBVersion + 1 + + diff --git a/Factor.app/Contents/Resources/English.lproj/MiniFactor.nib/info.nib b/Factor.app/Contents/Resources/English.lproj/MiniFactor.nib/info.nib index 3a18202826..86277eb8a8 100644 --- a/Factor.app/Contents/Resources/English.lproj/MiniFactor.nib/info.nib +++ b/Factor.app/Contents/Resources/English.lproj/MiniFactor.nib/info.nib @@ -1,21 +1,18 @@ - + - IBDocumentLocation - 1266 155 525 491 0 0 2560 1578 - IBEditorPositions - - 29 - 326 905 270 44 0 0 2560 1578 - IBFramework Version - 439.0 + 677 + IBOldestOS + 5 IBOpenObjects - 29 + 293 IBSystem Version - 8R218 + 9J61 + targetFramework + IBCocoaFramework diff --git a/Factor.app/Contents/Resources/English.lproj/MiniFactor.nib/keyedobjects.nib b/Factor.app/Contents/Resources/English.lproj/MiniFactor.nib/keyedobjects.nib index 34abd139a62216d6d80944a25f3cb7b027239b57..992911439538aa237cb641d2cf23174faa42deb0 100644 GIT binary patch literal 12505 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 literal 9369 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 Date: Sun, 21 Jun 2009 20:53:11 -0500 Subject: [PATCH 3/5] bind file management action gestures to standard cocoa menu items --- basis/ui/backend/cocoa/views/views.factor | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/basis/ui/backend/cocoa/views/views.factor b/basis/ui/backend/cocoa/views/views.factor index a9568d4f75..9fb83e4865 100644 --- a/basis/ui/backend/cocoa/views/views.factor +++ b/basis/ui/backend/cocoa/views/views.factor @@ -225,6 +225,26 @@ CLASS: { [ nip select-all-action send-action$ ] } +{ "newDocument:" "id" { "id" "SEL" "id" } + [ nip new-action send-action$ ] +} + +{ "openDocument:" "id" { "id" "SEL" "id" } + [ nip open-action send-action$ ] +} + +{ "saveDocument:" "id" { "id" "SEL" "id" } + [ nip save-action send-action$ ] +} + +{ "saveDocumentAs:" "id" { "id" "SEL" "id" } + [ nip save-as-action send-action$ ] +} + +{ "revertDocumentToSaved:" "id" { "id" "SEL" "id" } + [ nip revert-action send-action$ ] +} + ! Multi-touch gestures: this is undocumented. ! http://cocoadex.com/2008/02/nsevent-modifications-swipe-ro.html { "magnifyWithEvent:" "void" { "id" "SEL" "id" } From 0b990db4e58595448062393beadedcbda8f22901 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sun, 21 Jun 2009 20:57:54 -0500 Subject: [PATCH 4/5] move "run factor file" and "save factor image" commands to application menu --- .../English.lproj/Factor.nib/info.nib | 4 +--- .../English.lproj/Factor.nib/keyedobjects.nib | Bin 14018 -> 15029 bytes 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Factor.app/Contents/Resources/English.lproj/Factor.nib/info.nib b/Factor.app/Contents/Resources/English.lproj/Factor.nib/info.nib index 03b5496717..1d9f641c11 100644 --- a/Factor.app/Contents/Resources/English.lproj/Factor.nib/info.nib +++ b/Factor.app/Contents/Resources/English.lproj/Factor.nib/info.nib @@ -7,9 +7,7 @@ IBOldestOS 5 IBOpenObjects - - 344 - + IBSystem Version 9J61 targetFramework diff --git a/Factor.app/Contents/Resources/English.lproj/Factor.nib/keyedobjects.nib b/Factor.app/Contents/Resources/English.lproj/Factor.nib/keyedobjects.nib index 52d86b9b0751c321b0ed2d750a70112ff59a35a2..1659393f2e09f2c10eeb2c37f5afe96dadbe7f1c 100644 GIT binary patch literal 15029 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 F{|C22vNr$# literal 14018 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 Pn9x;TFLVumr}p?i7^$gq From ac3ec67c6a01edd6f36d52d969c3765de0d065fb Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Mon, 22 Jun 2009 11:20:54 -0500 Subject: [PATCH 5/5] separate component format from component order in image objects --- basis/cairo/cairo.factor | 3 +- basis/core-graphics/core-graphics.factor | 3 +- basis/images/bitmap/loading/loading.factor | 2 +- basis/images/images-tests.factor | 4 +- basis/images/images.factor | 74 ++++++++++++++----- basis/images/jpeg/jpeg.factor | 1 + basis/images/png/png.factor | 2 +- basis/images/processing/processing.factor | 2 +- .../tesselation/tesselation-tests.factor | 20 ++--- basis/images/tesselation/tesselation.factor | 6 +- basis/images/tiff/tiff.factor | 18 ++--- basis/opengl/gl/gl.factor | 6 ++ basis/opengl/textures/textures.factor | 71 +++++++++++++----- .../images/normalization/normalization.factor | 32 ++++---- extra/noise/noise.factor | 3 +- extra/terrain/generation/generation.factor | 1 + 16 files changed, 168 insertions(+), 80 deletions(-) diff --git a/basis/cairo/cairo.factor b/basis/cairo/cairo.factor index 3a41f0bcf9..074798a1b2 100755 --- a/basis/cairo/cairo.factor +++ b/basis/cairo/cairo.factor @@ -31,7 +31,8 @@ ERROR: cairo-error message ; &cairo_destroy @ ] make-memory-bitmap - BGRA >>component-order ; inline + BGRA >>component-order + ubyte-components >>component-type ; inline : dummy-cairo ( -- cr ) #! Sometimes we want a dummy context; eg with Pango, we want diff --git a/basis/core-graphics/core-graphics.factor b/basis/core-graphics/core-graphics.factor index 6612a43dca..a7bec04798 100644 --- a/basis/core-graphics/core-graphics.factor +++ b/basis/core-graphics/core-graphics.factor @@ -140,4 +140,5 @@ PRIVATE> : make-bitmap-image ( dim quot -- image ) '[ &CGContextRelease @ ] make-memory-bitmap - ARGB >>component-order ; inline + ARGB >>component-order + ubyte-components >>component-type ; inline diff --git a/basis/images/bitmap/loading/loading.factor b/basis/images/bitmap/loading/loading.factor index b0bd501f09..31975fa3f0 100644 --- a/basis/images/bitmap/loading/loading.factor +++ b/basis/images/bitmap/loading/loading.factor @@ -370,5 +370,5 @@ M: bitmap-image load-image* ( path bitmap-image -- bitmap ) [ loading-bitmap>bytes >>bitmap ] [ header>> [ width>> ] [ height>> abs ] bi 2array >>dim ] [ header>> height>> 0 < not >>upside-down? ] - [ bitmap>component-order >>component-order ] + [ bitmap>component-order >>component-order ubyte-components >>component-type ] } cleave ; diff --git a/basis/images/images-tests.factor b/basis/images/images-tests.factor index 8918dcb38c..ff49834a65 100644 --- a/basis/images/images-tests.factor +++ b/basis/images/images-tests.factor @@ -3,7 +3,7 @@ USING: images tools.test kernel accessors ; IN: images.tests -[ B{ 57 57 57 255 } ] [ 1 1 T{ image f { 2 3 } RGBA f B{ +[ B{ 57 57 57 255 } ] [ 1 1 T{ image f { 2 3 } RGBA ubyte-components f B{ 0 0 0 0 0 0 0 0 0 0 0 0 @@ -19,7 +19,7 @@ IN: images.tests 57 57 57 255 0 0 0 0 0 0 0 0 -} ] [ B{ 57 57 57 255 } 1 1 T{ image f { 2 3 } RGBA f B{ +} ] [ B{ 57 57 57 255 } 1 1 T{ image f { 2 3 } RGBA ubyte-components f B{ 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/basis/images/images.factor b/basis/images/images.factor index 4c76b85459..f74233c515 100755 --- a/basis/images/images.factor +++ b/basis/images/images.factor @@ -3,12 +3,58 @@ USING: combinators kernel accessors sequences math arrays ; IN: images -SINGLETONS: L LA BGR RGB BGRA RGBA ABGR ARGB RGBX XRGB BGRX XBGR -R16G16B16 R32G32B32 R16G16B16A16 R32G32B32A32 ; +SINGLETONS: + L LA BGR RGB BGRA RGBA ABGR ARGB RGBX XRGB BGRX XBGR + ubyte-components ushort-components + half-components float-components + byte-integer-components ubyte-integer-components + short-integer-components ushort-integer-components + int-integer-components uint-integer-components ; -UNION: alpha-channel BGRA RGBA ABGR ARGB R16G16B16A16 R32G32B32A32 ; +UNION: component-order + L LA BGR RGB BGRA RGBA ABGR ARGB RGBX XRGB BGRX XBGR ; -: bytes-per-pixel ( component-order -- n ) +UNION: component-type + ubyte-components ushort-components + half-components float-components + byte-integer-components ubyte-integer-components + short-integer-components ushort-integer-components + int-integer-components uint-integer-components ; + +UNION: unnormalized-integer-components + byte-integer-components ubyte-integer-components + short-integer-components ushort-integer-components + int-integer-components uint-integer-components ; + +UNION: alpha-channel BGRA RGBA ABGR ARGB ; + +TUPLE: image dim component-order component-type upside-down? bitmap ; + +: ( -- image ) image new ; inline + +: has-alpha? ( image -- ? ) component-order>> alpha-channel? ; + +GENERIC: load-image* ( path class -- image ) + +DEFER: bytes-per-pixel + + ( -- image ) image new ; inline - -: has-alpha? ( image -- ? ) component-order>> alpha-channel? ; - -GENERIC: load-image* ( path class -- image ) - -> first * + ] - [ component-order>> bytes-per-pixel [ * dup ] keep + ] + [ bytes-per-pixel [ * dup ] keep + ] [ bitmap>> ] tri ; : set-subseq ( new-value from to victim -- ) @@ -48,6 +80,10 @@ GENERIC: load-image* ( path class -- image ) PRIVATE> +: bytes-per-pixel ( image -- n ) + [ component-order>> component-count ] + [ component-type>> bytes-per-component ] bi * ; + : pixel-at ( x y image -- pixel ) pixel@ subseq ; diff --git a/basis/images/jpeg/jpeg.factor b/basis/images/jpeg/jpeg.factor index f61254c3cf..ca3ea8d2b4 100644 --- a/basis/images/jpeg/jpeg.factor +++ b/basis/images/jpeg/jpeg.factor @@ -298,6 +298,7 @@ MEMO: dct-matrix-blas ( -- m ) dct-matrix >float-blas-matrix ; : setup-bitmap ( image -- ) dup dim>> 16 v/n [ ceiling ] map 16 v*n >>dim BGR >>component-order + ubyte-components >>component-type f >>upside-down? dup dim>> first2 * 3 * 0 >>bitmap drop ; diff --git a/basis/images/png/png.factor b/basis/images/png/png.factor index bb470d8dd8..2469a6a72c 100755 --- a/basis/images/png/png.factor +++ b/basis/images/png/png.factor @@ -85,7 +85,7 @@ ERROR: unimplemented-color-type image ; [ ] dip { [ png-image-bytes >>bitmap ] [ [ width>> ] [ height>> ] bi 2array >>dim ] - [ drop RGB >>component-order ] + [ drop RGB >>component-order ubyte-components >>component-type ] } cleave ; : decode-indexed-color ( loading-png -- loading-png ) diff --git a/basis/images/processing/processing.factor b/basis/images/processing/processing.factor index fc463731b3..cd6754550d 100755 --- a/basis/images/processing/processing.factor +++ b/basis/images/processing/processing.factor @@ -17,7 +17,7 @@ IN: images.processing over matrix-dim >>dim swap flip flatten [ 128 * 128 + 0 max 255 min >fixnum ] map - >byte-array >>bitmap L >>component-order ; + >byte-array >>bitmap L >>component-order ubyte-components >>component-type ; :: matrix-zoom ( m f -- m' ) m matrix-dim f v*n coord-matrix diff --git a/basis/images/tesselation/tesselation-tests.factor b/basis/images/tesselation/tesselation-tests.factor index 2ac8e37ae7..9db58649a0 100644 --- a/basis/images/tesselation/tesselation-tests.factor +++ b/basis/images/tesselation/tesselation-tests.factor @@ -10,12 +10,12 @@ IN: images.tesselation [ { { - T{ image f { 2 2 } L f B{ 1 2 5 6 } } - T{ image f { 2 2 } L f B{ 3 4 7 8 } } + T{ image f { 2 2 } L ubyte-components f B{ 1 2 5 6 } } + T{ image f { 2 2 } L ubyte-components f B{ 3 4 7 8 } } } { - T{ image f { 2 2 } L f B{ 9 10 13 14 } } - T{ image f { 2 2 } L f B{ 11 12 15 16 } } + T{ image f { 2 2 } L ubyte-components f B{ 9 10 13 14 } } + T{ image f { 2 2 } L ubyte-components f B{ 11 12 15 16 } } } } ] [ @@ -23,18 +23,19 @@ IN: images.tesselation 1 16 [a,b] >byte-array >>bitmap { 4 4 } >>dim L >>component-order + ubyte-components >>component-type { 2 2 } tesselate ] unit-test [ { { - T{ image f { 2 2 } L f B{ 1 2 4 5 } } - T{ image f { 1 2 } L f B{ 3 6 } } + T{ image f { 2 2 } L ubyte-components f B{ 1 2 4 5 } } + T{ image f { 1 2 } L ubyte-components f B{ 3 6 } } } { - T{ image f { 2 1 } L f B{ 7 8 } } - T{ image f { 1 1 } L f B{ 9 } } + T{ image f { 2 1 } L ubyte-components f B{ 7 8 } } + T{ image f { 1 1 } L ubyte-components f B{ 9 } } } } ] [ @@ -42,5 +43,6 @@ IN: images.tesselation 1 9 [a,b] >byte-array >>bitmap { 3 3 } >>dim L >>component-order + ubyte-components >>component-type { 2 2 } tesselate -] unit-test \ No newline at end of file +] unit-test diff --git a/basis/images/tesselation/tesselation.factor b/basis/images/tesselation/tesselation.factor index cbdf396b48..d01bad61ea 100644 --- a/basis/images/tesselation/tesselation.factor +++ b/basis/images/tesselation/tesselation.factor @@ -19,7 +19,7 @@ IN: images.tesselation '[ _ tesselate-columns ] map ; : tile-width ( tile-bitmap original-image -- width ) - [ first length ] [ component-order>> bytes-per-pixel ] bi* /i ; + [ first length ] [ bytes-per-pixel ] bi* /i ; : ( tile-bitmap original-image -- tile-image ) clone @@ -28,8 +28,8 @@ IN: images.tesselation [ [ over tile-width ] [ length ] bi 2array >>dim ] bi ; :: tesselate ( image tess-dim -- image-grid ) - image component-order>> bytes-per-pixel :> bpp + image bytes-per-pixel :> bpp image dim>> { bpp 1 } v* :> image-dim' tess-dim { bpp 1 } v* :> tess-dim' image bitmap>> image-dim' tess-dim' tesselate-bitmap - [ [ image ] map ] map ; \ No newline at end of file + [ [ image ] map ] map ; diff --git a/basis/images/tiff/tiff.factor b/basis/images/tiff/tiff.factor index e00b05f2e7..7e12b03c13 100755 --- a/basis/images/tiff/tiff.factor +++ b/basis/images/tiff/tiff.factor @@ -484,15 +484,15 @@ ERROR: unknown-component-order ifd ; [ unknown-component-order ] } case >>bitmap ; -: ifd-component-order ( ifd -- byte-order ) +: ifd-component-order ( ifd -- component-order component-type ) bits-per-sample find-tag { - { { 32 32 32 32 } [ R32G32B32A32 ] } - { { 32 32 32 } [ R32G32B32 ] } - { { 16 16 16 16 } [ R16G16B16A16 ] } - { { 16 16 16 } [ R16G16B16 ] } - { { 8 8 8 8 } [ RGBA ] } - { { 8 8 8 } [ RGB ] } - { 8 [ LA ] } + { { 32 32 32 32 } [ RGBA float-components ] } + { { 32 32 32 } [ RGB float-components ] } + { { 16 16 16 16 } [ RGBA ushort-components ] } + { { 16 16 16 } [ RGB ushort-components ] } + { { 8 8 8 8 } [ RGBA ubyte-components ] } + { { 8 8 8 } [ RGB ubyte-components ] } + { 8 [ LA ubyte-components ] } [ unknown-component-order ] } case ; @@ -507,7 +507,7 @@ ERROR: unknown-component-order ifd ; : ifd>image ( ifd -- image ) [ ] dip { [ [ image-width find-tag ] [ image-length find-tag ] bi 2array >>dim ] - [ ifd-component-order >>component-order ] + [ ifd-component-order [ >>component-order ] [ >>component-type ] bi* ] [ bitmap>> >>bitmap ] } cleave ; diff --git a/basis/opengl/gl/gl.factor b/basis/opengl/gl/gl.factor index be457dcd00..6136115dbb 100644 --- a/basis/opengl/gl/gl.factor +++ b/basis/opengl/gl/gl.factor @@ -1801,6 +1801,12 @@ CONSTANT: GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT HEX: 8D56 CONSTANT: GL_MAX_SAMPLES_EXT HEX: 8D57 +! GL_ARB_half_float_pixel, GL_ARB_half_float_vertex + + +CONSTANT: GL_HALF_FLOAT_ARB HEX: 140B + + ! GL_ARB_texture_float diff --git a/basis/opengl/textures/textures.factor b/basis/opengl/textures/textures.factor index 2eabbd478b..0a8fc945bf 100755 --- a/basis/opengl/textures/textures.factor +++ b/basis/opengl/textures/textures.factor @@ -4,7 +4,7 @@ USING: accessors assocs cache colors.constants destructors kernel opengl opengl.gl opengl.capabilities combinators images images.tesselation grouping specialized-arrays.float sequences math math.vectors math.matrices generalizations fry arrays namespaces -system ; +system locals ; IN: opengl.textures SYMBOL: non-power-of-2-textures? @@ -22,16 +22,46 @@ SYMBOL: non-power-of-2-textures? : delete-texture ( id -- ) [ glDeleteTextures ] (delete-gl-object) ; -GENERIC: component-order>format ( component-order -- format type ) +GENERIC: component-type>type ( component-type -- internal-format type ) +GENERIC: component-order>format ( type component-order -- type format ) +GENERIC: component-order>integer-format ( type component-order -- type format ) -M: RGB component-order>format drop GL_RGB GL_UNSIGNED_BYTE ; -M: BGR component-order>format drop GL_BGR GL_UNSIGNED_BYTE ; -M: RGBA component-order>format drop GL_RGBA GL_UNSIGNED_BYTE ; -M: ARGB component-order>format drop GL_BGRA_EXT GL_UNSIGNED_INT_8_8_8_8_REV ; -M: BGRA component-order>format drop GL_BGRA_EXT GL_UNSIGNED_BYTE ; -M: BGRX component-order>format drop GL_BGRA_EXT GL_UNSIGNED_BYTE ; -M: LA component-order>format drop GL_LUMINANCE_ALPHA GL_UNSIGNED_BYTE ; -M: L component-order>format drop GL_LUMINANCE GL_UNSIGNED_BYTE ; +ERROR: unsupported-component-order component-order ; + +M: ubyte-components component-type>type drop GL_RGBA8 GL_UNSIGNED_BYTE ; +M: ushort-components component-type>type drop GL_RGBA16 GL_UNSIGNED_SHORT ; +M: half-components component-type>type drop GL_RGBA16F_ARB GL_HALF_FLOAT_ARB ; +M: float-components component-type>type drop GL_RGBA32F_ARB GL_FLOAT ; +M: byte-integer-components component-type>type drop GL_RGBA8I_EXT GL_BYTE ; +M: short-integer-components component-type>type drop GL_RGBA16I_EXT GL_SHORT ; +M: int-integer-components component-type>type drop GL_RGBA32I_EXT GL_INT ; +M: ubyte-integer-components component-type>type drop GL_RGBA8I_EXT GL_UNSIGNED_BYTE ; +M: ushort-integer-components component-type>type drop GL_RGBA16I_EXT GL_UNSIGNED_SHORT ; +M: uint-integer-components component-type>type drop GL_RGBA32I_EXT GL_UNSIGNED_INT ; + +M: RGB component-order>format drop GL_RGB ; +M: BGR component-order>format drop GL_BGR ; +M: RGBA component-order>format drop GL_RGBA ; +M: ARGB component-order>format + swap GL_UNSIGNED_BYTE = + [ drop GL_UNSIGNED_INT_8_8_8_8_REV GL_BGRA_EXT ] + [ unsupported-component-order ] if ; +M: BGRA component-order>format drop GL_BGRA_EXT ; +M: BGRX component-order>format drop GL_BGRA_EXT ; +M: LA component-order>format drop GL_LUMINANCE_ALPHA ; +M: L component-order>format drop GL_LUMINANCE ; + +M: object component-order>format unsupported-component-order ; + +M: RGB component-order>integer-format drop GL_RGB_INTEGER_EXT ; +M: BGR component-order>integer-format drop GL_BGR_INTEGER_EXT ; +M: RGBA component-order>integer-format drop GL_RGBA_INTEGER_EXT ; +M: BGRA component-order>integer-format drop GL_BGRA_INTEGER_EXT ; +M: BGRX component-order>integer-format drop GL_BGRA_INTEGER_EXT ; +M: LA component-order>integer-format drop GL_LUMINANCE_ALPHA_INTEGER_EXT ; +M: L component-order>integer-format drop GL_LUMINANCE_INTEGER_EXT ; + +M: object component-order>integer-format unsupported-component-order ; SLOT: display-list @@ -50,18 +80,25 @@ TUPLE: single-texture image dim loc texture-coords texture display-list disposed [ dup 1 = [ next-power-of-2 ] unless ] map ] unless ; -: tex-image ( image bitmap -- ) +: image-format ( image -- internal-format format type ) + dup component-type>> + [ nip component-type>type ] [ - [ GL_TEXTURE_2D 0 GL_RGBA ] dip - [ dim>> adjust-texture-dim first2 0 ] - [ component-order>> component-order>format ] bi - ] dip - glTexImage2D ; + unnormalized-integer-components? + [ component-order>> component-order>integer-format ] + [ component-order>> component-order>format ] if + ] 2bi swap ; + +:: tex-image ( image bitmap -- ) + image image-format :> type :> format :> internal-format + GL_TEXTURE_2D 0 internal-format + image dim>> adjust-texture-dim first2 0 + format type bitmap glTexImage2D ; : tex-sub-image ( image -- ) [ GL_TEXTURE_2D 0 0 0 ] dip [ dim>> first2 ] - [ component-order>> component-order>format ] + [ image-format [ drop ] 2dip ] [ bitmap>> ] tri glTexSubImage2D ; diff --git a/extra/images/normalization/normalization.factor b/extra/images/normalization/normalization.factor index dcdf39a53e..0f4877055a 100755 --- a/extra/images/normalization/normalization.factor +++ b/extra/images/normalization/normalization.factor @@ -3,7 +3,8 @@ USING: kernel accessors grouping sequences combinators math specialized-arrays.direct.uint byte-arrays fry specialized-arrays.direct.ushort specialized-arrays.uint -specialized-arrays.ushort specialized-arrays.float images ; +specialized-arrays.ushort specialized-arrays.float images +half-floats ; IN: images.normalization [ 255 suffix ] map concat ; -: normalize-floats ( byte-array -- byte-array ) - byte-array>float-array [ 255.0 * >integer ] B{ } map-as ; +: normalize-floats ( float-array -- byte-array ) + [ 255.0 * >integer ] B{ } map-as ; +GENERIC: normalize-component-type* ( image component-type -- image ) GENERIC: normalize-component-order* ( image component-order -- image ) : normalize-component-order ( image -- image ) + dup component-type>> '[ _ normalize-component-type* ] change-bitmap dup component-order>> '[ _ normalize-component-order* ] change-bitmap ; -M: RGBA normalize-component-order* drop ; +M: float-components normalize-component-type* + drop byte-array>float-array normalize-floats ; +M: half-components normalize-component-type* + drop byte-array>half-array normalize-floats ; -M: R32G32B32A32 normalize-component-order* - drop normalize-floats ; - -M: R32G32B32 normalize-component-order* - drop normalize-floats add-dummy-alpha ; - -: RGB16>8 ( bitmap -- bitmap' ) +: ushorts>ubytes ( bitmap -- bitmap' ) byte-array>ushort-array [ -8 shift ] B{ } map-as ; inline -M: R16G16B16A16 normalize-component-order* - drop RGB16>8 ; +M: ushort-components normalize-component-type* + drop ushorts>ubytes ; -M: R16G16B16 normalize-component-order* - drop RGB16>8 add-dummy-alpha ; +M: ubyte-components normalize-component-type* + drop ; + +M: RGBA normalize-component-order* drop ; : BGR>RGB ( bitmap -- pixels ) 3 [ ] map B{ } join ; inline diff --git a/extra/noise/noise.factor b/extra/noise/noise.factor index 3de4147835..975019bfd1 100644 --- a/extra/noise/noise.factor +++ b/extra/noise/noise.factor @@ -64,7 +64,8 @@ HINTS: hashes { byte-array fixnum fixnum fixnum } ; image new swap >>dim swap >>bitmap - L >>component-order ; + L >>component-order + ubyte-components >>component-type ; :: perlin-noise-unsafe ( table point -- value ) point unit-cube :> cube diff --git a/extra/terrain/generation/generation.factor b/extra/terrain/generation/generation.factor index 72221d7b0e..661ea88de6 100644 --- a/extra/terrain/generation/generation.factor +++ b/extra/terrain/generation/generation.factor @@ -36,6 +36,7 @@ TUPLE: segment image ; swap >>bitmap RGBA >>component-order + ubyte-components >>component-type terrain-segment-size >>dim ; : terrain-segment ( terrain at -- image )