Merge branch 'master' of git://factorcode.org/git/factor
* 'master' of git://factorcode.org/git/factor: (73 commits) Fix ui.gadgets.scrollers unit tests Browser tool now saves scroll bar position in history Rename scroll word to set-scroll-position and make it public Rename scroll word to set-scroll-position and make it public Move models.history to extra Clear button in search field is now positioned correctly Fix prettyprint of CONSTANT: and ALIAS: Fix prettyprinting of URLs Fix alien unit tests Fixes for recent changes Fix mailbox-get-all, and make mailbox timeouts throw a wait-timeout error instead of a string Oops dead code Fixing this for Windows mason.test: check if boot image is out of date, and refuse to build if so Fix documentation for map-index Fix alien hashcode for expired aliens opengl.textures: pad image up to a power of 2 using glTexSubImage2D instead of doing it in Factor code Don't call glFlush, it's useless Simplify do-matrix Add hashcode method for simple-alien; improves performance of malloc and free ...db4
commit
1546f4230b
|
@ -113,12 +113,6 @@ the command prompt using the console application:
|
||||||
|
|
||||||
factor.com -i=boot.<cpu>.image
|
factor.com -i=boot.<cpu>.image
|
||||||
|
|
||||||
Before bootstrapping, you will need to download the DLLs for the Pango
|
|
||||||
text rendering library. The required DLLs are listed in
|
|
||||||
build-support/dlls.txt and are available from the following location:
|
|
||||||
|
|
||||||
<http://factorcode.org/dlls>
|
|
||||||
|
|
||||||
Once bootstrapped, double-clicking factor.exe or factor.com starts
|
Once bootstrapped, double-clicking factor.exe or factor.com starts
|
||||||
the Factor UI.
|
the Factor UI.
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
! Copyright (C) 2009 Slava Pestov.
|
! Copyright (C) 2009 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: functors destructors accessors kernel parser words ;
|
USING: functors destructors accessors kernel parser words
|
||||||
|
effects generalizations sequences ;
|
||||||
IN: alien.destructors
|
IN: alien.destructors
|
||||||
|
|
||||||
SLOT: alien
|
SLOT: alien
|
||||||
|
@ -11,6 +12,7 @@ F-destructor DEFINES-CLASS ${F}-destructor
|
||||||
<F-destructor> DEFINES <${F}-destructor>
|
<F-destructor> DEFINES <${F}-destructor>
|
||||||
&F DEFINES &${F}
|
&F DEFINES &${F}
|
||||||
|F DEFINES |${F}
|
|F DEFINES |${F}
|
||||||
|
N [ F stack-effect out>> length ]
|
||||||
|
|
||||||
WHERE
|
WHERE
|
||||||
|
|
||||||
|
@ -18,7 +20,7 @@ TUPLE: F-destructor alien disposed ;
|
||||||
|
|
||||||
: <F-destructor> ( alien -- destructor ) f F-destructor boa ; inline
|
: <F-destructor> ( alien -- destructor ) f F-destructor boa ; inline
|
||||||
|
|
||||||
M: F-destructor dispose* alien>> F ;
|
M: F-destructor dispose* alien>> F N ndrop ;
|
||||||
|
|
||||||
: &F ( alien -- alien ) dup <F-destructor> &dispose drop ; inline
|
: &F ( alien -- alien ) dup <F-destructor> &dispose drop ; inline
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,9 @@ USING: accessors fry generalizations kernel macros math.order
|
||||||
stack-checker math ;
|
stack-checker math ;
|
||||||
IN: combinators.smart
|
IN: combinators.smart
|
||||||
|
|
||||||
|
MACRO: drop-outputs ( quot -- quot' )
|
||||||
|
dup infer out>> '[ @ _ ndrop ] ;
|
||||||
|
|
||||||
MACRO: output>sequence ( quot exemplar -- newquot )
|
MACRO: output>sequence ( quot exemplar -- newquot )
|
||||||
[ dup infer out>> ] dip
|
[ dup infer out>> ] dip
|
||||||
'[ @ _ _ nsequence ] ;
|
'[ @ _ _ nsequence ] ;
|
||||||
|
|
|
@ -20,10 +20,12 @@ IN: concurrency.conditions
|
||||||
]
|
]
|
||||||
] dip later ;
|
] dip later ;
|
||||||
|
|
||||||
|
ERROR: wait-timeout ;
|
||||||
|
|
||||||
: wait ( queue timeout status -- )
|
: wait ( queue timeout status -- )
|
||||||
over [
|
over [
|
||||||
[ queue-timeout [ drop ] ] dip suspend
|
[ queue-timeout [ drop ] ] dip suspend
|
||||||
[ "Timeout" throw ] [ cancel-alarm ] if
|
[ wait-timeout ] [ cancel-alarm ] if
|
||||||
] [
|
] [
|
||||||
[ drop '[ _ push-front ] ] dip suspend drop
|
[ drop '[ _ push-front ] ] dip suspend drop
|
||||||
] if ;
|
] if ;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
IN: concurrency.mailboxes.tests
|
IN: concurrency.mailboxes.tests
|
||||||
USING: concurrency.mailboxes concurrency.count-downs vectors
|
USING: concurrency.mailboxes concurrency.count-downs concurrency.conditions
|
||||||
sequences threads tools.test math kernel strings namespaces
|
vectors sequences threads tools.test math kernel strings namespaces
|
||||||
continuations calendar destructors ;
|
continuations calendar destructors ;
|
||||||
|
|
||||||
{ 1 1 } [ [ integer? ] mailbox-get? ] must-infer-as
|
{ 1 1 } [ [ integer? ] mailbox-get? ] must-infer-as
|
||||||
|
@ -75,3 +75,15 @@ continuations calendar destructors ;
|
||||||
[ ] [ "d" get 5 seconds await-timeout ] unit-test
|
[ ] [ "d" get 5 seconds await-timeout ] unit-test
|
||||||
|
|
||||||
[ ] [ "m" get dispose ] unit-test
|
[ ] [ "m" get dispose ] unit-test
|
||||||
|
|
||||||
|
[ { "foo" "bar" } ] [
|
||||||
|
<mailbox>
|
||||||
|
"foo" over mailbox-put
|
||||||
|
"bar" over mailbox-put
|
||||||
|
mailbox-get-all
|
||||||
|
] unit-test
|
||||||
|
|
||||||
|
[
|
||||||
|
<mailbox> 1 seconds mailbox-get-timeout
|
||||||
|
] [ wait-timeout? ] must-fail-with
|
||||||
|
|
|
@ -49,7 +49,7 @@ M: mailbox dispose* threads>> notify-all ;
|
||||||
|
|
||||||
: mailbox-get-all-timeout ( mailbox timeout -- array )
|
: mailbox-get-all-timeout ( mailbox timeout -- array )
|
||||||
block-if-empty
|
block-if-empty
|
||||||
[ dup mailbox-empty? ]
|
[ dup mailbox-empty? not ]
|
||||||
[ dup data>> pop-back ]
|
[ dup data>> pop-back ]
|
||||||
produce nip ;
|
produce nip ;
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ M: topic url-of topic>filename ;
|
||||||
: help>html ( topic -- xml )
|
: help>html ( topic -- xml )
|
||||||
[ article-title ]
|
[ article-title ]
|
||||||
[ drop help-stylesheet ]
|
[ drop help-stylesheet ]
|
||||||
[ [ help ] with-html-writer ]
|
[ [ print-topic ] with-html-writer ]
|
||||||
tri simple-page ;
|
tri simple-page ;
|
||||||
|
|
||||||
: generate-help-file ( topic -- )
|
: generate-help-file ( topic -- )
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
IN: help.tips
|
IN: help.tips
|
||||||
USING: help.markup help.syntax debugger prettyprint see help help.vocabs
|
USING: help.markup help.syntax debugger prettyprint see help help.vocabs
|
||||||
help.apropos tools.time stack-checker editors ;
|
help.apropos tools.time stack-checker editors memory ;
|
||||||
|
|
||||||
TIP: "To look at the most recent error, run " { $link :error } ". To look at the most recent error's callstack, run " { $link :c } "." ;
|
TIP: "To look at the most recent error, run " { $link :error } ". To look at the most recent error's callstack, run " { $link :c } "." ;
|
||||||
|
|
||||||
|
@ -20,7 +20,9 @@ TIP: "Power tools: " { $links see edit help about apropos time infer. } ;
|
||||||
|
|
||||||
TIP: "Tips of the day implement the " { $link "definition-protocol" } " and new tips of the day can be defined using the " { $link POSTPONE: TIP: } " parsing word." ;
|
TIP: "Tips of the day implement the " { $link "definition-protocol" } " and new tips of the day can be defined using the " { $link POSTPONE: TIP: } " parsing word." ;
|
||||||
|
|
||||||
TIP: "Try some simple demo applications, then look at the source code in " { $snippet "extra/" } ": " { $code "\"demos\" run" } ;
|
TIP: "Try some simple demo applications, then look at the source code in " { $snippet "extra/" } ": " { $snippet "\"demos\" run" } ;
|
||||||
|
|
||||||
|
TIP: "To save time on reloading big libraries such as the " { $vocab-link "furnace" } " web framework, save the image after loading them using the " { $link save } " word." ;
|
||||||
|
|
||||||
HELP: TIP:
|
HELP: TIP:
|
||||||
{ $syntax "TIP: content ;" }
|
{ $syntax "TIP: content ;" }
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
! Copyright (C) 2009 Doug Coleman.
|
! Copyright (C) 2009 Doug Coleman.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: combinators kernel ;
|
USING: combinators kernel accessors ;
|
||||||
IN: images
|
IN: images
|
||||||
|
|
||||||
SINGLETONS: L BGR RGB BGRA RGBA ABGR ARGB RGBX XRGB BGRX XBGR
|
SINGLETONS: L BGR RGB BGRA RGBA ABGR ARGB RGBX XRGB BGRX XBGR
|
||||||
R16G16B16 R32G32B32 R16G16B16A16 R32G32B32A32 ;
|
R16G16B16 R32G32B32 R16G16B16A16 R32G32B32A32 ;
|
||||||
|
|
||||||
|
UNION: alpha-channel BGRA RGBA ABGR ARGB R16G16B16A16 R32G32B32A32 ;
|
||||||
|
|
||||||
: bytes-per-pixel ( component-order -- n )
|
: bytes-per-pixel ( component-order -- n )
|
||||||
{
|
{
|
||||||
{ L [ 1 ] }
|
{ L [ 1 ] }
|
||||||
|
@ -29,4 +31,6 @@ TUPLE: image dim component-order upside-down? bitmap ;
|
||||||
|
|
||||||
: <image> ( -- image ) image new ; inline
|
: <image> ( -- image ) image new ; inline
|
||||||
|
|
||||||
|
: has-alpha? ( image -- ? ) component-order>> alpha-channel? ;
|
||||||
|
|
||||||
GENERIC: load-image* ( path tuple -- image )
|
GENERIC: load-image* ( path tuple -- image )
|
|
@ -61,6 +61,18 @@ M: ARGB normalize-component-order*
|
||||||
M: ABGR normalize-component-order*
|
M: ABGR normalize-component-order*
|
||||||
drop ARGB>RGBA BGRA>RGBA ;
|
drop ARGB>RGBA BGRA>RGBA ;
|
||||||
|
|
||||||
|
: fix-XBGR ( bitmap -- bitmap' )
|
||||||
|
dup 4 <sliced-groups> [ [ 255 0 ] dip set-nth ] each ;
|
||||||
|
|
||||||
|
M: XBGR normalize-component-order*
|
||||||
|
drop fix-XBGR ABGR normalize-component-order* ;
|
||||||
|
|
||||||
|
: fix-BGRX ( bitmap -- bitmap' )
|
||||||
|
dup 4 <sliced-groups> [ [ 255 3 ] dip set-nth ] each ;
|
||||||
|
|
||||||
|
M: BGRX normalize-component-order*
|
||||||
|
drop fix-BGRX BGRA normalize-component-order* ;
|
||||||
|
|
||||||
: normalize-scan-line-order ( image -- image )
|
: normalize-scan-line-order ( image -- image )
|
||||||
dup upside-down?>> [
|
dup upside-down?>> [
|
||||||
dup dim>> first 4 * '[
|
dup dim>> first 4 * '[
|
||||||
|
|
|
@ -111,7 +111,7 @@ PRIVATE>
|
||||||
: lcm ( a b -- c )
|
: lcm ( a b -- c )
|
||||||
[ * ] 2keep gcd nip /i ; foldable
|
[ * ] 2keep gcd nip /i ; foldable
|
||||||
|
|
||||||
: divisor? ( x y -- ? )
|
: divisor? ( m n -- ? )
|
||||||
mod 0 = ;
|
mod 0 = ;
|
||||||
|
|
||||||
: mod-inv ( x n -- y )
|
: mod-inv ( x n -- y )
|
||||||
|
|
|
@ -133,7 +133,6 @@ $nl
|
||||||
{ $subsection "models-impl" }
|
{ $subsection "models-impl" }
|
||||||
{ $subsection "models.arrow" }
|
{ $subsection "models.arrow" }
|
||||||
{ $subsection "models.product" }
|
{ $subsection "models.product" }
|
||||||
{ $subsection "models-history" }
|
|
||||||
{ $subsection "models-range" }
|
{ $subsection "models-range" }
|
||||||
{ $subsection "models-delay" } ;
|
{ $subsection "models-delay" } ;
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,8 @@ HELP: do-enabled
|
||||||
{ $description "Wraps a quotation in " { $link glEnable } "/" { $link glDisable } " calls." } ;
|
{ $description "Wraps a quotation in " { $link glEnable } "/" { $link glDisable } " calls." } ;
|
||||||
|
|
||||||
HELP: do-matrix
|
HELP: do-matrix
|
||||||
{ $values { "mode" { $link GL_MODELVIEW } " or " { $link GL_PROJECTION } } { "quot" quotation } }
|
{ $values { "quot" quotation } }
|
||||||
{ $description "Saves and restores the matrix specified by " { $snippet "mode" } " before and after calling the quotation." } ;
|
{ $description "Saves and restores the current matrix before and after calling the quotation." } ;
|
||||||
|
|
||||||
HELP: gl-line
|
HELP: gl-line
|
||||||
{ $values { "a" "a pair of integers" } { "b" "a pair of integers" } }
|
{ $values { "a" "a pair of integers" } { "b" "a pair of integers" } }
|
||||||
|
|
|
@ -44,9 +44,8 @@ MACRO: all-enabled ( seq quot -- )
|
||||||
MACRO: all-enabled-client-state ( seq quot -- )
|
MACRO: all-enabled-client-state ( seq quot -- )
|
||||||
[ words>values ] dip '[ _ _ (all-enabled-client-state) ] ;
|
[ words>values ] dip '[ _ _ (all-enabled-client-state) ] ;
|
||||||
|
|
||||||
: do-matrix ( mode quot -- )
|
: do-matrix ( quot -- )
|
||||||
swap [ glMatrixMode glPushMatrix call ] keep
|
glPushMatrix call glPopMatrix ; inline
|
||||||
glMatrixMode glPopMatrix ; inline
|
|
||||||
|
|
||||||
: gl-material ( face pname params -- )
|
: gl-material ( face pname params -- )
|
||||||
float-array{ } like glMaterialfv ;
|
float-array{ } like glMaterialfv ;
|
||||||
|
@ -165,7 +164,7 @@ MACRO: set-draw-buffers ( buffers -- )
|
||||||
: delete-dlist ( id -- ) 1 glDeleteLists ;
|
: delete-dlist ( id -- ) 1 glDeleteLists ;
|
||||||
|
|
||||||
: with-translation ( loc quot -- )
|
: with-translation ( loc quot -- )
|
||||||
GL_MODELVIEW [ [ gl-translate ] dip call ] do-matrix ; inline
|
[ [ gl-translate ] dip call ] do-matrix ; inline
|
||||||
|
|
||||||
: fix-coordinates ( point1 point2 -- x1 y2 x2 y2 )
|
: fix-coordinates ( point1 point2 -- x1 y2 x2 y2 )
|
||||||
[ first2 [ >fixnum ] bi@ ] bi@ ;
|
[ first2 [ >fixnum ] bi@ ] bi@ ;
|
||||||
|
@ -177,6 +176,7 @@ MACRO: set-draw-buffers ( buffers -- )
|
||||||
fix-coordinates glViewport ;
|
fix-coordinates glViewport ;
|
||||||
|
|
||||||
: init-matrices ( -- )
|
: init-matrices ( -- )
|
||||||
|
#! Leaves with matrix mode GL_MODELVIEW
|
||||||
GL_PROJECTION glMatrixMode
|
GL_PROJECTION glMatrixMode
|
||||||
glLoadIdentity
|
glLoadIdentity
|
||||||
GL_MODELVIEW glMatrixMode
|
GL_MODELVIEW glMatrixMode
|
||||||
|
|
|
@ -5,56 +5,6 @@ opengl.textures.private images kernel namespaces accessors
|
||||||
sequences ;
|
sequences ;
|
||||||
IN: opengl.textures.tests
|
IN: opengl.textures.tests
|
||||||
|
|
||||||
[ ] [
|
|
||||||
T{ image
|
|
||||||
{ dim { 3 5 } }
|
|
||||||
{ component-order RGB }
|
|
||||||
{ bitmap
|
|
||||||
B{
|
|
||||||
1 2 3 4 5 6 7 8 9
|
|
||||||
10 11 12 13 14 15 16 17 18
|
|
||||||
19 20 21 22 23 24 25 26 27
|
|
||||||
28 29 30 31 32 33 34 35 36
|
|
||||||
37 38 39 40 41 42 43 44 45
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} "image" set
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
[
|
|
||||||
T{ image
|
|
||||||
{ dim { 4 8 } }
|
|
||||||
{ component-order RGB }
|
|
||||||
{ bitmap
|
|
||||||
B{
|
|
||||||
1 2 3 4 5 6 7 8 9 7 8 9
|
|
||||||
10 11 12 13 14 15 16 17 18 16 17 18
|
|
||||||
19 20 21 22 23 24 25 26 27 25 26 27
|
|
||||||
28 29 30 31 32 33 34 35 36 34 35 36
|
|
||||||
37 38 39 40 41 42 43 44 45 43 44 45
|
|
||||||
37 38 39 40 41 42 43 44 45 43 44 45
|
|
||||||
37 38 39 40 41 42 43 44 45 43 44 45
|
|
||||||
37 38 39 40 41 42 43 44 45 43 44 45
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
] [
|
|
||||||
"image" get power-of-2-image
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
[
|
|
||||||
T{ image
|
|
||||||
{ dim { 0 0 } }
|
|
||||||
{ component-order R32G32B32 }
|
|
||||||
{ bitmap B{ } } }
|
|
||||||
] [
|
|
||||||
T{ image
|
|
||||||
{ dim { 0 0 } }
|
|
||||||
{ component-order R32G32B32 }
|
|
||||||
{ bitmap B{ } }
|
|
||||||
} power-of-2-image
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
{ { 0 0 } { 10 0 } }
|
{ { 0 0 } { 10 0 } }
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors assocs cache colors.constants destructors fry kernel
|
USING: accessors assocs cache colors.constants destructors fry kernel
|
||||||
opengl opengl.gl combinators images images.tesselation grouping
|
opengl opengl.gl combinators images images.tesselation grouping
|
||||||
specialized-arrays.float locals sequences math math.vectors
|
specialized-arrays.float sequences math math.vectors
|
||||||
math.matrices generalizations fry columns ;
|
math.matrices generalizations fry arrays ;
|
||||||
IN: opengl.textures
|
IN: opengl.textures
|
||||||
|
|
||||||
: gen-texture ( -- id ) [ glGenTextures ] (gen-gl-object) ;
|
: gen-texture ( -- id ) [ glGenTextures ] (gen-gl-object) ;
|
||||||
|
@ -17,60 +17,42 @@ M: BGR component-order>format drop GL_BGR GL_UNSIGNED_BYTE ;
|
||||||
M: RGBA component-order>format drop GL_RGBA 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: 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: BGRA component-order>format drop GL_BGRA_EXT GL_UNSIGNED_BYTE ;
|
||||||
|
M: BGRX component-order>format drop GL_BGRA_EXT GL_UNSIGNED_BYTE ;
|
||||||
|
|
||||||
GENERIC: draw-texture ( texture -- )
|
SLOT: display-list
|
||||||
|
|
||||||
|
: draw-texture ( texture -- ) display-list>> [ glCallList ] when* ;
|
||||||
|
|
||||||
GENERIC: draw-scaled-texture ( dim texture -- )
|
GENERIC: draw-scaled-texture ( dim texture -- )
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
TUPLE: single-texture loc dim texture-coords texture display-list disposed ;
|
TUPLE: single-texture image dim loc texture-coords texture display-list disposed ;
|
||||||
|
|
||||||
: repeat-last ( seq n -- seq' )
|
: (tex-image) ( image -- )
|
||||||
over peek pad-tail concat ;
|
[ GL_TEXTURE_2D 0 GL_RGBA ] dip
|
||||||
|
[ dim>> first2 [ next-power-of-2 ] bi@ 0 ]
|
||||||
|
[ component-order>> component-order>format f ] bi
|
||||||
|
glTexImage2D ;
|
||||||
|
|
||||||
: power-of-2-bitmap ( rows dim size -- bitmap dim )
|
: (tex-sub-image) ( image -- )
|
||||||
'[
|
[ GL_TEXTURE_2D 0 0 0 ] dip
|
||||||
first2
|
[ dim>> first2 ] [ component-order>> component-order>format ] [ bitmap>> ] tri
|
||||||
[ [ _ ] dip '[ _ group _ repeat-last ] map ]
|
glTexSubImage2D ;
|
||||||
[ repeat-last ]
|
|
||||||
bi*
|
|
||||||
] keep ;
|
|
||||||
|
|
||||||
: image-rows ( image -- rows )
|
: make-texture ( image -- id )
|
||||||
[ bitmap>> ]
|
#! We use glTexSubImage2D to work around the power of 2 texture size
|
||||||
[ dim>> first ]
|
#! limitation
|
||||||
[ component-order>> bytes-per-pixel ]
|
|
||||||
tri * group ; inline
|
|
||||||
|
|
||||||
: power-of-2-image ( image -- image )
|
|
||||||
dup dim>> [ 0 = ] all? [
|
|
||||||
clone dup
|
|
||||||
[ image-rows ]
|
|
||||||
[ dim>> [ next-power-of-2 ] map ]
|
|
||||||
[ component-order>> bytes-per-pixel ] tri
|
|
||||||
power-of-2-bitmap
|
|
||||||
[ >>bitmap ] [ >>dim ] bi*
|
|
||||||
] unless ;
|
|
||||||
|
|
||||||
:: make-texture ( image -- id )
|
|
||||||
gen-texture [
|
gen-texture [
|
||||||
GL_TEXTURE_BIT [
|
GL_TEXTURE_BIT [
|
||||||
GL_TEXTURE_2D swap glBindTexture
|
GL_TEXTURE_2D swap glBindTexture
|
||||||
GL_TEXTURE_2D
|
[ (tex-image) ] [ (tex-sub-image) ] bi
|
||||||
0
|
|
||||||
GL_RGBA
|
|
||||||
image dim>> first2
|
|
||||||
0
|
|
||||||
image component-order>> component-order>format
|
|
||||||
image bitmap>>
|
|
||||||
glTexImage2D
|
|
||||||
] do-attribs
|
] do-attribs
|
||||||
] keep ;
|
] keep ;
|
||||||
|
|
||||||
: init-texture ( -- )
|
: init-texture ( -- )
|
||||||
GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_LINEAR glTexParameteri
|
GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_NEAREST glTexParameteri
|
||||||
GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_LINEAR glTexParameteri
|
GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_NEAREST glTexParameteri
|
||||||
GL_TEXTURE_2D GL_TEXTURE_WRAP_S GL_REPEAT glTexParameteri
|
GL_TEXTURE_2D GL_TEXTURE_WRAP_S GL_REPEAT glTexParameteri
|
||||||
GL_TEXTURE_2D GL_TEXTURE_WRAP_T GL_REPEAT glTexParameteri ;
|
GL_TEXTURE_2D GL_TEXTURE_WRAP_T GL_REPEAT glTexParameteri ;
|
||||||
|
|
||||||
|
@ -92,26 +74,29 @@ TUPLE: single-texture loc dim texture-coords texture display-list disposed ;
|
||||||
|
|
||||||
: draw-textured-rect ( dim texture -- )
|
: draw-textured-rect ( dim texture -- )
|
||||||
[
|
[
|
||||||
(draw-textured-rect)
|
[ image>> has-alpha? [ GL_BLEND glDisable ] unless ]
|
||||||
GL_TEXTURE_2D 0 glBindTexture
|
[ (draw-textured-rect) GL_TEXTURE_2D 0 glBindTexture ]
|
||||||
|
[ image>> has-alpha? [ GL_BLEND glEnable ] unless ]
|
||||||
|
tri
|
||||||
] with-texturing ;
|
] with-texturing ;
|
||||||
|
|
||||||
: texture-coords ( dim -- coords )
|
: texture-coords ( texture -- coords )
|
||||||
[ dup next-power-of-2 /f ] map
|
[ [ dim>> ] [ image>> dim>> [ next-power-of-2 ] map ] bi v/ ]
|
||||||
{ { 0 0 } { 1 0 } { 1 1 } { 0 1 } } [ v* ] with map
|
[
|
||||||
float-array{ } join ;
|
image>> upside-down?>>
|
||||||
|
{ { 0 1 } { 1 1 } { 1 0 } { 0 0 } }
|
||||||
|
{ { 0 0 } { 1 0 } { 1 1 } { 0 1 } } ?
|
||||||
|
] bi
|
||||||
|
[ v* ] with map float-array{ } join ;
|
||||||
|
|
||||||
: make-texture-display-list ( texture -- dlist )
|
: make-texture-display-list ( texture -- dlist )
|
||||||
GL_COMPILE [ [ dim>> ] keep draw-textured-rect ] make-dlist ;
|
GL_COMPILE [ [ dim>> ] keep draw-textured-rect ] make-dlist ;
|
||||||
|
|
||||||
: <single-texture> ( image loc -- texture )
|
: <single-texture> ( image loc -- texture )
|
||||||
single-texture new swap >>loc
|
single-texture new swap >>loc swap [ >>image ] [ dim>> >>dim ] bi
|
||||||
swap
|
dup image>> dim>> product 0 = [
|
||||||
[ dim>> >>dim ] keep
|
dup texture-coords >>texture-coords
|
||||||
[ dim>> product 0 = ] keep '[
|
dup image>> make-texture >>texture
|
||||||
_
|
|
||||||
[ dim>> texture-coords >>texture-coords ]
|
|
||||||
[ power-of-2-image make-texture >>texture ] bi
|
|
||||||
dup make-texture-display-list >>display-list
|
dup make-texture-display-list >>display-list
|
||||||
] unless ;
|
] unless ;
|
||||||
|
|
||||||
|
@ -119,15 +104,13 @@ M: single-texture dispose*
|
||||||
[ texture>> [ delete-texture ] when* ]
|
[ texture>> [ delete-texture ] when* ]
|
||||||
[ display-list>> [ delete-dlist ] when* ] bi ;
|
[ display-list>> [ delete-dlist ] when* ] bi ;
|
||||||
|
|
||||||
M: single-texture draw-texture display-list>> [ glCallList ] when* ;
|
|
||||||
|
|
||||||
M: single-texture draw-scaled-texture
|
M: single-texture draw-scaled-texture
|
||||||
dup texture>> [ draw-textured-rect ] [ 2drop ] if ;
|
dup texture>> [ draw-textured-rect ] [ 2drop ] if ;
|
||||||
|
|
||||||
TUPLE: multi-texture grid display-list loc disposed ;
|
TUPLE: multi-texture grid display-list loc disposed ;
|
||||||
|
|
||||||
: image-locs ( image-grid -- loc-grid )
|
: image-locs ( image-grid -- loc-grid )
|
||||||
[ first [ dim>> first ] map ] [ 0 <column> [ dim>> second ] map ] bi
|
[ first [ dim>> first ] map ] [ [ first dim>> second ] map ] bi
|
||||||
[ 0 [ + ] accumulate nip ] bi@
|
[ 0 [ + ] accumulate nip ] bi@
|
||||||
cross-zip flip ;
|
cross-zip flip ;
|
||||||
|
|
||||||
|
@ -138,14 +121,15 @@ TUPLE: multi-texture grid display-list loc disposed ;
|
||||||
: draw-textured-grid ( grid -- )
|
: draw-textured-grid ( grid -- )
|
||||||
[ [ [ dim>> ] keep (draw-textured-rect) ] each ] each ;
|
[ [ [ dim>> ] keep (draw-textured-rect) ] each ] each ;
|
||||||
|
|
||||||
|
: grid-has-alpha? ( grid -- ? )
|
||||||
|
first first image>> has-alpha? ;
|
||||||
|
|
||||||
: make-textured-grid-display-list ( grid -- dlist )
|
: make-textured-grid-display-list ( grid -- dlist )
|
||||||
GL_COMPILE [
|
GL_COMPILE [
|
||||||
[
|
[
|
||||||
[
|
[ grid-has-alpha? [ GL_BLEND glDisable ] unless ]
|
||||||
[
|
[ [ [ [ dim>> ] keep (draw-textured-rect) ] each ] each ]
|
||||||
[ dim>> ] keep (draw-textured-rect)
|
[ grid-has-alpha? [ GL_BLEND glEnable ] unless ] tri
|
||||||
] each
|
|
||||||
] each
|
|
||||||
GL_TEXTURE_2D 0 glBindTexture
|
GL_TEXTURE_2D 0 glBindTexture
|
||||||
] with-texturing
|
] with-texturing
|
||||||
] make-dlist ;
|
] make-dlist ;
|
||||||
|
@ -159,11 +143,9 @@ TUPLE: multi-texture grid display-list loc disposed ;
|
||||||
f multi-texture boa
|
f multi-texture boa
|
||||||
] with-destructors ;
|
] with-destructors ;
|
||||||
|
|
||||||
M: multi-texture draw-texture display-list>> [ glCallList ] when* ;
|
|
||||||
|
|
||||||
M: multi-texture dispose* grid>> [ [ dispose ] each ] each ;
|
M: multi-texture dispose* grid>> [ [ dispose ] each ] each ;
|
||||||
|
|
||||||
CONSTANT: max-texture-size { 256 256 }
|
CONSTANT: max-texture-size { 512 512 }
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: alien alien.c-types arrays assocs byte-arrays io
|
USING: alien alien.c-types arrays assocs byte-arrays io
|
||||||
io.binary io.streams.string kernel math math.parser namespaces
|
io.binary io.streams.string kernel math math.parser namespaces
|
||||||
make parser prettyprint quotations sequences strings vectors
|
make parser quotations sequences strings vectors
|
||||||
words macros math.functions math.bitwise fry generalizations
|
words macros math.functions math.bitwise fry generalizations
|
||||||
combinators.smart io.streams.byte-array io.encodings.binary
|
combinators.smart io.streams.byte-array io.encodings.binary
|
||||||
math.vectors combinators multiline endian ;
|
math.vectors combinators multiline endian ;
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
IN: see.tests
|
||||||
|
USING: see tools.test io.streams.string math ;
|
||||||
|
|
||||||
|
CONSTANT: test-const 10
|
||||||
|
[ "IN: see.tests\nCONSTANT: test-const 10 inline\n" ]
|
||||||
|
[ [ \ test-const see ] with-string-writer ] unit-test
|
||||||
|
|
||||||
|
ALIAS: test-alias +
|
||||||
|
|
||||||
|
[ "USING: math ;\nIN: see.tests\nALIAS: test-alias + inline\n" ]
|
||||||
|
[ [ \ test-alias see ] with-string-writer ] unit-test
|
|
@ -7,7 +7,7 @@ definitions effects generic generic.standard io io.pathnames
|
||||||
io.streams.string io.styles kernel make namespaces prettyprint
|
io.streams.string io.styles kernel make namespaces prettyprint
|
||||||
prettyprint.backend prettyprint.config prettyprint.custom
|
prettyprint.backend prettyprint.config prettyprint.custom
|
||||||
prettyprint.sections sequences sets sorting strings summary
|
prettyprint.sections sequences sets sorting strings summary
|
||||||
words words.symbol ;
|
words words.symbol words.constant words.alias ;
|
||||||
IN: see
|
IN: see
|
||||||
|
|
||||||
GENERIC: synopsis* ( defspec -- )
|
GENERIC: synopsis* ( defspec -- )
|
||||||
|
@ -29,8 +29,16 @@ GENERIC: see* ( defspec -- )
|
||||||
: comment. ( text -- )
|
: comment. ( text -- )
|
||||||
H{ { font-style italic } } styled-text ;
|
H{ { font-style italic } } styled-text ;
|
||||||
|
|
||||||
|
GENERIC: print-stack-effect? ( word -- ? )
|
||||||
|
|
||||||
|
M: parsing-word print-stack-effect? drop f ;
|
||||||
|
M: symbol print-stack-effect? drop f ;
|
||||||
|
M: constant print-stack-effect? drop f ;
|
||||||
|
M: alias print-stack-effect? drop f ;
|
||||||
|
M: word print-stack-effect? drop t ;
|
||||||
|
|
||||||
: stack-effect. ( word -- )
|
: stack-effect. ( word -- )
|
||||||
[ [ parsing-word? ] [ symbol? ] bi or not ] [ stack-effect ] bi and
|
[ print-stack-effect? ] [ stack-effect ] bi and
|
||||||
[ effect>string comment. ] when* ;
|
[ effect>string comment. ] when* ;
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Doug Coleman
|
|
@ -0,0 +1,16 @@
|
||||||
|
! Copyright (C) 2009 Doug Coleman.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: functors kernel math.order sequences sorting ;
|
||||||
|
IN: sorting.functor
|
||||||
|
|
||||||
|
FUNCTOR: define-sorting ( NAME QUOT -- )
|
||||||
|
|
||||||
|
NAME<=> DEFINES ${NAME}<=>
|
||||||
|
NAME>=< DEFINES ${NAME}>=<
|
||||||
|
|
||||||
|
WHERE
|
||||||
|
|
||||||
|
: NAME<=> ( obj1 obj2 -- <=> ) QUOT bi@ <=> ;
|
||||||
|
: NAME>=< ( obj1 obj2 -- >=< ) NAME<=> invert-comparison ;
|
||||||
|
|
||||||
|
;FUNCTOR
|
|
@ -25,46 +25,11 @@ HELP: human>=<
|
||||||
}
|
}
|
||||||
{ $description "Compares two objects using the " { $link human<=> } " word and inverts the result." } ;
|
{ $description "Compares two objects using the " { $link human<=> } " word and inverts the result." } ;
|
||||||
|
|
||||||
HELP: human-compare
|
|
||||||
{ $values
|
|
||||||
{ "obj1" object } { "obj2" object } { "quot" quotation }
|
|
||||||
{ "<=>" "an ordering specifier" }
|
|
||||||
}
|
|
||||||
{ $description "Compares the results of applying the quotation to both objects via <=>." } ;
|
|
||||||
|
|
||||||
HELP: human-sort
|
|
||||||
{ $values
|
|
||||||
{ "seq" sequence }
|
|
||||||
{ "seq'" sequence }
|
|
||||||
}
|
|
||||||
{ $description "Sorts a sequence of objects by comparing the magnitude of any integers in the input string using the <=> word." } ;
|
|
||||||
|
|
||||||
HELP: human-sort-keys
|
|
||||||
{ $values
|
|
||||||
{ "seq" "an alist" }
|
|
||||||
{ "sortedseq" "a new sorted sequence" }
|
|
||||||
}
|
|
||||||
{ $description "Sorts the elements comparing first elements of pairs using the " { $link human<=> } " word." } ;
|
|
||||||
|
|
||||||
HELP: human-sort-values
|
|
||||||
{ $values
|
|
||||||
{ "seq" "an alist" }
|
|
||||||
{ "sortedseq" "a new sorted sequence" }
|
|
||||||
}
|
|
||||||
{ $description "Sorts the elements comparing second elements of pairs using the " { $link human<=> } " word." } ;
|
|
||||||
|
|
||||||
{ <=> >=< human-compare human-sort human-sort-keys human-sort-values } related-words
|
|
||||||
|
|
||||||
ARTICLE: "sorting.human" "Human-friendly sorting"
|
ARTICLE: "sorting.human" "Human-friendly sorting"
|
||||||
"The " { $vocab-link "sorting.human" } " vocabulary sorts by numbers as a human would -- by comparing their magnitudes -- rather than in a lexicographic way. For example, sorting a1, a10, a03, a2 with human sort returns a1, a2, a03, a10, while sorting with natural sort returns a03, a1, a10, a2." $nl
|
"The " { $vocab-link "sorting.human" } " vocabulary sorts by numbers as a human would -- by comparing their magnitudes -- rather than in a lexicographic way. For example, sorting a1, a10, a03, a2 with human sort returns a1, a2, a03, a10, while sorting with natural sort returns a03, a1, a10, a2." $nl
|
||||||
"Comparing two objects:"
|
"Comparing two objects:"
|
||||||
{ $subsection human<=> }
|
{ $subsection human<=> }
|
||||||
{ $subsection human>=< }
|
{ $subsection human>=< }
|
||||||
{ $subsection human-compare }
|
|
||||||
"Sort a sequence:"
|
|
||||||
{ $subsection human-sort }
|
|
||||||
{ $subsection human-sort-keys }
|
|
||||||
{ $subsection human-sort-values }
|
|
||||||
"Splitting a string into substrings and integers:"
|
"Splitting a string into substrings and integers:"
|
||||||
{ $subsection find-numbers } ;
|
{ $subsection find-numbers } ;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
USING: sorting.human tools.test ;
|
USING: sorting.human tools.test sorting.slots ;
|
||||||
IN: sorting.human.tests
|
IN: sorting.human.tests
|
||||||
|
|
||||||
\ human-sort must-infer
|
[ { "x1y" "x2" "x10y" } ] [ { "x1y" "x10y" "x2" } { human<=> } sort-by ] unit-test
|
||||||
|
|
||||||
[ { "x1y" "x2" "x10y" } ] [ { "x1y" "x10y" "x2" } human-sort ] unit-test
|
|
||||||
|
|
|
@ -1,22 +1,9 @@
|
||||||
! Copyright (C) 2008 Doug Coleman, Slava Pestov.
|
! Copyright (C) 2008 Doug Coleman, Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: peg.ebnf math.parser kernel assocs sorting fry
|
USING: math.parser peg.ebnf sorting.functor ;
|
||||||
math.order sequences ascii splitting.monotonic ;
|
|
||||||
IN: sorting.human
|
IN: sorting.human
|
||||||
|
|
||||||
: find-numbers ( string -- seq )
|
: find-numbers ( string -- seq )
|
||||||
[EBNF Result = ([0-9]+ => [[ string>number ]] | (!([0-9]) .)+)* EBNF] ;
|
[EBNF Result = ([0-9]+ => [[ string>number ]] | (!([0-9]) .)+)* EBNF] ;
|
||||||
|
|
||||||
: human<=> ( obj1 obj2 -- <=> ) [ find-numbers ] bi@ <=> ;
|
<< "human" [ find-numbers ] define-sorting >>
|
||||||
|
|
||||||
: human>=< ( obj1 obj2 -- >=< ) human<=> invert-comparison ; inline
|
|
||||||
|
|
||||||
: human-compare ( obj1 obj2 quot -- <=> ) bi@ human<=> ; inline
|
|
||||||
|
|
||||||
: human-sort ( seq -- seq' ) [ human<=> ] sort ;
|
|
||||||
|
|
||||||
: human-sort-keys ( seq -- sortedseq )
|
|
||||||
[ [ first ] human-compare ] sort ;
|
|
||||||
|
|
||||||
: human-sort-values ( seq -- sortedseq )
|
|
||||||
[ [ second ] human-compare ] sort ;
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ HELP: compare-slots
|
||||||
HELP: sort-by-slots
|
HELP: sort-by-slots
|
||||||
{ $values
|
{ $values
|
||||||
{ "seq" sequence } { "sort-specs" "a sequence of accessors ending with a comparator" }
|
{ "seq" sequence } { "sort-specs" "a sequence of accessors ending with a comparator" }
|
||||||
{ "seq'" sequence }
|
{ "sortedseq" sequence }
|
||||||
}
|
}
|
||||||
{ $description "Sorts a sequence of tuples by the sort-specs in " { $snippet "sort-spec" } ". A sort-spec is a sequence of slot accessors ending in a comparator." }
|
{ $description "Sorts a sequence of tuples by the sort-specs in " { $snippet "sort-spec" } ". A sort-spec is a sequence of slot accessors ending in a comparator." }
|
||||||
{ $examples
|
{ $examples
|
||||||
|
@ -39,11 +39,20 @@ HELP: split-by-slots
|
||||||
}
|
}
|
||||||
{ $description "Splits a sequence of tuples into a sequence of slices of tuples that have the same values in all slots in the accessor sequence. This word is only useful for splitting a sorted sequence, but is more efficient than partitioning in such a case." } ;
|
{ $description "Splits a sequence of tuples into a sequence of slices of tuples that have the same values in all slots in the accessor sequence. This word is only useful for splitting a sorted sequence, but is more efficient than partitioning in such a case." } ;
|
||||||
|
|
||||||
|
HELP: sort-by
|
||||||
|
{ $values
|
||||||
|
{ "seq" sequence } { "sort-seq" "a sequence of comparators" }
|
||||||
|
{ "sortedseq" sequence }
|
||||||
|
}
|
||||||
|
{ $description "Sorts a sequence by comparing elements by comparators, using subsequent comparators when there is a tie." } ;
|
||||||
|
|
||||||
ARTICLE: "sorting.slots" "Sorting by slots"
|
ARTICLE: "sorting.slots" "Sorting by slots"
|
||||||
"The " { $vocab-link "sorting.slots" } " vocabulary can sort tuples by slot in ascending or descending order, using subsequent slots as tie-breakers." $nl
|
"The " { $vocab-link "sorting.slots" } " vocabulary can sort tuples by slot in ascending or descending order, using subsequent slots as tie-breakers." $nl
|
||||||
"Comparing two objects by a sequence of slots:"
|
"Comparing two objects by a sequence of slots:"
|
||||||
{ $subsection compare-slots }
|
{ $subsection compare-slots }
|
||||||
"Sorting a sequence by a sequence of slots:"
|
"Sorting a sequence of tuples by a slot/comparator pairs:"
|
||||||
{ $subsection sort-by-slots } ;
|
{ $subsection sort-by-slots }
|
||||||
|
"Sorting a sequence by a sequence of comparators:"
|
||||||
|
{ $subsection sort-by } ;
|
||||||
|
|
||||||
ABOUT: "sorting.slots"
|
ABOUT: "sorting.slots"
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
! Copyright (C) 2009 Doug Coleman.
|
! Copyright (C) 2009 Doug Coleman.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors math.order sorting.slots tools.test
|
USING: accessors math.order sorting.slots tools.test
|
||||||
sorting.human arrays sequences kernel assocs multiline ;
|
sorting.human arrays sequences kernel assocs multiline
|
||||||
|
sorting.functor ;
|
||||||
IN: sorting.literals.tests
|
IN: sorting.literals.tests
|
||||||
|
|
||||||
TUPLE: sort-test a b c tuple2 ;
|
TUPLE: sort-test a b c tuple2 ;
|
||||||
|
@ -76,6 +77,9 @@ TUPLE: tuple2 d ;
|
||||||
[ { } ]
|
[ { } ]
|
||||||
[ { } { { a>> <=> } { b>> >=< } { c>> <=> } } sort-by-slots ] unit-test
|
[ { } { { a>> <=> } { b>> >=< } { c>> <=> } } sort-by-slots ] unit-test
|
||||||
|
|
||||||
|
[ { } ]
|
||||||
|
[ { } { } sort-by-slots ] unit-test
|
||||||
|
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
T{ sort-test { a 6 } { tuple2 T{ tuple2 { d 1 } } } }
|
T{ sort-test { a 6 } { tuple2 T{ tuple2 { d 1 } } } }
|
||||||
|
@ -143,3 +147,15 @@ TUPLE: tuple2 d ;
|
||||||
T{ sort-test { a 5 } { tuple2 T{ tuple2 { d 4 } } } }
|
T{ sort-test { a 5 } { tuple2 T{ tuple2 { d 4 } } } }
|
||||||
} { { tuple2>> d>> } { a>> } } split-by-slots [ >array ] map
|
} { { tuple2>> d>> } { a>> } } split-by-slots [ >array ] map
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
|
|
||||||
|
[ { "a" "b" "c" } ] [ { "b" "c" "a" } { <=> <=> } sort-by ] unit-test
|
||||||
|
[ { "b" "c" "a" } ] [ { "b" "c" "a" } { } sort-by ] unit-test
|
||||||
|
|
||||||
|
<< "length-test" [ length ] define-sorting >>
|
||||||
|
|
||||||
|
[ { { 1 } { 1 2 3 } { 1 3 2 } { 3 2 1 } } ]
|
||||||
|
[
|
||||||
|
{ { 3 2 1 } { 1 2 3 } { 1 3 2 } { 1 } }
|
||||||
|
{ length-test<=> <=> } sort-by
|
||||||
|
] unit-test
|
||||||
|
|
|
@ -7,13 +7,16 @@ IN: sorting.slots
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
|
: short-circuit-comparator ( obj1 obj2 word -- comparator/? )
|
||||||
|
execute dup +eq+ eq? [ drop f ] when ; inline
|
||||||
|
|
||||||
: slot-comparator ( seq -- quot )
|
: slot-comparator ( seq -- quot )
|
||||||
[
|
[
|
||||||
but-last-slice
|
but-last-slice
|
||||||
[ '[ [ _ execute ] bi@ ] ] map concat
|
[ '[ [ _ execute ] bi@ ] ] map concat
|
||||||
] [
|
] [
|
||||||
peek
|
peek
|
||||||
'[ @ _ execute dup +eq+ eq? [ drop f ] when ]
|
'[ @ _ short-circuit-comparator ]
|
||||||
] bi ;
|
] bi ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
@ -22,8 +25,20 @@ MACRO: compare-slots ( sort-specs -- <=> )
|
||||||
#! sort-spec: { accessors comparator }
|
#! sort-spec: { accessors comparator }
|
||||||
[ slot-comparator ] map '[ _ 2|| +eq+ or ] ;
|
[ slot-comparator ] map '[ _ 2|| +eq+ or ] ;
|
||||||
|
|
||||||
: sort-by-slots ( seq sort-specs -- seq' )
|
MACRO: sort-by-slots ( sort-specs -- quot )
|
||||||
'[ _ compare-slots ] sort ;
|
'[ [ _ compare-slots ] sort ] ;
|
||||||
|
|
||||||
|
MACRO: compare-seq ( seq -- quot )
|
||||||
|
[ '[ _ short-circuit-comparator ] ] map '[ _ 2|| +eq+ or ] ;
|
||||||
|
|
||||||
|
MACRO: sort-by ( sort-seq -- quot )
|
||||||
|
'[ [ _ compare-seq ] sort ] ;
|
||||||
|
|
||||||
|
MACRO: sort-keys-by ( sort-seq -- quot )
|
||||||
|
'[ [ first ] bi@ _ compare-seq ] sort ;
|
||||||
|
|
||||||
|
MACRO: sort-values-by ( sort-seq -- quot )
|
||||||
|
'[ [ second ] bi@ _ compare-seq ] sort ;
|
||||||
|
|
||||||
MACRO: split-by-slots ( accessor-seqs -- quot )
|
MACRO: split-by-slots ( accessor-seqs -- quot )
|
||||||
[ [ '[ [ _ execute ] bi@ ] ] map concat [ = ] compose ] map
|
[ [ '[ [ _ execute ] bi@ ] ] map concat [ = ] compose ] map
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Doug Coleman
|
|
@ -0,0 +1,40 @@
|
||||||
|
! Copyright (C) 2009 Doug Coleman.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: tools.test sorting.title sorting.slots ;
|
||||||
|
IN: sorting.title.tests
|
||||||
|
|
||||||
|
: sort-me ( -- seq )
|
||||||
|
{
|
||||||
|
"The Beatles"
|
||||||
|
"A river runs through it"
|
||||||
|
"Another"
|
||||||
|
"la vida loca"
|
||||||
|
"Basketball"
|
||||||
|
"racquetball"
|
||||||
|
"Los Fujis"
|
||||||
|
"los Fujis"
|
||||||
|
"La cucaracha"
|
||||||
|
"a day to remember"
|
||||||
|
"of mice and men"
|
||||||
|
"on belay"
|
||||||
|
"for the horde"
|
||||||
|
} ;
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"Another"
|
||||||
|
"Basketball"
|
||||||
|
"The Beatles"
|
||||||
|
"La cucaracha"
|
||||||
|
"a day to remember"
|
||||||
|
"for the horde"
|
||||||
|
"Los Fujis"
|
||||||
|
"los Fujis"
|
||||||
|
"of mice and men"
|
||||||
|
"on belay"
|
||||||
|
"racquetball"
|
||||||
|
"A river runs through it"
|
||||||
|
"la vida loca"
|
||||||
|
}
|
||||||
|
] [
|
||||||
|
sort-me { title<=> } sort-by
|
||||||
|
] unit-test
|
|
@ -0,0 +1,7 @@
|
||||||
|
! Copyright (C) 2009 Doug Coleman.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: sorting.functor regexp kernel accessors sequences
|
||||||
|
unicode.case ;
|
||||||
|
IN: sorting.title
|
||||||
|
|
||||||
|
<< "title" [ >lower dup R/ ^(the|a|an|el|la|los|las|il) / first-match [ to>> tail-slice ] when* ] define-sorting >>
|
|
@ -605,6 +605,8 @@ M: object infer-call*
|
||||||
|
|
||||||
\ fflush { alien } { } define-primitive
|
\ fflush { alien } { } define-primitive
|
||||||
|
|
||||||
|
\ fseek { alien integer integer } { } define-primitive
|
||||||
|
|
||||||
\ fclose { alien } { } define-primitive
|
\ fclose { alien } { } define-primitive
|
||||||
|
|
||||||
\ <wrapper> { object } { wrapper } define-primitive
|
\ <wrapper> { object } { wrapper } define-primitive
|
||||||
|
|
|
@ -42,11 +42,12 @@ IN: tools.deploy.macosx
|
||||||
|
|
||||||
: create-app-dir ( vocab bundle-name -- vm )
|
: create-app-dir ( vocab bundle-name -- vm )
|
||||||
[
|
[
|
||||||
nip
|
nip {
|
||||||
[ copy-dll ]
|
[ copy-dll ]
|
||||||
[ copy-nib ]
|
[ copy-nib ]
|
||||||
[ "Contents/Resources" append-path make-directories ]
|
[ "Contents/Resources" append-path make-directories ]
|
||||||
tri
|
[ "Contents/Resources" copy-theme ]
|
||||||
|
} cleave
|
||||||
]
|
]
|
||||||
[ create-app-plist ]
|
[ create-app-plist ]
|
||||||
[ "Contents/MacOS/" append-path copy-vm ] 2tri
|
[ "Contents/MacOS/" append-path copy-vm ] 2tri
|
||||||
|
|
|
@ -157,7 +157,8 @@ IN: tools.deploy.shaker
|
||||||
"specializer"
|
"specializer"
|
||||||
"step-into"
|
"step-into"
|
||||||
"step-into?"
|
"step-into?"
|
||||||
"superclass"
|
! UI needs this
|
||||||
|
! "superclass"
|
||||||
"transform-n"
|
"transform-n"
|
||||||
"transform-quot"
|
"transform-quot"
|
||||||
"tuple-dispatch-generic"
|
"tuple-dispatch-generic"
|
||||||
|
@ -276,7 +277,6 @@ IN: tools.deploy.shaker
|
||||||
lexer-factory
|
lexer-factory
|
||||||
print-use-hook
|
print-use-hook
|
||||||
root-cache
|
root-cache
|
||||||
vocab-roots
|
|
||||||
vocabs:dictionary
|
vocabs:dictionary
|
||||||
vocabs:load-vocab-hook
|
vocabs:load-vocab-hook
|
||||||
word
|
word
|
||||||
|
|
|
@ -9,11 +9,6 @@ IN: tools.deploy.windows
|
||||||
: copy-dll ( bundle-name -- )
|
: copy-dll ( bundle-name -- )
|
||||||
"resource:factor.dll" swap copy-file-into ;
|
"resource:factor.dll" swap copy-file-into ;
|
||||||
|
|
||||||
: copy-pango ( bundle-name -- )
|
|
||||||
"resource:build-support/dlls.txt" ascii file-lines
|
|
||||||
[ "resource:" prepend-path ] map
|
|
||||||
swap copy-files-into ;
|
|
||||||
|
|
||||||
:: copy-vm ( executable bundle-name extension -- vm )
|
:: copy-vm ( executable bundle-name extension -- vm )
|
||||||
vm "." split1-last drop extension append
|
vm "." split1-last drop extension append
|
||||||
bundle-name executable ".exe" append append-path
|
bundle-name executable ".exe" append append-path
|
||||||
|
@ -22,9 +17,7 @@ IN: tools.deploy.windows
|
||||||
: create-exe-dir ( vocab bundle-name -- vm )
|
: create-exe-dir ( vocab bundle-name -- vm )
|
||||||
dup copy-dll
|
dup copy-dll
|
||||||
deploy-ui? get [
|
deploy-ui? get [
|
||||||
[ copy-pango ]
|
[ "" copy-theme ] [ ".exe" copy-vm ] bi
|
||||||
[ "" copy-theme ]
|
|
||||||
[ ".exe" copy-vm ] tri
|
|
||||||
] [ ".com" copy-vm ] if ;
|
] [ ".com" copy-vm ] if ;
|
||||||
|
|
||||||
M: winnt deploy*
|
M: winnt deploy*
|
||||||
|
|
|
@ -29,6 +29,6 @@ HOOK: offscreen-pixels ui-backend ( world -- alien w h )
|
||||||
|
|
||||||
: with-gl-context ( handle quot -- )
|
: with-gl-context ( handle quot -- )
|
||||||
swap [ select-gl-context call ] keep
|
swap [ select-gl-context call ] keep
|
||||||
glFlush flush-gl-context gl-error ; inline
|
flush-gl-context gl-error ; inline
|
||||||
|
|
||||||
HOOK: (with-ui) ui-backend ( quot -- )
|
HOOK: (with-ui) ui-backend ( quot -- )
|
|
@ -1,16 +1,16 @@
|
||||||
! Copyright (C) 2005, 2006 Doug Coleman.
|
! Copyright (C) 2005, 2006 Doug Coleman.
|
||||||
! Portions copyright (C) 2007, 2009 Slava Pestov.
|
! Portions copyright (C) 2007, 2009 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: alien alien.c-types alien.strings arrays assocs ui
|
USING: alien alien.c-types alien.strings arrays assocs ui ui.private
|
||||||
ui.private ui.gadgets ui.gadgets.private ui.backend
|
ui.gadgets ui.gadgets.private ui.backend ui.clipboards
|
||||||
ui.clipboards ui.gadgets.worlds ui.gestures ui.event-loop io
|
ui.gadgets.worlds ui.gestures ui.event-loop io kernel math
|
||||||
kernel math math.vectors namespaces make sequences strings
|
math.vectors namespaces make sequences strings vectors words
|
||||||
vectors words windows.kernel32 windows.gdi32 windows.user32
|
windows.kernel32 windows.gdi32 windows.user32 windows.opengl32
|
||||||
windows.opengl32 windows.messages windows.types windows.nt
|
windows.messages windows.types windows.offscreen windows.nt windows
|
||||||
windows threads libc combinators fry combinators.short-circuit
|
threads libc combinators fry combinators.short-circuit continuations
|
||||||
continuations command-line shuffle opengl ui.render ascii
|
command-line shuffle opengl ui.render ascii math.bitwise locals
|
||||||
math.bitwise locals accessors math.rectangles math.order ascii
|
accessors math.rectangles math.order ascii calendar
|
||||||
calendar io.encodings.utf16n ;
|
io.encodings.utf16n ;
|
||||||
IN: ui.backend.windows
|
IN: ui.backend.windows
|
||||||
|
|
||||||
SINGLETON: windows-ui-backend
|
SINGLETON: windows-ui-backend
|
||||||
|
@ -433,12 +433,7 @@ M: windows-ui-backend do-events
|
||||||
style 0 ex-style AdjustWindowRectEx win32-error=0/f ;
|
style 0 ex-style AdjustWindowRectEx win32-error=0/f ;
|
||||||
|
|
||||||
: make-RECT ( world -- RECT )
|
: make-RECT ( world -- RECT )
|
||||||
[ window-loc>> dup ] [ dim>> ] bi v+
|
[ window-loc>> ] [ dim>> ] bi <RECT> ;
|
||||||
"RECT" <c-object>
|
|
||||||
over first over set-RECT-right
|
|
||||||
swap second over set-RECT-bottom
|
|
||||||
over first over set-RECT-left
|
|
||||||
swap second over set-RECT-top ;
|
|
||||||
|
|
||||||
: default-position-RECT ( RECT -- )
|
: default-position-RECT ( RECT -- )
|
||||||
dup get-RECT-dimensions [ 2drop ] 2dip
|
dup get-RECT-dimensions [ 2drop ] 2dip
|
||||||
|
@ -501,35 +496,12 @@ M: windows-ui-backend (open-window) ( world -- )
|
||||||
hWnd>> show-window ;
|
hWnd>> show-window ;
|
||||||
|
|
||||||
M: win-base select-gl-context ( handle -- )
|
M: win-base select-gl-context ( handle -- )
|
||||||
[ hDC>> ] keep hRC>> wglMakeCurrent win32-error=0/f
|
[ hDC>> ] [ hRC>> ] bi wglMakeCurrent win32-error=0/f
|
||||||
GdiFlush drop ;
|
GdiFlush drop ;
|
||||||
|
|
||||||
M: win-base flush-gl-context ( handle -- )
|
M: win-base flush-gl-context ( handle -- )
|
||||||
hDC>> SwapBuffers win32-error=0/f ;
|
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 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
|
|
||||||
dup rot (bitmap-info) DIB_RGB_COLORS f <void*>
|
|
||||||
[ f 0 CreateDIBSection ] keep *void*
|
|
||||||
[ 2dup SelectObject drop ] dip ;
|
|
||||||
|
|
||||||
: setup-offscreen-gl ( dim -- hDC hRC hBitmap bits )
|
: setup-offscreen-gl ( dim -- hDC hRC hBitmap bits )
|
||||||
make-offscreen-dc-and-bitmap [
|
make-offscreen-dc-and-bitmap [
|
||||||
[ dup offscreen-pfd-dwFlags setup-pixel-format ]
|
[ dup offscreen-pfd-dwFlags setup-pixel-format ]
|
||||||
|
@ -548,13 +520,12 @@ M: windows-ui-backend (close-offscreen-buffer) ( handle -- )
|
||||||
! each pixel; it's left as zero
|
! each pixel; it's left as zero
|
||||||
|
|
||||||
: (make-opaque) ( byte-array -- byte-array' )
|
: (make-opaque) ( byte-array -- byte-array' )
|
||||||
[ length 4 / ]
|
[ length 4 /i ]
|
||||||
[ '[ 255 swap 4 * 3 + _ set-nth ] each ]
|
[ '[ 255 swap 4 * 3 + _ set-nth ] each ]
|
||||||
[ ] tri ;
|
[ ] tri ;
|
||||||
|
|
||||||
: (opaque-pixels) ( world -- pixels )
|
: (opaque-pixels) ( world -- pixels )
|
||||||
[ handle>> bits>> ] [ dim>> first2 * 4 * ] bi
|
[ handle>> bits>> ] [ dim>> ] bi bitmap>byte-array (make-opaque) ;
|
||||||
memory>byte-array (make-opaque) ;
|
|
||||||
|
|
||||||
M: windows-ui-backend offscreen-pixels ( world -- alien w h )
|
M: windows-ui-backend offscreen-pixels ( world -- alien w h )
|
||||||
[ (opaque-pixels) ] [ dim>> first2 ] bi ;
|
[ (opaque-pixels) ] [ dim>> first2 ] bi ;
|
||||||
|
|
|
@ -141,7 +141,7 @@ M: editor ungraft*
|
||||||
: scroll>caret ( editor -- )
|
: scroll>caret ( editor -- )
|
||||||
dup graft-state>> second [
|
dup graft-state>> second [
|
||||||
[
|
[
|
||||||
[ caret-loc ] [ caret-dim { 1 0 } v+ ] bi <rect>
|
[ caret-loc ] [ caret-dim { 2 1 } v+ ] bi <rect>
|
||||||
] keep scroll>rect
|
] keep scroll>rect
|
||||||
] [ drop ] if ;
|
] [ drop ] if ;
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,9 @@ M: line-gadget line-height font>> font-metrics height>> ceiling ;
|
||||||
: validate-line ( m gadget -- n )
|
: validate-line ( m gadget -- n )
|
||||||
control-value [ drop f ] [ length 1- min 0 max ] if-empty ;
|
control-value [ drop f ] [ length 1- min 0 max ] if-empty ;
|
||||||
|
|
||||||
|
: valid-line? ( n gadget -- ? )
|
||||||
|
control-value length 1- 0 swap between? ;
|
||||||
|
|
||||||
: visible-line ( gadget quot -- n )
|
: visible-line ( gadget quot -- n )
|
||||||
'[
|
'[
|
||||||
[ clip get @ origin get [ second ] bi@ - ] dip
|
[ clip get @ origin get [ second ] bi@ - ] dip
|
||||||
|
|
|
@ -11,11 +11,11 @@ HELP: find-scroller
|
||||||
{ $values { "gadget" gadget } { "scroller/f" { $maybe scroller } } }
|
{ $values { "gadget" gadget } { "scroller/f" { $maybe scroller } } }
|
||||||
{ $description "Finds the first parent of " { $snippet "gadget" } " which is a " { $link scroller } ". Outputs " { $link f } " if the gadget is not contained in a " { $link scroller } "." } ;
|
{ $description "Finds the first parent of " { $snippet "gadget" } " which is a " { $link scroller } ". Outputs " { $link f } " if the gadget is not contained in a " { $link scroller } "." } ;
|
||||||
|
|
||||||
HELP: scroller-value
|
HELP: scroll-position
|
||||||
{ $values { "scroller" scroller } { "loc" "a pair of integers" } }
|
{ $values { "scroller" scroller } { "loc" "a pair of integers" } }
|
||||||
{ $description "Outputs the offset of the top-left corner of the scroller's " { $link viewport } "'s child." } ;
|
{ $description "Outputs the offset of the top-left corner of the scroller's " { $link viewport } "'s child." } ;
|
||||||
|
|
||||||
{ scroller-value scroll scroll>bottom scroll>top scroll>rect } related-words
|
{ scroll-position set-scroll-position scroll>bottom scroll>top scroll>rect } related-words
|
||||||
|
|
||||||
HELP: <scroller>
|
HELP: <scroller>
|
||||||
{ $values { "gadget" gadget } { "scroller" "a new " { $link scroller } } }
|
{ $values { "gadget" gadget } { "scroller" "a new " { $link scroller } } }
|
||||||
|
@ -23,7 +23,7 @@ HELP: <scroller>
|
||||||
|
|
||||||
{ <viewport> <scroller> } related-words
|
{ <viewport> <scroller> } related-words
|
||||||
|
|
||||||
HELP: scroll
|
HELP: set-scroll-position
|
||||||
{ $values { "scroller" scroller } { "value" "a pair of integers" } }
|
{ $values { "scroller" scroller } { "value" "a pair of integers" } }
|
||||||
{ $description "Sets the offset of the top-left corner of the scroller's " { $link viewport } "'s child." } ;
|
{ $description "Sets the offset of the top-left corner of the scroller's " { $link viewport } "'s child." } ;
|
||||||
|
|
||||||
|
@ -48,8 +48,8 @@ ARTICLE: "ui.gadgets.scrollers" "Scroller gadgets"
|
||||||
{ $subsection scroller }
|
{ $subsection scroller }
|
||||||
{ $subsection <scroller> }
|
{ $subsection <scroller> }
|
||||||
"Getting and setting the scroll position:"
|
"Getting and setting the scroll position:"
|
||||||
{ $subsection scroller-value }
|
{ $subsection scroll-position }
|
||||||
{ $subsection scroll }
|
{ $subsection set-scroll-position }
|
||||||
"Writing scrolling-aware gadgets:"
|
"Writing scrolling-aware gadgets:"
|
||||||
{ $subsection scroll>bottom }
|
{ $subsection scroll>bottom }
|
||||||
{ $subsection scroll>top }
|
{ $subsection scroll>top }
|
||||||
|
|
|
@ -45,13 +45,13 @@ IN: ui.gadgets.scrollers.tests
|
||||||
|
|
||||||
[ { 100 100 } ] [ "s" get viewport>> gadget-child pref-dim ] unit-test
|
[ { 100 100 } ] [ "s" get viewport>> gadget-child pref-dim ] unit-test
|
||||||
|
|
||||||
[ ] [ { 0 0 } "s" get scroll ] unit-test
|
[ ] [ { 0 0 } "s" get set-scroll-position ] unit-test
|
||||||
|
|
||||||
[ { 0 0 } ] [ "s" get model>> range-min-value ] unit-test
|
[ { 0 0 } ] [ "s" get model>> range-min-value ] unit-test
|
||||||
|
|
||||||
[ { 100 100 } ] [ "s" get model>> range-max-value ] unit-test
|
[ { 100 100 } ] [ "s" get model>> range-max-value ] unit-test
|
||||||
|
|
||||||
[ ] [ { 10 20 } "s" get scroll ] unit-test
|
[ ] [ { 10 20 } "s" get set-scroll-position ] unit-test
|
||||||
|
|
||||||
[ { 10 20 } ] [ "s" get model>> range-value ] unit-test
|
[ { 10 20 } ] [ "s" get model>> range-value ] unit-test
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ dup layout
|
||||||
drop
|
drop
|
||||||
"g2" get scroll>gadget
|
"g2" get scroll>gadget
|
||||||
"s" get layout
|
"s" get layout
|
||||||
"s" get scroller-value
|
"s" get scroll-position
|
||||||
] map [ { 0 0 } = ] all?
|
] map [ { 0 0 } = ] all?
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,13 @@ M: gadget viewport-column-header drop f ;
|
||||||
|
|
||||||
: scroll-down-line ( scroller -- ) y>> 1 swap slide-by-line ;
|
: scroll-down-line ( scroller -- ) y>> 1 swap slide-by-line ;
|
||||||
|
|
||||||
|
: set-scroll-position ( value scroller -- )
|
||||||
|
[
|
||||||
|
viewport>> [ dim>> { 0 0 } ] [ gadget-child pref-dim ] bi
|
||||||
|
4array flip
|
||||||
|
] keep
|
||||||
|
2dup control-value = [ 2drop ] [ set-control-value ] if ;
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: do-mouse-scroll ( scroller -- )
|
: do-mouse-scroll ( scroller -- )
|
||||||
|
@ -46,21 +53,14 @@ scroller H{
|
||||||
|
|
||||||
M: viewport pref-dim* gadget-child pref-viewport-dim ;
|
M: viewport pref-dim* gadget-child pref-viewport-dim ;
|
||||||
|
|
||||||
: scroll ( value scroller -- )
|
|
||||||
[
|
|
||||||
viewport>> [ dim>> { 0 0 } ] [ gadget-child pref-dim ] bi
|
|
||||||
4array flip
|
|
||||||
] keep
|
|
||||||
2dup control-value = [ 2drop ] [ set-control-value ] if ;
|
|
||||||
|
|
||||||
: (scroll>rect) ( rect scroller -- )
|
: (scroll>rect) ( rect scroller -- )
|
||||||
[ [ loc>> ] [ dim>> { 1 1 } v+ ] bi <rect> ] dip
|
|
||||||
{
|
{
|
||||||
[ scroller-value vneg offset-rect ]
|
[ scroll-position vneg offset-rect ]
|
||||||
[ viewport>> dim>> rect-min ]
|
[ viewport>> dim>> rect-min ]
|
||||||
|
[ viewport>> loc>> offset-rect ]
|
||||||
[ viewport>> [ v- { 0 0 } vmin ] [ v- { 0 0 } vmax ] with-rect-extents v+ ]
|
[ viewport>> [ v- { 0 0 } vmin ] [ v- { 0 0 } vmax ] with-rect-extents v+ ]
|
||||||
[ scroller-value v+ ]
|
[ scroll-position v+ ]
|
||||||
[ scroll ]
|
[ set-scroll-position ]
|
||||||
} cleave ;
|
} cleave ;
|
||||||
|
|
||||||
: relative-scroll-rect ( rect gadget scroller -- newrect )
|
: relative-scroll-rect ( rect gadget scroller -- newrect )
|
||||||
|
@ -72,7 +72,7 @@ M: viewport pref-dim* gadget-child pref-viewport-dim ;
|
||||||
2&& ;
|
2&& ;
|
||||||
|
|
||||||
: (update-scroller) ( scroller -- )
|
: (update-scroller) ( scroller -- )
|
||||||
[ scroller-value ] keep scroll ;
|
[ scroll-position ] keep set-scroll-position ;
|
||||||
|
|
||||||
: (scroll>gadget) ( gadget scroller -- )
|
: (scroll>gadget) ( gadget scroller -- )
|
||||||
2dup swap child? [
|
2dup swap child? [
|
||||||
|
@ -82,7 +82,8 @@ M: viewport pref-dim* gadget-child pref-viewport-dim ;
|
||||||
] [ f >>follows (update-scroller) drop ] if ;
|
] [ f >>follows (update-scroller) drop ] if ;
|
||||||
|
|
||||||
: (scroll>bottom) ( scroller -- )
|
: (scroll>bottom) ( scroller -- )
|
||||||
[ viewport>> gadget-child pref-dim { 0 1 } v* ] keep scroll ;
|
[ viewport>> gadget-child pref-dim { 0 1 } v* ] keep
|
||||||
|
set-scroll-position ;
|
||||||
|
|
||||||
GENERIC: update-scroller ( scroller follows -- )
|
GENERIC: update-scroller ( scroller follows -- )
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
IN: ui.gadgets.search-tables.tests
|
||||||
|
USING: ui.gadgets.search-tables sequences tools.test ;
|
||||||
|
[ [ second ] <search-table> ] must-infer
|
|
@ -28,6 +28,7 @@ TUPLE: search-field < track field ;
|
||||||
|
|
||||||
: <search-field> ( model -- gadget )
|
: <search-field> ( model -- gadget )
|
||||||
horizontal search-field new-track
|
horizontal search-field new-track
|
||||||
|
0 >>fill
|
||||||
{ 5 5 } >>gap
|
{ 5 5 } >>gap
|
||||||
+baseline+ >>align
|
+baseline+ >>align
|
||||||
swap <model-field> 10 >>min-cols >>field
|
swap <model-field> 10 >>min-cols >>field
|
||||||
|
|
|
@ -268,12 +268,13 @@ M: table model-changed
|
||||||
: mouse-row ( table -- n )
|
: mouse-row ( table -- n )
|
||||||
[ hand-rel second ] keep y>line ;
|
[ hand-rel second ] keep y>line ;
|
||||||
|
|
||||||
|
: if-mouse-row ( table true: ( table mouse-index -- ) false: ( table -- ) -- )
|
||||||
|
[ [ mouse-row ] keep 2dup valid-line? ]
|
||||||
|
[ ] [ '[ nip @ ] ] tri* if ; inline
|
||||||
|
|
||||||
: table-button-down ( table -- )
|
: table-button-down ( table -- )
|
||||||
dup takes-focus?>> [ dup request-focus ] when
|
dup takes-focus?>> [ dup request-focus ] when
|
||||||
dup control-value empty? [ drop ] [
|
[ swap [ >>mouse-index ] [ (select-row) ] bi ] [ drop ] if-mouse-row ;
|
||||||
dup [ mouse-row ] keep validate-line
|
|
||||||
[ >>mouse-index ] [ (select-row) ] bi
|
|
||||||
] if ;
|
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
@ -283,11 +284,14 @@ PRIVATE>
|
||||||
[ 2drop ]
|
[ 2drop ]
|
||||||
if ;
|
if ;
|
||||||
|
|
||||||
|
: row-action? ( table -- ? )
|
||||||
|
[ [ mouse-row ] keep valid-line? ]
|
||||||
|
[ single-click?>> hand-click# get 2 = or ] bi and ;
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: table-button-up ( table -- )
|
: table-button-up ( table -- )
|
||||||
dup single-click?>> hand-click# get 2 = or
|
dup row-action? [ row-action ] [ update-selected-value ] if ;
|
||||||
[ row-action ] [ update-selected-value ] if ;
|
|
||||||
|
|
||||||
: select-row ( table n -- )
|
: select-row ( table n -- )
|
||||||
over validate-line
|
over validate-line
|
||||||
|
@ -320,13 +324,6 @@ PRIVATE>
|
||||||
: next-page ( table -- )
|
: next-page ( table -- )
|
||||||
1 prev/next-page ;
|
1 prev/next-page ;
|
||||||
|
|
||||||
: valid-row? ( row table -- ? )
|
|
||||||
control-value length 1- 0 swap between? ;
|
|
||||||
|
|
||||||
: if-mouse-row ( table true false -- )
|
|
||||||
[ [ mouse-row ] keep 2dup valid-row? ]
|
|
||||||
[ ] [ '[ nip @ ] ] tri* if ; inline
|
|
||||||
|
|
||||||
: show-mouse-help ( table -- )
|
: show-mouse-help ( table -- )
|
||||||
[
|
[
|
||||||
swap
|
swap
|
||||||
|
|
|
@ -23,7 +23,7 @@ M: viewport layout*
|
||||||
M: viewport focusable-child*
|
M: viewport focusable-child*
|
||||||
gadget-child ;
|
gadget-child ;
|
||||||
|
|
||||||
: scroller-value ( scroller -- loc )
|
: scroll-position ( scroller -- loc )
|
||||||
model>> range-value [ >integer ] map ;
|
model>> range-value [ >integer ] map ;
|
||||||
|
|
||||||
M: viewport model-changed
|
M: viewport model-changed
|
||||||
|
@ -31,7 +31,7 @@ M: viewport model-changed
|
||||||
[ relayout-1 ]
|
[ relayout-1 ]
|
||||||
[
|
[
|
||||||
[ gadget-child ]
|
[ gadget-child ]
|
||||||
[ scroller-value vneg ]
|
[ scroll-position vneg ]
|
||||||
[ constraint>> ]
|
[ constraint>> ]
|
||||||
tri v* >>loc drop
|
tri v* >>loc drop
|
||||||
] bi ;
|
] bi ;
|
||||||
|
|
|
@ -10,9 +10,6 @@ IN: ui.text.core-text
|
||||||
|
|
||||||
SINGLETON: core-text-renderer
|
SINGLETON: core-text-renderer
|
||||||
|
|
||||||
M: core-text-renderer init-text-rendering
|
|
||||||
<cache-assoc> >>text-handle drop ;
|
|
||||||
|
|
||||||
M: core-text-renderer string-dim
|
M: core-text-renderer string-dim
|
||||||
[ " " string-dim { 0 1 } v* ]
|
[ " " string-dim { 0 1 } v* ]
|
||||||
[ cached-line dim>> ]
|
[ cached-line dim>> ]
|
||||||
|
@ -22,9 +19,9 @@ M: core-text-renderer flush-layout-cache
|
||||||
cached-lines get purge-cache ;
|
cached-lines get purge-cache ;
|
||||||
|
|
||||||
: rendered-line ( font string -- texture )
|
: rendered-line ( font string -- texture )
|
||||||
world get world-text-handle
|
world get world-text-handle [
|
||||||
[ cached-line [ image>> ] [ loc>> ] bi <texture> ]
|
cached-line [ image>> ] [ loc>> ] bi <texture>
|
||||||
2cache ;
|
] 2cache ;
|
||||||
|
|
||||||
M: core-text-renderer draw-string ( font string -- )
|
M: core-text-renderer draw-string ( font string -- )
|
||||||
rendered-line draw-texture ;
|
rendered-line draw-texture ;
|
||||||
|
|
|
@ -7,9 +7,6 @@ IN: ui.text.pango
|
||||||
|
|
||||||
SINGLETON: pango-renderer
|
SINGLETON: pango-renderer
|
||||||
|
|
||||||
M: pango-renderer init-text-rendering
|
|
||||||
<cache-assoc> >>text-handle drop ;
|
|
||||||
|
|
||||||
M: pango-renderer string-dim
|
M: pango-renderer string-dim
|
||||||
[ " " string-dim { 0 1 } v* ]
|
[ " " string-dim { 0 1 } v* ]
|
||||||
[ cached-layout logical-rect>> dim>> [ >integer ] map ] if-empty ;
|
[ cached-layout logical-rect>> dim>> [ >integer ] map ] if-empty ;
|
||||||
|
@ -18,9 +15,9 @@ M: pango-renderer flush-layout-cache
|
||||||
cached-layouts get purge-cache ;
|
cached-layouts get purge-cache ;
|
||||||
|
|
||||||
: rendered-layout ( font string -- texture )
|
: rendered-layout ( font string -- texture )
|
||||||
world get world-text-handle
|
world get world-text-handle [
|
||||||
[ cached-layout [ image>> ] [ text-position vneg ] bi <texture> ]
|
cached-layout [ image>> ] [ text-position vneg ] bi <texture>
|
||||||
2cache ;
|
] 2cache ;
|
||||||
|
|
||||||
M: pango-renderer draw-string ( font string -- )
|
M: pango-renderer draw-string ( font string -- )
|
||||||
rendered-layout draw-texture ;
|
rendered-layout draw-texture ;
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
UI text rendering implementation using cross-platform Pango library
|
|
@ -1,6 +1,22 @@
|
||||||
! Copyright (C) 2009 Slava Pestov.
|
! Copyright (C) 2009 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: tools.test ui.text fonts ;
|
USING: tools.test ui.text fonts math accessors kernel sequences ;
|
||||||
IN: ui.text.tests
|
IN: ui.text.tests
|
||||||
|
|
||||||
[ 0.0 ] [ 0 sans-serif-font "aaa" offset>x ] unit-test
|
[ t ] [ 0 sans-serif-font "aaa" offset>x zero? ] unit-test
|
||||||
|
[ t ] [ 1 sans-serif-font "aaa" offset>x 0.0 > ] unit-test
|
||||||
|
[ t ] [ 3 sans-serif-font "aaa" offset>x 0.0 > ] unit-test
|
||||||
|
[ t ] [ 1 monospace-font "a" offset>x 0.0 > ] unit-test
|
||||||
|
[ 0 ] [ 0 sans-serif-font "aaa" x>offset ] unit-test
|
||||||
|
[ 3 ] [ 100 sans-serif-font "aaa" x>offset ] unit-test
|
||||||
|
[ 0 ] [ 0 sans-serif-font "" x>offset ] unit-test
|
||||||
|
|
||||||
|
[ t ] [
|
||||||
|
sans-serif-font "aaa" line-metrics
|
||||||
|
[ [ ascent>> ] [ descent>> ] bi + ] [ height>> ] bi =
|
||||||
|
] unit-test
|
||||||
|
|
||||||
|
[ f ] [ sans-serif-font "\0a" text-dim first zero? ] unit-test
|
||||||
|
[ t ] [ sans-serif-font "" text-dim first zero? ] unit-test
|
||||||
|
|
||||||
|
[ f ] [ sans-serif-font font-metrics height>> zero? ] unit-test
|
||||||
|
|
|
@ -1,17 +1,16 @@
|
||||||
! Copyright (C) 2009 Slava Pestov.
|
! Copyright (C) 2009 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel arrays sequences math math.order opengl opengl.gl
|
USING: kernel arrays sequences math math.order cache opengl
|
||||||
strings fonts colors accessors namespaces ui.gadgets.worlds ;
|
opengl.gl strings fonts colors accessors namespaces
|
||||||
|
ui.gadgets.worlds ;
|
||||||
IN: ui.text
|
IN: ui.text
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
SYMBOL: font-renderer
|
SYMBOL: font-renderer
|
||||||
|
|
||||||
HOOK: init-text-rendering font-renderer ( world -- )
|
|
||||||
|
|
||||||
: world-text-handle ( world -- handle )
|
: world-text-handle ( world -- handle )
|
||||||
dup text-handle>> [ dup init-text-rendering ] unless
|
dup text-handle>> [ <cache-assoc> >>text-handle ] unless
|
||||||
text-handle>> ;
|
text-handle>> ;
|
||||||
|
|
||||||
HOOK: flush-layout-cache font-renderer ( -- )
|
HOOK: flush-layout-cache font-renderer ( -- )
|
||||||
|
@ -67,7 +66,7 @@ M: string draw-text draw-string ;
|
||||||
M: selection draw-text draw-string ;
|
M: selection draw-text draw-string ;
|
||||||
|
|
||||||
M: array draw-text
|
M: array draw-text
|
||||||
GL_MODELVIEW [
|
[
|
||||||
[
|
[
|
||||||
[ draw-string ]
|
[ draw-string ]
|
||||||
[ [ 0.0 ] 2dip string-height 0.0 glTranslated ] 2bi
|
[ [ 0.0 ] 2dip string-height 0.0 glTranslated ] 2bi
|
||||||
|
@ -79,7 +78,7 @@ USING: vocabs.loader namespaces system combinators ;
|
||||||
"ui-backend" get [
|
"ui-backend" get [
|
||||||
{
|
{
|
||||||
{ [ os macosx? ] [ "core-text" ] }
|
{ [ os macosx? ] [ "core-text" ] }
|
||||||
{ [ os windows? ] [ "pango" ] }
|
{ [ os windows? ] [ "uniscribe" ] }
|
||||||
{ [ os unix? ] [ "pango" ] }
|
{ [ os unix? ] [ "pango" ] }
|
||||||
} cond
|
} cond
|
||||||
] unless* "ui.text." prepend require
|
] unless* "ui.text." prepend require
|
|
@ -0,0 +1 @@
|
||||||
|
Slava Pestov
|
|
@ -0,0 +1 @@
|
||||||
|
UI text rendering implementation using the MS Windows Uniscribe library
|
|
@ -0,0 +1 @@
|
||||||
|
unportable
|
|
@ -0,0 +1,42 @@
|
||||||
|
! Copyright (C) 2009 Slava Pestov.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: accessors assocs cache kernel math math.vectors sequences fonts
|
||||||
|
namespaces opengl.textures ui.text ui.text.private ui.gadgets.worlds
|
||||||
|
windows.uniscribe ;
|
||||||
|
IN: ui.text.uniscribe
|
||||||
|
|
||||||
|
SINGLETON: uniscribe-renderer
|
||||||
|
|
||||||
|
M: uniscribe-renderer string-dim
|
||||||
|
[ " " string-dim { 0 1 } v* ]
|
||||||
|
[ cached-script-string size>> ] if-empty ;
|
||||||
|
|
||||||
|
M: uniscribe-renderer flush-layout-cache
|
||||||
|
cached-script-strings get purge-cache ;
|
||||||
|
|
||||||
|
: rendered-script-string ( font string -- texture )
|
||||||
|
world get world-text-handle
|
||||||
|
[ cached-script-string image>> { 0 0 } <texture> ]
|
||||||
|
2cache ;
|
||||||
|
|
||||||
|
M: uniscribe-renderer draw-string ( font string -- )
|
||||||
|
dup dup selection? [ string>> ] when empty?
|
||||||
|
[ 2drop ] [ rendered-script-string draw-texture ] if ;
|
||||||
|
|
||||||
|
M: uniscribe-renderer x>offset ( x font string -- n )
|
||||||
|
[ 2drop 0 ] [
|
||||||
|
cached-script-string x>line-offset 0 = [ 1+ ] unless
|
||||||
|
] if-empty ;
|
||||||
|
|
||||||
|
M: uniscribe-renderer offset>x ( n font string -- x )
|
||||||
|
[ 2drop 0 ] [ cached-script-string line-offset>x ] if-empty ;
|
||||||
|
|
||||||
|
M: uniscribe-renderer font-metrics ( font -- metrics )
|
||||||
|
" " cached-script-string metrics>> clone f >>width ;
|
||||||
|
|
||||||
|
M: uniscribe-renderer line-metrics ( font string -- metrics )
|
||||||
|
[ " " line-metrics clone 0 >>width ]
|
||||||
|
[ cached-script-string metrics>> 50 >>width 10 >>cap-height 10 >>x-height ]
|
||||||
|
if-empty ;
|
||||||
|
|
||||||
|
uniscribe-renderer font-renderer set-global
|
|
@ -1,23 +1,33 @@
|
||||||
! Copyright (C) 2006, 2009 Slava Pestov.
|
! Copyright (C) 2006, 2009 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: debugger help help.topics help.crossref help.home kernel
|
USING: debugger help help.topics help.crossref help.home kernel models
|
||||||
models compiler.units assocs words vocabs accessors fry
|
compiler.units assocs words vocabs accessors fry arrays
|
||||||
combinators.short-circuit namespaces sequences models
|
combinators.short-circuit namespaces sequences models help.apropos
|
||||||
models.history help.apropos combinators ui.commands ui.gadgets
|
combinators ui ui.commands ui.gadgets ui.gadgets.panes
|
||||||
ui.gadgets.panes ui.gadgets.scrollers ui.gadgets.tracks
|
ui.gadgets.scrollers ui.gadgets.tracks ui.gestures ui.gadgets.buttons
|
||||||
ui.gestures ui.gadgets.buttons ui.gadgets.packs
|
ui.gadgets.packs ui.gadgets.editors ui.gadgets.labels
|
||||||
ui.gadgets.editors ui.gadgets.labels ui.gadgets.status-bar
|
ui.gadgets.status-bar ui.gadgets.glass ui.gadgets.borders ui.gadgets.viewports
|
||||||
ui.gadgets.glass ui.gadgets.borders ui.tools.common
|
ui.tools.common ui.tools.browser.popups ui.tools.browser.history ;
|
||||||
ui.tools.browser.popups ui ;
|
|
||||||
IN: ui.tools.browser
|
IN: ui.tools.browser
|
||||||
|
|
||||||
TUPLE: browser-gadget < tool pane scroller search-field popup ;
|
TUPLE: browser-gadget < tool history pane scroller search-field popup ;
|
||||||
|
|
||||||
{ 650 400 } browser-gadget set-tool-dim
|
{ 650 400 } browser-gadget set-tool-dim
|
||||||
|
|
||||||
|
M: browser-gadget history-value
|
||||||
|
[ control-value ] [ scroller>> scroll-position ]
|
||||||
|
bi 2array ;
|
||||||
|
|
||||||
|
M: browser-gadget set-history-value
|
||||||
|
[ first2 ] dip
|
||||||
|
[ set-control-value ] [ scroller>> set-scroll-position ]
|
||||||
|
bi-curry bi* ;
|
||||||
|
|
||||||
: show-help ( link browser-gadget -- )
|
: show-help ( link browser-gadget -- )
|
||||||
[ >link ] [ model>> ] bi*
|
[ >link ] dip
|
||||||
[ [ add-recent ] [ add-history ] bi* ] [ set-model ] 2bi ;
|
[ [ add-recent ] [ history>> add-history ] bi* ]
|
||||||
|
[ model>> set-model ]
|
||||||
|
2bi ;
|
||||||
|
|
||||||
: <help-pane> ( browser-gadget -- gadget )
|
: <help-pane> ( browser-gadget -- gadget )
|
||||||
model>> [ '[ _ print-topic ] try ] <pane-control> ;
|
model>> [ '[ _ print-topic ] try ] <pane-control> ;
|
||||||
|
@ -41,7 +51,8 @@ TUPLE: browser-gadget < tool pane scroller search-field popup ;
|
||||||
: <browser-gadget> ( link -- gadget )
|
: <browser-gadget> ( link -- gadget )
|
||||||
vertical browser-gadget new-track
|
vertical browser-gadget new-track
|
||||||
1 >>fill
|
1 >>fill
|
||||||
swap >link <history> >>model
|
swap >link <model> >>model
|
||||||
|
dup <history> >>history
|
||||||
dup <search-field> >>search-field
|
dup <search-field> >>search-field
|
||||||
dup <browser-toolbar> { 3 3 } <border> { 1 0 } >>fill f track-add
|
dup <browser-toolbar> { 3 3 } <border> { 1 0 } >>fill f track-add
|
||||||
dup <help-pane> >>pane
|
dup <help-pane> >>pane
|
||||||
|
@ -93,9 +104,9 @@ M: browser-gadget focusable-child* search-field>> ;
|
||||||
|
|
||||||
\ show-browser H{ { +nullary+ t } } define-command
|
\ show-browser H{ { +nullary+ t } } define-command
|
||||||
|
|
||||||
: com-back ( browser -- ) model>> go-back ;
|
: com-back ( browser -- ) history>> go-back ;
|
||||||
|
|
||||||
: com-forward ( browser -- ) model>> go-forward ;
|
: com-forward ( browser -- ) history>> go-forward ;
|
||||||
|
|
||||||
: com-home ( browser -- ) "help.home" swap show-help ;
|
: com-home ( browser -- ) "help.home" swap show-help ;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Slava Pestov
|
|
@ -0,0 +1,36 @@
|
||||||
|
USING: namespaces ui.tools.browser.history sequences tools.test ;
|
||||||
|
IN: ui.tools.browser.history.tests
|
||||||
|
|
||||||
|
f <history> "history" set
|
||||||
|
|
||||||
|
"history" get add-history
|
||||||
|
|
||||||
|
[ t ] [ "history" get back>> empty? ] unit-test
|
||||||
|
[ t ] [ "history" get forward>> empty? ] unit-test
|
||||||
|
|
||||||
|
"history" get add-history
|
||||||
|
"history" get 3 >>value drop
|
||||||
|
|
||||||
|
[ t ] [ "history" get back>> empty? ] unit-test
|
||||||
|
[ t ] [ "history" get forward>> empty? ] unit-test
|
||||||
|
|
||||||
|
"history" get add-history
|
||||||
|
"history" get 4 >>value drop
|
||||||
|
|
||||||
|
[ f ] [ "history" get back>> empty? ] unit-test
|
||||||
|
[ t ] [ "history" get forward>> empty? ] unit-test
|
||||||
|
|
||||||
|
"history" get go-back
|
||||||
|
|
||||||
|
[ 3 ] [ "history" get value>> ] unit-test
|
||||||
|
|
||||||
|
[ t ] [ "history" get back>> empty? ] unit-test
|
||||||
|
[ f ] [ "history" get forward>> empty? ] unit-test
|
||||||
|
|
||||||
|
"history" get go-forward
|
||||||
|
|
||||||
|
[ 4 ] [ "history" get value>> ] unit-test
|
||||||
|
|
||||||
|
[ f ] [ "history" get back>> empty? ] unit-test
|
||||||
|
[ t ] [ "history" get forward>> empty? ] unit-test
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
! Copyright (C) 2009 Slava Pestov.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: kernel accessors sequences locals ;
|
||||||
|
IN: ui.tools.browser.history
|
||||||
|
|
||||||
|
TUPLE: history owner back forward ;
|
||||||
|
|
||||||
|
: <history> ( owner -- history )
|
||||||
|
V{ } clone V{ } clone history boa ;
|
||||||
|
|
||||||
|
GENERIC: history-value ( object -- value )
|
||||||
|
|
||||||
|
GENERIC: set-history-value ( value object -- )
|
||||||
|
|
||||||
|
: (add-history) ( history to -- )
|
||||||
|
swap owner>> history-value dup [ swap push ] [ 2drop ] if ;
|
||||||
|
|
||||||
|
:: go-back/forward ( history to from -- )
|
||||||
|
from empty? [
|
||||||
|
history to (add-history)
|
||||||
|
from pop history owner>> set-history-value
|
||||||
|
] unless ;
|
||||||
|
|
||||||
|
: go-back ( history -- )
|
||||||
|
dup [ forward>> ] [ back>> ] bi go-back/forward ;
|
||||||
|
|
||||||
|
: go-forward ( history -- )
|
||||||
|
dup [ back>> ] [ forward>> ] bi go-back/forward ;
|
||||||
|
|
||||||
|
: add-history ( history -- )
|
||||||
|
dup forward>> delete-all
|
||||||
|
dup back>> (add-history) ;
|
|
@ -141,6 +141,7 @@ GENERIC# accept-completion-hook 1 ( item popup -- )
|
||||||
t >>selection-required?
|
t >>selection-required?
|
||||||
t >>single-click?
|
t >>single-click?
|
||||||
30 >>min-cols
|
30 >>min-cols
|
||||||
|
10 >>min-rows
|
||||||
10 >>max-rows
|
10 >>max-rows
|
||||||
dup '[ _ accept-completion ] >>action ;
|
dup '[ _ accept-completion ] >>action ;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
! Copyright (C) 2008 Slava Pestov.
|
! Copyright (C) 2008 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel present prettyprint.custom prettyprint.backend urls ;
|
USING: kernel present prettyprint.custom prettyprint.sections
|
||||||
|
prettyprint.backend urls ;
|
||||||
IN: urls.prettyprint
|
IN: urls.prettyprint
|
||||||
|
|
||||||
M: url pprint* dup present "URL\" " "\"" pprint-string ;
|
M: url pprint*
|
||||||
|
\ URL" record-vocab
|
||||||
|
dup present "URL\" " "\"" pprint-string ;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
IN: urls.tests
|
IN: urls.tests
|
||||||
USING: urls urls.private tools.test
|
USING: urls urls.private tools.test prettyprint
|
||||||
arrays kernel assocs present accessors ;
|
arrays kernel assocs present accessors ;
|
||||||
|
|
||||||
CONSTANT: urls
|
CONSTANT: urls
|
||||||
|
@ -227,3 +227,5 @@ urls [
|
||||||
[ "http://localhost/?foo=bar" >url ] unit-test
|
[ "http://localhost/?foo=bar" >url ] unit-test
|
||||||
|
|
||||||
[ "/" ] [ "http://www.jedit.org" >url path>> ] unit-test
|
[ "/" ] [ "http://www.jedit.org" >url path>> ] unit-test
|
||||||
|
|
||||||
|
[ "USING: urls ;\nURL\" foo\"" ] [ URL" foo" unparse-use ] unit-test
|
|
@ -0,0 +1,37 @@
|
||||||
|
USING: assocs memoize locals kernel accessors init fonts math
|
||||||
|
combinators windows windows.types windows.gdi32 ;
|
||||||
|
IN: windows.fonts
|
||||||
|
|
||||||
|
: windows-font-name ( string -- string' )
|
||||||
|
H{
|
||||||
|
{ "sans-serif" "Tahoma" }
|
||||||
|
{ "serif" "Times New Roman" }
|
||||||
|
{ "monospace" "Courier New" }
|
||||||
|
} at-default ;
|
||||||
|
|
||||||
|
MEMO:: (cache-font) ( font -- HFONT )
|
||||||
|
font size>> neg ! nHeight
|
||||||
|
0 0 0 ! nWidth, nEscapement, nOrientation
|
||||||
|
font bold?>> FW_BOLD FW_NORMAL ? ! fnWeight
|
||||||
|
font italic?>> TRUE FALSE ? ! fdwItalic
|
||||||
|
FALSE ! fdwUnderline
|
||||||
|
FALSE ! fdWStrikeOut
|
||||||
|
DEFAULT_CHARSET ! fdwCharSet
|
||||||
|
OUT_OUTLINE_PRECIS ! fdwOutputPrecision
|
||||||
|
CLIP_DEFAULT_PRECIS ! fdwClipPrecision
|
||||||
|
DEFAULT_QUALITY ! fdwQuality
|
||||||
|
DEFAULT_PITCH ! fdwPitchAndFamily
|
||||||
|
font name>> windows-font-name
|
||||||
|
CreateFont
|
||||||
|
dup win32-error=0/f ;
|
||||||
|
|
||||||
|
: cache-font ( font -- HFONT ) strip-font-colors (cache-font) ;
|
||||||
|
|
||||||
|
[ \ (cache-font) reset-memoized ] "windows.fonts" add-init-hook
|
||||||
|
|
||||||
|
: TEXTMETRIC>metrics ( TEXTMETRIC -- metrics )
|
||||||
|
[ metrics new 0 >>width ] dip {
|
||||||
|
[ TEXTMETRICW-tmHeight >>height ]
|
||||||
|
[ TEXTMETRICW-tmAscent >>ascent ]
|
||||||
|
[ TEXTMETRICW-tmDescent >>descent ]
|
||||||
|
} cleave ;
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1 @@
|
||||||
|
Slava Pestov
|
|
@ -0,0 +1,5 @@
|
||||||
|
IN: windows.offscreen.tests
|
||||||
|
USING: windows.offscreen effects tools.test kernel images ;
|
||||||
|
|
||||||
|
{ 1 1 } [ [ [ ] make-bitmap-image ] with-memory-dc ] must-infer-as
|
||||||
|
[ t ] [ [ { 10 10 } swap [ ] make-bitmap-image ] with-memory-dc image? ] unit-test
|
|
@ -0,0 +1,53 @@
|
||||||
|
! Copyright (C) 2009 Joe Groff, Slava Pestov.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: alien.c-types kernel combinators sequences
|
||||||
|
math windows.gdi32 windows.types images destructors
|
||||||
|
accessors fry locals ;
|
||||||
|
IN: windows.offscreen
|
||||||
|
|
||||||
|
: (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 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-bitmap ( dim dc -- hBitmap bits )
|
||||||
|
[ nip ]
|
||||||
|
[
|
||||||
|
swap (bitmap-info) DIB_RGB_COLORS f <void*>
|
||||||
|
[ f 0 CreateDIBSection ] keep *void*
|
||||||
|
] 2bi
|
||||||
|
[ [ SelectObject drop ] keep ] dip ;
|
||||||
|
|
||||||
|
: make-offscreen-dc-and-bitmap ( dim -- dc hBitmap bits )
|
||||||
|
[ f CreateCompatibleDC ] dip over make-bitmap ;
|
||||||
|
|
||||||
|
: bitmap>byte-array ( bits dim -- byte-array )
|
||||||
|
product 4 * memory>byte-array ;
|
||||||
|
|
||||||
|
: bitmap>image ( bits dim -- image )
|
||||||
|
[ bitmap>byte-array ] keep
|
||||||
|
<image>
|
||||||
|
swap >>dim
|
||||||
|
swap >>bitmap
|
||||||
|
BGRX >>component-order
|
||||||
|
t >>upside-down? ;
|
||||||
|
|
||||||
|
: with-memory-dc ( quot: ( hDC -- ) -- )
|
||||||
|
[ [ f CreateCompatibleDC &DeleteDC ] dip call ] with-destructors ; inline
|
||||||
|
|
||||||
|
:: make-bitmap-image ( dim dc quot -- image )
|
||||||
|
dim dc make-bitmap [ &DeleteObject drop ] dip
|
||||||
|
quot dip
|
||||||
|
dim bitmap>image ; inline
|
|
@ -0,0 +1 @@
|
||||||
|
Utility words for memory DCs and bitmaps
|
|
@ -0,0 +1 @@
|
||||||
|
unportable
|
|
@ -1,6 +1,7 @@
|
||||||
! Copyright (C) 2005, 2006 Doug Coleman.
|
! Copyright (C) 2005, 2006 Doug Coleman.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: alien alien.syntax namespaces kernel words ;
|
USING: alien alien.c-types alien.syntax namespaces kernel words
|
||||||
|
sequences math math.bitwise math.vectors colors ;
|
||||||
IN: windows.types
|
IN: windows.types
|
||||||
|
|
||||||
TYPEDEF: char CHAR
|
TYPEDEF: char CHAR
|
||||||
|
@ -244,14 +245,14 @@ C-STRUCT: RECT
|
||||||
{ "LONG" "right" }
|
{ "LONG" "right" }
|
||||||
{ "LONG" "bottom" } ;
|
{ "LONG" "bottom" } ;
|
||||||
|
|
||||||
! C-STRUCT: PAINTSTRUCT
|
C-STRUCT: PAINTSTRUCT
|
||||||
! { "HDC" " hdc" }
|
{ "HDC" " hdc" }
|
||||||
! { "BOOL" "fErase" }
|
{ "BOOL" "fErase" }
|
||||||
! { "RECT" "rcPaint" }
|
{ "RECT" "rcPaint" }
|
||||||
! { "BOOL" "fRestore" }
|
{ "BOOL" "fRestore" }
|
||||||
! { "BOOL" "fIncUpdate" }
|
{ "BOOL" "fIncUpdate" }
|
||||||
! { "BYTE[32]" "rgbReserved" }
|
{ "BYTE[32]" "rgbReserved" }
|
||||||
! ;
|
;
|
||||||
|
|
||||||
C-STRUCT: BITMAPINFOHEADER
|
C-STRUCT: BITMAPINFOHEADER
|
||||||
{ "DWORD" "biSize" }
|
{ "DWORD" "biSize" }
|
||||||
|
@ -283,6 +284,10 @@ C-STRUCT: POINT
|
||||||
{ "LONG" "x" }
|
{ "LONG" "x" }
|
||||||
{ "LONG" "y" } ;
|
{ "LONG" "y" } ;
|
||||||
|
|
||||||
|
C-STRUCT: SIZE
|
||||||
|
{ "LONG" "cx" }
|
||||||
|
{ "LONG" "cy" } ;
|
||||||
|
|
||||||
C-STRUCT: MSG
|
C-STRUCT: MSG
|
||||||
{ "HWND" "hWnd" }
|
{ "HWND" "hWnd" }
|
||||||
{ "UINT" "message" }
|
{ "UINT" "message" }
|
||||||
|
@ -327,6 +332,14 @@ C-STRUCT: RECT
|
||||||
{ "LONG" "right" }
|
{ "LONG" "right" }
|
||||||
{ "LONG" "bottom" } ;
|
{ "LONG" "bottom" } ;
|
||||||
|
|
||||||
|
: <RECT> ( loc dim -- RECT )
|
||||||
|
over v+
|
||||||
|
"RECT" <c-object>
|
||||||
|
over first over set-RECT-right
|
||||||
|
swap second over set-RECT-bottom
|
||||||
|
over first over set-RECT-left
|
||||||
|
swap second over set-RECT-top ;
|
||||||
|
|
||||||
TYPEDEF: RECT* PRECT
|
TYPEDEF: RECT* PRECT
|
||||||
TYPEDEF: RECT* LPRECT
|
TYPEDEF: RECT* LPRECT
|
||||||
TYPEDEF: PIXELFORMATDESCRIPTOR PFD
|
TYPEDEF: PIXELFORMATDESCRIPTOR PFD
|
||||||
|
@ -363,3 +376,36 @@ C-STRUCT: ACCEL
|
||||||
{ "WORD" "key" }
|
{ "WORD" "key" }
|
||||||
{ "WORD" "cmd" } ;
|
{ "WORD" "cmd" } ;
|
||||||
TYPEDEF: ACCEL* LPACCEL
|
TYPEDEF: ACCEL* LPACCEL
|
||||||
|
|
||||||
|
TYPEDEF: DWORD COLORREF
|
||||||
|
TYPEDEF: DWORD* LPCOLORREF
|
||||||
|
|
||||||
|
: RGB ( r g b -- COLORREF )
|
||||||
|
{ 16 8 0 } bitfield ; inline
|
||||||
|
|
||||||
|
: color>RGB ( color -- COLORREF )
|
||||||
|
>rgba-components drop [ 255 * >integer ] tri@ RGB ;
|
||||||
|
|
||||||
|
C-STRUCT: TEXTMETRICW
|
||||||
|
{ "LONG" "tmHeight" }
|
||||||
|
{ "LONG" "tmAscent" }
|
||||||
|
{ "LONG" "tmDescent" }
|
||||||
|
{ "LONG" "tmInternalLeading" }
|
||||||
|
{ "LONG" "tmExternalLeading" }
|
||||||
|
{ "LONG" "tmAveCharWidth" }
|
||||||
|
{ "LONG" "tmMaxCharWidth" }
|
||||||
|
{ "LONG" "tmWeight" }
|
||||||
|
{ "LONG" "tmOverhang" }
|
||||||
|
{ "LONG" "tmDigitizedAspectX" }
|
||||||
|
{ "LONG" "tmDigitizedAspectY" }
|
||||||
|
{ "WCHAR" "tmFirstChar" }
|
||||||
|
{ "WCHAR" "tmLastChar" }
|
||||||
|
{ "WCHAR" "tmDefaultChar" }
|
||||||
|
{ "WCHAR" "tmBreakChar" }
|
||||||
|
{ "BYTE" "tmItalic" }
|
||||||
|
{ "BYTE" "tmUnderlined" }
|
||||||
|
{ "BYTE" "tmStruckOut" }
|
||||||
|
{ "BYTE" "tmPitchAndFamily" }
|
||||||
|
{ "BYTE" "tmCharSet" } ;
|
||||||
|
|
||||||
|
TYPEDEF: TEXTMETRICW* LPTEXTMETRIC
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Slava Pestov
|
|
@ -0,0 +1 @@
|
||||||
|
High-level wrapper around Uniscribe binding
|
|
@ -0,0 +1 @@
|
||||||
|
unportable
|
|
@ -0,0 +1,115 @@
|
||||||
|
! Copyright (C) 2009 Slava Pestov.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: kernel assocs math sequences fry io.encodings.string
|
||||||
|
io.encodings.utf16n accessors arrays combinators destructors locals
|
||||||
|
cache namespaces init images.normalization fonts alien.c-types
|
||||||
|
windows windows.usp10 windows.offscreen windows.gdi32
|
||||||
|
windows.ole32 windows.types windows.fonts opengl.textures ;
|
||||||
|
IN: windows.uniscribe
|
||||||
|
|
||||||
|
TUPLE: script-string font string metrics ssa size image disposed ;
|
||||||
|
|
||||||
|
: line-offset>x ( n script-string -- x )
|
||||||
|
2dup string>> length = [
|
||||||
|
ssa>> ! ssa
|
||||||
|
swap 1- ! icp
|
||||||
|
TRUE ! fTrailing
|
||||||
|
] [
|
||||||
|
ssa>>
|
||||||
|
swap ! icp
|
||||||
|
FALSE ! fTrailing
|
||||||
|
] if
|
||||||
|
0 <int> [ ScriptStringCPtoX ole32-error ] keep *int ;
|
||||||
|
|
||||||
|
: x>line-offset ( x script-string -- n trailing )
|
||||||
|
ssa>> ! ssa
|
||||||
|
swap ! iX
|
||||||
|
0 <int> ! pCh
|
||||||
|
0 <int> ! piTrailing
|
||||||
|
[ ScriptStringXtoCP ole32-error ] 2keep [ *int ] bi@ ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: make-script-string ( dc string -- script-string )
|
||||||
|
dup selection? [ string>> ] when
|
||||||
|
[ utf16n encode ] ! pString
|
||||||
|
[ length ] bi ! cString
|
||||||
|
dup 1.5 * 16 + >integer ! cGlyphs -- MSDN says this is "recommended size"
|
||||||
|
-1 ! iCharset -- Unicode
|
||||||
|
SSA_GLYPHS ! dwFlags
|
||||||
|
0 ! iReqWidth
|
||||||
|
f ! psControl
|
||||||
|
f ! psState
|
||||||
|
f ! piDx
|
||||||
|
f ! pTabdef
|
||||||
|
f ! pbInClass
|
||||||
|
f <void*> ! pssa
|
||||||
|
[ ScriptStringAnalyse ] keep
|
||||||
|
[ ole32-error ] [ |ScriptStringFree *void* ] bi* ;
|
||||||
|
|
||||||
|
: set-dc-colors ( dc font -- )
|
||||||
|
[ background>> color>RGB SetBkColor drop ]
|
||||||
|
[ foreground>> color>RGB SetTextColor drop ] 2bi ;
|
||||||
|
|
||||||
|
: selection-start/end ( script-string -- iMinSel iMaxSel )
|
||||||
|
string>> dup selection? [ [ start>> ] [ end>> ] bi ] [ drop 0 0 ] if ;
|
||||||
|
|
||||||
|
: (draw-script-string) ( script-string -- )
|
||||||
|
[
|
||||||
|
ssa>> ! ssa
|
||||||
|
0 ! iX
|
||||||
|
0 ! iY
|
||||||
|
0 ! uOptions
|
||||||
|
f ! prc
|
||||||
|
]
|
||||||
|
[ selection-start/end ] bi
|
||||||
|
! iMinSel
|
||||||
|
! iMaxSel
|
||||||
|
FALSE ! fDisabled
|
||||||
|
ScriptStringOut ole32-error ;
|
||||||
|
|
||||||
|
: draw-script-string ( dc script-string -- )
|
||||||
|
[ font>> set-dc-colors ] keep (draw-script-string) ;
|
||||||
|
|
||||||
|
:: make-script-string-image ( dc script-string -- image )
|
||||||
|
script-string size>> dc
|
||||||
|
[ dc script-string draw-script-string ] make-bitmap-image ;
|
||||||
|
|
||||||
|
: set-dc-font ( dc font -- )
|
||||||
|
cache-font SelectObject win32-error=0/f ;
|
||||||
|
|
||||||
|
: script-string-size ( script-string -- dim )
|
||||||
|
ssa>> ScriptString_pSize
|
||||||
|
dup win32-error=0/f
|
||||||
|
[ SIZE-cx ] [ SIZE-cy ] bi 2array ;
|
||||||
|
|
||||||
|
: dc-metrics ( dc -- metrics )
|
||||||
|
"TEXTMETRICW" <c-object>
|
||||||
|
[ GetTextMetrics drop ] keep
|
||||||
|
TEXTMETRIC>metrics ;
|
||||||
|
|
||||||
|
: <script-string> ( font string -- script-string )
|
||||||
|
[ script-string new ] 2dip
|
||||||
|
[ >>font ] [ >>string ] bi*
|
||||||
|
[
|
||||||
|
{
|
||||||
|
[ over font>> set-dc-font ]
|
||||||
|
[ dc-metrics >>metrics ]
|
||||||
|
[ over string>> make-script-string >>ssa ]
|
||||||
|
[ drop dup script-string-size >>size ]
|
||||||
|
[ over make-script-string-image >>image ]
|
||||||
|
} cleave
|
||||||
|
] with-memory-dc ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
M: script-string dispose*
|
||||||
|
ssa>> <void*> ScriptStringFree ole32-error ;
|
||||||
|
|
||||||
|
SYMBOL: cached-script-strings
|
||||||
|
|
||||||
|
: cached-script-string ( string font -- script-string )
|
||||||
|
cached-script-strings get-global [ <script-string> ] 2cache ;
|
||||||
|
|
||||||
|
[ <cache-assoc> cached-script-strings set-global ]
|
||||||
|
"windows.uniscribe" add-init-hook
|
|
@ -1,6 +1,6 @@
|
||||||
! Copyright (C) 2009 Doug Coleman.
|
! Copyright (C) 2009 Doug Coleman.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: alien.syntax ;
|
USING: alien.syntax alien.destructors ;
|
||||||
IN: windows.usp10
|
IN: windows.usp10
|
||||||
|
|
||||||
LIBRARY: usp10
|
LIBRARY: usp10
|
||||||
|
@ -262,6 +262,8 @@ FUNCTION: HRESULT ScriptStringFree (
|
||||||
SCRIPT_STRING_ANALYSIS* pssa
|
SCRIPT_STRING_ANALYSIS* pssa
|
||||||
) ;
|
) ;
|
||||||
|
|
||||||
|
DESTRUCTOR: ScriptStringFree
|
||||||
|
|
||||||
FUNCTION: SIZE* ScriptString_pSize ( SCRIPT_STRING_ANALYSIS ssa ) ;
|
FUNCTION: SIZE* ScriptString_pSize ( SCRIPT_STRING_ANALYSIS ssa ) ;
|
||||||
|
|
||||||
FUNCTION: int* ScriptString_pcOutChars ( SCRIPT_STRING_ANALYSIS ssa ) ;
|
FUNCTION: int* ScriptString_pcOutChars ( SCRIPT_STRING_ANALYSIS ssa ) ;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
! Copyright (C) 2005, 2006 Doug Coleman.
|
! Copyright (C) 2005, 2006 Doug Coleman.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: alien alien.syntax alien.c-types alien.strings arrays
|
USING: alien alien.syntax alien.c-types alien.strings arrays
|
||||||
combinators kernel math namespaces parser prettyprint sequences
|
combinators kernel math namespaces parser sequences
|
||||||
windows.errors windows.types windows.kernel32 words
|
windows.errors windows.types windows.kernel32 words
|
||||||
io.encodings.utf16n ;
|
io.encodings.utf16n ;
|
||||||
IN: windows
|
IN: windows
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
libcairo-2.dll
|
|
||||||
libgio-2.0-0.dll
|
|
||||||
libglib-2.0-0.dll
|
|
||||||
libgmodule-2.0-0.dll
|
|
||||||
libgobject-2.0-0.dll
|
|
||||||
libgthread-2.0-0.dll
|
|
||||||
libpango-1.0-0.dll
|
|
||||||
libpangocairo-1.0-0.dll
|
|
||||||
libpangowin32-1.0-0.dll
|
|
||||||
libpng12-0.dll
|
|
||||||
libtiff3.dll
|
|
||||||
zlib1.dll
|
|
|
@ -445,16 +445,6 @@ get_url() {
|
||||||
check_ret $DOWNLOADER
|
check_ret $DOWNLOADER
|
||||||
}
|
}
|
||||||
|
|
||||||
maybe_download_dlls() {
|
|
||||||
if [[ $OS == winnt ]] ; then
|
|
||||||
for file in `cat build-support/dlls.txt`; do
|
|
||||||
get_url http://factorcode.org/dlls/$file
|
|
||||||
chmod 777 *.dll
|
|
||||||
check_ret chmod
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
get_config_info() {
|
get_config_info() {
|
||||||
find_build_info
|
find_build_info
|
||||||
check_installed_programs
|
check_installed_programs
|
||||||
|
@ -472,7 +462,6 @@ install() {
|
||||||
cd_factor
|
cd_factor
|
||||||
make_factor
|
make_factor
|
||||||
get_boot_image
|
get_boot_image
|
||||||
maybe_download_dlls
|
|
||||||
bootstrap
|
bootstrap
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -547,7 +536,6 @@ case "$1" in
|
||||||
update) update; update_bootstrap ;;
|
update) update; update_bootstrap ;;
|
||||||
bootstrap) get_config_info; bootstrap ;;
|
bootstrap) get_config_info; bootstrap ;;
|
||||||
report) find_build_info ;;
|
report) find_build_info ;;
|
||||||
dlls) get_config_info; maybe_download_dlls;;
|
|
||||||
net-bootstrap) get_config_info; update_boot_images; bootstrap ;;
|
net-bootstrap) get_config_info; update_boot_images; bootstrap ;;
|
||||||
make-target) ECHO=false; find_build_info; echo $MAKE_TARGET ;;
|
make-target) ECHO=false; find_build_info; echo $MAKE_TARGET ;;
|
||||||
*) usage ;;
|
*) usage ;;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
USING: accessors alien alien.accessors alien.syntax byte-arrays arrays
|
USING: accessors alien alien.accessors alien.syntax byte-arrays arrays
|
||||||
kernel kernel.private namespaces tools.test sequences libc math
|
kernel kernel.private namespaces tools.test sequences libc math
|
||||||
system prettyprint layouts alien.libraries ;
|
system prettyprint layouts alien.libraries sets ;
|
||||||
IN: alien.tests
|
IN: alien.tests
|
||||||
|
|
||||||
[ t ] [ -1 <alien> alien-address 0 > ] unit-test
|
[ t ] [ -1 <alien> alien-address 0 > ] unit-test
|
||||||
|
@ -86,3 +86,5 @@ f initialize-test set-global
|
||||||
[ ] [ initialize-test get BAD-ALIEN >>alien drop ] unit-test
|
[ ] [ initialize-test get BAD-ALIEN >>alien drop ] unit-test
|
||||||
|
|
||||||
[ 7575 ] [ initialize-test [ 7575 ] initialize-alien ] unit-test
|
[ 7575 ] [ initialize-test [ 7575 ] initialize-alien ] unit-test
|
||||||
|
|
||||||
|
[ V{ BAD-ALIEN } ] [ { BAD-ALIEN BAD-ALIEN BAD-ALIEN } prune ] unit-test
|
|
@ -49,6 +49,8 @@ M: alien equal?
|
||||||
2drop f
|
2drop f
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
|
M: simple-alien hashcode* nip dup expired>> [ drop 1234 ] [ alien-address ] if ;
|
||||||
|
|
||||||
ERROR: alien-callback-error ;
|
ERROR: alien-callback-error ;
|
||||||
|
|
||||||
: alien-callback ( return parameters abi quot -- alien )
|
: alien-callback ( return parameters abi quot -- alien )
|
||||||
|
|
|
@ -510,6 +510,7 @@ tuple
|
||||||
{ "fputc" "io.streams.c" (( ch alien -- )) }
|
{ "fputc" "io.streams.c" (( ch alien -- )) }
|
||||||
{ "fwrite" "io.streams.c" (( string alien -- )) }
|
{ "fwrite" "io.streams.c" (( string alien -- )) }
|
||||||
{ "fflush" "io.streams.c" (( alien -- )) }
|
{ "fflush" "io.streams.c" (( alien -- )) }
|
||||||
|
{ "fseek" "io.streams.c" (( alien offset whence -- )) }
|
||||||
{ "fclose" "io.streams.c" (( alien -- )) }
|
{ "fclose" "io.streams.c" (( alien -- )) }
|
||||||
{ "<wrapper>" "kernel" (( obj -- wrapper )) }
|
{ "<wrapper>" "kernel" (( obj -- wrapper )) }
|
||||||
{ "(clone)" "kernel" (( obj -- newobj )) }
|
{ "(clone)" "kernel" (( obj -- newobj )) }
|
||||||
|
|
|
@ -1,11 +1,24 @@
|
||||||
! Copyright (C) 2004, 2008 Slava Pestov.
|
! Copyright (C) 2004, 2009 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel kernel.private namespaces make io io.encodings
|
USING: kernel kernel.private namespaces make io io.encodings
|
||||||
sequences math generic threads.private classes io.backend
|
sequences math generic threads.private classes io.backend
|
||||||
io.files continuations destructors byte-arrays accessors ;
|
io.files continuations destructors byte-arrays accessors
|
||||||
|
combinators ;
|
||||||
IN: io.streams.c
|
IN: io.streams.c
|
||||||
|
|
||||||
TUPLE: c-writer handle disposed ;
|
TUPLE: c-stream handle disposed ;
|
||||||
|
|
||||||
|
M: c-stream dispose* handle>> fclose ;
|
||||||
|
|
||||||
|
M: c-stream stream-seek
|
||||||
|
handle>> swap {
|
||||||
|
{ seek-absolute [ 0 ] }
|
||||||
|
{ seek-relative [ 1 ] }
|
||||||
|
{ seek-end [ 2 ] }
|
||||||
|
[ bad-seek-type ]
|
||||||
|
} case fseek ;
|
||||||
|
|
||||||
|
TUPLE: c-writer < c-stream ;
|
||||||
|
|
||||||
: <c-writer> ( handle -- stream ) f c-writer boa ;
|
: <c-writer> ( handle -- stream ) f c-writer boa ;
|
||||||
|
|
||||||
|
@ -17,9 +30,7 @@ M: c-writer stream-write dup check-disposed handle>> fwrite ;
|
||||||
|
|
||||||
M: c-writer stream-flush dup check-disposed handle>> fflush ;
|
M: c-writer stream-flush dup check-disposed handle>> fflush ;
|
||||||
|
|
||||||
M: c-writer dispose* handle>> fclose ;
|
TUPLE: c-reader < c-stream ;
|
||||||
|
|
||||||
TUPLE: c-reader handle disposed ;
|
|
||||||
|
|
||||||
: <c-reader> ( handle -- stream ) f c-reader boa ;
|
: <c-reader> ( handle -- stream ) f c-reader boa ;
|
||||||
|
|
||||||
|
@ -43,9 +54,6 @@ M: c-reader stream-read-until
|
||||||
[ swap read-until-loop ] B{ } make swap
|
[ swap read-until-loop ] B{ } make swap
|
||||||
over empty? over not and [ 2drop f f ] when ;
|
over empty? over not and [ 2drop f f ] when ;
|
||||||
|
|
||||||
M: c-reader dispose*
|
|
||||||
handle>> fclose ;
|
|
||||||
|
|
||||||
M: c-io-backend init-io ;
|
M: c-io-backend init-io ;
|
||||||
|
|
||||||
: stdin-handle ( -- alien ) 11 getenv ;
|
: stdin-handle ( -- alien ) 11 getenv ;
|
||||||
|
|
|
@ -311,7 +311,7 @@ HELP: each-index
|
||||||
|
|
||||||
HELP: map-index
|
HELP: map-index
|
||||||
{ $values
|
{ $values
|
||||||
{ "seq" sequence } { "quot" quotation } }
|
{ "seq" sequence } { "quot" quotation } { "newseq" sequence } }
|
||||||
{ $description "Calls the quotation with the element of the sequence and its index on the stack, with the index on the top of the stack. Collects the outputs of the quotation and outputs them in a sequence of the same type as the input sequence." }
|
{ $description "Calls the quotation with the element of the sequence and its index on the stack, with the index on the top of the stack. Collects the outputs of the quotation and outputs them in a sequence of the same type as the input sequence." }
|
||||||
{ $examples { $example "USING: sequences prettyprint math ;"
|
{ $examples { $example "USING: sequences prettyprint math ;"
|
||||||
"{ 10 20 30 } [ + ] map-index ."
|
"{ 10 20 30 } [ + ] map-index ."
|
||||||
|
|
|
@ -506,7 +506,7 @@ PRIVATE>
|
||||||
[ [ 0 = ] 2dip if ] 2curry
|
[ [ 0 = ] 2dip if ] 2curry
|
||||||
each-index ; inline
|
each-index ; inline
|
||||||
|
|
||||||
: map-index ( seq quot -- )
|
: map-index ( seq quot -- newseq )
|
||||||
prepare-index 2map ; inline
|
prepare-index 2map ; inline
|
||||||
|
|
||||||
: reduce-index ( seq identity quot -- )
|
: reduce-index ( seq identity quot -- )
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
! Copyright (C) 2008 Doug Coleman.
|
! Copyright (C) 2008 Doug Coleman.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: quotations effects accessors sequences words kernel ;
|
USING: quotations effects accessors sequences words kernel definitions ;
|
||||||
IN: words.alias
|
IN: words.alias
|
||||||
|
|
||||||
PREDICATE: alias < word "alias" word-prop ;
|
PREDICATE: alias < word "alias" word-prop ;
|
||||||
|
@ -12,5 +12,6 @@ PREDICATE: alias < word "alias" word-prop ;
|
||||||
M: alias reset-word
|
M: alias reset-word
|
||||||
[ call-next-method ] [ f "alias" set-word-prop ] bi ;
|
[ call-next-method ] [ f "alias" set-word-prop ] bi ;
|
||||||
|
|
||||||
M: alias stack-effect
|
M: alias definer drop \ ALIAS: f ;
|
||||||
def>> first stack-effect ;
|
|
||||||
|
M: alias definition def>> first 1quotation ;
|
|
@ -0,0 +1,14 @@
|
||||||
|
IN: words.constant.tests
|
||||||
|
USING: tools.test math ;
|
||||||
|
|
||||||
|
CONSTANT: a +
|
||||||
|
|
||||||
|
[ + ] [ a ] unit-test
|
||||||
|
|
||||||
|
CONSTANT: b \ +
|
||||||
|
|
||||||
|
[ \ + ] [ b ] unit-test
|
||||||
|
|
||||||
|
CONSTANT: c { 1 2 3 }
|
||||||
|
|
||||||
|
[ { 1 2 3 } ] [ c ] unit-test
|
|
@ -1,6 +1,6 @@
|
||||||
! Copyright (C) 2008 Slava Pestov.
|
! Copyright (C) 2008, 2009 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors kernel sequences words ;
|
USING: accessors kernel sequences words definitions quotations ;
|
||||||
IN: words.constant
|
IN: words.constant
|
||||||
|
|
||||||
PREDICATE: constant < word ( obj -- ? )
|
PREDICATE: constant < word ( obj -- ? )
|
||||||
|
@ -8,3 +8,7 @@ PREDICATE: constant < word ( obj -- ? )
|
||||||
|
|
||||||
: define-constant ( word value -- )
|
: define-constant ( word value -- )
|
||||||
[ ] curry (( -- value )) define-inline ;
|
[ ] curry (( -- value )) define-inline ;
|
||||||
|
|
||||||
|
M: constant definer drop \ CONSTANT: f ;
|
||||||
|
|
||||||
|
M: constant definition def>> first literalize 1quotation ;
|
|
@ -1,6 +1,6 @@
|
||||||
! Copyright (C) 2009 Doug Coleman.
|
! Copyright (C) 2009 Doug Coleman.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: tools.test c.preprocessor kernel accessors ;
|
USING: tools.test c.preprocessor kernel accessors multiline ;
|
||||||
IN: c.preprocessor.tests
|
IN: c.preprocessor.tests
|
||||||
|
|
||||||
[ "vocab:c/tests/test1/test1.c" start-preprocess-file ]
|
[ "vocab:c/tests/test1/test1.c" start-preprocess-file ]
|
||||||
|
@ -9,8 +9,18 @@ IN: c.preprocessor.tests
|
||||||
[ "yo\n\n\n\nyo4\n" ]
|
[ "yo\n\n\n\nyo4\n" ]
|
||||||
[ "vocab:c/tests/test2/test2.c" start-preprocess-file nip ] unit-test
|
[ "vocab:c/tests/test2/test2.c" start-preprocess-file nip ] unit-test
|
||||||
|
|
||||||
|
/*
|
||||||
[ "vocab:c/tests/test3/test3.c" start-preprocess-file ]
|
[ "vocab:c/tests/test3/test3.c" start-preprocess-file ]
|
||||||
[ "\"BOO\"" = ] must-fail-with
|
[ "\"BOO\"" = ] must-fail-with
|
||||||
|
*/
|
||||||
|
|
||||||
[ V{ "\"omg\"" "\"lol\"" } ]
|
[ V{ "\"omg\"" "\"lol\"" } ]
|
||||||
[ "vocab:c/tests/test4/test4.c" start-preprocess-file drop warnings>> ] unit-test
|
[ "vocab:c/tests/test4/test4.c" start-preprocess-file drop warnings>> ] unit-test
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);
|
||||||
|
f(2 * (2+(3,4)-0,1)) | f(2 * (~ 5)) & f(2 * (0,1))^m(0,1);
|
||||||
|
int i[] = { 1, 23, 4, 5, };
|
||||||
|
char c[2][6] = { "hello", "" };
|
||||||
|
*/
|
||||||
|
|
|
@ -3,24 +3,41 @@
|
||||||
USING: html.parser.state io io.encodings.utf8 io.files
|
USING: html.parser.state io io.encodings.utf8 io.files
|
||||||
io.streams.string kernel combinators accessors io.pathnames
|
io.streams.string kernel combinators accessors io.pathnames
|
||||||
fry sequences arrays locals namespaces io.directories
|
fry sequences arrays locals namespaces io.directories
|
||||||
assocs math splitting make ;
|
assocs math splitting make unicode.categories
|
||||||
|
combinators.short-circuit ;
|
||||||
IN: c.preprocessor
|
IN: c.preprocessor
|
||||||
|
|
||||||
: initial-library-paths ( -- seq )
|
: initial-library-paths ( -- seq )
|
||||||
V{ "/usr/include" } clone ;
|
V{ "/usr/include" } clone ;
|
||||||
|
|
||||||
|
: initial-symbol-table ( -- hashtable )
|
||||||
|
H{
|
||||||
|
{ "__APPLE__" "" }
|
||||||
|
{ "__amd64__" "" }
|
||||||
|
{ "__x86_64__" "" }
|
||||||
|
} clone ;
|
||||||
|
|
||||||
TUPLE: preprocessor-state library-paths symbol-table
|
TUPLE: preprocessor-state library-paths symbol-table
|
||||||
include-nesting include-nesting-max processing-disabled?
|
include-nesting include-nesting-max processing-disabled?
|
||||||
ifdef-nesting warnings ;
|
ifdef-nesting warnings errors
|
||||||
|
pragmas
|
||||||
|
include-nexts
|
||||||
|
ifs elifs elses ;
|
||||||
|
|
||||||
: <preprocessor-state> ( -- preprocessor-state )
|
: <preprocessor-state> ( -- preprocessor-state )
|
||||||
preprocessor-state new
|
preprocessor-state new
|
||||||
initial-library-paths >>library-paths
|
initial-library-paths >>library-paths
|
||||||
H{ } clone >>symbol-table
|
initial-symbol-table >>symbol-table
|
||||||
0 >>include-nesting
|
0 >>include-nesting
|
||||||
200 >>include-nesting-max
|
200 >>include-nesting-max
|
||||||
0 >>ifdef-nesting
|
0 >>ifdef-nesting
|
||||||
V{ } clone >>warnings ;
|
V{ } clone >>warnings
|
||||||
|
V{ } clone >>errors
|
||||||
|
V{ } clone >>pragmas
|
||||||
|
V{ } clone >>include-nexts
|
||||||
|
V{ } clone >>ifs
|
||||||
|
V{ } clone >>elifs
|
||||||
|
V{ } clone >>elses ;
|
||||||
|
|
||||||
DEFER: preprocess-file
|
DEFER: preprocess-file
|
||||||
|
|
||||||
|
@ -64,8 +81,13 @@ ERROR: header-file-missing path ;
|
||||||
|
|
||||||
: readlns ( -- string ) [ (readlns) ] { } make concat ;
|
: readlns ( -- string ) [ (readlns) ] { } make concat ;
|
||||||
|
|
||||||
|
: take-define-identifier ( state-parser -- string )
|
||||||
|
skip-whitespace
|
||||||
|
[ current { [ blank? ] [ CHAR: ( = ] } 1|| ] take-until ;
|
||||||
|
|
||||||
: handle-define ( preprocessor-state state-parser -- )
|
: handle-define ( preprocessor-state state-parser -- )
|
||||||
[ take-token ] [ take-rest ] bi
|
[ take-define-identifier ]
|
||||||
|
[ skip-whitespace take-rest ] bi
|
||||||
"\\" ?tail [ readlns append ] when
|
"\\" ?tail [ readlns append ] when
|
||||||
spin symbol-table>> set-at ;
|
spin symbol-table>> set-at ;
|
||||||
|
|
||||||
|
@ -86,9 +108,25 @@ ERROR: header-file-missing path ;
|
||||||
: handle-endif ( preprocessor-state state-parser -- )
|
: handle-endif ( preprocessor-state state-parser -- )
|
||||||
drop [ 1 - ] change-ifdef-nesting drop ;
|
drop [ 1 - ] change-ifdef-nesting drop ;
|
||||||
|
|
||||||
|
: handle-if ( preprocessor-state state-parser -- )
|
||||||
|
[ [ 1 + ] change-ifdef-nesting ] dip
|
||||||
|
skip-whitespace take-rest swap ifs>> push ;
|
||||||
|
|
||||||
|
: handle-elif ( preprocessor-state state-parser -- )
|
||||||
|
skip-whitespace take-rest swap elifs>> push ;
|
||||||
|
|
||||||
|
: handle-else ( preprocessor-state state-parser -- )
|
||||||
|
skip-whitespace take-rest swap elses>> push ;
|
||||||
|
|
||||||
|
: handle-pragma ( preprocessor-state state-parser -- )
|
||||||
|
skip-whitespace take-rest swap pragmas>> push ;
|
||||||
|
|
||||||
|
: handle-include-next ( preprocessor-state state-parser -- )
|
||||||
|
skip-whitespace take-rest swap include-nexts>> push ;
|
||||||
|
|
||||||
: handle-error ( preprocessor-state state-parser -- )
|
: handle-error ( preprocessor-state state-parser -- )
|
||||||
skip-whitespace
|
skip-whitespace take-rest swap errors>> push ;
|
||||||
nip take-rest throw ;
|
! nip take-rest throw ;
|
||||||
|
|
||||||
: handle-warning ( preprocessor-state state-parser -- )
|
: handle-warning ( preprocessor-state state-parser -- )
|
||||||
skip-whitespace
|
skip-whitespace
|
||||||
|
@ -104,11 +142,11 @@ ERROR: header-file-missing path ;
|
||||||
{ "ifdef" [ handle-ifdef ] }
|
{ "ifdef" [ handle-ifdef ] }
|
||||||
{ "ifndef" [ handle-ifndef ] }
|
{ "ifndef" [ handle-ifndef ] }
|
||||||
{ "endif" [ handle-endif ] }
|
{ "endif" [ handle-endif ] }
|
||||||
{ "if" [ 2drop ] }
|
{ "if" [ handle-if ] }
|
||||||
{ "elif" [ 2drop ] }
|
{ "elif" [ handle-elif ] }
|
||||||
{ "else" [ 2drop ] }
|
{ "else" [ handle-else ] }
|
||||||
{ "pragma" [ 2drop ] }
|
{ "pragma" [ handle-pragma ] }
|
||||||
{ "include_next" [ 2drop ] }
|
{ "include_next" [ handle-include-next ] }
|
||||||
[ unknown-c-preprocessor ]
|
[ unknown-c-preprocessor ]
|
||||||
} case ;
|
} case ;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
/*
|
||||||
|
# lol
|
||||||
|
*/
|
|
@ -0,0 +1 @@
|
||||||
|
foo.h ftw
|
|
@ -0,0 +1,2 @@
|
||||||
|
#define FOO_H "foo.h"
|
||||||
|
#include FOO_H
|
|
@ -0,0 +1,3 @@
|
||||||
|
#if 4 > (5 - 4++)
|
||||||
|
#error "Umm"
|
||||||
|
#endif
|
|
@ -0,0 +1,2 @@
|
||||||
|
#if 10
|
||||||
|
#error "Umm"
|
|
@ -0,0 +1,15 @@
|
||||||
|
#if 4 > (1 + 2)
|
||||||
|
good
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if 4 > 1 + 2
|
||||||
|
good
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (4 > 1) - 1
|
||||||
|
bad
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (4 > 1) - 2
|
||||||
|
good
|
||||||
|
#endif
|
|
@ -0,0 +1,3 @@
|
||||||
|
#define TABSIZE 100
|
||||||
|
|
||||||
|
int table[TABSIZE];
|
|
@ -0,0 +1 @@
|
||||||
|
#define max(a, b) ((a) > (b) ? (a) : (b))
|
|
@ -0,0 +1,19 @@
|
||||||
|
#define x 3
|
||||||
|
#define f(a) f(x * (a))
|
||||||
|
#undef x
|
||||||
|
#define x 2
|
||||||
|
#define g f
|
||||||
|
#define z z[0]
|
||||||
|
#define h g(~
|
||||||
|
#define m(a) a(w)
|
||||||
|
#define w 0,1
|
||||||
|
#define t(a) a
|
||||||
|
#define p() int
|
||||||
|
#define q(x) x
|
||||||
|
#define r(x,y) x ## y
|
||||||
|
#define str(x) # x
|
||||||
|
f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);
|
||||||
|
g(x+(3,4)-w) | h 5) & m
|
||||||
|
(f)^m(m);
|
||||||
|
p() i[q()] = { q(1), r(2,3), r(4,), r(,5), r(,) };
|
||||||
|
char c[2][6] = { str(hello), str() };
|
|
@ -0,0 +1,15 @@
|
||||||
|
#define str(s) #s
|
||||||
|
#define xstr(s) str(s)
|
||||||
|
#define debug(s, t) printf("x" # s "= %d, x" # t "= %s", \
|
||||||
|
x ## s, x ## t)
|
||||||
|
#define INCFILE(n) vers ## n
|
||||||
|
#define glue(a, b) a## b
|
||||||
|
#define xglue(a, b) glue(a, b)
|
||||||
|
#define HIGHLOW "hello"
|
||||||
|
#define LOW LOW ", world"
|
||||||
|
debug(1, 2);
|
||||||
|
fputs(str(strncmp("abc\0d", "abc", '\4') //this goes away
|
||||||
|
== 0) str(: @\n), s);
|
||||||
|
#include xstr(INCFILE(2).h)
|
||||||
|
glue(HIGH, LOW);
|
||||||
|
xglue(HIGH, LOW)
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue