SunRasterReader.st
author claus
Wed, 13 Oct 1993 01:31:41 +0100
changeset 2 842b6a603cdc
parent 0 3f9277473954
child 3 78aaa5408119
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
3f9277473954 Initial revision
claus
parents:
diff changeset
     1
"
3f9277473954 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1993 by Claus Gittinger
3f9277473954 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
3f9277473954 Initial revision
claus
parents:
diff changeset
     4
3f9277473954 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
3f9277473954 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
3f9277473954 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
3f9277473954 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
3f9277473954 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
3f9277473954 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
3f9277473954 Initial revision
claus
parents:
diff changeset
    11
"
3f9277473954 Initial revision
claus
parents:
diff changeset
    12
3f9277473954 Initial revision
claus
parents:
diff changeset
    13
ImageReader subclass:#SunRasterReader
3f9277473954 Initial revision
claus
parents:
diff changeset
    14
         instanceVariableNames:''
3f9277473954 Initial revision
claus
parents:
diff changeset
    15
         classVariableNames:''
3f9277473954 Initial revision
claus
parents:
diff changeset
    16
         poolDictionaries:''
3f9277473954 Initial revision
claus
parents:
diff changeset
    17
         category:'Graphics-Support'
3f9277473954 Initial revision
claus
parents:
diff changeset
    18
!
3f9277473954 Initial revision
claus
parents:
diff changeset
    19
3f9277473954 Initial revision
claus
parents:
diff changeset
    20
SunRasterReader comment:'
3f9277473954 Initial revision
claus
parents:
diff changeset
    21
3f9277473954 Initial revision
claus
parents:
diff changeset
    22
COPYRIGHT (c) 1993 by Claus Gittinger
3f9277473954 Initial revision
claus
parents:
diff changeset
    23
              All Rights Reserved
3f9277473954 Initial revision
claus
parents:
diff changeset
    24
3f9277473954 Initial revision
claus
parents:
diff changeset
    25
this class provides methods for loading Sun Raster file images
3f9277473954 Initial revision
claus
parents:
diff changeset
    26
3f9277473954 Initial revision
claus
parents:
diff changeset
    27
%W% %E%
3f9277473954 Initial revision
claus
parents:
diff changeset
    28
written Summer 91 by claus
3f9277473954 Initial revision
claus
parents:
diff changeset
    29
'!
3f9277473954 Initial revision
claus
parents:
diff changeset
    30
3f9277473954 Initial revision
claus
parents:
diff changeset
    31
!SunRasterReader methodsFor:'reading from file'!
3f9277473954 Initial revision
claus
parents:
diff changeset
    32
3f9277473954 Initial revision
claus
parents:
diff changeset
    33
fromFile: aFilename 
3f9277473954 Initial revision
claus
parents:
diff changeset
    34
    | rasterType mapType mapBytes imageWords form depth 
3f9277473954 Initial revision
claus
parents:
diff changeset
    35
      rMap gMap bMap mapLen
3f9277473954 Initial revision
claus
parents:
diff changeset
    36
      bits a b c index|
3f9277473954 Initial revision
claus
parents:
diff changeset
    37
3f9277473954 Initial revision
claus
parents:
diff changeset
    38
    inStream := FileStream readonlyFileNamed:aFilename.
3f9277473954 Initial revision
claus
parents:
diff changeset
    39
    inStream isNil ifTrue:[
3f9277473954 Initial revision
claus
parents:
diff changeset
    40
        'open error' printNewline. 
3f9277473954 Initial revision
claus
parents:
diff changeset
    41
        ^ nil
3f9277473954 Initial revision
claus
parents:
diff changeset
    42
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
    43
3f9277473954 Initial revision
claus
parents:
diff changeset
    44
    inStream binary.
3f9277473954 Initial revision
claus
parents:
diff changeset
    45
3f9277473954 Initial revision
claus
parents:
diff changeset
    46
    ((inStream nextWord = 16r59A6) 
3f9277473954 Initial revision
claus
parents:
diff changeset
    47
    and:[inStream nextWord = 16r6A95]) ifFalse: [
3f9277473954 Initial revision
claus
parents:
diff changeset
    48
"
3f9277473954 Initial revision
claus
parents:
diff changeset
    49
    inStream nextLong = 16r59A66A95 ifFalse: [
3f9277473954 Initial revision
claus
parents:
diff changeset
    50
"
3f9277473954 Initial revision
claus
parents:
diff changeset
    51
        inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
    52
        self error: 'Not a Sun Raster File (bad magic number)'
3f9277473954 Initial revision
claus
parents:
diff changeset
    53
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
    54
3f9277473954 Initial revision
claus
parents:
diff changeset
    55
    width := inStream nextLong.
3f9277473954 Initial revision
claus
parents:
diff changeset
    56
    height := inStream nextLong.
3f9277473954 Initial revision
claus
parents:
diff changeset
    57
3f9277473954 Initial revision
claus
parents:
diff changeset
    58
    depth := inStream nextLong.
3f9277473954 Initial revision
claus
parents:
diff changeset
    59
    inStream nextLong.   "Ignore the image length since I can't rely on it anyway."
3f9277473954 Initial revision
claus
parents:
diff changeset
    60
    rasterType _ inStream nextLong.
3f9277473954 Initial revision
claus
parents:
diff changeset
    61
    mapType := inStream nextLong.  "Ignore the raster maptype."
3f9277473954 Initial revision
claus
parents:
diff changeset
    62
    mapBytes := inStream nextLong.  
3f9277473954 Initial revision
claus
parents:
diff changeset
    63
3f9277473954 Initial revision
claus
parents:
diff changeset
    64
    depth = 8 ifTrue: [
3f9277473954 Initial revision
claus
parents:
diff changeset
    65
        mapLen := (mapBytes // 3).
3f9277473954 Initial revision
claus
parents:
diff changeset
    66
        rMap := ByteArray new:mapLen.
3f9277473954 Initial revision
claus
parents:
diff changeset
    67
        gMap := ByteArray new:mapLen.
3f9277473954 Initial revision
claus
parents:
diff changeset
    68
        bMap := ByteArray new:mapLen.
3f9277473954 Initial revision
claus
parents:
diff changeset
    69
        inStream nextBytes:mapLen into:rMap.
3f9277473954 Initial revision
claus
parents:
diff changeset
    70
        inStream nextBytes:mapLen into:gMap.
3f9277473954 Initial revision
claus
parents:
diff changeset
    71
        inStream nextBytes:mapLen into:bMap.
3f9277473954 Initial revision
claus
parents:
diff changeset
    72
3f9277473954 Initial revision
claus
parents:
diff changeset
    73
        data := ByteArray new:(width * height).
3f9277473954 Initial revision
claus
parents:
diff changeset
    74
        inStream nextBytes:(width * height) into:data.
3f9277473954 Initial revision
claus
parents:
diff changeset
    75
3f9277473954 Initial revision
claus
parents:
diff changeset
    76
        photometric := #palette.
3f9277473954 Initial revision
claus
parents:
diff changeset
    77
        samplesPerPixel := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    78
        bitsPerSample := #(8).
3f9277473954 Initial revision
claus
parents:
diff changeset
    79
        colorMap := Array with:rMap with:gMap with:bMap.
3f9277473954 Initial revision
claus
parents:
diff changeset
    80
        inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
    81
        ^ self
3f9277473954 Initial revision
claus
parents:
diff changeset
    82
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
    83
    depth ~~ 1 ifTrue: [
3f9277473954 Initial revision
claus
parents:
diff changeset
    84
        inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
    85
        self error: 'Raster file is not monochrome'
3f9277473954 Initial revision
claus
parents:
diff changeset
    86
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
    87
3f9277473954 Initial revision
claus
parents:
diff changeset
    88
    form := nil.
3f9277473954 Initial revision
claus
parents:
diff changeset
    89
3f9277473954 Initial revision
claus
parents:
diff changeset
    90
    inStream skip: mapBytes.  "Skip the color map."
3f9277473954 Initial revision
claus
parents:
diff changeset
    91
    imageWords _ (width / 16) ceiling * height.
3f9277473954 Initial revision
claus
parents:
diff changeset
    92
    data := ByteArray new:(imageWords * 2).
3f9277473954 Initial revision
claus
parents:
diff changeset
    93
3f9277473954 Initial revision
claus
parents:
diff changeset
    94
    (rasterType between: 0 and: 2) ifFalse: [
3f9277473954 Initial revision
claus
parents:
diff changeset
    95
        inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
    96
        self error: 'Unknown raster file rasterType'
3f9277473954 Initial revision
claus
parents:
diff changeset
    97
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
    98
3f9277473954 Initial revision
claus
parents:
diff changeset
    99
    (rasterType = 2)  ifFalse: [
3f9277473954 Initial revision
claus
parents:
diff changeset
   100
        "no compression of bytes"
3f9277473954 Initial revision
claus
parents:
diff changeset
   101
        inStream nextBytes:(imageWords * 2) into:data
3f9277473954 Initial revision
claus
parents:
diff changeset
   102
    ] ifTrue: [ 
3f9277473954 Initial revision
claus
parents:
diff changeset
   103
        "run length compression of bytes"
3f9277473954 Initial revision
claus
parents:
diff changeset
   104
3f9277473954 Initial revision
claus
parents:
diff changeset
   105
        bits _ ByteArray new: imageWords * 2.
3f9277473954 Initial revision
claus
parents:
diff changeset
   106
        index := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   107
        a _ inStream next.
3f9277473954 Initial revision
claus
parents:
diff changeset
   108
        [a notNil] whileTrue: [
3f9277473954 Initial revision
claus
parents:
diff changeset
   109
            (a = 128) ifFalse: [
3f9277473954 Initial revision
claus
parents:
diff changeset
   110
                bits at:index put: a.
3f9277473954 Initial revision
claus
parents:
diff changeset
   111
                index := index + 1
3f9277473954 Initial revision
claus
parents:
diff changeset
   112
            ] ifTrue: [
3f9277473954 Initial revision
claus
parents:
diff changeset
   113
                b _ inStream next.
3f9277473954 Initial revision
claus
parents:
diff changeset
   114
                b = 0 ifTrue: [
3f9277473954 Initial revision
claus
parents:
diff changeset
   115
                    bits at:index put:128 .
3f9277473954 Initial revision
claus
parents:
diff changeset
   116
                    index := index + 1
3f9277473954 Initial revision
claus
parents:
diff changeset
   117
                ] ifFalse: [
3f9277473954 Initial revision
claus
parents:
diff changeset
   118
                    c := inStream next.
3f9277473954 Initial revision
claus
parents:
diff changeset
   119
                    1 to:(b+1) do:[:i |
3f9277473954 Initial revision
claus
parents:
diff changeset
   120
                        bits at:index put:c.
3f9277473954 Initial revision
claus
parents:
diff changeset
   121
                        index := index + 1
3f9277473954 Initial revision
claus
parents:
diff changeset
   122
                    ]
3f9277473954 Initial revision
claus
parents:
diff changeset
   123
                ]
3f9277473954 Initial revision
claus
parents:
diff changeset
   124
            ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   125
            a _ inStream next
3f9277473954 Initial revision
claus
parents:
diff changeset
   126
        ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   127
        1 to: imageWords do: [:i | form bitsWordAt: i put: (bits wordAt: i)]
3f9277473954 Initial revision
claus
parents:
diff changeset
   128
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   129
    photometric := #whiteIs0.
3f9277473954 Initial revision
claus
parents:
diff changeset
   130
    samplesPerPixel := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   131
    bitsPerSample := #(1).
3f9277473954 Initial revision
claus
parents:
diff changeset
   132
    inStream close
3f9277473954 Initial revision
claus
parents:
diff changeset
   133
3f9277473954 Initial revision
claus
parents:
diff changeset
   134
    "Image fromFile:'../fileIn/bitmaps/founders.im8'"
3f9277473954 Initial revision
claus
parents:
diff changeset
   135
! !