separated image writer for stream writing
authorClaus Gittinger <cg@exept.de>
Fri, 16 Jul 1999 01:49:17 +0200
changeset 1206 fe2354feee01
parent 1205 a631dc401a71
child 1207 5ca42a599a49
separated image writer for stream writing
GIFReader.st
--- 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!