diff --git a/basis/colors/constants/factor-colors.txt b/basis/colors/constants/factor-colors.txt index b8af9d3949..64a857a2a4 100644 --- a/basis/colors/constants/factor-colors.txt +++ b/basis/colors/constants/factor-colors.txt @@ -4,3 +4,4 @@ 172 167 147 FactorDarkTan 81 91 105 FactorLightSlateBlue 55 62 72 FactorDarkSlateBlue + 0 51 0 FactorDarkGreen diff --git a/basis/compiler/cfg/instructions/instructions.factor b/basis/compiler/cfg/instructions/instructions.factor index 97bdccf045..cf0f668db3 100644 --- a/basis/compiler/cfg/instructions/instructions.factor +++ b/basis/compiler/cfg/instructions/instructions.factor @@ -468,65 +468,88 @@ use: src/int-rep ; ! Alien accessors INSN: ##alien-unsigned-1 def: dst/int-rep -use: src/int-rep ; +use: src/int-rep +literal: offset ; INSN: ##alien-unsigned-2 def: dst/int-rep -use: src/int-rep ; +use: src/int-rep +literal: offset ; INSN: ##alien-unsigned-4 def: dst/int-rep -use: src/int-rep ; +use: src/int-rep +literal: offset ; INSN: ##alien-signed-1 def: dst/int-rep -use: src/int-rep ; +use: src/int-rep +literal: offset ; INSN: ##alien-signed-2 def: dst/int-rep -use: src/int-rep ; +use: src/int-rep +literal: offset ; INSN: ##alien-signed-4 def: dst/int-rep -use: src/int-rep ; +use: src/int-rep +literal: offset ; INSN: ##alien-cell def: dst/int-rep -use: src/int-rep ; +use: src/int-rep +literal: offset ; INSN: ##alien-float def: dst/float-rep -use: src/int-rep ; +use: src/int-rep +literal: offset ; INSN: ##alien-double def: dst/double-rep -use: src/int-rep ; +use: src/int-rep +literal: offset ; INSN: ##alien-vector def: dst use: src/int-rep -literal: rep ; +literal: offset rep ; INSN: ##set-alien-integer-1 -use: src/int-rep value/int-rep ; +use: src/int-rep +literal: offset +use: value/int-rep ; INSN: ##set-alien-integer-2 -use: src/int-rep value/int-rep ; +use: src/int-rep +literal: offset +use: value/int-rep ; INSN: ##set-alien-integer-4 -use: src/int-rep value/int-rep ; +use: src/int-rep +literal: offset +use: value/int-rep ; INSN: ##set-alien-cell -use: src/int-rep value/int-rep ; +use: src/int-rep +literal: offset +use: value/int-rep ; INSN: ##set-alien-float -use: src/int-rep value/float-rep ; +use: src/int-rep +literal: offset +use: value/float-rep ; INSN: ##set-alien-double -use: src/int-rep value/double-rep ; +use: src/int-rep +literal: offset +use: value/double-rep ; INSN: ##set-alien-vector -use: src/int-rep value +use: src/int-rep +literal: offset +use: value literal: rep ; ! Memory allocation diff --git a/basis/compiler/cfg/intrinsics/alien/alien.factor b/basis/compiler/cfg/intrinsics/alien/alien.factor index 2b903813a0..bc6baa21b7 100644 --- a/basis/compiler/cfg/intrinsics/alien/alien.factor +++ b/basis/compiler/cfg/intrinsics/alien/alien.factor @@ -33,10 +33,10 @@ IN: compiler.cfg.intrinsics.alien [ second class>> fixnum class<= ] bi and ; -: prepare-alien-accessor ( info -- offset-vreg ) - class>> [ 2inputs ^^untag-fixnum swap ] dip ^^unbox-c-ptr ^^add ; +: prepare-alien-accessor ( info -- ptr-vreg offset ) + class>> [ 2inputs ^^untag-fixnum swap ] dip ^^unbox-c-ptr ^^add 0 ; -: prepare-alien-getter ( infos -- offset-vreg ) +: prepare-alien-getter ( infos -- ptr-vreg offset ) first prepare-alien-accessor ; : inline-alien-getter ( node quot -- ) @@ -49,7 +49,7 @@ IN: compiler.cfg.intrinsics.alien [ third class>> fixnum class<= ] tri and and ; -: prepare-alien-setter ( infos -- offset-vreg ) +: prepare-alien-setter ( infos -- ptr-vreg offset ) second prepare-alien-accessor ; : inline-alien-integer-setter ( node quot -- ) diff --git a/basis/compiler/cfg/representations/representations.factor b/basis/compiler/cfg/representations/representations.factor index f103a0195f..423f415742 100644 --- a/basis/compiler/cfg/representations/representations.factor +++ b/basis/compiler/cfg/representations/representations.factor @@ -1,8 +1,8 @@ ! Copyright (C) 2009 Slava Pestov ! See http://factorcode.org/license.txt for BSD license. USING: kernel fry accessors sequences assocs sets namespaces -arrays combinators make locals deques dlists layouts -cpu.architecture compiler.utilities +arrays combinators combinators.short-circuit make locals deques +dlists layouts cpu.architecture compiler.utilities compiler.cfg compiler.cfg.rpo compiler.cfg.hats @@ -208,6 +208,25 @@ SYMBOL: phi-mappings M: ##phi conversions-for-insn [ , ] [ [ inputs>> values ] [ dst>> ] bi phi-mappings get set-at ] bi ; +! When a literal zero vector is unboxed, we replace the ##load-reference +! with a ##zero-vector instruction since this is more efficient. +: convert-to-zero-vector? ( insn -- ? ) + { + [ dst>> rep-of vector-rep? ] + [ obj>> B{ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } = ] + } 1&& ; + +: convert-to-zero-vector ( insn -- ) + dst>> dup rep-of ##zero-vector ; + +M: ##load-reference conversions-for-insn + dup convert-to-zero-vector? + [ convert-to-zero-vector ] [ call-next-method ] if ; + +M: ##load-constant conversions-for-insn + dup convert-to-zero-vector? + [ convert-to-zero-vector ] [ call-next-method ] if ; + M: vreg-insn conversions-for-insn [ compute-renaming-set ] [ perform-renaming ] bi ; diff --git a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor index 5759d7467a..8e5e013606 100755 --- a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor +++ b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor @@ -16,6 +16,7 @@ IN: compiler.cfg.value-numbering.rewrite : vreg-small-constant? ( vreg -- ? ) vreg>expr { [ constant-expr? ] + [ value>> fixnum? ] [ value>> small-enough? ] } 1&& ; @@ -391,6 +392,29 @@ M: ##unbox-any-c-ptr rewrite dup src>> vreg>expr dup box-displaced-alien-expr? [ rewrite-unbox-displaced-alien ] [ 2drop f ] if ; +! More efficient addressing for alien intrinsics +: rewrite-alien-addressing ( insn -- insn' ) + dup src>> vreg>expr dup add-imm-expr? [ + [ src1>> vn>vreg ] [ src2>> vn>constant ] bi + [ >>src ] [ '[ _ + ] change-offset ] bi* + ] [ 2drop f ] if ; + +M: ##alien-unsigned-1 rewrite rewrite-alien-addressing ; +M: ##alien-unsigned-2 rewrite rewrite-alien-addressing ; +M: ##alien-unsigned-4 rewrite rewrite-alien-addressing ; +M: ##alien-signed-1 rewrite rewrite-alien-addressing ; +M: ##alien-signed-2 rewrite rewrite-alien-addressing ; +M: ##alien-signed-4 rewrite rewrite-alien-addressing ; +M: ##alien-float rewrite rewrite-alien-addressing ; +M: ##alien-double rewrite rewrite-alien-addressing ; +M: ##alien-vector rewrite rewrite-alien-addressing ; +M: ##set-alien-integer-1 rewrite rewrite-alien-addressing ; +M: ##set-alien-integer-2 rewrite rewrite-alien-addressing ; +M: ##set-alien-integer-4 rewrite rewrite-alien-addressing ; +M: ##set-alien-float rewrite rewrite-alien-addressing ; +M: ##set-alien-double rewrite rewrite-alien-addressing ; +M: ##set-alien-vector rewrite rewrite-alien-addressing ; + ! Some lame constant folding for SIMD intrinsics. Eventually this ! should be redone completely. @@ -431,3 +455,7 @@ M: ##shuffle-vector rewrite M: ##scalar>vector rewrite dup src>> vreg>expr dup constant-expr? [ fold-scalar>vector ] [ 2drop f ] if ; + +M: ##xor-vector rewrite + dup [ src1>> vreg>vn ] [ src2>> vreg>vn ] bi eq? + [ [ dst>> ] [ rep>> ] bi \ ##zero-vector new-insn ] [ drop f ] if ; diff --git a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor index 663a2f0193..b2750da3fa 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor @@ -406,6 +406,20 @@ IN: compiler.cfg.value-numbering.tests } value-numbering-step trim-temps ] unit-test +[ + { + T{ ##peek f 0 D 0 } + T{ ##load-constant f 1 3.5 } + T{ ##compare f 2 0 1 cc= } + } +] [ + { + T{ ##peek f 0 D 0 } + T{ ##load-constant f 1 3.5 } + T{ ##compare f 2 0 1 cc= } + } value-numbering-step trim-temps +] unit-test + [ { T{ ##peek f 0 D 0 } @@ -434,6 +448,20 @@ IN: compiler.cfg.value-numbering.tests } value-numbering-step ] unit-test +[ + { + T{ ##peek f 0 D 0 } + T{ ##load-constant f 1 3.5 } + T{ ##compare-branch f 0 1 cc= } + } +] [ + { + T{ ##peek f 0 D 0 } + T{ ##load-constant f 1 3.5 } + T{ ##compare-branch f 0 1 cc= } + } value-numbering-step trim-temps +] unit-test + [ { T{ ##peek f 0 D 0 } @@ -1189,6 +1217,16 @@ cell 8 = [ } value-numbering-step ] unit-test +[ + { + T{ ##zero-vector f 2 float-4-rep } + } +] [ + { + T{ ##xor-vector f 2 1 1 float-4-rep } + } value-numbering-step +] unit-test + : test-branch-folding ( insns -- insns' n ) [ V{ 0 1 } clone >>successors basic-block set value-numbering-step ] keep diff --git a/basis/compression/lzw/authors.txt b/basis/compression/lzw/authors.txt index b4bd0e7b35..14da4319b2 100644 --- a/basis/compression/lzw/authors.txt +++ b/basis/compression/lzw/authors.txt @@ -1 +1,2 @@ -Doug Coleman \ No newline at end of file +Doug Coleman +Keith Lazuka diff --git a/basis/compression/lzw/lzw-docs.factor b/basis/compression/lzw/lzw-docs.factor new file mode 100644 index 0000000000..c43a2d5a37 --- /dev/null +++ b/basis/compression/lzw/lzw-docs.factor @@ -0,0 +1,83 @@ +! Copyright (C) 2009 Keith Lazuka +! See http://factorcode.org/license.txt for BSD license. +USING: bitstreams byte-arrays classes help.markup help.syntax +kernel math quotations sequences ; +IN: compression.lzw + +HELP: gif-lzw-uncompress +{ $values + { "seq" sequence } { "code-size" integer } + { "byte-array" byte-array } +} +{ $description "Decompresses a sequence of LZW-compressed bytes obtained from a GIF file." } ; + +HELP: tiff-lzw-uncompress +{ $values + { "seq" sequence } + { "byte-array" byte-array } +} +{ $description "Decompresses a sequence of LZW-compressed bytes obtained from a TIFF file." } ; + +HELP: lzw-read +{ $values + { "lzw" lzw } + { "lzw" lzw } { "n" integer } +} +{ $description "Read the next LZW code." } ; + +HELP: lzw-process-next-code +{ $values + { "lzw" lzw } { "quot" quotation } +} +{ $description "Read the next LZW code and, assuming that the code is neither the Clear Code nor the End of Information Code, conditionally processes it by calling " { $snippet "quot" } " with the lzw object and the LZW code. If it does read a Clear Code, this combinator will take care of handling the Clear Code for you." } ; + +HELP: +{ $values + { "input" bit-reader } { "code-size" "number of bits" } { "class" class } + { "obj" object } +} +{ $description "Instantiate a new LZW decompressor." } ; + +HELP: code-space-full? +{ $values + { "lzw" lzw } + { "?" boolean } +} +{ $description "Determines when to increment the variable length code's bit-width." } ; + +HELP: reset-lzw-uncompress +{ $values + { "lzw" lzw } + { "lzw" lzw } +} +{ $description "Reset the LZW uncompressor state (either at initialization time or immediately after receiving a Clear Code). " } ; + +ARTICLE: "compression.lzw.differences" "LZW Differences between TIFF and GIF" +{ $vocab-link "compression.lzw" } +$nl +"There are some subtle differences between the LZW algorithm used by TIFF and GIF images." +{ $heading "Variable Length Codes" } +"Both TIFF and GIF use a variation of the LZW algorithm that uses variable length codes. In both cases, the maximum code size is 12 bits. The initial code size, however, is different between the two formats. TIFF's initial code size is always 9 bits. GIF's initial code size is specified on a per-file basis at the beginning of the image descriptor block, with a minimum of 3 bits." +$nl +"TIFF and GIF each switch to the next code size using slightly different algorithms. GIF increments the code size as soon as the LZW string table's length is equal to 2**code-size, while TIFF increments the code size when the table's length is equal to 2**code-size - 1." +{ $heading "Packing Bits into Bytes" } +"TIFF and GIF LZW algorithms differ in how they pack the code bits into the byte stream. The least significant bit in a TIFF code is stored in the most significant bit of the bytestream, while the least significant bit in a GIF code is stored in the least significant bit of the bytestream." +{ $heading "Special Codes" } +"TIFF and GIF both add the concept of a 'Clear Code' and a 'End of Information Code' to the LZW algorithm. In both cases, the 'Clear Code' is equal to 2**(code-size - 1) and the 'End of Information Code' is equal to the Clear Code + 1. These 2 codes are reserved in the string table. So in both cases, the LZW string table is initialized to have a length equal to the End of Information Code + 1." +; + +ARTICLE: "compression.lzw" "LZW Compression" +{ $vocab-link "compression.lzw" } +$nl +"Implements both the TIFF and GIF variations of the LZW algorithm." +{ $heading "Decompression" } +{ $subsection tiff-lzw-uncompress } +{ $subsection gif-lzw-uncompress } +{ $heading "Compression" } +"Compression has not yet been implemented." +$nl +"Implementation details:" +{ $subsection "compression.lzw.differences" } +; + +ABOUT: "compression.lzw" diff --git a/basis/compression/lzw/lzw.factor b/basis/compression/lzw/lzw.factor index 46a319662e..e017636009 100644 --- a/basis/compression/lzw/lzw.factor +++ b/basis/compression/lzw/lzw.factor @@ -1,39 +1,37 @@ ! Copyright (C) 2009 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors alien.accessors assocs byte-arrays combinators -io.encodings.binary io.streams.byte-array kernel math sequences -vectors ; +USING: accessors combinators io kernel math namespaces +prettyprint sequences vectors ; +QUALIFIED-WITH: bitstreams bs IN: compression.lzw -QUALIFIED-WITH: bitstreams bs +TUPLE: lzw +input +output +table +code +old-code +initial-code-size +code-size +clear-code +end-of-information-code ; -CONSTANT: clear-code 256 -CONSTANT: end-of-information 257 +TUPLE: tiff-lzw < lzw ; +TUPLE: gif-lzw < lzw ; -TUPLE: lzw input output table code old-code ; - -SYMBOL: table-full - -: lzw-bit-width ( n -- n' ) - { - { [ dup 510 <= ] [ drop 9 ] } - { [ dup 1022 <= ] [ drop 10 ] } - { [ dup 2046 <= ] [ drop 11 ] } - { [ dup 4094 <= ] [ drop 12 ] } - [ drop table-full ] - } cond ; - -: lzw-bit-width-uncompress ( lzw -- n ) - table>> length lzw-bit-width ; - -: initial-uncompress-table ( -- seq ) - 258 iota [ 1vector ] V{ } map-as ; +: initial-uncompress-table ( size -- seq ) + iota [ 1vector ] V{ } map-as ; : reset-lzw-uncompress ( lzw -- lzw ) - initial-uncompress-table >>table ; + dup end-of-information-code>> 1 + initial-uncompress-table >>table + dup initial-code-size>> >>code-size ; -: ( input -- obj ) - lzw new +: ( input code-size class -- obj ) + new + swap >>code-size + dup code-size>> >>initial-code-size + dup code-size>> 1 - 2^ >>clear-code + dup clear-code>> 1 + >>end-of-information-code swap >>input BV{ } clone >>output reset-lzw-uncompress ; @@ -55,22 +53,43 @@ ERROR: not-in-table value ; : write-code ( lzw -- ) [ lookup-code ] [ output>> ] bi push-all ; -: add-to-table ( seq lzw -- ) table>> push ; +GENERIC: code-space-full? ( lzw -- ? ) + +: size-and-limit ( lzw -- m n ) [ table>> length ] [ code-size>> 2^ ] bi ; + +M: tiff-lzw code-space-full? size-and-limit 1 - = ; +M: gif-lzw code-space-full? size-and-limit = ; + +: maybe-increment-code-size ( lzw -- lzw ) + dup code-space-full? [ [ 1 + ] change-code-size ] when ; + +: add-to-table ( seq lzw -- ) + [ table>> push ] + [ maybe-increment-code-size 2drop ] 2bi ; : lzw-read ( lzw -- lzw n ) - [ ] [ lzw-bit-width-uncompress ] [ input>> ] tri bs:read ; + [ ] [ code-size>> ] [ input>> ] tri bs:read ; + +: end-of-information? ( lzw code -- ? ) swap end-of-information-code>> = ; +: clear-code? ( lzw code -- ? ) swap clear-code>> = ; + +DEFER: handle-clear-code +: lzw-process-next-code ( lzw quot: ( lzw code -- ) -- ) + [ lzw-read ] dip { + { [ 3dup drop end-of-information? ] [ 3drop ] } + { [ 3dup drop clear-code? ] [ 2drop handle-clear-code ] } + [ call( lzw code -- ) ] + } cond ; inline DEFER: lzw-uncompress-char : handle-clear-code ( lzw -- ) reset-lzw-uncompress - lzw-read dup end-of-information = [ - 2drop - ] [ + [ >>code [ write-code ] [ code>old-code ] bi lzw-uncompress-char - ] if ; + ] lzw-process-next-code ; : handle-uncompress-code ( lzw -- lzw ) dup code-in-table? [ @@ -89,23 +108,15 @@ DEFER: lzw-uncompress-char ] if ; : lzw-uncompress-char ( lzw -- ) - lzw-read [ - >>code - dup code>> end-of-information = [ - drop - ] [ - dup code>> clear-code = [ - handle-clear-code - ] [ - handle-uncompress-code - lzw-uncompress-char - ] if - ] if - ] [ - drop - ] if* ; + [ >>code handle-uncompress-code lzw-uncompress-char ] + lzw-process-next-code ; -: lzw-uncompress ( seq -- byte-array ) - bs: +: lzw-uncompress ( bitstream code-size class -- byte-array ) [ lzw-uncompress-char ] [ output>> ] bi ; + +: tiff-lzw-uncompress ( seq -- byte-array ) + bs: 9 tiff-lzw lzw-uncompress ; + +: gif-lzw-uncompress ( seq code-size -- byte-array ) + [ bs: ] dip gif-lzw lzw-uncompress ; diff --git a/basis/cpu/architecture/architecture.factor b/basis/cpu/architecture/architecture.factor index 9d6f8fd662..3b1f57d08e 100644 --- a/basis/cpu/architecture/architecture.factor +++ b/basis/cpu/architecture/architecture.factor @@ -114,6 +114,14 @@ M: float-rep rep-size drop 4 ; M: double-rep rep-size drop 8 ; M: stack-params rep-size drop cell ; M: vector-rep rep-size drop 16 ; +M: char-scalar-rep rep-size drop 1 ; +M: uchar-scalar-rep rep-size drop 1 ; +M: short-scalar-rep rep-size drop 2 ; +M: ushort-scalar-rep rep-size drop 2 ; +M: int-scalar-rep rep-size drop 4 ; +M: uint-scalar-rep rep-size drop 4 ; +M: longlong-scalar-rep rep-size drop 8 ; +M: ulonglong-scalar-rep rep-size drop 8 ; GENERIC: rep-component-type ( rep -- n ) @@ -277,24 +285,24 @@ HOOK: %unbox-any-c-ptr cpu ( dst src temp -- ) HOOK: %box-alien cpu ( dst src temp -- ) HOOK: %box-displaced-alien cpu ( dst displacement base temp1 temp2 base-class -- ) -HOOK: %alien-unsigned-1 cpu ( dst src -- ) -HOOK: %alien-unsigned-2 cpu ( dst src -- ) -HOOK: %alien-unsigned-4 cpu ( dst src -- ) -HOOK: %alien-signed-1 cpu ( dst src -- ) -HOOK: %alien-signed-2 cpu ( dst src -- ) -HOOK: %alien-signed-4 cpu ( dst src -- ) -HOOK: %alien-cell cpu ( dst src -- ) -HOOK: %alien-float cpu ( dst src -- ) -HOOK: %alien-double cpu ( dst src -- ) -HOOK: %alien-vector cpu ( dst src rep -- ) +HOOK: %alien-unsigned-1 cpu ( dst src offset -- ) +HOOK: %alien-unsigned-2 cpu ( dst src offset -- ) +HOOK: %alien-unsigned-4 cpu ( dst src offset -- ) +HOOK: %alien-signed-1 cpu ( dst src offset -- ) +HOOK: %alien-signed-2 cpu ( dst src offset -- ) +HOOK: %alien-signed-4 cpu ( dst src offset -- ) +HOOK: %alien-cell cpu ( dst src offset -- ) +HOOK: %alien-float cpu ( dst src offset -- ) +HOOK: %alien-double cpu ( dst src offset -- ) +HOOK: %alien-vector cpu ( dst src offset rep -- ) -HOOK: %set-alien-integer-1 cpu ( ptr value -- ) -HOOK: %set-alien-integer-2 cpu ( ptr value -- ) -HOOK: %set-alien-integer-4 cpu ( ptr value -- ) -HOOK: %set-alien-cell cpu ( ptr value -- ) -HOOK: %set-alien-float cpu ( ptr value -- ) -HOOK: %set-alien-double cpu ( ptr value -- ) -HOOK: %set-alien-vector cpu ( ptr value rep -- ) +HOOK: %set-alien-integer-1 cpu ( ptr offset value -- ) +HOOK: %set-alien-integer-2 cpu ( ptr offset value -- ) +HOOK: %set-alien-integer-4 cpu ( ptr offset value -- ) +HOOK: %set-alien-cell cpu ( ptr offset value -- ) +HOOK: %set-alien-float cpu ( ptr offset value -- ) +HOOK: %set-alien-double cpu ( ptr offset value -- ) +HOOK: %set-alien-vector cpu ( ptr offset value rep -- ) HOOK: %alien-global cpu ( dst symbol library -- ) HOOK: %vm-field-ptr cpu ( dst fieldname -- ) diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index 14a382d6cf..eaaab19662 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -307,45 +307,45 @@ M:: x86 %set-string-nth-fast ( ch str index temp -- ) temp string-offset [+] new-ch 8-bit-version-of MOV ] with-small-register ; -:: %alien-integer-getter ( dst src size quot -- ) +:: %alien-integer-getter ( dst src offset size quot -- ) dst { src } size [| new-dst | - new-dst dup size n-bit-version-of dup src [] MOV + new-dst dup size n-bit-version-of dup src offset [+] MOV quot call dst new-dst int-rep %copy ] with-small-register ; inline -: %alien-unsigned-getter ( dst src size -- ) +: %alien-unsigned-getter ( dst src offset size -- ) [ MOVZX ] %alien-integer-getter ; inline M: x86 %alien-unsigned-1 8 %alien-unsigned-getter ; M: x86 %alien-unsigned-2 16 %alien-unsigned-getter ; M: x86 %alien-unsigned-4 32 [ 2drop ] %alien-integer-getter ; -: %alien-signed-getter ( dst src size -- ) +: %alien-signed-getter ( dst src offset size -- ) [ MOVSX ] %alien-integer-getter ; inline M: x86 %alien-signed-1 8 %alien-signed-getter ; M: x86 %alien-signed-2 16 %alien-signed-getter ; M: x86 %alien-signed-4 32 %alien-signed-getter ; -M: x86 %alien-cell [] MOV ; -M: x86 %alien-float [] MOVSS ; -M: x86 %alien-double [] MOVSD ; -M: x86 %alien-vector [ [] ] dip %copy ; +M: x86 %alien-cell [+] MOV ; +M: x86 %alien-float [+] MOVSS ; +M: x86 %alien-double [+] MOVSD ; +M: x86 %alien-vector [ [+] ] dip %copy ; -:: %alien-integer-setter ( ptr value size -- ) +:: %alien-integer-setter ( ptr offset value size -- ) value { ptr } size [| new-value | new-value value int-rep %copy - ptr [] new-value size n-bit-version-of MOV + ptr offset [+] new-value size n-bit-version-of MOV ] with-small-register ; inline M: x86 %set-alien-integer-1 8 %alien-integer-setter ; M: x86 %set-alien-integer-2 16 %alien-integer-setter ; M: x86 %set-alien-integer-4 32 %alien-integer-setter ; -M: x86 %set-alien-cell [ [] ] dip MOV ; -M: x86 %set-alien-float [ [] ] dip MOVSS ; -M: x86 %set-alien-double [ [] ] dip MOVSD ; -M: x86 %set-alien-vector [ [] ] 2dip %copy ; +M: x86 %set-alien-cell [ [+] ] dip MOV ; +M: x86 %set-alien-float [ [+] ] dip MOVSS ; +M: x86 %set-alien-double [ [+] ] dip MOVSD ; +M: x86 %set-alien-vector [ [+] ] 2dip %copy ; : shift-count? ( reg -- ? ) { ECX RCX } memq? ; @@ -1042,8 +1042,11 @@ M: x86 %shr-vector-reps { sse2? { short-8-rep ushort-8-rep int-4-rep uint-4-rep ulonglong-2-rep } } } available-reps ; -M: x86 %integer>scalar drop MOVD ; -M: x86 %scalar>integer drop MOVD ; +: scalar-sized-reg ( reg rep -- reg' ) + rep-size 8 * n-bit-version-of ; + +M: x86 %integer>scalar scalar-sized-reg MOVD ; +M: x86 %scalar>integer swap [ scalar-sized-reg ] dip MOVD ; M: x86 %vector>scalar %copy ; M: x86 %scalar>vector %copy ; diff --git a/basis/help/markup/markup.factor b/basis/help/markup/markup.factor index 0201e86b3f..2377a6753a 100644 --- a/basis/help/markup/markup.factor +++ b/basis/help/markup/markup.factor @@ -1,6 +1,6 @@ ! Copyright (C) 2005, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors arrays assocs classes colors.constants +USING: accessors arrays assocs classes colors colors.constants combinators definitions definitions.icons effects fry generic hashtables help.stylesheet help.topics io io.styles kernel make math namespaces parser present prettyprint @@ -154,6 +154,9 @@ ALIAS: $slot $snippet 1array \ $image prefix ; ! Some links + +string ] [ effect-style ] bi - [ write ] with-style - ] [ drop ] if ; +GENERIC: link-long-text ( topic -- ) -: inter-cleave ( x seq between -- ) - [ [ call( x -- ) ] with ] dip swap interleave ; inline +M: topic link-long-text + [ article-title ] keep write-link ; -: (($link)) ( topic words -- ) - [ dup topic? [ >link ] unless ] dip - [ [ bl ] inter-cleave ] ($span) ; inline +M: word link-long-text + dup presented associate [ + [ article-name link-style get format ] + [ drop bl ] + [ stack-effect effect>string stack-effect-style get format ] + tri + ] with-nesting ; -: ($link) ( topic -- ) - { [ link-text ] } (($link)) ; +: >topic ( obj -- topic ) dup topic? [ >link ] unless ; +PRIVATE> + +: ($link) ( topic -- ) >topic link-text ; : $link ( element -- ) first ($link) ; -: ($long-link) ( topic -- ) - { [ link-text ] [ link-effect ] } (($link)) ; - +: ($long-link) ( topic -- ) >topic link-long-text ; : $long-link ( element -- ) first ($long-link) ; : ($pretty-link) ( topic -- ) - { [ link-icon ] [ link-text ] } (($link)) ; - + >topic [ link-icon ] [ drop bl ] [ link-text ] tri ; : $pretty-link ( element -- ) first ($pretty-link) ; : ($long-pretty-link) ( topic -- ) - { [ link-icon ] [ link-text ] [ link-effect ] } (($link)) ; - -: $long-pretty-link ( element -- ) first ($long-pretty-link) ; + >topic [ link-icon ] [ drop bl ] [ link-long-text ] tri ; : <$pretty-link> ( definition -- element ) 1array \ $pretty-link prefix ; diff --git a/basis/images/tiff/tiff-tests.factor b/basis/images/tiff/tiff-tests.factor index 9905e7ad79..7a27a98251 100755 --- a/basis/images/tiff/tiff-tests.factor +++ b/basis/images/tiff/tiff-tests.factor @@ -1,10 +1,44 @@ ! Copyright (C) 2009 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. -USING: tools.test images.tiff ; +USING: accessors images.tiff images.viewer io +io.encodings.binary io.files namespaces sequences tools.test ; IN: images.tiff.tests -: tiff-test-path ( -- path ) - "resource:extra/images/test-images/rgb.tiff" ; +: path>tiff ( path -- tiff ) + binary [ input-stream get load-tiff ] with-file-reader ; + +: tiff-example1 ( -- tiff ) + "resource:extra/images/testing/square.tiff" path>tiff ; + +: tiff-example2 ( -- tiff ) + "resource:extra/images/testing/cube.tiff" path>tiff ; + +: tiff-example3 ( -- tiff ) + "resource:extra/images/testing/bi.tiff" path>tiff ; + +: tiff-example4 ( -- tiff ) + "resource:extra/images/testing/noise.tiff" path>tiff ; + +: tiff-example5 ( -- tiff ) + "resource:extra/images/testing/alpha.tiff" path>tiff ; + +: tiff-example6 ( -- tiff ) + "resource:extra/images/testing/color_spectrum.tiff" path>tiff ; + +: tiff-example7 ( -- tiff ) + "resource:extra/images/testing/small.tiff" path>tiff ; + +: tiff-all. ( -- ) + { + tiff-example1 tiff-example2 tiff-example3 tiff-example4 tiff-example5 + tiff-example6 + } + [ execute( -- gif ) tiff>image image. ] each ; + +[ 1024 ] [ tiff-example1 ifds>> first bitmap>> length ] unit-test +[ 1024 ] [ tiff-example2 ifds>> first bitmap>> length ] unit-test +[ 131744 ] [ tiff-example3 ifds>> first bitmap>> length ] unit-test +[ 49152 ] [ tiff-example4 ifds>> first bitmap>> length ] unit-test +[ 16 ] [ tiff-example5 ifds>> first bitmap>> length ] unit-test +[ 117504 ] [ tiff-example6 ifds>> first bitmap>> length ] unit-test -: tiff-test-path2 ( -- path ) - "resource:extra/images/test-images/octagon.tiff" ; diff --git a/basis/images/tiff/tiff.factor b/basis/images/tiff/tiff.factor index f0a8bb4891..4a82545d79 100755 --- a/basis/images/tiff/tiff.factor +++ b/basis/images/tiff/tiff.factor @@ -438,7 +438,7 @@ ERROR: unhandled-compression compression ; : (uncompress-strips) ( strips compression -- uncompressed-strips ) { { compression-none [ ] } - { compression-lzw [ [ lzw-uncompress ] map ] } + { compression-lzw [ [ tiff-lzw-uncompress ] map ] } [ unhandled-compression ] } case ; diff --git a/basis/io/styles/styles.factor b/basis/io/styles/styles.factor index b141d8d2f7..ae493be849 100644 --- a/basis/io/styles/styles.factor +++ b/basis/io/styles/styles.factor @@ -1,9 +1,10 @@ ! Copyright (C) 2005, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: hashtables io io.streams.plain io.streams.string -colors summary make accessors splitting math.order -kernel namespaces assocs destructors strings sequences -present fry strings.tables delegate delegate.protocols ; +USING: accessors assocs colors colors.constants delegate +delegate.protocols destructors fry hashtables io +io.streams.plain io.streams.string kernel make math.order +namespaces present sequences splitting strings strings.tables +summary ; IN: io.styles GENERIC: stream-format ( str style stream -- ) @@ -162,3 +163,9 @@ M: input summary : write-object ( str obj -- ) presented associate format ; : write-image ( image -- ) [ "" ] dip image associate format ; + +SYMBOL: stack-effect-style +H{ + { foreground COLOR: FactorDarkGreen } + { font-style plain } +} stack-effect-style set-global diff --git a/basis/prettyprint/stylesheet/stylesheet.factor b/basis/prettyprint/stylesheet/stylesheet.factor index 580049160d..42a701d60f 100644 --- a/basis/prettyprint/stylesheet/stylesheet.factor +++ b/basis/prettyprint/stylesheet/stylesheet.factor @@ -43,5 +43,4 @@ PRIVATE> dim-color colored-presentation-style ; : effect-style ( effect -- style ) - 0 0.2 0 1 colored-presentation-style - { { font-style plain } } assoc-union ; + presented associate stack-effect-style get assoc-union ; diff --git a/extra/images/gif/authors.txt b/extra/images/gif/authors.txt new file mode 100644 index 0000000000..14da4319b2 --- /dev/null +++ b/extra/images/gif/authors.txt @@ -0,0 +1,2 @@ +Doug Coleman +Keith Lazuka diff --git a/extra/images/gif/gif-docs.factor b/extra/images/gif/gif-docs.factor new file mode 100644 index 0000000000..935e8f6beb --- /dev/null +++ b/extra/images/gif/gif-docs.factor @@ -0,0 +1,12 @@ +! Copyright (C) 2009 Keith Lazuka. +! See http://factorcode.org/license.txt for BSD license. +USING: help.markup help.syntax kernel sequences ; +IN: images.gif + +ARTICLE: "images.gif" "GIF Image Loader" +{ $vocab-link "images.gif" } +$nl +{ $notes "Currently multi-frame GIF images are not supported." } +; + +ABOUT: "images.gif" diff --git a/extra/images/gif/gif-tests.factor b/extra/images/gif/gif-tests.factor new file mode 100644 index 0000000000..1eeb420a04 --- /dev/null +++ b/extra/images/gif/gif-tests.factor @@ -0,0 +1,95 @@ +! Copyright (C) 2009 Keith Lazuka. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors bitstreams compression.lzw images.gif io +io.encodings.binary io.files kernel math math.bitwise +math.parser namespaces prettyprint sequences tools.test images.viewer ; +QUALIFIED-WITH: bitstreams bs +IN: images.gif.tests + +: path>gif ( path -- loading-gif ) + binary [ input-stream get load-gif ] with-file-reader ; + +: gif-example1 ( -- loading-gif ) + "resource:extra/images/testing/circle.gif" path>gif ; + +: gif-example2 ( -- loading-gif ) + "resource:extra/images/testing/checkmark.gif" path>gif ; + +: gif-example3 ( -- loading-gif ) + "resource:extra/images/testing/monochrome.gif" path>gif ; + +: gif-example4 ( -- loading-gif ) + "resource:extra/images/testing/noise.gif" path>gif ; + +: gif-example5 ( -- loading-gif ) + "resource:extra/images/testing/alpha.gif" path>gif ; + +: gif-example6 ( -- loading-gif ) + "resource:extra/images/testing/astronaut_animation.gif" path>gif ; + +: gif-all. ( -- ) + { + gif-example1 gif-example2 gif-example3 gif-example4 gif-example5 + gif-example6 + } + [ execute( -- gif ) gif>image image. ] each ; + +: declared-num-colors ( gif -- n ) flags>> 3 bits 1 + 2^ ; +: actual-num-colors ( gif -- n ) global-color-table>> length ; + +[ 16 ] [ gif-example1 actual-num-colors ] unit-test +[ 16 ] [ gif-example1 declared-num-colors ] unit-test + +[ 256 ] [ gif-example2 actual-num-colors ] unit-test +[ 256 ] [ gif-example2 declared-num-colors ] unit-test + +[ 2 ] [ gif-example3 actual-num-colors ] unit-test +[ 2 ] [ gif-example3 declared-num-colors ] unit-test + +: >index-stream ( gif -- seq ) + [ compressed-bytes>> ] + [ image-descriptor>> first-code-size>> ] bi + gif-lzw-uncompress ; + +[ + BV{ + 0 0 0 0 0 0 + 1 0 0 0 0 1 + 1 1 0 0 1 1 + 1 1 1 1 1 1 + 1 0 1 1 0 1 + 1 0 0 0 0 1 + } +] [ gif-example3 >index-stream ] unit-test + +[ + B{ + 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 + 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 255 + 0 0 0 255 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 255 0 0 0 255 + 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 + 0 0 0 255 255 255 255 255 0 0 0 255 0 0 0 255 255 255 255 255 0 0 0 255 + 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 255 + } +] [ gif-example3 gif>image bitmap>> ] unit-test + +[ + BV{ + 0 1 + 1 0 + } +] [ gif-example5 >index-stream ] unit-test + +[ + B{ + 255 000 000 255 000 000 000 000 + 000 000 000 000 255 000 000 255 + } +] [ gif-example5 gif>image bitmap>> ] unit-test + +[ 100 ] [ gif-example1 >index-stream length ] unit-test +[ 870 ] [ gif-example2 >index-stream length ] unit-test +[ 16384 ] [ gif-example4 >index-stream length ] unit-test + +! example6 is a GIF animation and the first frame contains 1768 pixels +[ 1768 ] [ gif-example6 >index-stream length ] unit-test diff --git a/extra/images/gif/gif.factor b/extra/images/gif/gif.factor index 9e1bc347b2..7301cc984f 100644 --- a/extra/images/gif/gif.factor +++ b/extra/images/gif/gif.factor @@ -1,11 +1,11 @@ -! Copyrigt (C) 2009 Doug Coleman. +! Copyrigt (C) 2009 Doug Coleman, Keith Lazuka ! See http://factorcode.org/license.txt for BSD license. -USING: accessors arrays combinators constructors destructors -images images.loader io io.binary io.buffers -io.encodings.binary io.encodings.string io.encodings.utf8 -io.files io.files.info io.ports io.streams.limited kernel make -math math.bitwise math.functions multiline namespaces -prettyprint sequences ; +USING: accessors arrays assocs combinators compression.lzw +constructors destructors grouping images images.loader io +io.binary io.buffers io.encodings.binary io.encodings.string +io.encodings.utf8 io.files io.files.info io.ports +io.streams.limited kernel make math math.bitwise math.functions +multiline namespaces prettyprint sequences ; IN: images.gif SINGLETON: gif-image @@ -37,12 +37,10 @@ ERROR: unknown-extension n ; ERROR: gif-unexpected-eof ; TUPLE: graphics-control-extension -label block-size raw-data -packed delay-time color-index -block-terminator ; +flags delay-time transparent-color-index ; TUPLE: image-descriptor -separator left top width height flags ; +left top width height flags first-code-size ; TUPLE: plain-text-extension introducer label block-size text-grid-left text-grid-top text-grid-width @@ -67,6 +65,8 @@ CONSTANT: graphic-control-extension HEX: f9 CONSTANT: comment-extension HEX: fe CONSTANT: application-extension HEX: ff CONSTANT: trailer HEX: 3b +CONSTANT: graphic-control-extension-block-size HEX: 04 +CONSTANT: block-terminator HEX: 00 : ( -- loading-gif ) \ loading-gif new @@ -92,18 +92,20 @@ M: input-port stream-peek1 : read-image-descriptor ( -- image-descriptor ) \ image-descriptor new - 1 read le> >>separator 2 read le> >>left 2 read le> >>top 2 read le> >>width 2 read le> >>height - 1 read le> >>flags ; + 1 read le> >>flags + 1 read le> 1 + >>first-code-size ; : read-graphic-control-extension ( -- graphic-control-extension ) \ graphics-control-extension new - 1 read le> [ >>block-size ] [ read ] bi - >>raw-data - 1 read le> >>block-terminator ; + 1 read le> graphic-control-extension-block-size assert= + 1 read le> >>flags + 2 read le> >>delay-time + 1 read le> >>transparent-color-index + 1 read le> block-terminator assert= ; : read-plain-text-extension ( -- plain-text-extension ) \ plain-text-extension new @@ -147,12 +149,14 @@ ERROR: unimplemented message ; : interlaced? ( image -- ? ) flags>> 6 bit? ; inline : sort? ( image -- ? ) flags>> 5 bit? ; inline : color-table-size ( image -- ? ) flags>> 3 bits 1 + 2^ 3 * ; inline +: transparency? ( image -- ? ) + graphic-control-extensions>> first flags>> 0 bit? ; inline : color-resolution ( image -- ? ) flags>> -4 shift 3 bits ; inline : read-global-color-table ( loading-gif -- loading-gif ) dup color-table? [ - dup color-table-size read >>global-color-table + dup color-table-size read 3 group >>global-color-table ] when ; : maybe-read-local-color-table ( loading-gif -- loading-gif ) @@ -220,8 +224,33 @@ ERROR: unhandled-data byte ; } case ] with-input-stream ; -: loading-gif>image ( loading-gif -- image ) - ; +: decompress ( loading-gif -- indexes ) + [ compressed-bytes>> ] + [ image-descriptor>> first-code-size>> ] bi + gif-lzw-uncompress ; + +: colorize ( index palette transparent-index/f -- seq ) + pick = [ 2drop B{ 0 0 0 0 } ] [ nth 255 suffix ] if ; + +: apply-palette ( indexes palette transparent-index/f -- bitmap ) + [ colorize ] 2curry V{ } map-as concat ; + +: dimensions ( loading-gif -- dim ) + [ image-descriptor>> width>> ] [ image-descriptor>> height>> ] bi 2array ; + +: ?transparent-color-index ( loading-gif -- index/f ) + dup transparency? + [ graphic-control-extensions>> first transparent-color-index>> ] + [ drop f ] if ; + +: gif>image ( loading-gif -- image ) + [ ] dip + [ dimensions >>dim ] + [ drop RGBA >>component-order ubyte-components >>component-type ] + [ + [ decompress ] [ global-color-table>> ] [ ?transparent-color-index ] tri + apply-palette >>bitmap + ] tri ; ERROR: loading-gif-error gif-image ; @@ -229,4 +258,4 @@ ERROR: loading-gif-error gif-image ; dup loading?>> [ loading-gif-error ] when ; M: gif-image stream>image ( path gif-image -- image ) - drop load-gif ensure-loaded loading-gif>image ; + drop load-gif ensure-loaded gif>image ; diff --git a/extra/images/gif/summary.txt b/extra/images/gif/summary.txt new file mode 100644 index 0000000000..ff8fc71264 --- /dev/null +++ b/extra/images/gif/summary.txt @@ -0,0 +1 @@ +GIF image file format diff --git a/extra/images/testing/alpha.gif b/extra/images/testing/alpha.gif new file mode 100644 index 0000000000..c4c38bdaf0 Binary files /dev/null and b/extra/images/testing/alpha.gif differ diff --git a/extra/images/testing/alpha.tiff b/extra/images/testing/alpha.tiff new file mode 100644 index 0000000000..27215d6f0f Binary files /dev/null and b/extra/images/testing/alpha.tiff differ diff --git a/extra/images/testing/astronaut_animation.gif b/extra/images/testing/astronaut_animation.gif new file mode 100644 index 0000000000..8c768480fe Binary files /dev/null and b/extra/images/testing/astronaut_animation.gif differ diff --git a/extra/images/testing/bi.tiff b/extra/images/testing/bi.tiff new file mode 100644 index 0000000000..ad0ce97cc0 Binary files /dev/null and b/extra/images/testing/bi.tiff differ diff --git a/extra/images/testing/checkmark.gif b/extra/images/testing/checkmark.gif new file mode 100644 index 0000000000..df83efaf55 Binary files /dev/null and b/extra/images/testing/checkmark.gif differ diff --git a/extra/images/testing/circle.gif b/extra/images/testing/circle.gif new file mode 100644 index 0000000000..101a48a880 Binary files /dev/null and b/extra/images/testing/circle.gif differ diff --git a/extra/images/testing/color_spectrum.tiff b/extra/images/testing/color_spectrum.tiff new file mode 100644 index 0000000000..f596deb0f2 Binary files /dev/null and b/extra/images/testing/color_spectrum.tiff differ diff --git a/extra/images/testing/cube.tiff b/extra/images/testing/cube.tiff new file mode 100644 index 0000000000..eef52e32d8 Binary files /dev/null and b/extra/images/testing/cube.tiff differ diff --git a/extra/images/testing/monochrome.gif b/extra/images/testing/monochrome.gif new file mode 100644 index 0000000000..b0875faa61 Binary files /dev/null and b/extra/images/testing/monochrome.gif differ diff --git a/extra/images/testing/noise.bmp b/extra/images/testing/noise.bmp new file mode 100644 index 0000000000..8e47f143dd Binary files /dev/null and b/extra/images/testing/noise.bmp differ diff --git a/extra/images/testing/noise.gif b/extra/images/testing/noise.gif new file mode 100644 index 0000000000..31dffae42b Binary files /dev/null and b/extra/images/testing/noise.gif differ diff --git a/extra/images/testing/noise.tiff b/extra/images/testing/noise.tiff new file mode 100644 index 0000000000..2958b0b838 Binary files /dev/null and b/extra/images/testing/noise.tiff differ diff --git a/extra/images/testing/small.tiff b/extra/images/testing/small.tiff new file mode 100644 index 0000000000..7051d58218 Binary files /dev/null and b/extra/images/testing/small.tiff differ diff --git a/extra/images/testing/square.tiff b/extra/images/testing/square.tiff new file mode 100644 index 0000000000..16e94f70b8 Binary files /dev/null and b/extra/images/testing/square.tiff differ diff --git a/extra/math/matrices/simd/simd.factor b/extra/math/matrices/simd/simd.factor index 2769a783bc..014cd86265 100644 --- a/extra/math/matrices/simd/simd.factor +++ b/extra/math/matrices/simd/simd.factor @@ -20,7 +20,7 @@ M: matrix4 new-sequence 2drop matrix4 (struct) ; inline > first4 ; inline + rows>> 4 firstn ; inline :: set-rows ( c1 c2 c3 c4 c -- c ) c rows>> :> rows