FaceReader.st
author Stefan Vogel <sv@exept.de>
Thu, 25 Apr 1996 18:09:57 +0200
changeset 218 96e8e87e5dc8
parent 210 5405de794686
child 234 b6352d13e792
permissions -rw-r--r--
Fix typo.

"
 COPYRIGHT (c) 1993 by Claus Gittinger
	      All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"

ImageReader subclass:#FaceReader
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'Graphics-Images support'
!

!FaceReader class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 1993 by Claus Gittinger
	      All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
!

documentation
"
    This class knows how to read face files.
    This format is used for people's faces - which can be obtained from some
     ftp-servers, to improve mail- and/or newsreaders :-).
    Other than above, that format is not used often.

    The file format is (ascii):
        ...
        FirstName: ...
        LastName: ...
        E-mail: ...
        PicData: ...
        Image: <width> <height> <depth>

        bits; encoded in uppercase hex ascii; 2 chars/pixel
        pixel values are greyscale-value; 0..255

    Only 8-bit greyscale is supported 
    - I have never encountered any other face-file-format.

    Only file reading is supported.


    Notice: 
        Face files come in two formats: the first is the one implemented here,
        the other is the blitImage file format, which only supports 48x48x1 images.
        The latter is supported by the BlitImageReader class.

    [See also:]
        BlitImageReader GIFReader JPEGReader PBMReader PCXReader 
        ST80FormReader SunRasterReader TargaReader TIFFReader WindowsIconReader 
        XBMReader XPMReader XWDReader 
"
! !

!FaceReader class methodsFor:'initialization'!

initialize
    "install myself in the Image classes fileFormat table
     for the `.face' extension."

    Image fileFormats at:'.face'  put:self.

    "Modified: 23.4.1996 / 12:27:35 / cg"
! !

!FaceReader methodsFor:'reading from file'!

fromStream:aStream
    "read an image in my format from aStream"

    |line 
     dstIndex "{ Class: SmallInteger }"
     bytesPerRow
     lo       "{ Class: SmallInteger }"
     hi       "{ Class: SmallInteger }"
     val      "{ Class: SmallInteger }"
     inHeader s depth|

    inStream := aStream.

    line := aStream nextLine.
    line isNil ifTrue:[
        ^ nil
    ].

    inHeader := true.
    [inHeader] whileTrue:[
        (line startsWith:'Image:') ifTrue:[
            s := ReadStream on:line.
            s position:7.
            width := Number readFrom:s.
            height := Number readFrom:s.
            depth := Number readFrom:s.
            inHeader := false.
        ].
        line := aStream nextLine
    ].

    depth == 8 ifFalse:[
        self error:'only depth 8 supported'
    ].

    [line isEmpty] whileTrue:[
        line := aStream nextLine.
    ].

    bytesPerRow := width * depth // 8.
    ((width * depth \\ 8) ~~ 0) ifTrue:[
        bytesPerRow := bytesPerRow + 1
    ].

    data := ByteArray uninitializedNew:(bytesPerRow * height).
    dstIndex := data size.

    [line notNil] whileTrue:[
        1 to:(line size) by:2 do:[:cI |
            hi := (line at:cI) digitValue.
            lo := (line at:(cI + 1)) digitValue.
            val := (hi bitShift:4) bitOr:lo.
            data at:dstIndex put:val.
            dstIndex := dstIndex - 1
        ].
        line := aStream nextLine
    ].
    photometric := #blackIs0.
    samplesPerPixel := 1.
    bitsPerSample := #(8)

    "
     FaceReader fromFile:'../goodies/faces/next.com/steve.face'
    "
    "this is NOT steve jobs :-)"

    "Modified: 23.4.1996 / 12:23:38 / cg"
! !

!FaceReader class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libview2/FaceReader.st,v 1.20 1996-04-25 16:09:57 stefan Exp $'
! !
FaceReader initialize!