diff -r a8f1fcc3e6bc -r a1ed08195ee7 XPMReader.st --- a/XPMReader.st Fri Apr 04 19:07:10 2003 +0200 +++ b/XPMReader.st Fri Apr 04 19:07:54 2003 +0200 @@ -13,7 +13,7 @@ "{ Package: 'stx:libview2' }" ImageReader subclass:#XPMReader - instanceVariableNames:'' + instanceVariableNames:'charsPerPixel maskPixelValue characterTranslation' classVariableNames:'' poolDictionaries:'' category:'Graphics-Images-Support' @@ -124,7 +124,7 @@ " XPMReader isValidImageFile:'fooBar' - XPMReader isValidImageFile:'bitmaps/xpmBitmaps/device_images/ljet.xpm' + XPMReader isValidImageFile:'../../goodies/bitmaps/xpmBitmaps/device_images/ljet.xpm' XPMReader isValidImageFile:'bitmaps/gifImages/garfield.gif' " @@ -151,70 +151,24 @@ ^ s ! -fromStream:aStream - "read an XPM-image from aStream. Return the receiver - (with all relevant instance variables set for the image) - or nil on error" - - |line - srcIndex "{ Class: SmallInteger }" - dstIndex "{ Class: SmallInteger }" - colorName monoName greyName grey4Name symbolicName colorMapSize redMap greenMap blueMap - charsPerPixel xlation s bitsPerPixel lineDone maskPixelValue - state key lastKey lastChar1 lastChar2 c1 c2 lastXLation| - - inStream := aStream. - - line := aStream nextLine. - (line notNil and:[line startsWith:'/* XPM']) ifFalse:[ - ^ self fileFormatError:'format error (expected XPM)'. - ]. - - line := aStream nextLine. - [line notNil and:[(line startsWith:'/*') or:[line isBlank or:[(line startsWith:' *')]]]] whileTrue:[ - line := aStream nextLine. - ]. - (line notNil and:[line startsWith:'static char']) ifFalse:[ - ^ self fileFormatError:'format error (expected static char)'. - ]. - line := aStream nextLine. - (line notNil and:[line startsWith:'/*']) ifTrue:[ - [line notNil - and:[(line startsWith:'/*') or:[line startsWith:' *']]] whileTrue:[ - line := aStream nextLine. - ]. - ]. - line notNil ifTrue:[ - line := line withoutSeparators - ]. - (line notNil and:[line startsWith:'"']) ifFalse:[ - ^ self fileFormatError:'format error (expected "ww hh nn mm)'. - ]. - s := ReadStream on:line. - s next. "skip quote" - width := Integer readFrom:s. - height := Integer readFrom:s. - colorMapSize := Integer readFrom:s. - charsPerPixel := Integer readFrom:s. - charsPerPixel ~~ 1 ifTrue:[ - xlation := Dictionary new:colorMapSize. - ] ifFalse:[ - xlation := Array new:256. - ]. +readColorMap:colorMapSize + |redMap greenMap blueMap s key lineDone state + symbolicName monoName greyName grey4Name colorName| redMap := ByteArray new:colorMapSize. greenMap := ByteArray new:colorMapSize. blueMap := ByteArray new:colorMapSize. colorMap := Colormap redVector:redMap greenVector:greenMap blueVector:blueMap. + 1 to:colorMapSize do:[:colorIndex | |index line color t word| - line := aStream nextLine. + line := inStream nextLine. [line notNil and:[line startsWith:'/*']] whileTrue:[ [line notNil and:[(line endsWith:'*/') not]] whileTrue:[ - line := aStream nextLine. + line := inStream nextLine. ]. - line := aStream nextLine. + line := inStream nextLine. ]. line notNil ifTrue:[ line := line withoutSeparators @@ -227,10 +181,10 @@ s next. "skip quote" charsPerPixel ~~ 1 ifTrue:[ key := s next:charsPerPixel. - xlation at:key put:colorIndex - 1. + characterTranslation at:key put:colorIndex - 1. ] ifFalse:[ index := s next asciiValue. - xlation at:index put:colorIndex - 1. + characterTranslation at:index put:colorIndex - 1. ]. lineDone := false. @@ -339,6 +293,58 @@ blueMap at:colorIndex put:(color blue asFloat * 255.0 // 100). ]. ]. +! + +readImage + "read an XPM-image from my inStream. Return the receiver + (with all relevant instance variables set for the image) + or nil on error" + + |line + srcIndex "{ Class: SmallInteger }" + dstIndex "{ Class: SmallInteger }" + colorMapSize + s bitsPerPixel key lastKey lastChar1 lastChar2 c1 c2 lastXLation| + + line := inStream nextLine. + (line notNil and:[line startsWith:'/* XPM']) ifFalse:[ + ^ self fileFormatError:'format error (expected XPM)'. + ]. + + line := inStream nextLine. + [line notNil and:[(line startsWith:'/*') or:[line isBlank or:[(line startsWith:' *')]]]] whileTrue:[ + line := inStream nextLine. + ]. + (line notNil and:[line startsWith:'static char']) ifFalse:[ + ^ self fileFormatError:'format error (expected static char)'. + ]. + line := inStream nextLine. + (line notNil and:[line startsWith:'/*']) ifTrue:[ + [line notNil + and:[(line startsWith:'/*') or:[line startsWith:' *']]] whileTrue:[ + line := inStream nextLine. + ]. + ]. + line notNil ifTrue:[ + line := line withoutSeparators + ]. + (line notNil and:[line startsWith:'"']) ifFalse:[ + ^ self fileFormatError:'format error (expected "ww hh nn mm)'. + ]. + s := ReadStream on:line. + s next. "skip quote" + width := Integer readFrom:s. + height := Integer readFrom:s. + colorMapSize := Integer readFrom:s. + charsPerPixel := Integer readFrom:s. + + charsPerPixel ~~ 1 ifTrue:[ + characterTranslation := Dictionary new:colorMapSize. + ] ifFalse:[ + characterTranslation := Array new:256. + ]. + + self readColorMap:colorMapSize. "actually, could make it an image with less depth most of the time ..." @@ -355,9 +361,9 @@ dstIndex := 1. 1 to:height do:[:row | - line := aStream nextLine withoutSpaces. + line := inStream nextLine withoutSpaces. [line notNil and:[line startsWith:'/*']] whileTrue:[ - line := aStream nextLine withoutSpaces. + line := inStream nextLine withoutSpaces. ]. line notNil ifTrue:[ line := line withoutSeparators @@ -370,7 +376,7 @@ 1 to:width do:[:col | key := line at:srcIndex. key ~~ lastKey ifTrue:[ - lastXLation := xlation at:key asciiValue. + lastXLation := characterTranslation at:key asciiValue. lastKey := key ]. data at:dstIndex put:lastXLation. @@ -390,7 +396,7 @@ (c1 ~~ lastChar1 or:[c2 ~~ lastChar2]) ifTrue:[ key at:1 put:c1. key at:2 put:c2. - lastXLation := xlation at:key. + lastXLation := characterTranslation at:key. lastChar1 := c1. lastChar2 := c2. ]. @@ -410,9 +416,9 @@ s next. "/ skip dquote 1 to:width do:[:col | key := s next:charsPerPixel. -"/ data at:dstIndex put:(xlation at:key). +"/ data at:dstIndex put:(characterTranslation at:key). key ~= lastKey ifTrue:[ - lastXLation := xlation at:key. + lastXLation := characterTranslation at:key. lastKey := key ]. data at:dstIndex put:lastXLation. @@ -437,10 +443,7 @@ ]. " - XPMReader fromStream:('bitmaps/ljet.xpm' asFilename readStream) - XPMReader fromStream:('bitmaps/magtape.xpm' asFilename readStream) - XPMReader fromStream:('bitmaps/pixmap.xpm' asFilename readStream) - XPMReader fromStream:('bitmaps/SBrowser.xbm' asFilename readStream) + XPMReader fromStream:('../../goodies/bitmaps/xpmBitmaps/FATAL.xpm' asFilename readStream) " "Created: / 24.9.1995 / 06:20:06 / claus" @@ -573,7 +576,7 @@ !XPMReader class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libview2/XPMReader.st,v 1.49 2003-03-02 18:39:45 stefan Exp $' + ^ '$Header: /cvs/stx/stx/libview2/XPMReader.st,v 1.50 2003-04-04 17:07:22 cg Exp $' ! ! XPMReader initialize!