ImageReader.st
author claus
Wed, 13 Oct 1993 01:32:53 +0100
changeset 2 b35336ab0de3
parent 0 48194c26a46c
child 5 e5942fea6925
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
48194c26a46c Initial revision
claus
parents:
diff changeset
     1
"
48194c26a46c Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1991-93 by Claus Gittinger
48194c26a46c Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
48194c26a46c Initial revision
claus
parents:
diff changeset
     4
48194c26a46c Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
48194c26a46c Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
48194c26a46c Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
48194c26a46c Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
48194c26a46c Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
48194c26a46c Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
48194c26a46c Initial revision
claus
parents:
diff changeset
    11
"
48194c26a46c Initial revision
claus
parents:
diff changeset
    12
48194c26a46c Initial revision
claus
parents:
diff changeset
    13
Object subclass:#ImageReader
48194c26a46c Initial revision
claus
parents:
diff changeset
    14
         instanceVariableNames:'width height data byteOrder inStream outStream
48194c26a46c Initial revision
claus
parents:
diff changeset
    15
                                photometric samplesPerPixel bitsPerSample
48194c26a46c Initial revision
claus
parents:
diff changeset
    16
                                colorMap'
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    17
         classVariableNames:'ReverseBits'
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    18
         poolDictionaries:''
48194c26a46c Initial revision
claus
parents:
diff changeset
    19
         category:'Graphics-Support'
48194c26a46c Initial revision
claus
parents:
diff changeset
    20
!
48194c26a46c Initial revision
claus
parents:
diff changeset
    21
48194c26a46c Initial revision
claus
parents:
diff changeset
    22
ImageReader comment:'
48194c26a46c Initial revision
claus
parents:
diff changeset
    23
48194c26a46c Initial revision
claus
parents:
diff changeset
    24
COPYRIGHT (c) 1991-93 by Claus Gittinger
48194c26a46c Initial revision
claus
parents:
diff changeset
    25
              All Rights Reserved
48194c26a46c Initial revision
claus
parents:
diff changeset
    26
48194c26a46c Initial revision
claus
parents:
diff changeset
    27
common functions for image-readers (i.e. TIFFReader, GIFReader etc.)
48194c26a46c Initial revision
claus
parents:
diff changeset
    28
48194c26a46c Initial revision
claus
parents:
diff changeset
    29
%W% %E%
48194c26a46c Initial revision
claus
parents:
diff changeset
    30
written Summer 91 by claus
48194c26a46c Initial revision
claus
parents:
diff changeset
    31
'!
48194c26a46c Initial revision
claus
parents:
diff changeset
    32
48194c26a46c Initial revision
claus
parents:
diff changeset
    33
!ImageReader class methodsFor:'testing'!
48194c26a46c Initial revision
claus
parents:
diff changeset
    34
48194c26a46c Initial revision
claus
parents:
diff changeset
    35
isValidImageFile:aFileName
48194c26a46c Initial revision
claus
parents:
diff changeset
    36
    "return true, if aFileName contains an image this
48194c26a46c Initial revision
claus
parents:
diff changeset
    37
     reader understands - should be redefined in subclasses"
48194c26a46c Initial revision
claus
parents:
diff changeset
    38
48194c26a46c Initial revision
claus
parents:
diff changeset
    39
    ^ false
48194c26a46c Initial revision
claus
parents:
diff changeset
    40
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
    41
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    42
!ImageReader class methodsFor:'constants'!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    43
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    44
reverseBits
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    45
    "return a table filled with bit reverse information.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    46
     To convert from msbit-first to lsbit-first bytes, use
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    47
     the value as index into the table, retrieving the reverse
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    48
     value. Since indexing must start at 1, use (value + 1) as
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    49
     index."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    50
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    51
    |val index|
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    52
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    53
    ReverseBits isNil ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    54
        ReverseBits := ByteArray new:256.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    55
        0 to:255 do:[:i |
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    56
            val := 0.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    57
            index := i.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    58
            (index bitTest:16r01) ifTrue:[val := val bitOr:16r80].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    59
            (index bitTest:16r02) ifTrue:[val := val bitOr:16r40].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    60
            (index bitTest:16r04) ifTrue:[val := val bitOr:16r20].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    61
            (index bitTest:16r08) ifTrue:[val := val bitOr:16r10].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    62
            (index bitTest:16r10) ifTrue:[val := val bitOr:16r08].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    63
            (index bitTest:16r20) ifTrue:[val := val bitOr:16r04].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    64
            (index bitTest:16r40) ifTrue:[val := val bitOr:16r02].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    65
            (index bitTest:16r80) ifTrue:[val := val bitOr:16r01].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    66
            ReverseBits at:(index + 1) put:val
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    67
        ]
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    68
    ].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    69
    ^ ReverseBits
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    70
! !
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    71
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    72
!ImageReader class methodsFor:'fileIn / fileOut'!
48194c26a46c Initial revision
claus
parents:
diff changeset
    73
48194c26a46c Initial revision
claus
parents:
diff changeset
    74
fromFile:aFileName
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    75
    |reader image depth|
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    76
48194c26a46c Initial revision
claus
parents:
diff changeset
    77
    reader := self new.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    78
    reader := reader fromFile:aFileName.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    79
    reader notNil ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    80
        depth := reader bitsPerPixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    81
	image := (Image implementorForDepth: depth) new.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    82
        image width:(reader width).
48194c26a46c Initial revision
claus
parents:
diff changeset
    83
        image height:(reader height).
48194c26a46c Initial revision
claus
parents:
diff changeset
    84
        image photometric:(reader photometric).
48194c26a46c Initial revision
claus
parents:
diff changeset
    85
        image samplesPerPixel:(reader samplesPerPixel).
48194c26a46c Initial revision
claus
parents:
diff changeset
    86
        image bitsPerSample:(reader bitsPerSample).
48194c26a46c Initial revision
claus
parents:
diff changeset
    87
        image colorMap:(reader colorMap).
48194c26a46c Initial revision
claus
parents:
diff changeset
    88
        image data:(reader data).
48194c26a46c Initial revision
claus
parents:
diff changeset
    89
        ^ image
48194c26a46c Initial revision
claus
parents:
diff changeset
    90
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
    91
    ^ nil
48194c26a46c Initial revision
claus
parents:
diff changeset
    92
!
48194c26a46c Initial revision
claus
parents:
diff changeset
    93
48194c26a46c Initial revision
claus
parents:
diff changeset
    94
save:anImage onFile:aFileName
48194c26a46c Initial revision
claus
parents:
diff changeset
    95
    ^ (self basicNew) save:anImage onFile:aFileName
48194c26a46c Initial revision
claus
parents:
diff changeset
    96
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
    97
48194c26a46c Initial revision
claus
parents:
diff changeset
    98
!ImageReader methodsFor:'accessing'!
48194c26a46c Initial revision
claus
parents:
diff changeset
    99
48194c26a46c Initial revision
claus
parents:
diff changeset
   100
width
48194c26a46c Initial revision
claus
parents:
diff changeset
   101
    ^ width
48194c26a46c Initial revision
claus
parents:
diff changeset
   102
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   103
48194c26a46c Initial revision
claus
parents:
diff changeset
   104
height 
48194c26a46c Initial revision
claus
parents:
diff changeset
   105
    ^ height
48194c26a46c Initial revision
claus
parents:
diff changeset
   106
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   107
48194c26a46c Initial revision
claus
parents:
diff changeset
   108
data 
48194c26a46c Initial revision
claus
parents:
diff changeset
   109
    ^ data
48194c26a46c Initial revision
claus
parents:
diff changeset
   110
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   111
48194c26a46c Initial revision
claus
parents:
diff changeset
   112
photometric
48194c26a46c Initial revision
claus
parents:
diff changeset
   113
    ^ photometric
48194c26a46c Initial revision
claus
parents:
diff changeset
   114
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   115
48194c26a46c Initial revision
claus
parents:
diff changeset
   116
colorMap
48194c26a46c Initial revision
claus
parents:
diff changeset
   117
    ^ colorMap
48194c26a46c Initial revision
claus
parents:
diff changeset
   118
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   119
48194c26a46c Initial revision
claus
parents:
diff changeset
   120
samplesPerPixel
48194c26a46c Initial revision
claus
parents:
diff changeset
   121
    ^ samplesPerPixel
48194c26a46c Initial revision
claus
parents:
diff changeset
   122
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   123
48194c26a46c Initial revision
claus
parents:
diff changeset
   124
bitsPerSample
48194c26a46c Initial revision
claus
parents:
diff changeset
   125
    ^ bitsPerSample
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   126
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   127
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   128
bitsPerPixel
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   129
    "return the number of bits per pixel"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   130
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   131
    ^ (bitsPerSample inject:0 into:[:sum :i | sum + i])
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   132
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   133
48194c26a46c Initial revision
claus
parents:
diff changeset
   134
!ImageReader methodsFor:'fileIn / fileOut'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   135
48194c26a46c Initial revision
claus
parents:
diff changeset
   136
fromFile:aFileName
48194c26a46c Initial revision
claus
parents:
diff changeset
   137
    ^ self subclassResponsibility
48194c26a46c Initial revision
claus
parents:
diff changeset
   138
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   139
48194c26a46c Initial revision
claus
parents:
diff changeset
   140
save:image onFile:aFileName
48194c26a46c Initial revision
claus
parents:
diff changeset
   141
    ^ self subclassResponsibility
48194c26a46c Initial revision
claus
parents:
diff changeset
   142
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   143
48194c26a46c Initial revision
claus
parents:
diff changeset
   144
!ImageReader methodsFor:'i/o support'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   145
48194c26a46c Initial revision
claus
parents:
diff changeset
   146
readLong
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   147
    "return the next 4-byte long, honoring the byte-order"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   148
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   149
    ^ inStream nextLongMSB:(byteOrder ~~ #lsb)
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   150
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   151
"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   152
    |bytes val|
48194c26a46c Initial revision
claus
parents:
diff changeset
   153
48194c26a46c Initial revision
claus
parents:
diff changeset
   154
    bytes := ByteArray new:4.
48194c26a46c Initial revision
claus
parents:
diff changeset
   155
    inStream nextBytes:4 into:bytes.
48194c26a46c Initial revision
claus
parents:
diff changeset
   156
    (byteOrder == #lsb) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   157
        val := bytes at:4.
48194c26a46c Initial revision
claus
parents:
diff changeset
   158
        val := val * 256 + (bytes at:3).
48194c26a46c Initial revision
claus
parents:
diff changeset
   159
        val := val * 256 + (bytes at:2).
48194c26a46c Initial revision
claus
parents:
diff changeset
   160
        val := val * 256 + (bytes at:1)
48194c26a46c Initial revision
claus
parents:
diff changeset
   161
    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   162
        val := bytes at:1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   163
        val := val * 256 + (bytes at:2).
48194c26a46c Initial revision
claus
parents:
diff changeset
   164
        val := val * 256 + (bytes at:3).
48194c26a46c Initial revision
claus
parents:
diff changeset
   165
        val := val * 256 + (bytes at:4)
48194c26a46c Initial revision
claus
parents:
diff changeset
   166
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   167
    ^ val
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   168
"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   169
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   170
48194c26a46c Initial revision
claus
parents:
diff changeset
   171
readShort
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   172
    "return the next 2-byte short, honoring the byte-order"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   173
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   174
    ^ inStream nextShortMSB:(byteOrder ~~ #lsb)
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   175
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   176
"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   177
    |bytes val|
48194c26a46c Initial revision
claus
parents:
diff changeset
   178
48194c26a46c Initial revision
claus
parents:
diff changeset
   179
    bytes := ByteArray new:2.
48194c26a46c Initial revision
claus
parents:
diff changeset
   180
    inStream nextBytes:2 into:bytes.
48194c26a46c Initial revision
claus
parents:
diff changeset
   181
    (byteOrder == #lsb) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   182
        val := bytes at:2.
48194c26a46c Initial revision
claus
parents:
diff changeset
   183
        val := val * 256 + (bytes at:1)
48194c26a46c Initial revision
claus
parents:
diff changeset
   184
    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   185
        val := bytes at:1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   186
        val := val * 256 + (bytes at:2)
48194c26a46c Initial revision
claus
parents:
diff changeset
   187
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   188
    ^ val
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   189
"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   190
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   191
48194c26a46c Initial revision
claus
parents:
diff changeset
   192
readShortLong
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   193
    "return the next 2-byte short, honoring the byte-order.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   194
     There are actually 4 bytes read, but only 2 looked at."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   195
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   196
    |bytes val|
48194c26a46c Initial revision
claus
parents:
diff changeset
   197
48194c26a46c Initial revision
claus
parents:
diff changeset
   198
    bytes := ByteArray new:4.
48194c26a46c Initial revision
claus
parents:
diff changeset
   199
    inStream nextBytes:4 into:bytes.
48194c26a46c Initial revision
claus
parents:
diff changeset
   200
    (byteOrder == #lsb) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   201
        val := bytes at:2.
48194c26a46c Initial revision
claus
parents:
diff changeset
   202
        val := val * 256 + (bytes at:1)
48194c26a46c Initial revision
claus
parents:
diff changeset
   203
    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   204
        val := bytes at:3.
48194c26a46c Initial revision
claus
parents:
diff changeset
   205
        val := val * 256 + (bytes at:4)
48194c26a46c Initial revision
claus
parents:
diff changeset
   206
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   207
    ^ val
48194c26a46c Initial revision
claus
parents:
diff changeset
   208
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   209
48194c26a46c Initial revision
claus
parents:
diff changeset
   210
writeLong:anInteger
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   211
    "write a 4-byte long, honoring the byte-order."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   212
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   213
    outStream nextLongPut:anInteger MSB:(byteOrder ~~ #lsb)
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   214
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   215
"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   216
    |bytes i|
48194c26a46c Initial revision
claus
parents:
diff changeset
   217
48194c26a46c Initial revision
claus
parents:
diff changeset
   218
    i := anInteger.
48194c26a46c Initial revision
claus
parents:
diff changeset
   219
    bytes := ByteArray new:4.
48194c26a46c Initial revision
claus
parents:
diff changeset
   220
    (byteOrder == #lsb) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   221
        bytes at:1 put:(i bitAnd:16rFF).
48194c26a46c Initial revision
claus
parents:
diff changeset
   222
        i := i // 256.
48194c26a46c Initial revision
claus
parents:
diff changeset
   223
        bytes at:2 put:(i bitAnd:16rFF).
48194c26a46c Initial revision
claus
parents:
diff changeset
   224
        i := i // 256.
48194c26a46c Initial revision
claus
parents:
diff changeset
   225
        bytes at:3 put:(i bitAnd:16rFF).
48194c26a46c Initial revision
claus
parents:
diff changeset
   226
        i := i // 256.
48194c26a46c Initial revision
claus
parents:
diff changeset
   227
        bytes at:4 put:(i bitAnd:16rFF).
48194c26a46c Initial revision
claus
parents:
diff changeset
   228
    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   229
        bytes at:4 put:(i bitAnd:16rFF).
48194c26a46c Initial revision
claus
parents:
diff changeset
   230
        i := i // 256.
48194c26a46c Initial revision
claus
parents:
diff changeset
   231
        bytes at:3 put:(i bitAnd:16rFF).
48194c26a46c Initial revision
claus
parents:
diff changeset
   232
        i := i // 256.
48194c26a46c Initial revision
claus
parents:
diff changeset
   233
        bytes at:2 put:(i bitAnd:16rFF).
48194c26a46c Initial revision
claus
parents:
diff changeset
   234
        i := i // 256.
48194c26a46c Initial revision
claus
parents:
diff changeset
   235
        bytes at:1 put:(i bitAnd:16rFF).
48194c26a46c Initial revision
claus
parents:
diff changeset
   236
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   237
    outStream nextPutBytes:4 from:bytes
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   238
"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   239
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   240
48194c26a46c Initial revision
claus
parents:
diff changeset
   241
writeShort:anInteger
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   242
    "write a 2-byte short, honoring the byte-order."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   243
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   244
    outStream nextShortPut:anInteger MSB:(byteOrder ~~ #lsb)
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   245
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   246
"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   247
    |bytes i|
48194c26a46c Initial revision
claus
parents:
diff changeset
   248
48194c26a46c Initial revision
claus
parents:
diff changeset
   249
    i := anInteger.
48194c26a46c Initial revision
claus
parents:
diff changeset
   250
    bytes := ByteArray new:2.
48194c26a46c Initial revision
claus
parents:
diff changeset
   251
    (byteOrder == #lsb) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   252
        bytes at:1 put:(i bitAnd:16rFF).
48194c26a46c Initial revision
claus
parents:
diff changeset
   253
        i := i // 256.
48194c26a46c Initial revision
claus
parents:
diff changeset
   254
        bytes at:2 put:(i bitAnd:16rFF).
48194c26a46c Initial revision
claus
parents:
diff changeset
   255
    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   256
        bytes at:2 put:(i bitAnd:16rFF).
48194c26a46c Initial revision
claus
parents:
diff changeset
   257
        i := i // 256.
48194c26a46c Initial revision
claus
parents:
diff changeset
   258
        bytes at:1 put:(i bitAnd:16rFF).
48194c26a46c Initial revision
claus
parents:
diff changeset
   259
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   260
    outStream nextPutBytes:2 from:bytes
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   261
"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   262
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   263
48194c26a46c Initial revision
claus
parents:
diff changeset
   264
!ImageReader class methodsFor:'decompression support'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   265
48194c26a46c Initial revision
claus
parents:
diff changeset
   266
decompressCCITT3From:srcBytes into:dstBytes startingAt:offset count:count 
48194c26a46c Initial revision
claus
parents:
diff changeset
   267
    "same as above but using primitive for speed"
48194c26a46c Initial revision
claus
parents:
diff changeset
   268
%{
48194c26a46c Initial revision
claus
parents:
diff changeset
   269
    if ((_Class(srcBytes) == ByteArray)
48194c26a46c Initial revision
claus
parents:
diff changeset
   270
     && (_Class(dstBytes) == ByteArray)
48194c26a46c Initial revision
claus
parents:
diff changeset
   271
     && _isSmallInteger(offset)
48194c26a46c Initial revision
claus
parents:
diff changeset
   272
     && _isSmallInteger(count)) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   273
        decodeCCITTgroup3(_ByteArrayInstPtr(srcBytes)->ba_element,
48194c26a46c Initial revision
claus
parents:
diff changeset
   274
                          _ByteArrayInstPtr(dstBytes)->ba_element
48194c26a46c Initial revision
claus
parents:
diff changeset
   275
                          + _intVal(offset) - 1,
48194c26a46c Initial revision
claus
parents:
diff changeset
   276
                          _intVal(count));
48194c26a46c Initial revision
claus
parents:
diff changeset
   277
        RETURN ( self );
48194c26a46c Initial revision
claus
parents:
diff changeset
   278
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   279
%}
48194c26a46c Initial revision
claus
parents:
diff changeset
   280
.
48194c26a46c Initial revision
claus
parents:
diff changeset
   281
    self primitiveFailed
48194c26a46c Initial revision
claus
parents:
diff changeset
   282
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   283
48194c26a46c Initial revision
claus
parents:
diff changeset
   284
decompressLZWFrom:srcBytes count:count into:dstBytes startingAt:offset
48194c26a46c Initial revision
claus
parents:
diff changeset
   285
%{
48194c26a46c Initial revision
claus
parents:
diff changeset
   286
    if ((_Class(srcBytes) == ByteArray)
48194c26a46c Initial revision
claus
parents:
diff changeset
   287
     && (_Class(dstBytes) == ByteArray)
48194c26a46c Initial revision
claus
parents:
diff changeset
   288
     && _isSmallInteger(offset)
48194c26a46c Initial revision
claus
parents:
diff changeset
   289
     && _isSmallInteger(count)) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   290
        decodeLZW(_ByteArrayInstPtr(srcBytes)->ba_element,
48194c26a46c Initial revision
claus
parents:
diff changeset
   291
                  _ByteArrayInstPtr(dstBytes)->ba_element
48194c26a46c Initial revision
claus
parents:
diff changeset
   292
                  + _intVal(offset) - 1,
48194c26a46c Initial revision
claus
parents:
diff changeset
   293
                  _intVal(count));
48194c26a46c Initial revision
claus
parents:
diff changeset
   294
        RETURN ( self );
48194c26a46c Initial revision
claus
parents:
diff changeset
   295
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   296
%}
48194c26a46c Initial revision
claus
parents:
diff changeset
   297
.
48194c26a46c Initial revision
claus
parents:
diff changeset
   298
    self primitiveFailed
48194c26a46c Initial revision
claus
parents:
diff changeset
   299
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   300
48194c26a46c Initial revision
claus
parents:
diff changeset
   301
decodeDelta:step in:data width:width height:height
48194c26a46c Initial revision
claus
parents:
diff changeset
   302
    (step ~~ 3) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   303
        ^ self error:'only rgb pictures supported'
48194c26a46c Initial revision
claus
parents:
diff changeset
   304
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   305
48194c26a46c Initial revision
claus
parents:
diff changeset
   306
%{
48194c26a46c Initial revision
claus
parents:
diff changeset
   307
    if ((_Class(data) == ByteArray)
48194c26a46c Initial revision
claus
parents:
diff changeset
   308
     && _isSmallInteger(width)
48194c26a46c Initial revision
claus
parents:
diff changeset
   309
     && _isSmallInteger(height)) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   310
        decodeDelta(_ByteArrayInstPtr(data)->ba_element,
48194c26a46c Initial revision
claus
parents:
diff changeset
   311
                    _intVal(width), _intVal(height));
48194c26a46c Initial revision
claus
parents:
diff changeset
   312
        RETURN ( self );
48194c26a46c Initial revision
claus
parents:
diff changeset
   313
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   314
%}
48194c26a46c Initial revision
claus
parents:
diff changeset
   315
.
48194c26a46c Initial revision
claus
parents:
diff changeset
   316
    self primitiveFailed
48194c26a46c Initial revision
claus
parents:
diff changeset
   317
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   318
48194c26a46c Initial revision
claus
parents:
diff changeset
   319
decompressGIFFrom:srcBytes count:count into:dstBytes startingAt:offset codeLen:codeLen
48194c26a46c Initial revision
claus
parents:
diff changeset
   320
%{
48194c26a46c Initial revision
claus
parents:
diff changeset
   321
    if ((_Class(srcBytes) == ByteArray)
48194c26a46c Initial revision
claus
parents:
diff changeset
   322
     && (_Class(dstBytes) == ByteArray)
48194c26a46c Initial revision
claus
parents:
diff changeset
   323
     && _isSmallInteger(codeLen)
48194c26a46c Initial revision
claus
parents:
diff changeset
   324
     && _isSmallInteger(offset)
48194c26a46c Initial revision
claus
parents:
diff changeset
   325
     && _isSmallInteger(count)) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   326
        decodeGIF(_ByteArrayInstPtr(srcBytes)->ba_element,
48194c26a46c Initial revision
claus
parents:
diff changeset
   327
                  _ByteArrayInstPtr(dstBytes)->ba_element
48194c26a46c Initial revision
claus
parents:
diff changeset
   328
                  + _intVal(offset) - 1,
48194c26a46c Initial revision
claus
parents:
diff changeset
   329
                  _intVal(count),
48194c26a46c Initial revision
claus
parents:
diff changeset
   330
                  _intVal(codeLen));
48194c26a46c Initial revision
claus
parents:
diff changeset
   331
        RETURN ( self );
48194c26a46c Initial revision
claus
parents:
diff changeset
   332
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   333
%}
48194c26a46c Initial revision
claus
parents:
diff changeset
   334
.
48194c26a46c Initial revision
claus
parents:
diff changeset
   335
    self primitiveFailed
48194c26a46c Initial revision
claus
parents:
diff changeset
   336
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   337
48194c26a46c Initial revision
claus
parents:
diff changeset
   338
%{
48194c26a46c Initial revision
claus
parents:
diff changeset
   339
48194c26a46c Initial revision
claus
parents:
diff changeset
   340
/*
48194c26a46c Initial revision
claus
parents:
diff changeset
   341
 * ccitt decompression
48194c26a46c Initial revision
claus
parents:
diff changeset
   342
 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   343
static short *whiteCountTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
   344
static char  *whiteShiftTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
   345
static short *blackCountTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
   346
static char  *blackShiftTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
   347
48194c26a46c Initial revision
claus
parents:
diff changeset
   348
struct ccitt_def {
48194c26a46c Initial revision
claus
parents:
diff changeset
   349
    unsigned short bits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   350
    short nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   351
};
48194c26a46c Initial revision
claus
parents:
diff changeset
   352
48194c26a46c Initial revision
claus
parents:
diff changeset
   353
static struct ccitt_def 
48194c26a46c Initial revision
claus
parents:
diff changeset
   354
whiteDef[] = {
48194c26a46c Initial revision
claus
parents:
diff changeset
   355
    { 0x3500, 8 }, /* 0 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   356
    { 0x1c00, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   357
    { 0x7000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   358
    { 0x8000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   359
    { 0xb000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   360
    { 0xc000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   361
    { 0xe000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   362
    { 0xf000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   363
    { 0x9800, 5 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   364
    { 0xA000, 5 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   365
    { 0x3800, 5 }, /* 10 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   366
    { 0x4000, 5 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   367
    { 0x2000, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   368
    { 0x0c00, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   369
    { 0xd000, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   370
    { 0xd400, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   371
    { 0xa800, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   372
    { 0xac00, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   373
    { 0x4e00, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   374
    { 0x1800, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   375
    { 0x1000, 7 }, /* 20 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   376
    { 0x2e00, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   377
    { 0x0600, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   378
    { 0x0800, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   379
    { 0x5000, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   380
    { 0x5600, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   381
    { 0x2600, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   382
    { 0x4800, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   383
    { 0x3000, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   384
    { 0x0200, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   385
    { 0x0300, 8 }, /* 30 */ 
48194c26a46c Initial revision
claus
parents:
diff changeset
   386
    { 0x1a00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   387
    { 0x1b00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   388
    { 0x1200, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   389
    { 0x1300, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   390
    { 0x1400, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   391
    { 0x1500, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   392
    { 0x1600, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   393
    { 0x1700, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   394
    { 0x2800, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   395
    { 0x2900, 8 }, /* 40 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   396
    { 0x2a00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   397
    { 0x2b00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   398
    { 0x2c00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   399
    { 0x2d00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   400
    { 0x0400, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   401
    { 0x0500, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   402
    { 0x0a00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   403
    { 0x0b00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   404
    { 0x5200, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   405
    { 0x5300, 8 }, /* 50 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   406
    { 0x5400, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   407
    { 0x5500, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   408
    { 0x2400, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   409
    { 0x2500, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   410
    { 0x5800, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   411
    { 0x5900, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   412
    { 0x5a00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   413
    { 0x5b00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   414
    { 0x4a00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   415
    { 0x4b00, 8 }, /* 60 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   416
    { 0x3200, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   417
    { 0x3300, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   418
    { 0x3400, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   419
/* ---------------- */
48194c26a46c Initial revision
claus
parents:
diff changeset
   420
    { 0xd800, 5 }, /* 64 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   421
    { 0x9000, 5 }, /* 128 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   422
    { 0x5c00, 6 }, /* 192 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   423
    { 0x6e00, 7 }, /* 256 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   424
    { 0x3600, 8 }, /* 320 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   425
    { 0x3700, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   426
    { 0x6400, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   427
    { 0x6500, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   428
    { 0x6800, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   429
    { 0x6700, 8 }, /* 640 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   430
    { 0x6600, 9 }, /* 704 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   431
    { 0x6680, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   432
    { 0x6900, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   433
    { 0x6980, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   434
    { 0x6a00, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   435
    { 0x6a80, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   436
    { 0x6b00, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   437
    { 0x6b80, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   438
    { 0x6c00, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   439
    { 0x6c80, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   440
    { 0x6d00, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   441
    { 0x6d80, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   442
    { 0x4c00, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   443
    { 0x4c80, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   444
    { 0x4d00, 9 }, /* 1600 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   445
    { 0x6000, 6 }, /* 1664 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   446
    { 0x4d80, 9 }, /* 1728 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   447
/* -------------------------------- */
48194c26a46c Initial revision
claus
parents:
diff changeset
   448
    { 0x0100, 11 }, /* 1792 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   449
    { 0x0180, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   450
    { 0x01a0, 11 }, /* 1920 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   451
    { 0x0120, 12 }, /* 1984 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   452
    { 0x0130, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   453
    { 0x0140, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   454
    { 0x0150, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   455
    { 0x0160, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   456
    { 0x0170, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   457
    { 0x01c0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   458
    { 0x01d0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   459
    { 0x01e0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   460
    { 0x01f0, 12 }, /* 2560 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   461
/* -------------------------------- */
48194c26a46c Initial revision
claus
parents:
diff changeset
   462
    { 0x0010, 12 }, /* EOL */
48194c26a46c Initial revision
claus
parents:
diff changeset
   463
};
48194c26a46c Initial revision
claus
parents:
diff changeset
   464
48194c26a46c Initial revision
claus
parents:
diff changeset
   465
static struct ccitt_def 
48194c26a46c Initial revision
claus
parents:
diff changeset
   466
blackDef[] = {
48194c26a46c Initial revision
claus
parents:
diff changeset
   467
    { 0x0dc0, 10 }, /* 0 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   468
    { 0x4000, 3 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   469
    { 0xc000, 2 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   470
    { 0x8000, 2 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   471
    { 0x6000, 3 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   472
    { 0x3000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   473
    { 0x2000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   474
    { 0x1800, 5 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   475
    { 0x1400, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   476
    { 0x1000, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   477
    { 0x0800, 7 }, /* 10 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   478
    { 0x0a00, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   479
    { 0x0e00, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   480
    { 0x0400, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   481
    { 0x0700, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   482
    { 0x0c00, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   483
    { 0x05c0, 10 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   484
    { 0x0600, 10 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   485
    { 0x0200, 10 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   486
    { 0x0ce0, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   487
    { 0x0d00, 11 }, /* 20 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   488
    { 0x0d80, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   489
    { 0x06e0, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   490
    { 0x0500, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   491
    { 0x02e0, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   492
    { 0x0300, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   493
    { 0x0ca0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   494
    { 0x0cb0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   495
    { 0x0cc0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   496
    { 0x0cd0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   497
    { 0x0680, 12 }, /* 30 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   498
    { 0x0690, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   499
    { 0x06a0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   500
    { 0x06b0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   501
    { 0x0d20, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   502
    { 0x0d30, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   503
    { 0x0d40, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   504
    { 0x0d50, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   505
    { 0x0d60, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   506
    { 0x0d70, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   507
    { 0x06c0, 12 }, /* 40 */ 
48194c26a46c Initial revision
claus
parents:
diff changeset
   508
    { 0x06d0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   509
    { 0x0da0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   510
    { 0x0db0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   511
    { 0x0540, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   512
    { 0x0550, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   513
    { 0x0560, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   514
    { 0x0570, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   515
    { 0x0640, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   516
    { 0x0650, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   517
    { 0x0520, 12 }, /* 50 */ 
48194c26a46c Initial revision
claus
parents:
diff changeset
   518
    { 0x0530, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   519
    { 0x0240, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   520
    { 0x0370, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   521
    { 0x0380, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   522
    { 0x0270, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   523
    { 0x0280, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   524
    { 0x0580, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   525
    { 0x0590, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   526
    { 0x02b0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   527
    { 0x02c0, 12 }, /* 60 */ 
48194c26a46c Initial revision
claus
parents:
diff changeset
   528
    { 0x05a0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   529
    { 0x0660, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   530
    { 0x0670, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   531
/* ---------------- */
48194c26a46c Initial revision
claus
parents:
diff changeset
   532
    { 0x03c0, 10 }, /* 64 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   533
    { 0x0c80, 12 }, /* 128 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   534
    { 0x0c90, 12 }, /* 192 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   535
    { 0x05b0, 12 }, /* 256 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   536
    { 0x0330, 12 }, /* 320 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   537
    { 0x0340, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   538
    { 0x0350, 12 }, /* 448 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   539
    { 0x0360, 13 }, /* 512 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   540
    { 0x0368, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   541
    { 0x0250, 13 }, /* 640 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   542
    { 0x0258, 13 }, /* 704 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   543
    { 0x0260, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   544
    { 0x0268, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   545
    { 0x0390, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   546
    { 0x0398, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   547
    { 0x03a0, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   548
    { 0x03a8, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   549
    { 0x03b0, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   550
    { 0x03b8, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   551
    { 0x0290, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   552
    { 0x0298, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   553
    { 0x02a0, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   554
    { 0x02a8, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   555
    { 0x02d0, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   556
    { 0x02d8, 13 }, /* 1600 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   557
    { 0x0320, 13 }, /* 1664 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   558
    { 0x0328, 13 }, /* 1728 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   559
/* -------------------------------- */
48194c26a46c Initial revision
claus
parents:
diff changeset
   560
};
48194c26a46c Initial revision
claus
parents:
diff changeset
   561
48194c26a46c Initial revision
claus
parents:
diff changeset
   562
static
48194c26a46c Initial revision
claus
parents:
diff changeset
   563
initCCITTTables() {
48194c26a46c Initial revision
claus
parents:
diff changeset
   564
    register cnt, bits, value;
48194c26a46c Initial revision
claus
parents:
diff changeset
   565
    int nBits, index;
48194c26a46c Initial revision
claus
parents:
diff changeset
   566
48194c26a46c Initial revision
claus
parents:
diff changeset
   567
    if (whiteCountTable != (short *)0) return;
48194c26a46c Initial revision
claus
parents:
diff changeset
   568
48194c26a46c Initial revision
claus
parents:
diff changeset
   569
    whiteCountTable = (short *) malloc(sizeof(short) * 8192);
48194c26a46c Initial revision
claus
parents:
diff changeset
   570
    whiteShiftTable = (char *) malloc(sizeof(char) * 8192);
48194c26a46c Initial revision
claus
parents:
diff changeset
   571
    blackCountTable = (short *) malloc(sizeof(short) * 8192);
48194c26a46c Initial revision
claus
parents:
diff changeset
   572
    blackShiftTable = (char *) malloc(sizeof(char) * 8192);
48194c26a46c Initial revision
claus
parents:
diff changeset
   573
48194c26a46c Initial revision
claus
parents:
diff changeset
   574
    for (index = 0; index < 8192; index++) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   575
        whiteCountTable[index] = -1;
48194c26a46c Initial revision
claus
parents:
diff changeset
   576
        blackCountTable[index] = -1;
48194c26a46c Initial revision
claus
parents:
diff changeset
   577
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   578
48194c26a46c Initial revision
claus
parents:
diff changeset
   579
    for (value = 0; value <= 63; value++) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   580
        nBits = whiteDef[value].nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   581
        bits = whiteDef[value].bits >> 3;
48194c26a46c Initial revision
claus
parents:
diff changeset
   582
        for (cnt = 1 << (13 - nBits); cnt; cnt--, bits++) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   583
            whiteCountTable[bits] = value;
48194c26a46c Initial revision
claus
parents:
diff changeset
   584
            whiteShiftTable[bits] = nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   585
        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   586
        nBits = blackDef[value].nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   587
        bits = blackDef[value].bits >> 3;
48194c26a46c Initial revision
claus
parents:
diff changeset
   588
        for (cnt = 1 << (13 - nBits); cnt; cnt--, bits++) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   589
            blackCountTable[bits] = value;
48194c26a46c Initial revision
claus
parents:
diff changeset
   590
            blackShiftTable[bits] = nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   591
        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   592
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   593
    index = value;
48194c26a46c Initial revision
claus
parents:
diff changeset
   594
48194c26a46c Initial revision
claus
parents:
diff changeset
   595
    for (; value <= 1728; value += 64) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   596
        nBits = whiteDef[index].nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   597
        bits = whiteDef[index].bits >> 3;
48194c26a46c Initial revision
claus
parents:
diff changeset
   598
        for (cnt = 1 << (13 - nBits); cnt; cnt--, bits++) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   599
            whiteCountTable[bits] = value;
48194c26a46c Initial revision
claus
parents:
diff changeset
   600
            whiteShiftTable[bits] = nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   601
        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   602
        nBits = blackDef[index].nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   603
        bits = blackDef[index].bits >> 3;
48194c26a46c Initial revision
claus
parents:
diff changeset
   604
        for (cnt = 1 << (13 - nBits); cnt; cnt--, bits++) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   605
            blackCountTable[bits] = value;
48194c26a46c Initial revision
claus
parents:
diff changeset
   606
            blackShiftTable[bits] = nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   607
        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   608
        index++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   609
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   610
48194c26a46c Initial revision
claus
parents:
diff changeset
   611
    for (; value <= 2560; value += 64) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   612
        nBits = whiteDef[index].nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   613
        bits = whiteDef[index].bits >> 3;
48194c26a46c Initial revision
claus
parents:
diff changeset
   614
        for (cnt = 1 << (13 - nBits); cnt; cnt--, bits++) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   615
            whiteCountTable[bits] = value;
48194c26a46c Initial revision
claus
parents:
diff changeset
   616
            whiteShiftTable[bits] = nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   617
            blackCountTable[bits] = value;
48194c26a46c Initial revision
claus
parents:
diff changeset
   618
            blackShiftTable[bits] = nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   619
        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   620
        index++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   621
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   622
}
48194c26a46c Initial revision
claus
parents:
diff changeset
   623
48194c26a46c Initial revision
claus
parents:
diff changeset
   624
static short 
48194c26a46c Initial revision
claus
parents:
diff changeset
   625
leftBits[] = {
48194c26a46c Initial revision
claus
parents:
diff changeset
   626
     0, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF
48194c26a46c Initial revision
claus
parents:
diff changeset
   627
};
48194c26a46c Initial revision
claus
parents:
diff changeset
   628
48194c26a46c Initial revision
claus
parents:
diff changeset
   629
decodeCCITTgroup3(from, to, len)
48194c26a46c Initial revision
claus
parents:
diff changeset
   630
    unsigned char *from;
48194c26a46c Initial revision
claus
parents:
diff changeset
   631
    register unsigned char *to;
48194c26a46c Initial revision
claus
parents:
diff changeset
   632
{
48194c26a46c Initial revision
claus
parents:
diff changeset
   633
    register cnt;
48194c26a46c Initial revision
claus
parents:
diff changeset
   634
    register short *countPtr;
48194c26a46c Initial revision
claus
parents:
diff changeset
   635
    register char *shiftPtr;
48194c26a46c Initial revision
claus
parents:
diff changeset
   636
    unsigned bits, bits13;
48194c26a46c Initial revision
claus
parents:
diff changeset
   637
    int shift, outCount, nBitsLess13;
48194c26a46c Initial revision
claus
parents:
diff changeset
   638
    int outBitOffset;
48194c26a46c Initial revision
claus
parents:
diff changeset
   639
    int nLeft, t;
48194c26a46c Initial revision
claus
parents:
diff changeset
   640
48194c26a46c Initial revision
claus
parents:
diff changeset
   641
    if (! whiteCountTable) initCCITTTables();
48194c26a46c Initial revision
claus
parents:
diff changeset
   642
48194c26a46c Initial revision
claus
parents:
diff changeset
   643
    countPtr = whiteCountTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
   644
    shiftPtr = whiteShiftTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
   645
    outCount = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   646
    outBitOffset = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   647
    bits = *from++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   648
    bits = (bits << 8) | *from++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   649
    nBitsLess13 = 3;
48194c26a46c Initial revision
claus
parents:
diff changeset
   650
    for (;;) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   651
        bits13 = (bits >> nBitsLess13) & 0x1FFF;
48194c26a46c Initial revision
claus
parents:
diff changeset
   652
        cnt = countPtr[bits13];
48194c26a46c Initial revision
claus
parents:
diff changeset
   653
        if (cnt < 0) return;
48194c26a46c Initial revision
claus
parents:
diff changeset
   654
        shift = shiftPtr[bits13];
48194c26a46c Initial revision
claus
parents:
diff changeset
   655
        outCount += cnt;
48194c26a46c Initial revision
claus
parents:
diff changeset
   656
        if (countPtr == blackCountTable) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   657
            /* toggle if it was a terminating code */
48194c26a46c Initial revision
claus
parents:
diff changeset
   658
            if (cnt < 64) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   659
                countPtr = whiteCountTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
   660
                shiftPtr = whiteShiftTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
   661
            }
48194c26a46c Initial revision
claus
parents:
diff changeset
   662
48194c26a46c Initial revision
claus
parents:
diff changeset
   663
            /* draw cnt black bits */
48194c26a46c Initial revision
claus
parents:
diff changeset
   664
            if (cnt) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   665
                if (outBitOffset) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   666
                    nLeft = 8 - outBitOffset;
48194c26a46c Initial revision
claus
parents:
diff changeset
   667
                    if (cnt < nLeft) nLeft = cnt;
48194c26a46c Initial revision
claus
parents:
diff changeset
   668
                    t = leftBits[nLeft] >> outBitOffset;
48194c26a46c Initial revision
claus
parents:
diff changeset
   669
                    *to |= t;
48194c26a46c Initial revision
claus
parents:
diff changeset
   670
                    cnt -= nLeft;
48194c26a46c Initial revision
claus
parents:
diff changeset
   671
                    outBitOffset += nLeft;
48194c26a46c Initial revision
claus
parents:
diff changeset
   672
                    if (outBitOffset >= 8) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   673
                        to++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   674
                        outBitOffset -= 8;
48194c26a46c Initial revision
claus
parents:
diff changeset
   675
                    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   676
                }
48194c26a46c Initial revision
claus
parents:
diff changeset
   677
                if (cnt > 256) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   678
                    while ((int)to & 3) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   679
                        *to++ = 0xFF;
48194c26a46c Initial revision
claus
parents:
diff changeset
   680
                        cnt -= 8;
48194c26a46c Initial revision
claus
parents:
diff changeset
   681
                    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   682
                    while (cnt >= 32) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   683
                        (*(long *)to) = 0xFFFFFFFF;
48194c26a46c Initial revision
claus
parents:
diff changeset
   684
                        to += 4;
48194c26a46c Initial revision
claus
parents:
diff changeset
   685
                        cnt -= 32;
48194c26a46c Initial revision
claus
parents:
diff changeset
   686
                    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   687
                }
48194c26a46c Initial revision
claus
parents:
diff changeset
   688
                while (cnt >= 8) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   689
                    *to++ = 0xFF;
48194c26a46c Initial revision
claus
parents:
diff changeset
   690
                    cnt -= 8;
48194c26a46c Initial revision
claus
parents:
diff changeset
   691
                }
48194c26a46c Initial revision
claus
parents:
diff changeset
   692
                *to |= leftBits[cnt];
48194c26a46c Initial revision
claus
parents:
diff changeset
   693
                outBitOffset += cnt;
48194c26a46c Initial revision
claus
parents:
diff changeset
   694
            }
48194c26a46c Initial revision
claus
parents:
diff changeset
   695
        } else {
48194c26a46c Initial revision
claus
parents:
diff changeset
   696
            /* toggle if it was a terminating code */
48194c26a46c Initial revision
claus
parents:
diff changeset
   697
            if (cnt < 64) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   698
                countPtr = blackCountTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
   699
                shiftPtr = blackShiftTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
   700
            }
48194c26a46c Initial revision
claus
parents:
diff changeset
   701
48194c26a46c Initial revision
claus
parents:
diff changeset
   702
            /* skip cnt bits */
48194c26a46c Initial revision
claus
parents:
diff changeset
   703
            to += cnt >> 3;
48194c26a46c Initial revision
claus
parents:
diff changeset
   704
            outBitOffset += cnt & 7;
48194c26a46c Initial revision
claus
parents:
diff changeset
   705
            if (outBitOffset >= 8) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   706
                to++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   707
                outBitOffset -= 8;
48194c26a46c Initial revision
claus
parents:
diff changeset
   708
            }
48194c26a46c Initial revision
claus
parents:
diff changeset
   709
        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   710
        if (outCount >= len) return;
48194c26a46c Initial revision
claus
parents:
diff changeset
   711
48194c26a46c Initial revision
claus
parents:
diff changeset
   712
        nBitsLess13 -= shift;
48194c26a46c Initial revision
claus
parents:
diff changeset
   713
        while (nBitsLess13 < 0) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   714
            bits = (bits << 8) | *from++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   715
            nBitsLess13 += 8;
48194c26a46c Initial revision
claus
parents:
diff changeset
   716
        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   717
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   718
}
48194c26a46c Initial revision
claus
parents:
diff changeset
   719
48194c26a46c Initial revision
claus
parents:
diff changeset
   720
/*
48194c26a46c Initial revision
claus
parents:
diff changeset
   721
 * LZW decompression
48194c26a46c Initial revision
claus
parents:
diff changeset
   722
 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   723
struct buffer {
48194c26a46c Initial revision
claus
parents:
diff changeset
   724
        struct buffer *prev;
48194c26a46c Initial revision
claus
parents:
diff changeset
   725
        unsigned char chars[8192 - 4];
48194c26a46c Initial revision
claus
parents:
diff changeset
   726
};
48194c26a46c Initial revision
claus
parents:
diff changeset
   727
        
48194c26a46c Initial revision
claus
parents:
diff changeset
   728
decodeLZW(from, to, inCount)
48194c26a46c Initial revision
claus
parents:
diff changeset
   729
    unsigned char *from;
48194c26a46c Initial revision
claus
parents:
diff changeset
   730
    unsigned char *to;
48194c26a46c Initial revision
claus
parents:
diff changeset
   731
{
48194c26a46c Initial revision
claus
parents:
diff changeset
   732
    register unsigned code;
48194c26a46c Initial revision
claus
parents:
diff changeset
   733
    unsigned char *strings[4096];
48194c26a46c Initial revision
claus
parents:
diff changeset
   734
    short stringLen[4096];
48194c26a46c Initial revision
claus
parents:
diff changeset
   735
    struct buffer *scratchBuffer;
48194c26a46c Initial revision
claus
parents:
diff changeset
   736
    struct buffer *newBuffer;
48194c26a46c Initial revision
claus
parents:
diff changeset
   737
    unsigned char *scratchPtr;
48194c26a46c Initial revision
claus
parents:
diff changeset
   738
    int nScratch;
48194c26a46c Initial revision
claus
parents:
diff changeset
   739
    unsigned nextCode, oldCode;
48194c26a46c Initial revision
claus
parents:
diff changeset
   740
    register unsigned bits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   741
    int nBits, mask, shift;
48194c26a46c Initial revision
claus
parents:
diff changeset
   742
    int i;
48194c26a46c Initial revision
claus
parents:
diff changeset
   743
    int len;
48194c26a46c Initial revision
claus
parents:
diff changeset
   744
    int codeLen = 9;
48194c26a46c Initial revision
claus
parents:
diff changeset
   745
48194c26a46c Initial revision
claus
parents:
diff changeset
   746
    scratchBuffer = (struct buffer *)malloc(sizeof(struct buffer));
48194c26a46c Initial revision
claus
parents:
diff changeset
   747
    if (! scratchBuffer) return;
48194c26a46c Initial revision
claus
parents:
diff changeset
   748
    scratchBuffer->prev = (struct buffer *)0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   749
    scratchPtr = scratchBuffer->chars;
48194c26a46c Initial revision
claus
parents:
diff changeset
   750
    nScratch = sizeof(scratchBuffer->chars);
48194c26a46c Initial revision
claus
parents:
diff changeset
   751
48194c26a46c Initial revision
claus
parents:
diff changeset
   752
    for (i = 0; i < 256; i++) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   753
        *scratchPtr = i;
48194c26a46c Initial revision
claus
parents:
diff changeset
   754
        strings[i] = scratchPtr++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   755
        stringLen[i] = 1;
48194c26a46c Initial revision
claus
parents:
diff changeset
   756
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   757
48194c26a46c Initial revision
claus
parents:
diff changeset
   758
    nextCode = 258;
48194c26a46c Initial revision
claus
parents:
diff changeset
   759
    nScratch -= 256;
48194c26a46c Initial revision
claus
parents:
diff changeset
   760
    mask = 0x1FF;
48194c26a46c Initial revision
claus
parents:
diff changeset
   761
    nBits = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   762
    bits = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   763
    while (inCount) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   764
        /* fetch code */
48194c26a46c Initial revision
claus
parents:
diff changeset
   765
        while (nBits < codeLen) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   766
            bits = (bits<<8) | *from++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   767
            inCount--;
48194c26a46c Initial revision
claus
parents:
diff changeset
   768
            nBits += 8;
48194c26a46c Initial revision
claus
parents:
diff changeset
   769
        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   770
        shift = nBits - codeLen;
48194c26a46c Initial revision
claus
parents:
diff changeset
   771
        code = (bits >> shift) & mask;
48194c26a46c Initial revision
claus
parents:
diff changeset
   772
        bits &= ~(mask << shift);
48194c26a46c Initial revision
claus
parents:
diff changeset
   773
        nBits -= codeLen;
48194c26a46c Initial revision
claus
parents:
diff changeset
   774
        if (code == 257) break;
48194c26a46c Initial revision
claus
parents:
diff changeset
   775
        if (code == 256) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   776
            if (! inCount)
48194c26a46c Initial revision
claus
parents:
diff changeset
   777
                break;
48194c26a46c Initial revision
claus
parents:
diff changeset
   778
48194c26a46c Initial revision
claus
parents:
diff changeset
   779
            /* free stuff */
48194c26a46c Initial revision
claus
parents:
diff changeset
   780
            while (scratchBuffer->prev) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   781
                newBuffer = scratchBuffer;
48194c26a46c Initial revision
claus
parents:
diff changeset
   782
                scratchBuffer = scratchBuffer->prev;
48194c26a46c Initial revision
claus
parents:
diff changeset
   783
                free(newBuffer);
48194c26a46c Initial revision
claus
parents:
diff changeset
   784
            }
48194c26a46c Initial revision
claus
parents:
diff changeset
   785
            /* reset everything */
48194c26a46c Initial revision
claus
parents:
diff changeset
   786
            scratchPtr = scratchBuffer->chars + 256;
48194c26a46c Initial revision
claus
parents:
diff changeset
   787
            nScratch = sizeof(scratchBuffer->chars) - 256;
48194c26a46c Initial revision
claus
parents:
diff changeset
   788
            codeLen = 9;
48194c26a46c Initial revision
claus
parents:
diff changeset
   789
            nextCode = 258;
48194c26a46c Initial revision
claus
parents:
diff changeset
   790
            mask = 0x1FF;
48194c26a46c Initial revision
claus
parents:
diff changeset
   791
            /* fetch code */
48194c26a46c Initial revision
claus
parents:
diff changeset
   792
            while (nBits < codeLen) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   793
                bits = (bits<<8) | *from++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   794
                inCount--;
48194c26a46c Initial revision
claus
parents:
diff changeset
   795
                nBits += 8;
48194c26a46c Initial revision
claus
parents:
diff changeset
   796
            }
48194c26a46c Initial revision
claus
parents:
diff changeset
   797
            shift = nBits - codeLen;
48194c26a46c Initial revision
claus
parents:
diff changeset
   798
            code = (bits >> shift) & mask;
48194c26a46c Initial revision
claus
parents:
diff changeset
   799
            bits &= ~(mask << shift);
48194c26a46c Initial revision
claus
parents:
diff changeset
   800
            nBits -= codeLen;
48194c26a46c Initial revision
claus
parents:
diff changeset
   801
            if (code == 257) break;
48194c26a46c Initial revision
claus
parents:
diff changeset
   802
            /* add to output */
48194c26a46c Initial revision
claus
parents:
diff changeset
   803
            *to++ = code;
48194c26a46c Initial revision
claus
parents:
diff changeset
   804
            oldCode = code;
48194c26a46c Initial revision
claus
parents:
diff changeset
   805
        } else {
48194c26a46c Initial revision
claus
parents:
diff changeset
   806
            if (code < nextCode) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   807
                /* writeString(string[code]) */
48194c26a46c Initial revision
claus
parents:
diff changeset
   808
                len = stringLen[code];
48194c26a46c Initial revision
claus
parents:
diff changeset
   809
                bcopy(strings[code], to, len);
48194c26a46c Initial revision
claus
parents:
diff changeset
   810
                to += len;
48194c26a46c Initial revision
claus
parents:
diff changeset
   811
48194c26a46c Initial revision
claus
parents:
diff changeset
   812
                /* add( string[oldcode] + first(string[code]) ) */
48194c26a46c Initial revision
claus
parents:
diff changeset
   813
                len = stringLen[oldCode] + 1;
48194c26a46c Initial revision
claus
parents:
diff changeset
   814
                if (nScratch < len) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   815
                    newBuffer = (struct buffer *)malloc(sizeof(struct buffer));
48194c26a46c Initial revision
claus
parents:
diff changeset
   816
                    newBuffer->prev = scratchBuffer;
48194c26a46c Initial revision
claus
parents:
diff changeset
   817
                    scratchBuffer = newBuffer;
48194c26a46c Initial revision
claus
parents:
diff changeset
   818
                    scratchPtr = scratchBuffer->chars;
48194c26a46c Initial revision
claus
parents:
diff changeset
   819
                    nScratch = sizeof(scratchBuffer->chars);
48194c26a46c Initial revision
claus
parents:
diff changeset
   820
                }
48194c26a46c Initial revision
claus
parents:
diff changeset
   821
                stringLen[nextCode] = len;
48194c26a46c Initial revision
claus
parents:
diff changeset
   822
                strings[nextCode] = scratchPtr;
48194c26a46c Initial revision
claus
parents:
diff changeset
   823
                bcopy(strings[oldCode], scratchPtr, len-1);
48194c26a46c Initial revision
claus
parents:
diff changeset
   824
                scratchPtr += len-1;
48194c26a46c Initial revision
claus
parents:
diff changeset
   825
                *scratchPtr++ = strings[code][0];
48194c26a46c Initial revision
claus
parents:
diff changeset
   826
                nScratch -= len;
48194c26a46c Initial revision
claus
parents:
diff changeset
   827
            } else {
48194c26a46c Initial revision
claus
parents:
diff changeset
   828
                /* writeString(string[oldCode] + first(string[oldCode]) ) */
48194c26a46c Initial revision
claus
parents:
diff changeset
   829
                len = stringLen[oldCode];
48194c26a46c Initial revision
claus
parents:
diff changeset
   830
                bcopy(strings[oldCode], to, len);
48194c26a46c Initial revision
claus
parents:
diff changeset
   831
                to += len;
48194c26a46c Initial revision
claus
parents:
diff changeset
   832
                *to++ = strings[oldCode][0];
48194c26a46c Initial revision
claus
parents:
diff changeset
   833
48194c26a46c Initial revision
claus
parents:
diff changeset
   834
                /* add( string[oldcode] + first(string[oldCode]) ) */
48194c26a46c Initial revision
claus
parents:
diff changeset
   835
                len++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   836
                if (nScratch < len) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   837
                    newBuffer = (struct buffer *)malloc(sizeof(struct buffer));
48194c26a46c Initial revision
claus
parents:
diff changeset
   838
                    newBuffer->prev = scratchBuffer;
48194c26a46c Initial revision
claus
parents:
diff changeset
   839
                    scratchBuffer = newBuffer;
48194c26a46c Initial revision
claus
parents:
diff changeset
   840
                    scratchPtr = scratchBuffer->chars;
48194c26a46c Initial revision
claus
parents:
diff changeset
   841
                    nScratch = sizeof(scratchBuffer->chars);
48194c26a46c Initial revision
claus
parents:
diff changeset
   842
                }
48194c26a46c Initial revision
claus
parents:
diff changeset
   843
                stringLen[nextCode] = len;
48194c26a46c Initial revision
claus
parents:
diff changeset
   844
                strings[nextCode] = scratchPtr;
48194c26a46c Initial revision
claus
parents:
diff changeset
   845
                bcopy(strings[oldCode], scratchPtr, len-1);
48194c26a46c Initial revision
claus
parents:
diff changeset
   846
                scratchPtr += len-1;
48194c26a46c Initial revision
claus
parents:
diff changeset
   847
                *scratchPtr++ = strings[oldCode][0];
48194c26a46c Initial revision
claus
parents:
diff changeset
   848
                nScratch -= len;
48194c26a46c Initial revision
claus
parents:
diff changeset
   849
            }
48194c26a46c Initial revision
claus
parents:
diff changeset
   850
            oldCode = code;
48194c26a46c Initial revision
claus
parents:
diff changeset
   851
            nextCode++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   852
            if (nextCode >= 511)
48194c26a46c Initial revision
claus
parents:
diff changeset
   853
                if (nextCode == 511) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   854
                    codeLen = 10;
48194c26a46c Initial revision
claus
parents:
diff changeset
   855
                    mask = 0x3FF;
48194c26a46c Initial revision
claus
parents:
diff changeset
   856
                } else if (nextCode >= 1023)
48194c26a46c Initial revision
claus
parents:
diff changeset
   857
                    if (nextCode == 1023) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   858
                        codeLen = 11;
48194c26a46c Initial revision
claus
parents:
diff changeset
   859
                        mask = 0x7FF;
48194c26a46c Initial revision
claus
parents:
diff changeset
   860
                    } else 
48194c26a46c Initial revision
claus
parents:
diff changeset
   861
                        if (nextCode == 2047) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   862
                            codeLen = 12;
48194c26a46c Initial revision
claus
parents:
diff changeset
   863
                            mask = 0xFFF;
48194c26a46c Initial revision
claus
parents:
diff changeset
   864
                        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   865
        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   866
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   867
    /* free stuff */
48194c26a46c Initial revision
claus
parents:
diff changeset
   868
    while (scratchBuffer) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   869
        newBuffer = scratchBuffer;
48194c26a46c Initial revision
claus
parents:
diff changeset
   870
        scratchBuffer = scratchBuffer->prev;
48194c26a46c Initial revision
claus
parents:
diff changeset
   871
        free(newBuffer);
48194c26a46c Initial revision
claus
parents:
diff changeset
   872
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   873
}
48194c26a46c Initial revision
claus
parents:
diff changeset
   874
48194c26a46c Initial revision
claus
parents:
diff changeset
   875
/*
48194c26a46c Initial revision
claus
parents:
diff changeset
   876
 * delta decoding (TIFF predictor = 2)
48194c26a46c Initial revision
claus
parents:
diff changeset
   877
 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   878
decodeDelta(bytes, width, height)
48194c26a46c Initial revision
claus
parents:
diff changeset
   879
    register unsigned char *bytes;
48194c26a46c Initial revision
claus
parents:
diff changeset
   880
{
48194c26a46c Initial revision
claus
parents:
diff changeset
   881
        register w;
48194c26a46c Initial revision
claus
parents:
diff changeset
   882
        unsigned char r, g, b;
48194c26a46c Initial revision
claus
parents:
diff changeset
   883
48194c26a46c Initial revision
claus
parents:
diff changeset
   884
        while (height--) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   885
            r = g = b = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   886
            for (w = width; w; w--) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   887
                r += *bytes;
48194c26a46c Initial revision
claus
parents:
diff changeset
   888
                *bytes++ = r;
48194c26a46c Initial revision
claus
parents:
diff changeset
   889
                g += *bytes;
48194c26a46c Initial revision
claus
parents:
diff changeset
   890
                *bytes++ = g;
48194c26a46c Initial revision
claus
parents:
diff changeset
   891
                b += *bytes;
48194c26a46c Initial revision
claus
parents:
diff changeset
   892
                *bytes++ = b;
48194c26a46c Initial revision
claus
parents:
diff changeset
   893
            }
48194c26a46c Initial revision
claus
parents:
diff changeset
   894
        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   895
}
48194c26a46c Initial revision
claus
parents:
diff changeset
   896
48194c26a46c Initial revision
claus
parents:
diff changeset
   897
decodeGIF(from, to, inCount, initialCodeLen)
48194c26a46c Initial revision
claus
parents:
diff changeset
   898
    unsigned char *from;
48194c26a46c Initial revision
claus
parents:
diff changeset
   899
    unsigned char *to;
48194c26a46c Initial revision
claus
parents:
diff changeset
   900
{
48194c26a46c Initial revision
claus
parents:
diff changeset
   901
    register unsigned code;
48194c26a46c Initial revision
claus
parents:
diff changeset
   902
    unsigned short prefix[4096];
48194c26a46c Initial revision
claus
parents:
diff changeset
   903
    unsigned short suffix[4096];
48194c26a46c Initial revision
claus
parents:
diff changeset
   904
    unsigned short outCode[4096];
48194c26a46c Initial revision
claus
parents:
diff changeset
   905
    int outCount;
48194c26a46c Initial revision
claus
parents:
diff changeset
   906
    unsigned maxCode, oldCode, fin, inCode, curCode;
48194c26a46c Initial revision
claus
parents:
diff changeset
   907
    register unsigned bits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   908
    register int nBits, mask, shift;
48194c26a46c Initial revision
claus
parents:
diff changeset
   909
    int i;
48194c26a46c Initial revision
claus
parents:
diff changeset
   910
    int len;
48194c26a46c Initial revision
claus
parents:
diff changeset
   911
    int endCode, clearCode, freeCode;
48194c26a46c Initial revision
claus
parents:
diff changeset
   912
    int codeLen = initialCodeLen;
48194c26a46c Initial revision
claus
parents:
diff changeset
   913
    static int ranges[] = {0, 1, 2, 4,
48194c26a46c Initial revision
claus
parents:
diff changeset
   914
                           8, 16, 32, 64,
48194c26a46c Initial revision
claus
parents:
diff changeset
   915
                           128, 256, 512, 1024,
48194c26a46c Initial revision
claus
parents:
diff changeset
   916
                           2048 };
48194c26a46c Initial revision
claus
parents:
diff changeset
   917
48194c26a46c Initial revision
claus
parents:
diff changeset
   918
    clearCode = ranges[codeLen]; /* 256 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   919
    endCode = clearCode + 1;     /* 257 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   920
    freeCode = clearCode + 2;    /* 258 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   921
    maxCode = clearCode << 1;    /* 512 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   922
    outCount = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   923
48194c26a46c Initial revision
claus
parents:
diff changeset
   924
    mask = maxCode - 1;          /* 1FF */
48194c26a46c Initial revision
claus
parents:
diff changeset
   925
    nBits = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   926
    bits = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   927
    while (inCount) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   928
        /* fetch code */
48194c26a46c Initial revision
claus
parents:
diff changeset
   929
        while (nBits < codeLen) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   930
            bits = bits | (*from++ << nBits);
48194c26a46c Initial revision
claus
parents:
diff changeset
   931
            inCount--;
48194c26a46c Initial revision
claus
parents:
diff changeset
   932
            nBits += 8;
48194c26a46c Initial revision
claus
parents:
diff changeset
   933
        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   934
        code = bits & mask;
48194c26a46c Initial revision
claus
parents:
diff changeset
   935
        bits >>= codeLen;
48194c26a46c Initial revision
claus
parents:
diff changeset
   936
        nBits -= codeLen;
48194c26a46c Initial revision
claus
parents:
diff changeset
   937
        if (code == endCode) break;
48194c26a46c Initial revision
claus
parents:
diff changeset
   938
        if (code == clearCode) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   939
            if (! inCount)
48194c26a46c Initial revision
claus
parents:
diff changeset
   940
                break;
48194c26a46c Initial revision
claus
parents:
diff changeset
   941
48194c26a46c Initial revision
claus
parents:
diff changeset
   942
            codeLen = initialCodeLen;
48194c26a46c Initial revision
claus
parents:
diff changeset
   943
            maxCode = clearCode<<1;
48194c26a46c Initial revision
claus
parents:
diff changeset
   944
            mask = maxCode - 1;
48194c26a46c Initial revision
claus
parents:
diff changeset
   945
            freeCode = clearCode + 2;  
48194c26a46c Initial revision
claus
parents:
diff changeset
   946
48194c26a46c Initial revision
claus
parents:
diff changeset
   947
            /* fetch code */
48194c26a46c Initial revision
claus
parents:
diff changeset
   948
            while (nBits < codeLen) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   949
                bits = bits | (*from++ << nBits);
48194c26a46c Initial revision
claus
parents:
diff changeset
   950
                inCount--;
48194c26a46c Initial revision
claus
parents:
diff changeset
   951
                nBits += 8;
48194c26a46c Initial revision
claus
parents:
diff changeset
   952
            }
48194c26a46c Initial revision
claus
parents:
diff changeset
   953
            code = bits & mask;
48194c26a46c Initial revision
claus
parents:
diff changeset
   954
            bits >>= codeLen;
48194c26a46c Initial revision
claus
parents:
diff changeset
   955
            nBits -= codeLen;
48194c26a46c Initial revision
claus
parents:
diff changeset
   956
            if (code == endCode) break;
48194c26a46c Initial revision
claus
parents:
diff changeset
   957
            /* add to output */
48194c26a46c Initial revision
claus
parents:
diff changeset
   958
            *to++ = code;
48194c26a46c Initial revision
claus
parents:
diff changeset
   959
            oldCode = fin = curCode = code;
48194c26a46c Initial revision
claus
parents:
diff changeset
   960
        } else {
48194c26a46c Initial revision
claus
parents:
diff changeset
   961
            curCode = inCode = code;
48194c26a46c Initial revision
claus
parents:
diff changeset
   962
            if (curCode >= freeCode) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   963
                curCode = oldCode;
48194c26a46c Initial revision
claus
parents:
diff changeset
   964
                outCode[outCount++] = fin;
48194c26a46c Initial revision
claus
parents:
diff changeset
   965
            }
48194c26a46c Initial revision
claus
parents:
diff changeset
   966
48194c26a46c Initial revision
claus
parents:
diff changeset
   967
            while (curCode >= clearCode) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   968
                if (outCount > 1024) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   969
                    return;
48194c26a46c Initial revision
claus
parents:
diff changeset
   970
                }
48194c26a46c Initial revision
claus
parents:
diff changeset
   971
                outCode[outCount++] = suffix[curCode];
48194c26a46c Initial revision
claus
parents:
diff changeset
   972
                curCode = prefix[curCode];
48194c26a46c Initial revision
claus
parents:
diff changeset
   973
            }
48194c26a46c Initial revision
claus
parents:
diff changeset
   974
48194c26a46c Initial revision
claus
parents:
diff changeset
   975
            fin = curCode;
48194c26a46c Initial revision
claus
parents:
diff changeset
   976
            outCode[outCount++] = fin;
48194c26a46c Initial revision
claus
parents:
diff changeset
   977
48194c26a46c Initial revision
claus
parents:
diff changeset
   978
            for (i = outCount - 1; i >= 0; i--)
48194c26a46c Initial revision
claus
parents:
diff changeset
   979
                *to++ = outCode[i];
48194c26a46c Initial revision
claus
parents:
diff changeset
   980
            outCount = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   981
48194c26a46c Initial revision
claus
parents:
diff changeset
   982
            prefix[freeCode] = oldCode;
48194c26a46c Initial revision
claus
parents:
diff changeset
   983
            suffix[freeCode] = fin;
48194c26a46c Initial revision
claus
parents:
diff changeset
   984
            oldCode = inCode;
48194c26a46c Initial revision
claus
parents:
diff changeset
   985
48194c26a46c Initial revision
claus
parents:
diff changeset
   986
            freeCode++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   987
            if (freeCode >= maxCode) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   988
                if (codeLen < 12) {
48194c26a46c Initial revision
claus
parents:
diff changeset
   989
                    codeLen++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   990
                    maxCode *= 2;
48194c26a46c Initial revision
claus
parents:
diff changeset
   991
                    mask = (1 << codeLen) - 1;
48194c26a46c Initial revision
claus
parents:
diff changeset
   992
                }
48194c26a46c Initial revision
claus
parents:
diff changeset
   993
            }
48194c26a46c Initial revision
claus
parents:
diff changeset
   994
        }
48194c26a46c Initial revision
claus
parents:
diff changeset
   995
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   996
}
48194c26a46c Initial revision
claus
parents:
diff changeset
   997
48194c26a46c Initial revision
claus
parents:
diff changeset
   998
%}