--- a/GIFReader.st Wed Jul 14 12:43:53 1999 +0200
+++ b/GIFReader.st Fri Jul 16 01:49:17 1999 +0200
@@ -774,23 +774,50 @@
save:image onFile:aFileName
"save image as GIF file on aFileName"
+ |aStream|
+
image depth ~~ 8 ifTrue:[
- ^ Image cannotRepresentImageSignal
- raiseWith:image
- errorString:('GIF (currently) only supports depth8 images').
+ ^ Image cannotRepresentImageSignal
+ raiseWith:image
+ errorString:('GIF (currently) only supports depth8 images').
].
- outStream := FileStream newFileNamed:aFileName.
- outStream isNil ifTrue:[
- ^ Image fileCreationErrorSignal
- raiseWith:image
- errorString:('file creation error: ' , aFileName asString).
+ aStream := FileStream newFileNamed:aFileName.
+ aStream isNil ifTrue:[
+ ^ Image fileCreationErrorSignal
+ raiseWith:image
+ errorString:('file creation error: ' , aFileName asString).
].
+ self save:image onStream:aStream
+ aStream close.
+
+ "
+ |i|
+
+ i := Image fromFile:'bitmaps/gifImages/garfield.gif'.
+ GIFReader save:i onFile:'foo.gif'.
+ (Image fromFile:'./foo.gif') inspect
+ "
+
+ "Created: / 14.10.1997 / 17:40:12 / cg"
+ "Modified: / 27.10.1997 / 22:42:31 / cg"
+!
+
+save:image onStream:aStream
+ "save image in GIF-file-format onto aStream"
+
+ image depth ~~ 8 ifTrue:[
+ ^ Image cannotRepresentImageSignal
+ raiseWith:image
+ errorString:('GIF (currently) only supports depth8 images').
+ ].
+
+ outStream := aStream.
outStream binary.
mask := image mask.
mask notNil ifTrue:[
- self assignTransparentPixelIn:image
+ self assignTransparentPixelIn:image
].
byteOrder := #lsb.
@@ -804,13 +831,12 @@
self writeHeaderFor:image.
maskPixel notNil ifTrue:[
- self writeMaskExtensionHeaderFor:image.
+ self writeMaskExtensionHeaderFor:image.
].
self writeBitDataFor:image.
outStream nextPut: Terminator.
- outStream close.
"
|i|
@@ -825,94 +851,94 @@
!
writeBitDataFor: image
- "using modified Lempel-Ziv Welch algorithm."
+ "using modified Lempel-Ziv Welch algorithm."
- | bits bitsPerPixel t1
- maxBits maxMaxCode tSize initCodeSize ent tShift fCode pixel index disp nomatch |
+ | 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.
+ 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
+ interlace == true ifTrue:[
+ t1 := 64
+ ] ifFalse:[
+ t1 := 0
+ ].
+ outStream nextPut:t1. "/ another flag
- bitsPerPixel := image bitsPerPixel.
- bits := image bits.
+ 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).
+ 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.
+ 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.
+ 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].
+ 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"
+ 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"
!
@@ -992,6 +1018,6 @@
!GIFReader class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libview2/GIFReader.st,v 1.73 1998-08-24 11:14:13 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libview2/GIFReader.st,v 1.74 1999-07-15 23:49:17 cg Exp $'
! !
GIFReader initialize!