--- a/GIFReader.st Thu Jan 20 16:26:36 2005 +0100
+++ b/GIFReader.st Tue Feb 01 13:39:32 2005 +0100
@@ -568,6 +568,99 @@
"Modified: 14.10.1997 / 18:44:27 / cg"
!
+writeBitDataFor: image
+ "using modified Lempel-Ziv Welch algorithm."
+
+ | bits bitsPerPixel t1
+ maxBits maxMaxCode tSize initCodeSize ent tShift fCode pixel index disp nomatch |
+
+ outStream nextPut:ImageSeparator.
+ self writeShort:0. "/
+ self writeShort:0. "/
+ self writeShort:width. "/ image size
+ self writeShort:height.
+
+ interlace == true ifTrue:[
+ t1 := 64
+ ] ifFalse:[
+ t1 := 0
+ ].
+ outStream nextPut:t1. "/ another flag
+
+ bitsPerPixel := image bitsPerPixel.
+ bits := image bits.
+
+ pass := 0.
+ xpos := 0.
+ ypos := 0.
+ rowByteSize := image bytesPerRow. "/ width * 8 + 31 // 32 * 4.
+ remainBitCount := 0.
+ bufByte := 0.
+ bufStream := WriteStream on: (ByteArray new: 256).
+
+ maxBits := 12.
+ maxMaxCode := 1 bitShift: maxBits.
+ tSize := 5003.
+ prefixTable := Array new: tSize.
+ suffixTable := Array new: tSize.
+
+ initCodeSize := bitsPerPixel <= 1 ifTrue: [2] ifFalse: [bitsPerPixel].
+ outStream nextPut: initCodeSize.
+ self setParameters: initCodeSize.
+
+ tShift := 0.
+ fCode := tSize.
+ [fCode < 65536] whileTrue:
+ [tShift := tShift + 1.
+ fCode := fCode * 2].
+ tShift := 8 - tShift.
+ 1 to: tSize do: [:i | suffixTable at: i put: -1].
+
+ self writeCodeAndCheckCodeSize: clearCode.
+ ent := self readPixelFrom: bits.
+ [(pixel := self readPixelFrom: bits) == nil] whileFalse:
+ [
+ fCode := (pixel bitShift: maxBits) + ent.
+ index := ((pixel bitShift: tShift) bitXor: ent) + 1.
+ (suffixTable at: index) = fCode
+ ifTrue: [ent := prefixTable at: index]
+ ifFalse:
+ [nomatch := true.
+ (suffixTable at: index) >= 0
+ ifTrue:
+ [disp := tSize - index + 1.
+ index = 1 ifTrue: [disp := 1].
+ "probe"
+ [(index := index - disp) < 1 ifTrue: [index := index + tSize].
+ (suffixTable at: index) = fCode
+ ifTrue:
+ [ent := prefixTable at: index.
+ nomatch := false.
+ "continue whileFalse:"].
+ nomatch and: [(suffixTable at: index) > 0]]
+ whileTrue: ["probe"]].
+ "nomatch"
+ nomatch ifTrue:
+ [self writeCodeAndCheckCodeSize: ent.
+ ent := pixel.
+ freeCode < maxMaxCode
+ ifTrue:
+ [prefixTable at: index put: freeCode.
+ suffixTable at: index put: fCode.
+ freeCode := freeCode + 1]
+ ifFalse:
+ [self writeCodeAndCheckCodeSize: clearCode.
+ 1 to: tSize do: [:i | suffixTable at: i put: -1].
+ self setParameters: initCodeSize]]]].
+ prefixTable := suffixTable := nil.
+ self writeCodeAndCheckCodeSize: ent.
+ self writeCodeAndCheckCodeSize: eoiCode.
+ self flushCode.
+ outStream nextPut: 0. "zero-length packet"
+
+ "Modified: 15.10.1997 / 19:56:28 / cg"
+!
+
writeCode: aCode
self nextBitsPut: aCode
@@ -581,6 +674,57 @@
"Created: 14.10.1997 / 18:38:24 / cg"
"Modified: 14.10.1997 / 18:40:56 / cg"
+!
+
+writeHeaderFor:image
+ "write the gif header"
+
+ |bitsPerPixel t1|
+
+ bitsPerPixel := image bitsPerPixel.
+
+ outStream nextPutAll: 'GIF89a' asByteArray.
+ self writeShort:width. "/ screen size
+ self writeShort:height.
+ t1 := 128.
+ t1 := t1 bitOr:(bitsPerPixel - 1 bitShift:5).
+ t1 := t1 bitOr:(bitsPerPixel - 1).
+ outStream nextPut:t1. "/ flag
+ outStream nextPut:0. "/ background (not used)
+ outStream nextPut:0. "/ aspect ratio
+
+ 0 to:(1 bitShift:bitsPerPixel)-1 do:[:pixel |
+ |clr red green blue|
+
+ clr := image colorFromValue:pixel.
+ clr isNil ifTrue:[
+ "/ unused colorMap slot
+ red := green := blue := 0.
+ ] ifFalse:[
+ red := (clr redByte).
+ green := (clr greenByte).
+ blue := (clr blueByte).
+ ].
+ outStream
+ nextPut:red; nextPut:green; nextPut:blue.
+ ].
+
+ "Created: / 14.10.1997 / 17:41:28 / cg"
+ "Modified: / 31.10.1997 / 16:12:13 / cg"
+!
+
+writeMaskExtensionHeaderFor:image
+ "write an extension header for the transparent pixel"
+
+ outStream nextPut:Extension.
+ outStream nextPut:16rF9. "/ graphic control extension
+ outStream nextPut:4. "/ subBlockSize
+
+ outStream nextPut:1. "/ animationType
+ outStream nextPutShort:1 MSB:false. "/ animationTime
+ outStream nextPut:maskPixel. "/ animationMask
+
+ outStream nextPut:0.
! !
!GIFReader methodsFor:'reading'!
@@ -829,156 +973,12 @@
"Created: / 14.10.1997 / 17:40:12 / cg"
"Modified: / 27.10.1997 / 22:42:31 / cg"
-!
-
-writeBitDataFor: image
- "using modified Lempel-Ziv Welch algorithm."
-
- | bits bitsPerPixel t1
- maxBits maxMaxCode tSize initCodeSize ent tShift fCode pixel index disp nomatch |
-
- outStream nextPut:ImageSeparator.
- self writeShort:0. "/
- self writeShort:0. "/
- self writeShort:width. "/ image size
- self writeShort:height.
-
- interlace == true ifTrue:[
- t1 := 64
- ] ifFalse:[
- t1 := 0
- ].
- outStream nextPut:t1. "/ another flag
-
- bitsPerPixel := image bitsPerPixel.
- bits := image bits.
-
- pass := 0.
- xpos := 0.
- ypos := 0.
- rowByteSize := image bytesPerRow. "/ width * 8 + 31 // 32 * 4.
- remainBitCount := 0.
- bufByte := 0.
- bufStream := WriteStream on: (ByteArray new: 256).
-
- maxBits := 12.
- maxMaxCode := 1 bitShift: maxBits.
- tSize := 5003.
- prefixTable := Array new: tSize.
- suffixTable := Array new: tSize.
-
- initCodeSize := bitsPerPixel <= 1 ifTrue: [2] ifFalse: [bitsPerPixel].
- outStream nextPut: initCodeSize.
- self setParameters: initCodeSize.
-
- tShift := 0.
- fCode := tSize.
- [fCode < 65536] whileTrue:
- [tShift := tShift + 1.
- fCode := fCode * 2].
- tShift := 8 - tShift.
- 1 to: tSize do: [:i | suffixTable at: i put: -1].
-
- self writeCodeAndCheckCodeSize: clearCode.
- ent := self readPixelFrom: bits.
- [(pixel := self readPixelFrom: bits) == nil] whileFalse:
- [
- fCode := (pixel bitShift: maxBits) + ent.
- index := ((pixel bitShift: tShift) bitXor: ent) + 1.
- (suffixTable at: index) = fCode
- ifTrue: [ent := prefixTable at: index]
- ifFalse:
- [nomatch := true.
- (suffixTable at: index) >= 0
- ifTrue:
- [disp := tSize - index + 1.
- index = 1 ifTrue: [disp := 1].
- "probe"
- [(index := index - disp) < 1 ifTrue: [index := index + tSize].
- (suffixTable at: index) = fCode
- ifTrue:
- [ent := prefixTable at: index.
- nomatch := false.
- "continue whileFalse:"].
- nomatch and: [(suffixTable at: index) > 0]]
- whileTrue: ["probe"]].
- "nomatch"
- nomatch ifTrue:
- [self writeCodeAndCheckCodeSize: ent.
- ent := pixel.
- freeCode < maxMaxCode
- ifTrue:
- [prefixTable at: index put: freeCode.
- suffixTable at: index put: fCode.
- freeCode := freeCode + 1]
- ifFalse:
- [self writeCodeAndCheckCodeSize: clearCode.
- 1 to: tSize do: [:i | suffixTable at: i put: -1].
- self setParameters: initCodeSize]]]].
- prefixTable := suffixTable := nil.
- self writeCodeAndCheckCodeSize: ent.
- self writeCodeAndCheckCodeSize: eoiCode.
- self flushCode.
- outStream nextPut: 0. "zero-length packet"
-
- "Modified: 15.10.1997 / 19:56:28 / cg"
-!
-
-writeHeaderFor:image
- "write the gif header"
-
- |bitsPerPixel t1|
-
- bitsPerPixel := image bitsPerPixel.
-
- outStream nextPutAll: 'GIF89a' asByteArray.
- self writeShort:width. "/ screen size
- self writeShort:height.
- t1 := 128.
- t1 := t1 bitOr:(bitsPerPixel - 1 bitShift:5).
- t1 := t1 bitOr:(bitsPerPixel - 1).
- outStream nextPut:t1. "/ flag
- outStream nextPut:0. "/ background (not used)
- outStream nextPut:0. "/ aspect ratio
-
- 0 to:(1 bitShift:bitsPerPixel)-1 do:[:pixel |
- |clr red green blue|
-
- clr := image colorFromValue:pixel.
- clr isNil ifTrue:[
- "/ unused colorMap slot
- red := green := blue := 0.
- ] ifFalse:[
- red := (clr redByte).
- green := (clr greenByte).
- blue := (clr blueByte).
- ].
- outStream
- nextPut:red; nextPut:green; nextPut:blue.
- ].
-
- "Created: / 14.10.1997 / 17:41:28 / cg"
- "Modified: / 31.10.1997 / 16:12:13 / cg"
-!
-
-writeMaskExtensionHeaderFor:image
- "write an extension header for the transparent pixel"
-
- outStream nextPut:Extension.
- outStream nextPut:16rF9. "/ graphic control extension
- outStream nextPut:4. "/ subBlockSize
-
- outStream nextPut:1. "/ animationType
- outStream nextPutShort:1 MSB:false. "/ animationTime
- outStream nextPut:maskPixel. "/ animationMask
-
- outStream nextPut:0.
! !
!GIFReader class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libview2/GIFReader.st,v 1.91 2005-01-07 14:35:42 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libview2/GIFReader.st,v 1.92 2005-02-01 12:39:32 stefan Exp $'
! !
GIFReader initialize!