ImageReader.st
author Claus Gittinger <cg@exept.de>
Thu, 24 Jul 1997 18:05:20 +0200
changeset 1828 6bde6b02a671
parent 1819 a9ff463a55d3
child 1891 0dc56210cbfb
permissions -rw-r--r--
tuned #buildMaskFromColor:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
48194c26a46c Initial revision
claus
parents:
diff changeset
     1
"
6
7ee0cfde237d *** empty log message ***
claus
parents: 5
diff changeset
     2
 COPYRIGHT (c) 1991 by Claus Gittinger
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
     3
	      All Rights Reserved
0
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
518
f76da6242336 nicer message
Claus Gittinger <cg@exept.de>
parents: 285
diff changeset
    14
	instanceVariableNames:'width height data byteOrder inStream outStream photometric
1648
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
    15
		samplesPerPixel bitsPerSample colorMap mask maskPixel
1772
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
    16
		dimensionCallBack imageSequence'
518
f76da6242336 nicer message
Claus Gittinger <cg@exept.de>
parents: 285
diff changeset
    17
	classVariableNames:'ReverseBits'
f76da6242336 nicer message
Claus Gittinger <cg@exept.de>
parents: 285
diff changeset
    18
	poolDictionaries:''
665
843bf13683f5 category change
Claus Gittinger <cg@exept.de>
parents: 618
diff changeset
    19
	category:'Graphics-Images-Support'
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    20
!
48194c26a46c Initial revision
claus
parents:
diff changeset
    21
189
claus
parents: 153
diff changeset
    22
!ImageReader primitiveDefinitions!
claus
parents: 153
diff changeset
    23
%{
claus
parents: 153
diff changeset
    24
#ifndef _STDIO_H_INCLUDED_
claus
parents: 153
diff changeset
    25
# include <stdio.h>
claus
parents: 153
diff changeset
    26
# define _STDIO_H_INCLUDED_
claus
parents: 153
diff changeset
    27
#endif
claus
parents: 153
diff changeset
    28
%}
claus
parents: 153
diff changeset
    29
! !
claus
parents: 153
diff changeset
    30
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
    31
!ImageReader primitiveFunctions!
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    32
%{
48194c26a46c Initial revision
claus
parents:
diff changeset
    33
48194c26a46c Initial revision
claus
parents:
diff changeset
    34
/*
48194c26a46c Initial revision
claus
parents:
diff changeset
    35
 * ccitt decompression
48194c26a46c Initial revision
claus
parents:
diff changeset
    36
 */
48194c26a46c Initial revision
claus
parents:
diff changeset
    37
static short *whiteCountTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
    38
static char  *whiteShiftTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
    39
static short *blackCountTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
    40
static char  *blackShiftTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
    41
48194c26a46c Initial revision
claus
parents:
diff changeset
    42
struct ccitt_def {
48194c26a46c Initial revision
claus
parents:
diff changeset
    43
    unsigned short bits;
48194c26a46c Initial revision
claus
parents:
diff changeset
    44
    short nBits;
48194c26a46c Initial revision
claus
parents:
diff changeset
    45
};
48194c26a46c Initial revision
claus
parents:
diff changeset
    46
48194c26a46c Initial revision
claus
parents:
diff changeset
    47
static struct ccitt_def 
48194c26a46c Initial revision
claus
parents:
diff changeset
    48
whiteDef[] = {
48194c26a46c Initial revision
claus
parents:
diff changeset
    49
    { 0x3500, 8 }, /* 0 */
48194c26a46c Initial revision
claus
parents:
diff changeset
    50
    { 0x1c00, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    51
    { 0x7000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    52
    { 0x8000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    53
    { 0xb000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    54
    { 0xc000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    55
    { 0xe000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    56
    { 0xf000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    57
    { 0x9800, 5 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    58
    { 0xA000, 5 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    59
    { 0x3800, 5 }, /* 10 */
48194c26a46c Initial revision
claus
parents:
diff changeset
    60
    { 0x4000, 5 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    61
    { 0x2000, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    62
    { 0x0c00, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    63
    { 0xd000, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    64
    { 0xd400, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    65
    { 0xa800, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    66
    { 0xac00, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    67
    { 0x4e00, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    68
    { 0x1800, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    69
    { 0x1000, 7 }, /* 20 */
48194c26a46c Initial revision
claus
parents:
diff changeset
    70
    { 0x2e00, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    71
    { 0x0600, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    72
    { 0x0800, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    73
    { 0x5000, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    74
    { 0x5600, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    75
    { 0x2600, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    76
    { 0x4800, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    77
    { 0x3000, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    78
    { 0x0200, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
    79
    { 0x0300, 8 }, /* 30 */ 
48194c26a46c Initial revision
claus
parents:
diff changeset
    80
    { 0x1a00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    81
    { 0x1b00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    82
    { 0x1200, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    83
    { 0x1300, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    84
    { 0x1400, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    85
    { 0x1500, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    86
    { 0x1600, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    87
    { 0x1700, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    88
    { 0x2800, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    89
    { 0x2900, 8 }, /* 40 */
48194c26a46c Initial revision
claus
parents:
diff changeset
    90
    { 0x2a00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    91
    { 0x2b00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    92
    { 0x2c00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    93
    { 0x2d00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    94
    { 0x0400, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    95
    { 0x0500, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    96
    { 0x0a00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    97
    { 0x0b00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    98
    { 0x5200, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
    99
    { 0x5300, 8 }, /* 50 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   100
    { 0x5400, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   101
    { 0x5500, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   102
    { 0x2400, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   103
    { 0x2500, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   104
    { 0x5800, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   105
    { 0x5900, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   106
    { 0x5a00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   107
    { 0x5b00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   108
    { 0x4a00, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   109
    { 0x4b00, 8 }, /* 60 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   110
    { 0x3200, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   111
    { 0x3300, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   112
    { 0x3400, 8 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   113
/* ---------------- */
48194c26a46c Initial revision
claus
parents:
diff changeset
   114
    { 0xd800, 5 }, /* 64 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   115
    { 0x9000, 5 }, /* 128 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   116
    { 0x5c00, 6 }, /* 192 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   117
    { 0x6e00, 7 }, /* 256 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   118
    { 0x3600, 8 }, /* 320 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   119
    { 0x3700, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   120
    { 0x6400, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   121
    { 0x6500, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   122
    { 0x6800, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   123
    { 0x6700, 8 }, /* 640 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   124
    { 0x6600, 9 }, /* 704 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   125
    { 0x6680, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   126
    { 0x6900, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   127
    { 0x6980, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   128
    { 0x6a00, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   129
    { 0x6a80, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   130
    { 0x6b00, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   131
    { 0x6b80, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   132
    { 0x6c00, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   133
    { 0x6c80, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   134
    { 0x6d00, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   135
    { 0x6d80, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   136
    { 0x4c00, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   137
    { 0x4c80, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   138
    { 0x4d00, 9 }, /* 1600 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   139
    { 0x6000, 6 }, /* 1664 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   140
    { 0x4d80, 9 }, /* 1728 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   141
/* -------------------------------- */
48194c26a46c Initial revision
claus
parents:
diff changeset
   142
    { 0x0100, 11 }, /* 1792 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   143
    { 0x0180, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   144
    { 0x01a0, 11 }, /* 1920 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   145
    { 0x0120, 12 }, /* 1984 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   146
    { 0x0130, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   147
    { 0x0140, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   148
    { 0x0150, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   149
    { 0x0160, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   150
    { 0x0170, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   151
    { 0x01c0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   152
    { 0x01d0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   153
    { 0x01e0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   154
    { 0x01f0, 12 }, /* 2560 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   155
/* -------------------------------- */
48194c26a46c Initial revision
claus
parents:
diff changeset
   156
    { 0x0010, 12 }, /* EOL */
48194c26a46c Initial revision
claus
parents:
diff changeset
   157
};
48194c26a46c Initial revision
claus
parents:
diff changeset
   158
48194c26a46c Initial revision
claus
parents:
diff changeset
   159
static struct ccitt_def 
48194c26a46c Initial revision
claus
parents:
diff changeset
   160
blackDef[] = {
48194c26a46c Initial revision
claus
parents:
diff changeset
   161
    { 0x0dc0, 10 }, /* 0 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   162
    { 0x4000, 3 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   163
    { 0xc000, 2 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   164
    { 0x8000, 2 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   165
    { 0x6000, 3 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   166
    { 0x3000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   167
    { 0x2000, 4 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   168
    { 0x1800, 5 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   169
    { 0x1400, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   170
    { 0x1000, 6 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   171
    { 0x0800, 7 }, /* 10 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   172
    { 0x0a00, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   173
    { 0x0e00, 7 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   174
    { 0x0400, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   175
    { 0x0700, 8 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   176
    { 0x0c00, 9 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   177
    { 0x05c0, 10 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   178
    { 0x0600, 10 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   179
    { 0x0200, 10 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   180
    { 0x0ce0, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   181
    { 0x0d00, 11 }, /* 20 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   182
    { 0x0d80, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   183
    { 0x06e0, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   184
    { 0x0500, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   185
    { 0x02e0, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   186
    { 0x0300, 11 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   187
    { 0x0ca0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   188
    { 0x0cb0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   189
    { 0x0cc0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   190
    { 0x0cd0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   191
    { 0x0680, 12 }, /* 30 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   192
    { 0x0690, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   193
    { 0x06a0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   194
    { 0x06b0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   195
    { 0x0d20, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   196
    { 0x0d30, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   197
    { 0x0d40, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   198
    { 0x0d50, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   199
    { 0x0d60, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   200
    { 0x0d70, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   201
    { 0x06c0, 12 }, /* 40 */ 
48194c26a46c Initial revision
claus
parents:
diff changeset
   202
    { 0x06d0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   203
    { 0x0da0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   204
    { 0x0db0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   205
    { 0x0540, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   206
    { 0x0550, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   207
    { 0x0560, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   208
    { 0x0570, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   209
    { 0x0640, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   210
    { 0x0650, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   211
    { 0x0520, 12 }, /* 50 */ 
48194c26a46c Initial revision
claus
parents:
diff changeset
   212
    { 0x0530, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   213
    { 0x0240, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   214
    { 0x0370, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   215
    { 0x0380, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   216
    { 0x0270, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   217
    { 0x0280, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   218
    { 0x0580, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   219
    { 0x0590, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   220
    { 0x02b0, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   221
    { 0x02c0, 12 }, /* 60 */ 
48194c26a46c Initial revision
claus
parents:
diff changeset
   222
    { 0x05a0, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   223
    { 0x0660, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   224
    { 0x0670, 12 }, 
48194c26a46c Initial revision
claus
parents:
diff changeset
   225
/* ---------------- */
48194c26a46c Initial revision
claus
parents:
diff changeset
   226
    { 0x03c0, 10 }, /* 64 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   227
    { 0x0c80, 12 }, /* 128 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   228
    { 0x0c90, 12 }, /* 192 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   229
    { 0x05b0, 12 }, /* 256 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   230
    { 0x0330, 12 }, /* 320 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   231
    { 0x0340, 12 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   232
    { 0x0350, 12 }, /* 448 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   233
    { 0x0360, 13 }, /* 512 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   234
    { 0x0368, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   235
    { 0x0250, 13 }, /* 640 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   236
    { 0x0258, 13 }, /* 704 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   237
    { 0x0260, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   238
    { 0x0268, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   239
    { 0x0390, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   240
    { 0x0398, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   241
    { 0x03a0, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   242
    { 0x03a8, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   243
    { 0x03b0, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   244
    { 0x03b8, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   245
    { 0x0290, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   246
    { 0x0298, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   247
    { 0x02a0, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   248
    { 0x02a8, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   249
    { 0x02d0, 13 },
48194c26a46c Initial revision
claus
parents:
diff changeset
   250
    { 0x02d8, 13 }, /* 1600 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   251
    { 0x0320, 13 }, /* 1664 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   252
    { 0x0328, 13 }, /* 1728 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   253
/* -------------------------------- */
48194c26a46c Initial revision
claus
parents:
diff changeset
   254
};
48194c26a46c Initial revision
claus
parents:
diff changeset
   255
48194c26a46c Initial revision
claus
parents:
diff changeset
   256
static
48194c26a46c Initial revision
claus
parents:
diff changeset
   257
initCCITTTables() {
48194c26a46c Initial revision
claus
parents:
diff changeset
   258
    register cnt, bits, value;
48194c26a46c Initial revision
claus
parents:
diff changeset
   259
    int nBits, index;
48194c26a46c Initial revision
claus
parents:
diff changeset
   260
48194c26a46c Initial revision
claus
parents:
diff changeset
   261
    if (whiteCountTable != (short *)0) return;
48194c26a46c Initial revision
claus
parents:
diff changeset
   262
48194c26a46c Initial revision
claus
parents:
diff changeset
   263
    whiteCountTable = (short *) malloc(sizeof(short) * 8192);
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   264
    if (! whiteCountTable) return;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   265
    whiteShiftTable = (char *) malloc(sizeof(char) * 8192);
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   266
    if (! whiteShiftTable) {
95
47ac85948d38 asText eliminated
claus
parents: 89
diff changeset
   267
	goto fail1;
47ac85948d38 asText eliminated
claus
parents: 89
diff changeset
   268
/*
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   269
	free(whiteCountTable); whiteCountTable = (short *)0;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   270
	return;
95
47ac85948d38 asText eliminated
claus
parents: 89
diff changeset
   271
*/
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   272
    }
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   273
    blackCountTable = (short *) malloc(sizeof(short) * 8192);
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   274
    if (! blackCountTable) {
95
47ac85948d38 asText eliminated
claus
parents: 89
diff changeset
   275
	goto fail2;
47ac85948d38 asText eliminated
claus
parents: 89
diff changeset
   276
/*
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   277
	free(whiteShiftTable); whiteShiftTable = (char *)0;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   278
	free(whiteCountTable); whiteCountTable = (short *)0;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   279
	return;
95
47ac85948d38 asText eliminated
claus
parents: 89
diff changeset
   280
*/
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   281
    }
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   282
    blackShiftTable = (char *) malloc(sizeof(char) * 8192);
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   283
    if (! blackShiftTable) {
95
47ac85948d38 asText eliminated
claus
parents: 89
diff changeset
   284
	free(blackCountTable); blackCountTable = (short *)0;
47ac85948d38 asText eliminated
claus
parents: 89
diff changeset
   285
fail2:
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   286
	free(whiteShiftTable); whiteShiftTable = (char *)0;
95
47ac85948d38 asText eliminated
claus
parents: 89
diff changeset
   287
fail1:
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   288
	free(whiteCountTable); whiteCountTable = (short *)0;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   289
	return;
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   290
    }
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   291
48194c26a46c Initial revision
claus
parents:
diff changeset
   292
    for (index = 0; index < 8192; index++) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   293
	whiteCountTable[index] = -1;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   294
	blackCountTable[index] = -1;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   295
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   296
48194c26a46c Initial revision
claus
parents:
diff changeset
   297
    for (value = 0; value <= 63; value++) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   298
	nBits = whiteDef[value].nBits;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   299
	bits = whiteDef[value].bits >> 3;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   300
	for (cnt = 1 << (13 - nBits); cnt; cnt--, bits++) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   301
	    whiteCountTable[bits] = value;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   302
	    whiteShiftTable[bits] = nBits;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   303
	}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   304
	nBits = blackDef[value].nBits;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   305
	bits = blackDef[value].bits >> 3;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   306
	for (cnt = 1 << (13 - nBits); cnt; cnt--, bits++) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   307
	    blackCountTable[bits] = value;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   308
	    blackShiftTable[bits] = nBits;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   309
	}
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   310
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   311
    index = value;
48194c26a46c Initial revision
claus
parents:
diff changeset
   312
48194c26a46c Initial revision
claus
parents:
diff changeset
   313
    for (; value <= 1728; value += 64) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   314
	nBits = whiteDef[index].nBits;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   315
	bits = whiteDef[index].bits >> 3;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   316
	for (cnt = 1 << (13 - nBits); cnt; cnt--, bits++) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   317
	    whiteCountTable[bits] = value;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   318
	    whiteShiftTable[bits] = nBits;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   319
	}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   320
	nBits = blackDef[index].nBits;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   321
	bits = blackDef[index].bits >> 3;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   322
	for (cnt = 1 << (13 - nBits); cnt; cnt--, bits++) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   323
	    blackCountTable[bits] = value;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   324
	    blackShiftTable[bits] = nBits;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   325
	}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   326
	index++;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   327
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   328
48194c26a46c Initial revision
claus
parents:
diff changeset
   329
    for (; value <= 2560; value += 64) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   330
	nBits = whiteDef[index].nBits;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   331
	bits = whiteDef[index].bits >> 3;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   332
	for (cnt = 1 << (13 - nBits); cnt; cnt--, bits++) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   333
	    whiteCountTable[bits] = value;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   334
	    whiteShiftTable[bits] = nBits;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   335
	    blackCountTable[bits] = value;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   336
	    blackShiftTable[bits] = nBits;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   337
	}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   338
	index++;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   339
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   340
}
48194c26a46c Initial revision
claus
parents:
diff changeset
   341
48194c26a46c Initial revision
claus
parents:
diff changeset
   342
static short 
48194c26a46c Initial revision
claus
parents:
diff changeset
   343
leftBits[] = {
48194c26a46c Initial revision
claus
parents:
diff changeset
   344
     0, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF
48194c26a46c Initial revision
claus
parents:
diff changeset
   345
};
48194c26a46c Initial revision
claus
parents:
diff changeset
   346
189
claus
parents: 153
diff changeset
   347
static int
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   348
__decodeCCITTgroup3__(from, to, len)
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   349
    unsigned char *from;
48194c26a46c Initial revision
claus
parents:
diff changeset
   350
    register unsigned char *to;
48194c26a46c Initial revision
claus
parents:
diff changeset
   351
{
48194c26a46c Initial revision
claus
parents:
diff changeset
   352
    register cnt;
48194c26a46c Initial revision
claus
parents:
diff changeset
   353
    register short *countPtr;
48194c26a46c Initial revision
claus
parents:
diff changeset
   354
    register char *shiftPtr;
48194c26a46c Initial revision
claus
parents:
diff changeset
   355
    unsigned bits, bits13;
48194c26a46c Initial revision
claus
parents:
diff changeset
   356
    int shift, outCount, nBitsLess13;
48194c26a46c Initial revision
claus
parents:
diff changeset
   357
    int outBitOffset;
48194c26a46c Initial revision
claus
parents:
diff changeset
   358
    int nLeft, t;
48194c26a46c Initial revision
claus
parents:
diff changeset
   359
48194c26a46c Initial revision
claus
parents:
diff changeset
   360
    if (! whiteCountTable) initCCITTTables();
46
7b331e9012fd *** empty log message ***
claus
parents: 35
diff changeset
   361
    if (! whiteCountTable) return 0; /* malloc failed */
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   362
48194c26a46c Initial revision
claus
parents:
diff changeset
   363
    countPtr = whiteCountTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
   364
    shiftPtr = whiteShiftTable;
48194c26a46c Initial revision
claus
parents:
diff changeset
   365
    outCount = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   366
    outBitOffset = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   367
    bits = *from++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   368
    bits = (bits << 8) | *from++;
48194c26a46c Initial revision
claus
parents:
diff changeset
   369
    nBitsLess13 = 3;
48194c26a46c Initial revision
claus
parents:
diff changeset
   370
    for (;;) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   371
	bits13 = (bits >> nBitsLess13) & 0x1FFF;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   372
	cnt = countPtr[bits13];
189
claus
parents: 153
diff changeset
   373
	if (cnt < 0) return 1;
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   374
	shift = shiftPtr[bits13];
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   375
	outCount += cnt;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   376
	if (countPtr == blackCountTable) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   377
	    /* toggle if it was a terminating code */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   378
	    if (cnt < 64) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   379
		countPtr = whiteCountTable;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   380
		shiftPtr = whiteShiftTable;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   381
	    }
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   382
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   383
	    /* draw cnt black bits */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   384
	    if (cnt) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   385
		if (outBitOffset) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   386
		    nLeft = 8 - outBitOffset;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   387
		    if (cnt < nLeft) nLeft = cnt;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   388
		    t = leftBits[nLeft] >> outBitOffset;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   389
		    *to |= t;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   390
		    cnt -= nLeft;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   391
		    outBitOffset += nLeft;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   392
		    if (outBitOffset >= 8) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   393
			to++;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   394
			outBitOffset -= 8;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   395
		    }
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   396
		}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   397
		if (cnt > 256) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   398
		    while ((int)to & 3) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   399
			*to++ = 0xFF;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   400
			cnt -= 8;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   401
		    }
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   402
		    while (cnt >= 32) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   403
			(*(long *)to) = 0xFFFFFFFF;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   404
			to += 4;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   405
			cnt -= 32;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   406
		    }
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   407
		}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   408
		while (cnt >= 8) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   409
		    *to++ = 0xFF;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   410
		    cnt -= 8;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   411
		}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   412
		*to |= leftBits[cnt];
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   413
		outBitOffset += cnt;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   414
	    }
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   415
	} else {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   416
	    /* toggle if it was a terminating code */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   417
	    if (cnt < 64) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   418
		countPtr = blackCountTable;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   419
		shiftPtr = blackShiftTable;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   420
	    }
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   421
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   422
	    /* skip cnt bits */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   423
	    to += cnt >> 3;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   424
	    outBitOffset += cnt & 7;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   425
	    if (outBitOffset >= 8) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   426
		to++;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   427
		outBitOffset -= 8;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   428
	    }
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   429
	}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   430
	if (outCount >= len) return 1;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   431
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   432
	nBitsLess13 -= shift;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   433
	while (nBitsLess13 < 0) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   434
	    bits = (bits << 8) | *from++;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   435
	    nBitsLess13 += 8;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   436
	}
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   437
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   438
}
48194c26a46c Initial revision
claus
parents:
diff changeset
   439
48194c26a46c Initial revision
claus
parents:
diff changeset
   440
/*
48194c26a46c Initial revision
claus
parents:
diff changeset
   441
 * LZW decompression
48194c26a46c Initial revision
claus
parents:
diff changeset
   442
 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   443
struct buffer {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   444
	struct buffer *prev;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   445
	unsigned char chars[8192 - 4];
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   446
};
189
claus
parents: 153
diff changeset
   447
claus
parents: 153
diff changeset
   448
static int        
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   449
__decodeLZW__(from, to, inCount)
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   450
    unsigned char *from;
48194c26a46c Initial revision
claus
parents:
diff changeset
   451
    unsigned char *to;
48194c26a46c Initial revision
claus
parents:
diff changeset
   452
{
48194c26a46c Initial revision
claus
parents:
diff changeset
   453
    register unsigned code;
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   454
    unsigned char **strings;
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   455
    short *stringLen;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   456
    struct buffer *scratchBuffer;
48194c26a46c Initial revision
claus
parents:
diff changeset
   457
    struct buffer *newBuffer;
48194c26a46c Initial revision
claus
parents:
diff changeset
   458
    unsigned char *scratchPtr;
48194c26a46c Initial revision
claus
parents:
diff changeset
   459
    int nScratch;
1262
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   460
    unsigned nextCode;
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   461
    int oldCode = -1;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   462
    register unsigned bits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   463
    int nBits, mask, shift;
48194c26a46c Initial revision
claus
parents:
diff changeset
   464
    int i;
48194c26a46c Initial revision
claus
parents:
diff changeset
   465
    int len;
48194c26a46c Initial revision
claus
parents:
diff changeset
   466
    int codeLen = 9;
1262
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   467
    int ret = 1;	/* return success */
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   468
48194c26a46c Initial revision
claus
parents:
diff changeset
   469
    scratchBuffer = (struct buffer *)malloc(sizeof(struct buffer));
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   470
    if (! scratchBuffer) return 0;
46
7b331e9012fd *** empty log message ***
claus
parents: 35
diff changeset
   471
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   472
    strings = (unsigned char **)malloc(sizeof(unsigned char *) * 4096);
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   473
    if (! strings) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   474
	free(scratchBuffer);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   475
	return 0;
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   476
    }
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   477
    stringLen = (short *)malloc(sizeof(short) * 4096);
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   478
    if (! stringLen) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   479
	free(strings);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   480
	free(scratchBuffer);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   481
	return 0;
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   482
    }
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   483
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   484
    scratchBuffer->prev = (struct buffer *)0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   485
    scratchPtr = scratchBuffer->chars;
48194c26a46c Initial revision
claus
parents:
diff changeset
   486
    nScratch = sizeof(scratchBuffer->chars);
48194c26a46c Initial revision
claus
parents:
diff changeset
   487
48194c26a46c Initial revision
claus
parents:
diff changeset
   488
    for (i = 0; i < 256; i++) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   489
	*scratchPtr = i;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   490
	strings[i] = scratchPtr++;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   491
	stringLen[i] = 1;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   492
    }
48194c26a46c Initial revision
claus
parents:
diff changeset
   493
48194c26a46c Initial revision
claus
parents:
diff changeset
   494
    nextCode = 258;
48194c26a46c Initial revision
claus
parents:
diff changeset
   495
    nScratch -= 256;
48194c26a46c Initial revision
claus
parents:
diff changeset
   496
    mask = 0x1FF;
48194c26a46c Initial revision
claus
parents:
diff changeset
   497
    nBits = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   498
    bits = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   499
    while (inCount) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   500
	/* fetch code */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   501
	while (nBits < codeLen) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   502
	    bits = (bits<<8) | *from++;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   503
	    inCount--;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   504
	    nBits += 8;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   505
	}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   506
	shift = nBits - codeLen;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   507
	code = (bits >> shift) & mask;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   508
	bits &= ~(mask << shift);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   509
	nBits -= codeLen;
1262
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   510
			
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   511
	if (code == 257) break;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   512
	if (code == 256) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   513
	    if (! inCount)
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   514
		break;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   515
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   516
	    /* free stuff */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   517
	    while (scratchBuffer->prev) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   518
		newBuffer = scratchBuffer;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   519
		scratchBuffer = scratchBuffer->prev;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   520
		free(newBuffer);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   521
	    }
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   522
	    /* reset everything */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   523
	    scratchPtr = scratchBuffer->chars + 256;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   524
	    nScratch = sizeof(scratchBuffer->chars) - 256;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   525
	    codeLen = 9;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   526
	    nextCode = 258;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   527
	    mask = 0x1FF;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   528
	    /* fetch code */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   529
	    while (nBits < codeLen) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   530
		bits = (bits<<8) | *from++;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   531
		inCount--;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   532
		nBits += 8;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   533
	    }
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   534
	    shift = nBits - codeLen;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   535
	    code = (bits >> shift) & mask;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   536
	    bits &= ~(mask << shift);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   537
	    nBits -= codeLen;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   538
	    if (code == 257) break;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   539
	    /* add to output */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   540
	    *to++ = code;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   541
	    oldCode = code;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   542
	} else {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   543
	    if (code < nextCode) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   544
		/* writeString(string[code]) */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   545
		len = stringLen[code];
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   546
		bcopy(strings[code], to, len);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   547
		to += len;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   548
1262
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   549
		if (oldCode != -1) {
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   550
		    /* add( string[oldcode] + first(string[code]) ) */
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   551
		    len = stringLen[oldCode] + 1;
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   552
		    if (nScratch < len) {
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   553
		        newBuffer = (struct buffer *)malloc(sizeof(struct buffer));
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   554
		        if (! newBuffer) goto out;
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   555
		        newBuffer->prev = scratchBuffer;
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   556
		        scratchBuffer = newBuffer;
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   557
		        scratchPtr = scratchBuffer->chars;
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   558
		        nScratch = sizeof(scratchBuffer->chars);
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   559
		    }
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   560
		    stringLen[nextCode] = len;
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   561
		    strings[nextCode] = scratchPtr;
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   562
		    bcopy(strings[oldCode], scratchPtr, len-1);
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   563
		    scratchPtr += len-1;
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   564
		    *scratchPtr++ = strings[code][0];
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   565
		    nScratch -= len;
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   566
	            nextCode++;
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   567
		}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   568
	    } else {
1262
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   569
		if (oldCode == -1) {
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   570
		    /* bad input */
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   571
		    ret = 0;
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   572
		    goto out;
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   573
	        }
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   574
	    
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   575
		/* writeString(string[oldCode] + first(string[oldCode]) ) */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   576
		len = stringLen[oldCode];
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   577
		bcopy(strings[oldCode], to, len);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   578
		to += len;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   579
		*to++ = strings[oldCode][0];
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   580
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   581
		/* add( string[oldcode] + first(string[oldCode]) ) */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   582
		len++;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   583
		if (nScratch < len) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   584
		    newBuffer = (struct buffer *)malloc(sizeof(struct buffer));
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   585
		    if (! newBuffer) goto out;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   586
		    newBuffer->prev = scratchBuffer;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   587
		    scratchBuffer = newBuffer;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   588
		    scratchPtr = scratchBuffer->chars;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   589
		    nScratch = sizeof(scratchBuffer->chars);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   590
		}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   591
		stringLen[nextCode] = len;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   592
		strings[nextCode] = scratchPtr;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   593
		bcopy(strings[oldCode], scratchPtr, len-1);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   594
		scratchPtr += len-1;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   595
		*scratchPtr++ = strings[oldCode][0];
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   596
		nScratch -= len;
1262
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   597
	        nextCode++;
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   598
	    }
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   599
	    oldCode = code;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   600
	    if (nextCode >= 511)
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   601
		if (nextCode == 511) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   602
		    codeLen = 10;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   603
		    mask = 0x3FF;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   604
		} else if (nextCode >= 1023)
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   605
		    if (nextCode == 1023) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   606
			codeLen = 11;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   607
			mask = 0x7FF;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   608
		    } else 
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   609
			if (nextCode == 2047) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   610
			    codeLen = 12;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   611
			    mask = 0xFFF;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   612
			}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   613
	}
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   614
    }
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   615
out: ;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   616
    /* free stuff */
48194c26a46c Initial revision
claus
parents:
diff changeset
   617
    while (scratchBuffer) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   618
	newBuffer = scratchBuffer;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   619
	scratchBuffer = scratchBuffer->prev;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   620
	free(newBuffer);
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   621
    }
46
7b331e9012fd *** empty log message ***
claus
parents: 35
diff changeset
   622
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   623
    free(strings);
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   624
    free(stringLen);
46
7b331e9012fd *** empty log message ***
claus
parents: 35
diff changeset
   625
1262
61bbba463582 lzw_decode caused a SIGSEGV.
Stefan Vogel <sv@exept.de>
parents: 1175
diff changeset
   626
    return ret;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   627
}
48194c26a46c Initial revision
claus
parents:
diff changeset
   628
48194c26a46c Initial revision
claus
parents:
diff changeset
   629
/*
48194c26a46c Initial revision
claus
parents:
diff changeset
   630
 * delta decoding (TIFF predictor = 2)
48194c26a46c Initial revision
claus
parents:
diff changeset
   631
 */
189
claus
parents: 153
diff changeset
   632
static
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   633
__decodeDelta__(bytes, width, height)
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   634
    register unsigned char *bytes;
48194c26a46c Initial revision
claus
parents:
diff changeset
   635
{
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   636
	register w;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   637
	unsigned char r, g, b;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   638
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   639
	while (height--) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   640
	    r = g = b = 0;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   641
	    for (w = width; w; w--) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   642
		r += *bytes;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   643
		*bytes++ = r;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   644
		g += *bytes;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   645
		*bytes++ = g;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   646
		b += *bytes;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   647
		*bytes++ = b;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   648
	    }
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   649
	}
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   650
}
48194c26a46c Initial revision
claus
parents:
diff changeset
   651
46
7b331e9012fd *** empty log message ***
claus
parents: 35
diff changeset
   652
/*
7b331e9012fd *** empty log message ***
claus
parents: 35
diff changeset
   653
 * GIF decompression
7b331e9012fd *** empty log message ***
claus
parents: 35
diff changeset
   654
 */
189
claus
parents: 153
diff changeset
   655
static int
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   656
__decodeGIF__(from, to, inCount, initialCodeLen)
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   657
    unsigned char *from;
48194c26a46c Initial revision
claus
parents:
diff changeset
   658
    unsigned char *to;
48194c26a46c Initial revision
claus
parents:
diff changeset
   659
{
48194c26a46c Initial revision
claus
parents:
diff changeset
   660
    register unsigned code;
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   661
    unsigned short *prefix;
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   662
    unsigned short *suffix;
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   663
    unsigned short *outCode;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   664
    int outCount;
48194c26a46c Initial revision
claus
parents:
diff changeset
   665
    unsigned maxCode, oldCode, fin, inCode, curCode;
48194c26a46c Initial revision
claus
parents:
diff changeset
   666
    register unsigned bits;
48194c26a46c Initial revision
claus
parents:
diff changeset
   667
    register int nBits, mask, shift;
48194c26a46c Initial revision
claus
parents:
diff changeset
   668
    int i;
48194c26a46c Initial revision
claus
parents:
diff changeset
   669
    int len;
48194c26a46c Initial revision
claus
parents:
diff changeset
   670
    int endCode, clearCode, freeCode;
48194c26a46c Initial revision
claus
parents:
diff changeset
   671
    int codeLen = initialCodeLen;
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   672
    static int ranges[] = {0, 1, 2, 4, 8, 16, 32, 64,
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   673
			   128, 256, 512, 1024, 2048 };
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   674
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   675
    prefix = (unsigned short *)malloc(sizeof(short) * 4096);
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   676
    if (! prefix) return 0;
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   677
    suffix  = (unsigned short *)malloc(sizeof(short) * 4096);
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   678
    if (! suffix) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   679
	free(prefix);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   680
	return 0;
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   681
    }
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   682
    outCode = (unsigned short *)malloc(sizeof(short) * 4096);
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   683
    if (! outCode) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   684
	free(prefix);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   685
	free(suffix);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   686
	return 0;
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   687
    }
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   688
    clearCode = ranges[codeLen]; /* 256 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   689
    endCode = clearCode + 1;     /* 257 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   690
    freeCode = clearCode + 2;    /* 258 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   691
    maxCode = clearCode << 1;    /* 512 */
48194c26a46c Initial revision
claus
parents:
diff changeset
   692
    outCount = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   693
48194c26a46c Initial revision
claus
parents:
diff changeset
   694
    mask = maxCode - 1;          /* 1FF */
48194c26a46c Initial revision
claus
parents:
diff changeset
   695
    nBits = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   696
    bits = 0;
48194c26a46c Initial revision
claus
parents:
diff changeset
   697
    while (inCount) {
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   698
	/* fetch code */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   699
	while (nBits < codeLen) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   700
	    bits = bits | (*from++ << nBits);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   701
	    inCount--;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   702
	    nBits += 8;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   703
	}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   704
	code = bits & mask;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   705
	bits >>= codeLen;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   706
	nBits -= codeLen;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   707
	if (code == endCode) break;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   708
	if (code == clearCode) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   709
	    if (! inCount)
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   710
		break;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   711
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   712
	    codeLen = initialCodeLen;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   713
	    maxCode = clearCode<<1;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   714
	    mask = maxCode - 1;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   715
	    freeCode = clearCode + 2;  
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   716
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   717
	    /* fetch code */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   718
	    while (nBits < codeLen) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   719
		bits = bits | (*from++ << nBits);
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   720
		inCount--;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   721
		nBits += 8;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   722
	    }
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   723
	    code = bits & mask;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   724
	    bits >>= codeLen;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   725
	    nBits -= codeLen;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   726
	    if (code == endCode) break;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   727
	    /* add to output */
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   728
	    *to++ = code;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   729
	    oldCode = fin = curCode = code;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   730
	} else {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   731
	    curCode = inCode = code;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   732
	    if (curCode >= freeCode) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   733
		curCode = oldCode;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   734
		outCode[outCount++] = fin;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   735
	    }
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   736
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   737
	    while (curCode >= clearCode) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   738
		if (outCount > 1024) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   739
		    goto out;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   740
		}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   741
		outCode[outCount++] = suffix[curCode];
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   742
		curCode = prefix[curCode];
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   743
	    }
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   744
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   745
	    fin = curCode;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   746
	    outCode[outCount++] = fin;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   747
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   748
	    for (i = outCount - 1; i >= 0; i--)
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   749
		*to++ = outCode[i];
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   750
	    outCount = 0;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   751
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   752
	    prefix[freeCode] = oldCode;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   753
	    suffix[freeCode] = fin;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   754
	    oldCode = inCode;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   755
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   756
	    freeCode++;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   757
	    if (freeCode >= maxCode) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   758
		if (codeLen < 12) {
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   759
		    codeLen++;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   760
		    maxCode *= 2;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   761
		    mask = (1 << codeLen) - 1;
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   762
		}
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   763
	    }
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   764
	}
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   765
    }
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   766
out: ;
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   767
    free(prefix);
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   768
    free(suffix);
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   769
    free(outCode);
46
7b331e9012fd *** empty log message ***
claus
parents: 35
diff changeset
   770
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   771
    return 1;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   772
}
48194c26a46c Initial revision
claus
parents:
diff changeset
   773
189
claus
parents: 153
diff changeset
   774
/*
claus
parents: 153
diff changeset
   775
 * BMP file read/decompression
claus
parents: 153
diff changeset
   776
 */
claus
parents: 153
diff changeset
   777
static int
claus
parents: 153
diff changeset
   778
loadBMP1to8(w, h, fp, dest)
claus
parents: 153
diff changeset
   779
    int w, h;
claus
parents: 153
diff changeset
   780
    FILE *fp;
1819
a9ff463a55d3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1775
diff changeset
   781
    unsigned char *dest;
189
claus
parents: 153
diff changeset
   782
{
claus
parents: 153
diff changeset
   783
    int   i,j,c,bitnum,padw;
claus
parents: 153
diff changeset
   784
    unsigned char *pp;
claus
parents: 153
diff changeset
   785
claus
parents: 153
diff changeset
   786
    c = 0;
claus
parents: 153
diff changeset
   787
    padw = ((w + 31)/32) * 32;  /* 'w', padded to be a multiple of 32 */
claus
parents: 153
diff changeset
   788
claus
parents: 153
diff changeset
   789
    for (i=h-1; i>=0; i--) {
claus
parents: 153
diff changeset
   790
	pp = dest + (i * w);
claus
parents: 153
diff changeset
   791
	for (j=bitnum=0; j<padw; j++,bitnum++) {
claus
parents: 153
diff changeset
   792
	    if ((bitnum&7) == 0) { /* read the next byte */
claus
parents: 153
diff changeset
   793
		c = getc(fp);
claus
parents: 153
diff changeset
   794
		bitnum = 0;
claus
parents: 153
diff changeset
   795
	    }
claus
parents: 153
diff changeset
   796
	    if (j<w) {
claus
parents: 153
diff changeset
   797
		*pp++ = (c & 0x80) ? 1 : 0;
claus
parents: 153
diff changeset
   798
		c <<= 1;
claus
parents: 153
diff changeset
   799
	    }
claus
parents: 153
diff changeset
   800
	}
claus
parents: 153
diff changeset
   801
	if (ferror(fp)) return 0;
claus
parents: 153
diff changeset
   802
    }
claus
parents: 153
diff changeset
   803
    if (ferror(fp)) return 0;
claus
parents: 153
diff changeset
   804
    return 1;
claus
parents: 153
diff changeset
   805
}
claus
parents: 153
diff changeset
   806
claus
parents: 153
diff changeset
   807
static int
claus
parents: 153
diff changeset
   808
loadBMP2to8(w, h, fp, dest)
claus
parents: 153
diff changeset
   809
    int w, h;
claus
parents: 153
diff changeset
   810
    FILE *fp;
1819
a9ff463a55d3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1775
diff changeset
   811
    unsigned char *dest;
189
claus
parents: 153
diff changeset
   812
{
claus
parents: 153
diff changeset
   813
    int   i,j,c,bitnum,padw;
claus
parents: 153
diff changeset
   814
    unsigned char *pp;
claus
parents: 153
diff changeset
   815
claus
parents: 153
diff changeset
   816
    c = 0;
claus
parents: 153
diff changeset
   817
    padw = ((w + 31)/32) * 32;  /* 'w', padded to be a multiple of 32 */
claus
parents: 153
diff changeset
   818
claus
parents: 153
diff changeset
   819
    for (i=h-1; i>=0; i--) {
claus
parents: 153
diff changeset
   820
	pp = dest + (i * w);
claus
parents: 153
diff changeset
   821
	for (j=bitnum=0; j<padw; j++,bitnum++) {
claus
parents: 153
diff changeset
   822
	    if ((bitnum&3) == 0) { /* read the next byte */
claus
parents: 153
diff changeset
   823
		c = getc(fp);
claus
parents: 153
diff changeset
   824
		bitnum = 0;
claus
parents: 153
diff changeset
   825
	    }
claus
parents: 153
diff changeset
   826
	    if (j<w) {
claus
parents: 153
diff changeset
   827
		*pp++ = (c & 0xC0) >> 6;
claus
parents: 153
diff changeset
   828
		c <<= 2;
claus
parents: 153
diff changeset
   829
	    }
claus
parents: 153
diff changeset
   830
	}
claus
parents: 153
diff changeset
   831
	if (ferror(fp)) return 0;
claus
parents: 153
diff changeset
   832
    }
claus
parents: 153
diff changeset
   833
    if (ferror(fp)) return 0;
claus
parents: 153
diff changeset
   834
    return 1;
claus
parents: 153
diff changeset
   835
}
claus
parents: 153
diff changeset
   836
claus
parents: 153
diff changeset
   837
static int
claus
parents: 153
diff changeset
   838
loadBMP4to8(w, h, comp, fp, dest)
claus
parents: 153
diff changeset
   839
    int w, h;
claus
parents: 153
diff changeset
   840
    FILE *fp;
1819
a9ff463a55d3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1775
diff changeset
   841
    unsigned char *dest;
189
claus
parents: 153
diff changeset
   842
{
claus
parents: 153
diff changeset
   843
    int   i,j,c,c1,padw,x,y,nybnum;
claus
parents: 153
diff changeset
   844
    unsigned char *pp;
claus
parents: 153
diff changeset
   845
claus
parents: 153
diff changeset
   846
    c = c1 = 0;
claus
parents: 153
diff changeset
   847
claus
parents: 153
diff changeset
   848
    if (comp == 0) {   /* read uncompressed data */
claus
parents: 153
diff changeset
   849
	padw = ((w + 7)/8) * 8; /* 'w' padded to a multiple of 8pix (32 bits) */
claus
parents: 153
diff changeset
   850
claus
parents: 153
diff changeset
   851
	for (i=h-1; i>=0; i--) {
claus
parents: 153
diff changeset
   852
	    pp = dest + (i * w);
claus
parents: 153
diff changeset
   853
claus
parents: 153
diff changeset
   854
	    for (j=nybnum=0; j<padw; j++,nybnum++) {
claus
parents: 153
diff changeset
   855
		if ((nybnum & 1) == 0) { /* read next byte */
claus
parents: 153
diff changeset
   856
		    c = getc(fp);
claus
parents: 153
diff changeset
   857
		    nybnum = 0;
claus
parents: 153
diff changeset
   858
		}
claus
parents: 153
diff changeset
   859
claus
parents: 153
diff changeset
   860
		if (j<w) {
claus
parents: 153
diff changeset
   861
		    *pp++ = (c & 0xf0) >> 4;
claus
parents: 153
diff changeset
   862
		    c <<= 4;
claus
parents: 153
diff changeset
   863
		}
claus
parents: 153
diff changeset
   864
	    }
claus
parents: 153
diff changeset
   865
	    if (ferror(fp)) return 0;
claus
parents: 153
diff changeset
   866
	}
claus
parents: 153
diff changeset
   867
    } else {
claus
parents: 153
diff changeset
   868
	if (comp == 2) {  /* read RLE4 compressed data */
claus
parents: 153
diff changeset
   869
	    x = y = 0;  
claus
parents: 153
diff changeset
   870
	    pp = dest + x + (h-y-1)*w;
claus
parents: 153
diff changeset
   871
claus
parents: 153
diff changeset
   872
	    while (y<h) {
claus
parents: 153
diff changeset
   873
		c = getc(fp); if (c == EOF) return 0;
claus
parents: 153
diff changeset
   874
claus
parents: 153
diff changeset
   875
		if (c) {                                   /* encoded mode */
claus
parents: 153
diff changeset
   876
		    c1 = getc(fp);
claus
parents: 153
diff changeset
   877
		    for (i=0; i<c; i++,x++,pp++) 
claus
parents: 153
diff changeset
   878
			*pp = (i&1) ? (c1 & 0x0f) : ((c1>>4)&0x0f);
claus
parents: 153
diff changeset
   879
		} else {    
claus
parents: 153
diff changeset
   880
		    /* c==0x00  :  escape codes */
claus
parents: 153
diff changeset
   881
		    c = getc(fp);  if (c == EOF) return 0;
claus
parents: 153
diff changeset
   882
claus
parents: 153
diff changeset
   883
		    if (c == 0x00) {                    /* end of line */
claus
parents: 153
diff changeset
   884
			x=0;  y++;  pp = dest + x + (h-y-1)*w;
claus
parents: 153
diff changeset
   885
		    } else 
claus
parents: 153
diff changeset
   886
			if (c == 0x01) break;               /* end of pic8 */
claus
parents: 153
diff changeset
   887
claus
parents: 153
diff changeset
   888
			else 
claus
parents: 153
diff changeset
   889
			    if (c == 0x02) {                /* delta */
claus
parents: 153
diff changeset
   890
				c = getc(fp);  x += c;
claus
parents: 153
diff changeset
   891
				c = getc(fp);  y += c;
claus
parents: 153
diff changeset
   892
				pp = dest + x + (h-y-1)*w;
claus
parents: 153
diff changeset
   893
			    } else {                        /* absolute mode */
claus
parents: 153
diff changeset
   894
				for (i=0; i<c; i++, x++, pp++) {
claus
parents: 153
diff changeset
   895
				    if ((i&1) == 0) c1 = getc(fp);
claus
parents: 153
diff changeset
   896
				    *pp = (i&1) ? (c1 & 0x0f) : ((c1>>4)&0x0f);
claus
parents: 153
diff changeset
   897
				}
claus
parents: 153
diff changeset
   898
claus
parents: 153
diff changeset
   899
				if (((c&3)==1) || ((c&3)==2)) getc(fp);  /* read pad byte */
claus
parents: 153
diff changeset
   900
			    }
claus
parents: 153
diff changeset
   901
		}  /* escape processing */
claus
parents: 153
diff changeset
   902
		if (ferror(fp)) return 0;
claus
parents: 153
diff changeset
   903
	    }  /* while */
claus
parents: 153
diff changeset
   904
	} else {
claus
parents: 153
diff changeset
   905
	    return 0;
claus
parents: 153
diff changeset
   906
	}
claus
parents: 153
diff changeset
   907
    }
claus
parents: 153
diff changeset
   908
    if (ferror(fp)) return 0;
claus
parents: 153
diff changeset
   909
    return 1;
claus
parents: 153
diff changeset
   910
}
claus
parents: 153
diff changeset
   911
claus
parents: 153
diff changeset
   912
static int
claus
parents: 153
diff changeset
   913
loadBMP8(w, h, comp, fp, dest)
claus
parents: 153
diff changeset
   914
    int w, h;
claus
parents: 153
diff changeset
   915
    FILE *fp;
1819
a9ff463a55d3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1775
diff changeset
   916
    unsigned char *dest;
189
claus
parents: 153
diff changeset
   917
{
claus
parents: 153
diff changeset
   918
    int   i,j,c,c1,padw,x,y;
claus
parents: 153
diff changeset
   919
    unsigned char *pp;
claus
parents: 153
diff changeset
   920
claus
parents: 153
diff changeset
   921
    if (comp == 0) {   /* uncompressed data */
claus
parents: 153
diff changeset
   922
	padw = ((w + 3)/4) * 4; 
claus
parents: 153
diff changeset
   923
claus
parents: 153
diff changeset
   924
	for (i=h-1; i>=0; i--) {
claus
parents: 153
diff changeset
   925
	    pp = dest + (i * w);
claus
parents: 153
diff changeset
   926
claus
parents: 153
diff changeset
   927
	    for (j=0; j<padw; j++) {
claus
parents: 153
diff changeset
   928
		c = getc(fp);  
claus
parents: 153
diff changeset
   929
		if (c==EOF) return 0;
claus
parents: 153
diff changeset
   930
claus
parents: 153
diff changeset
   931
		if (j<w) *pp++ = c;
claus
parents: 153
diff changeset
   932
	    }
claus
parents: 153
diff changeset
   933
	    if (ferror(fp)) return 0;
claus
parents: 153
diff changeset
   934
	}
claus
parents: 153
diff changeset
   935
    } else {
claus
parents: 153
diff changeset
   936
	if (comp == 1) {  /* RLE8 compressed */
claus
parents: 153
diff changeset
   937
	    x = y = 0;  
claus
parents: 153
diff changeset
   938
	    pp = dest + x + (h-y-1)*w;
claus
parents: 153
diff changeset
   939
claus
parents: 153
diff changeset
   940
	    while (y<h) {
claus
parents: 153
diff changeset
   941
		c = getc(fp);  
claus
parents: 153
diff changeset
   942
		if (c == EOF) return 0;
claus
parents: 153
diff changeset
   943
claus
parents: 153
diff changeset
   944
		if (c) {                                   /* encoded mode */
claus
parents: 153
diff changeset
   945
		    c1 = getc(fp);
claus
parents: 153
diff changeset
   946
		    for (i=0; i<c; i++,x++,pp++) *pp = c1;
claus
parents: 153
diff changeset
   947
		} else {    
claus
parents: 153
diff changeset
   948
		    /* c==0x00  :  escape codes */
claus
parents: 153
diff changeset
   949
		    c = getc(fp);  
claus
parents: 153
diff changeset
   950
		    if (c == EOF) return 0;
claus
parents: 153
diff changeset
   951
claus
parents: 153
diff changeset
   952
		    if (c == 0x00) {                    /* end of line */
claus
parents: 153
diff changeset
   953
			x=0;  y++;  pp = dest + x + (h-y-1)*w;
claus
parents: 153
diff changeset
   954
		    } else 
claus
parents: 153
diff changeset
   955
			if (c == 0x01) break;               /* end of pic8 */
claus
parents: 153
diff changeset
   956
claus
parents: 153
diff changeset
   957
			else if (c == 0x02) {               /* delta */
claus
parents: 153
diff changeset
   958
			    c = getc(fp);  x += c;
claus
parents: 153
diff changeset
   959
			    c = getc(fp);  y += c;
claus
parents: 153
diff changeset
   960
			    pp = dest + x + (h-y-1)*w;
claus
parents: 153
diff changeset
   961
			} else {                            /* absolute mode */
claus
parents: 153
diff changeset
   962
			    for (i=0; i<c; i++, x++, pp++) {
claus
parents: 153
diff changeset
   963
				c1 = getc(fp);
claus
parents: 153
diff changeset
   964
				*pp = c1;
claus
parents: 153
diff changeset
   965
			    }
claus
parents: 153
diff changeset
   966
claus
parents: 153
diff changeset
   967
			    if (c & 1) getc(fp);  /* odd length run: read an extra pad byte */
claus
parents: 153
diff changeset
   968
			}
claus
parents: 153
diff changeset
   969
		}  
claus
parents: 153
diff changeset
   970
		if (ferror(fp)) return 0;
claus
parents: 153
diff changeset
   971
	    } 
claus
parents: 153
diff changeset
   972
	} else {
claus
parents: 153
diff changeset
   973
	    return 0;
claus
parents: 153
diff changeset
   974
	}
claus
parents: 153
diff changeset
   975
    }
claus
parents: 153
diff changeset
   976
    if (ferror(fp)) return 0;
claus
parents: 153
diff changeset
   977
    return 1;
claus
parents: 153
diff changeset
   978
}
claus
parents: 153
diff changeset
   979
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   980
%}
77
da4678fae5c8 *** empty log message ***
claus
parents: 72
diff changeset
   981
! !
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   982
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
   983
!ImageReader class methodsFor:'documentation'!
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   984
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   985
copyright
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   986
"
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   987
 COPYRIGHT (c) 1991 by Claus Gittinger
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   988
	      All Rights Reserved
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   989
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   990
 This software is furnished under a license and may be used
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   991
 only in accordance with the terms of that license and with the
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   992
 inclusion of the above copyright notice.   This software may not
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   993
 be provided or otherwise made available to, or used by, any
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   994
 other person.  No title to or ownership of the software is
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   995
 hereby transferred.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   996
"
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   997
!
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   998
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
   999
documentation
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1000
"
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1001
    Abstract class to provide common functions for image-readers 
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1002
    (i.e. TIFFReader, GIFReader etc.)
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1003
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1004
    ImageReaders are created temporary to read an image from a stream.
618
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1005
    Normally, they are not directly used - instead, the image class is
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1006
    asked to read some file, and return an instance for it:
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1007
        Image fromFile:<someFileName>
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1008
    The Image class will guess the images format and forward the task to
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1009
    some concrete ImageReaderClass.
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1010
    If that class finds, that the files format is incorrect, other readers
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1011
    are tried until some finds the files format acceptable.
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1012
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1013
    Image readers read the stream and collect all relevant information internally.
118
25e775072a89 *** empty log message ***
claus
parents: 105
diff changeset
  1014
    Once done with reading, the actual image object is created and
25e775072a89 *** empty log message ***
claus
parents: 105
diff changeset
  1015
    data filled in from the imageReaders collected info.
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1016
618
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1017
    See the implementation of #fromStream: in concrete subclasses.
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1018
    The public interfaces are:
593
a3264954cf83 commentary
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1019
         <ConcreteReaderClass> fromFile:aFilename
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1020
    or:
593
a3264954cf83 commentary
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1021
         <ConcreteReaderClass> fromStream:aStream
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1022
121
306a2d195c0a *** empty log message ***
claus
parents: 120
diff changeset
  1023
    If you add a new reader, dont forget to add the method #isValidImageFile:
618
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1024
    which should return true, if this reader supports reading a given file.
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1025
    If your new reader class supports writing files, dont forget to add 
5d5277119897 commentart
Claus Gittinger <cg@exept.de>
parents: 611
diff changeset
  1026
    #canRepresent:anImage and return true from this method.
593
a3264954cf83 commentary
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1027
a3264954cf83 commentary
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1028
    [See also:]
a3264954cf83 commentary
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1029
        Image Icon Form
611
e0442439a3c6 documentation
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1030
e0442439a3c6 documentation
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1031
    [author:]
e0442439a3c6 documentation
Claus Gittinger <cg@exept.de>
parents: 593
diff changeset
  1032
        Claus Gittinger
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1033
"
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1034
! !
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1035
1358
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1036
!ImageReader class methodsFor:'instance creation'!
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1037
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1038
new
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1039
    ^ self basicNew initialize
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1040
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1041
    "Created: 18.2.1997 / 17:08:45 / cg"
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1042
! !
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1043
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
  1044
!ImageReader class methodsFor:'cleanup'!
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1045
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1046
lowSpaceCleanup
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1047
    "cleanup things we do not need"
118
25e775072a89 *** empty log message ***
claus
parents: 105
diff changeset
  1048
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1049
    ReverseBits := nil
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1050
! !
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1051
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
  1052
!ImageReader class methodsFor:'constants'!
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1053
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1054
reverseBits
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1055
    "return a table filled with bit reverse information.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1056
     To convert from msbit-first to lsbit-first bytes, use
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1057
     the value as index into the table, retrieving the reverse
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1058
     value. Since indexing must start at 1, use (value + 1) as
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1059
     index."
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1060
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1061
    |val "{ Class: SmallInteger }" |
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1062
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1063
    ReverseBits isNil ifTrue:[
153
claus
parents: 134
diff changeset
  1064
	ReverseBits := ByteArray uninitializedNew:256.
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1065
	0 to:255 do:[:i |
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1066
	    val := 0.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1067
	    (i bitTest:16r01) ifTrue:[val := val bitOr:16r80].
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1068
	    (i bitTest:16r02) ifTrue:[val := val bitOr:16r40].
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1069
	    (i bitTest:16r04) ifTrue:[val := val bitOr:16r20].
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1070
	    (i bitTest:16r08) ifTrue:[val := val bitOr:16r10].
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1071
	    (i bitTest:16r10) ifTrue:[val := val bitOr:16r08].
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1072
	    (i bitTest:16r20) ifTrue:[val := val bitOr:16r04].
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1073
	    (i bitTest:16r40) ifTrue:[val := val bitOr:16r02].
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1074
	    (i bitTest:16r80) ifTrue:[val := val bitOr:16r01].
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1075
	    ReverseBits at:(i + 1) put:val
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1076
	]
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1077
    ].
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1078
    ^ ReverseBits
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1079
! !
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1080
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
  1081
!ImageReader class methodsFor:'decompression support'!
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1082
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1083
decodeDelta:step in:data width:width height:height
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1084
    "perform NeXT special predictor delta decoding inplace in data.
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1085
     Calls primitive c function for speed"
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1086
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1087
    (step ~~ 3) ifTrue:[
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1088
	^ self error:'only rgb pictures supported'
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1089
    ].
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1090
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1091
%{
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1092
    if (__isByteArray(data)
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1093
     && __bothSmallInteger(width, height)) {
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1094
	__decodeDelta__(_ByteArrayInstPtr(data)->ba_element,
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1095
		    _intVal(width), _intVal(height));
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1096
	RETURN ( self );
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1097
    }
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1098
%}
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1099
.
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1100
    self primitiveFailed
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1101
!
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1102
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1103
decompressCCITT3From:srcBytes into:dstBytes startingAt:offset count:count 
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1104
    "decompress CCITT Group 3 compressed image data.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1105
     count bytes from srcBytes are decompressed into dstBytes.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1106
     Calls primitive c function for speed"
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1107
%{
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1108
    if (__isByteArray(srcBytes) 
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1109
     && __isByteArray(dstBytes)
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1110
     && __bothSmallInteger(offset, count)) {
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1111
	if (__decodeCCITTgroup3__(_ByteArrayInstPtr(srcBytes)->ba_element,
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1112
			      _ByteArrayInstPtr(dstBytes)->ba_element
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1113
			      + _intVal(offset) - 1,
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1114
			      _intVal(count))) {
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1115
	    RETURN ( self );
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1116
	}
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1117
    }
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1118
%}
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1119
.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1120
    self primitiveFailed
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1121
!
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1122
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1123
decompressGIFFrom:srcBytes count:count into:dstBytes startingAt:offset codeLen:codeLen
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1124
    "decompress GIF compressed image data.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1125
     count bytes from srcBytes are decompressed into dstBytes.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1126
     Calls primitive c function for speed"
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1127
%{
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1128
    if (__isByteArray(srcBytes) 
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1129
     && __isByteArray(dstBytes)
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1130
     && __bothSmallInteger(codeLen, offset)
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1131
     && __isSmallInteger(count)) {
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1132
	if (__decodeGIF__(_ByteArrayInstPtr(srcBytes)->ba_element,
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1133
		      _ByteArrayInstPtr(dstBytes)->ba_element
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1134
		      + _intVal(offset) - 1,
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1135
		      _intVal(count),
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1136
		      _intVal(codeLen))) {
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1137
	    RETURN ( self );
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1138
	}
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1139
    }
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1140
%}
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1141
.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1142
    self primitiveFailed
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1143
!
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1144
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1145
decompressLZWFrom:srcBytes count:count into:dstBytes startingAt:offset
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1146
    "decompress LZW (tiff) compressed image data.
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1147
     count bytes from srcBytes are decompressed into dstBytes.
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1148
     Calls primitive c function for speed"
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1149
%{
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1150
    if (__isByteArray(srcBytes) 
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1151
     && __isByteArray(dstBytes)
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1152
     && __bothSmallInteger(offset, count)) {
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1153
	if (__decodeLZW__(_ByteArrayInstPtr(srcBytes)->ba_element,
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1154
		      _ByteArrayInstPtr(dstBytes)->ba_element
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1155
		      + _intVal(offset) - 1,
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1156
		      _intVal(count))) {
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1157
	    RETURN ( self );
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1158
	}
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1159
    }
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1160
%}
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1161
.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1162
    self primitiveFailed
189
claus
parents: 153
diff changeset
  1163
!
claus
parents: 153
diff changeset
  1164
1648
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1165
decompressRLEFrom:srcBytes at:srcStartIndex into:dstBytes at:dstStartIndex increment:dstIncrement
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1166
    "common helper to expand RLE encoded data"
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1167
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1168
    "/ the code below expands common RLE formats, where the high bit
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1169
    "/ controls how the count in the low 7 bits is to be interpreted:
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1170
    "/ 1 means: count verbatim bytes follow;
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1171
    "/ 0 means: repeat the next byte count times.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1172
    "/ Decoding stops when a 0-count is encountered.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1173
    "/ srcBytes and dstBytes should not overlap.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1174
    "/ dstIncrement controls the stepping in the destination (usually: 1)
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1175
    "/
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1176
    "/ this may be recoded in C in the future
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1177
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1178
    |srcIdx "{Class: SmallInteger }"
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1179
     dstIdx "{Class: SmallInteger }"
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1180
     pixel  "{Class: SmallInteger }"
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1181
     count  "{Class: SmallInteger }"|
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1182
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1183
    srcIdx := srcStartIndex.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1184
    dstIdx := dstStartIndex.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1185
    [true] whileTrue:[
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1186
        pixel := srcBytes at:srcIdx.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1187
        count := pixel bitAnd:16r7F.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1188
        count == 0 ifTrue:[
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1189
            ^ self
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1190
        ].
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1191
        srcIdx := srcIdx + 1.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1192
        (pixel bitAnd:16r80) == 0 ifTrue:[
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1193
            "/ run bytes
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1194
            pixel := srcBytes at:srcIdx.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1195
            srcIdx := srcIdx + 1.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1196
            dstIncrement == 1 ifTrue:[
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1197
                dstBytes from:dstIdx to:(dstIdx+count-1) put:pixel.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1198
                dstIdx := dstIdx + count.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1199
            ] ifFalse:[
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1200
                1 to:count do:[:c |
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1201
                    dstBytes at:dstIdx put:pixel.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1202
                    dstIdx := dstIdx + dstIncrement.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1203
                ]
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1204
            ]
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1205
        ] ifFalse:[
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1206
            "/ verbatim bytes
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1207
            dstIncrement == 1 ifTrue:[
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1208
                dstBytes replaceFrom:dstIdx to:(dstIdx+count-1) with:srcBytes startingAt:srcIdx.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1209
                srcIdx := srcIdx + count.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1210
                dstIdx := dstIdx + count.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1211
            ] ifFalse:[
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1212
                1 to:count do:[:c |
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1213
                    dstBytes at:dstIdx put:(srcBytes at:srcIdx).
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1214
                    srcIdx := srcIdx + 1.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1215
                    dstIdx := dstIdx + dstIncrement.
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1216
                ]
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1217
            ]
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1218
        ]
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1219
    ].
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1220
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1221
    "Modified: 23.4.1997 / 18:54:05 / cg"
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1222
!
cbb3f0d60617 prepare for RLE decompression code reuse
Claus Gittinger <cg@exept.de>
parents: 1633
diff changeset
  1223
189
claus
parents: 153
diff changeset
  1224
loadBMP1to8Width:width height:height from:aStream into:aByteArray
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1225
    "load bmp-1 bit per pixel imagedata. A helper for BMP image reader.
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1226
     Calls primitive c function for speed"
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1227
189
claus
parents: 153
diff changeset
  1228
    |f|
claus
parents: 153
diff changeset
  1229
claus
parents: 153
diff changeset
  1230
    aStream isExternalStream ifFalse:[^ false].
claus
parents: 153
diff changeset
  1231
    f := aStream filePointer.
claus
parents: 153
diff changeset
  1232
    f isNil ifTrue:[^ false].
claus
parents: 153
diff changeset
  1233
%{
claus
parents: 153
diff changeset
  1234
    if (! (__bothSmallInteger(width, height)
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1235
           && __isByteArray(aByteArray))) {
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1236
        RETURN (false);
189
claus
parents: 153
diff changeset
  1237
    }
claus
parents: 153
diff changeset
  1238
    if (loadBMP1to8(__intVal(width), __intVal(height), 
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1239
                 __FILEVal(f), __ByteArrayInstPtr(aByteArray)->ba_element)) {
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1240
        RETURN (true);
189
claus
parents: 153
diff changeset
  1241
    }
claus
parents: 153
diff changeset
  1242
    RETURN (false);
claus
parents: 153
diff changeset
  1243
%}
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1244
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1245
    "Modified: 22.4.1996 / 19:14:32 / cg"
189
claus
parents: 153
diff changeset
  1246
!
claus
parents: 153
diff changeset
  1247
claus
parents: 153
diff changeset
  1248
loadBMP2to8Width:width height:height from:aStream into:aByteArray
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1249
    "load bmp-2 bit per pixel imagedata. A helper for BMP image reader.
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1250
     Calls primitive c function for speed"
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1251
189
claus
parents: 153
diff changeset
  1252
    |f|
claus
parents: 153
diff changeset
  1253
claus
parents: 153
diff changeset
  1254
    aStream isExternalStream ifFalse:[^ false].
claus
parents: 153
diff changeset
  1255
    f := aStream filePointer.
claus
parents: 153
diff changeset
  1256
    f isNil ifTrue:[^ false].
claus
parents: 153
diff changeset
  1257
%{
claus
parents: 153
diff changeset
  1258
    if (! (__bothSmallInteger(width, height)
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1259
           && __isByteArray(aByteArray))) {
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1260
        RETURN (false);
189
claus
parents: 153
diff changeset
  1261
    }
claus
parents: 153
diff changeset
  1262
    if (loadBMP2to8(__intVal(width), __intVal(height), 
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1263
             __FILEVal(f), __ByteArrayInstPtr(aByteArray)->ba_element)) {
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1264
        RETURN (true);
189
claus
parents: 153
diff changeset
  1265
    }
claus
parents: 153
diff changeset
  1266
    RETURN (false);
claus
parents: 153
diff changeset
  1267
%}
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1268
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1269
    "Modified: 22.4.1996 / 19:14:40 / cg"
189
claus
parents: 153
diff changeset
  1270
!
claus
parents: 153
diff changeset
  1271
claus
parents: 153
diff changeset
  1272
loadBMP4to8Width:width height:height compression:compression from:aStream into:aByteArray
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1273
    "load bmp-4 bit per pixel imagedata. A helper for BMP image reader.
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1274
     Calls primitive c function for speed"
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1275
189
claus
parents: 153
diff changeset
  1276
    |f|
claus
parents: 153
diff changeset
  1277
claus
parents: 153
diff changeset
  1278
    aStream isExternalStream ifFalse:[^ false].
claus
parents: 153
diff changeset
  1279
    f := aStream filePointer.
claus
parents: 153
diff changeset
  1280
    f isNil ifTrue:[^ false].
claus
parents: 153
diff changeset
  1281
%{
claus
parents: 153
diff changeset
  1282
    if (! (__bothSmallInteger(width, height)
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1283
           && __isSmallInteger(compression)
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1284
           && __isByteArray(aByteArray))) {
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1285
        RETURN (false);
189
claus
parents: 153
diff changeset
  1286
    }
claus
parents: 153
diff changeset
  1287
    if (loadBMP4to8(__intVal(width), __intVal(height), __intVal(compression), 
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1288
             __FILEVal(f), __ByteArrayInstPtr(aByteArray)->ba_element)) {
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1289
        RETURN (true);
189
claus
parents: 153
diff changeset
  1290
    }
claus
parents: 153
diff changeset
  1291
    RETURN (false);
claus
parents: 153
diff changeset
  1292
%}
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1293
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1294
    "Modified: 22.4.1996 / 19:14:46 / cg"
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1295
!
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1296
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1297
loadBMP8Width:width height:height compression:compression from:aStream into:aByteArray
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1298
    "load bmp-8 bit per pixel imagedata. A helper for BMP image reader.
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1299
     Calls primitive c function for speed"
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1300
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1301
|f|
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1302
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1303
    aStream isExternalStream ifFalse:[^ false].
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1304
    f := aStream filePointer.
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1305
    f isNil ifTrue:[^ false].
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1306
%{
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1307
    if (! (__bothSmallInteger(width, height)
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1308
           && __isSmallInteger(compression)
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1309
           && __isByteArray(aByteArray))) {
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1310
        RETURN (false);
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1311
    }
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1312
    if (loadBMP8(__intVal(width), __intVal(height), __intVal(compression), 
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1313
             __FILEVal(f), __ByteArrayInstPtr(aByteArray)->ba_element)) {
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1314
        RETURN (true);
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1315
    }
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1316
    RETURN (false);
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1317
%}
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1318
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1319
    "Modified: 22.4.1996 / 19:14:54 / cg"
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1320
! !
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1321
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
  1322
!ImageReader class methodsFor:'i/o support'!
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1323
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1324
streamReadingFile:aFilename
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1325
    "return a stream to read aFilename.
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1326
     If the filename ends with '.Z' or '.gz', return a stream
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1327
     to a pipe for the uncompressor. Otherwise, return a stream to read
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1328
     the file directly."
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1329
1300
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1330
    |inStream name fn|
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1331
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1332
    name := aFilename asString.
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1333
    ((name endsWith:'.Z') or:[name endsWith:'.gz']) ifTrue:[
1300
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1334
        fn := Smalltalk getSystemFileName:name.
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1335
        inStream := PipeStream readingFrom:'gunzip < ' , fn.
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1336
    ] ifFalse:[
518
f76da6242336 nicer message
Claus Gittinger <cg@exept.de>
parents: 285
diff changeset
  1337
        inStream := Smalltalk systemFileStreamFor:aFilename.
f76da6242336 nicer message
Claus Gittinger <cg@exept.de>
parents: 285
diff changeset
  1338
        inStream isNil ifTrue:[
f76da6242336 nicer message
Claus Gittinger <cg@exept.de>
parents: 285
diff changeset
  1339
            inStream := Smalltalk bitmapFileStreamFor:aFilename
f76da6242336 nicer message
Claus Gittinger <cg@exept.de>
parents: 285
diff changeset
  1340
        ]
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1341
    ].
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1342
    inStream isNil ifTrue:[
1175
5595569cfbd3 newStyle info & error messages
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
  1343
        'ImageReader [warning]: open error on: ' infoPrint. aFilename infoPrintCR. 
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1344
    ].
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1345
    ^ inStream
518
f76da6242336 nicer message
Claus Gittinger <cg@exept.de>
parents: 285
diff changeset
  1346
1300
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1347
    "Modified: 31.1.1997 / 10:37:24 / cg"
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1348
! !
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1349
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
  1350
!ImageReader class methodsFor:'image reading'!
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1351
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1352
fromFile:aFileName
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1353
    "read an image (in my format) from aFileName. 
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1354
     Return the image or nil on error."
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1355
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1356
    |reader|
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1357
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1358
    reader := self readFile:aFileName.
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1359
    reader notNil ifTrue:[
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1360
        ^ reader image
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1361
    ].
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1362
    ^ nil
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1363
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1364
    "
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1365
     XBMReader fromFile:'bitmaps/SBrowser.xbm'
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1366
     XPMReader fromFile:'bitmaps/xpmBitmaps/BOOK.xpm'
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1367
     XBMReader fromFile:'bitmaps/xpmBitmaps/BOOK.xpm'
518
f76da6242336 nicer message
Claus Gittinger <cg@exept.de>
parents: 285
diff changeset
  1368
    "
f76da6242336 nicer message
Claus Gittinger <cg@exept.de>
parents: 285
diff changeset
  1369
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1370
    "Modified: 4.4.1997 / 22:09:49 / cg"
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1371
!
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1372
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1373
fromStream:aStream
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1374
    "read an image (in my format) from aStream.
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1375
     Return the image or nil (if unrecognized format or error).
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1376
     The stream remains open."
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1377
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1378
    |reader|
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1379
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1380
    reader := self new fromStream:aStream.
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1381
    reader notNil ifTrue:[
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1382
        ^ reader image
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1383
    ].
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1384
    ^ nil
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1385
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1386
    "Modified: 4.4.1997 / 22:11:49 / cg"
1550
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1387
!
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1388
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1389
imagesFromFile:aFileName
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1390
    "read all images (in my format) from aFileName. 
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1391
     Return a collection of images or nil on error.
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1392
     Not all reader may support multiple images."
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1393
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1394
    |reader|
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1395
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1396
    reader := self readFile:aFileName.
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1397
    reader notNil ifTrue:[
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1398
        ^ reader images
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1399
    ].
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1400
    ^ nil
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1401
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1402
    "Modified: 4.4.1997 / 22:11:01 / cg"
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1403
!
1550
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1404
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1405
imagesFromStream:aStream
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1406
    "read all images (in my format) from aStream.
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1407
     Return a collection of images or nil (if unrecognized format or error).
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1408
     The stream remains open.
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1409
     Not all reader may support multiple images."
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1410
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1411
    |reader|
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1412
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1413
    reader := self new fromStream:aStream.
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1414
    reader notNil ifTrue:[
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1415
        ^ reader images
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1416
    ].
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1417
    ^ nil
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1418
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1419
    "Modified: 4.4.1997 / 22:11:40 / cg"
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1420
!
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1421
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1422
readFile:aFileName
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1423
    "create a reader and let it read an image (in my format) from aFileName. 
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1424
     Return the reader."
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1425
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1426
    |reader inStream|
1550
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1427
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1428
    inStream := self streamReadingFile:aFileName.
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1429
    inStream isNil ifTrue:[
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1430
        'ImageReader [warning]: file open error' errorPrintCR.
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1431
        ^ nil
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1432
    ].
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1433
    reader := self new fromStream:inStream.
1550
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1434
    inStream close.
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1435
    ^ reader
1550
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1436
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1437
    "
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1438
     XPMReader readFile:'bitmaps/xpmBitmaps/BOOK.xpm'
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1439
    "
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1440
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1441
    "Modified: 4.4.1997 / 22:06:49 / cg"
1550
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1442
!
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1443
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1444
readStream:inStream
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1445
    "create a reader and let it read a stream (in my format). 
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1446
     Return the reader. The stream remains open."
1550
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1447
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1448
    ^ self new fromStream:inStream.
1550
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1449
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1450
    "Created: 4.4.1997 / 22:08:13 / cg"
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1451
! !
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1452
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
  1453
!ImageReader class methodsFor:'image writing'!
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1454
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1455
save:anImage onFile:aFileName
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1456
    "save the image in my format on aFileName"
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1457
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1458
    ^ (self basicNew) save:anImage onFile:aFileName
1574
7c25ed84ad12 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1551
diff changeset
  1459
7c25ed84ad12 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1551
diff changeset
  1460
    "Modified: 10.4.1997 / 17:42:57 / cg"
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1461
! !
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1462
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
  1463
!ImageReader class methodsFor:'testing'!
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1464
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1465
canRepresent:anImage
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1466
    "return true, if anImage can be represented in my file format.
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1467
     must be redefined in concrete subclasses which support saving."
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1468
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1469
    ^ false
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1470
!
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1471
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1472
isValidImageFile:aFileName
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1473
    "return true, if aFileName contains an image this
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1474
     reader understands - must be redefined in concrete subclasses
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1475
     which support reading."
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1476
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1477
    ^ false
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1478
! !
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1479
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1480
!ImageReader methodsFor:'accessing'!
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1481
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1482
bitsPerPixel
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1483
    "return the number of bits per pixel"
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1484
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1485
    ^ (bitsPerSample inject:0 into:[:sum :i | sum + i])
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1486
!
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1487
1300
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1488
bitsPerRow
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1489
    "return the number of bits in one scanline of the image"
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1490
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1491
    ^  width * (self bitsPerPixel).
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1492
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1493
    "Created: 31.1.1997 / 10:38:42 / cg"
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1494
!
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1495
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1496
bitsPerSample
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1497
    "return the number of bits per sample"
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1498
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1499
    ^ bitsPerSample
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1500
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1501
    "Modified: 22.4.1996 / 19:15:18 / cg"
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1502
!
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1503
1300
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1504
bytesPerRow
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1505
    "return the number of bytes in one scanline of the image"
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1506
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1507
    |bitsPerRow bytesPerRow|
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1508
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1509
    bitsPerRow := width * (self bitsPerPixel).
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1510
    bytesPerRow := bitsPerRow // 8.
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1511
    ((bitsPerRow \\ 8) ~~ 0) ifTrue:[
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1512
        bytesPerRow := bytesPerRow + 1
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1513
    ].
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1514
    ^ bytesPerRow
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1515
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1516
    "Created: 31.1.1997 / 10:39:06 / cg"
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1517
!
1416ad43b694 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1262
diff changeset
  1518
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1519
colorMap
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1520
    "return the colormap"
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1521
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1522
    ^ colorMap
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1523
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1524
    "Modified: 22.4.1996 / 19:15:24 / cg"
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1525
!
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1526
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1527
data 
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1528
    "return the raw image data"
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1529
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1530
    ^ data
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1531
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1532
    "Modified: 22.4.1996 / 19:15:31 / cg"
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1533
!
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1534
1055
ea202da7dc44 dimensionCallBack
Claus Gittinger <cg@exept.de>
parents: 1053
diff changeset
  1535
dimensionCallBack:aBlock
ea202da7dc44 dimensionCallBack
Claus Gittinger <cg@exept.de>
parents: 1053
diff changeset
  1536
    "set the block, which is evaluated during the readProcess, as soon as
ea202da7dc44 dimensionCallBack
Claus Gittinger <cg@exept.de>
parents: 1053
diff changeset
  1537
     the images dimension is known. This is useful for background image reading,
ea202da7dc44 dimensionCallBack
Claus Gittinger <cg@exept.de>
parents: 1053
diff changeset
  1538
     if the size is need to be known (for example: for formatting purposes)"
ea202da7dc44 dimensionCallBack
Claus Gittinger <cg@exept.de>
parents: 1053
diff changeset
  1539
ea202da7dc44 dimensionCallBack
Claus Gittinger <cg@exept.de>
parents: 1053
diff changeset
  1540
    dimensionCallBack := aBlock
ea202da7dc44 dimensionCallBack
Claus Gittinger <cg@exept.de>
parents: 1053
diff changeset
  1541
ea202da7dc44 dimensionCallBack
Claus Gittinger <cg@exept.de>
parents: 1053
diff changeset
  1542
    "Created: 14.9.1996 / 17:10:58 / cg"
ea202da7dc44 dimensionCallBack
Claus Gittinger <cg@exept.de>
parents: 1053
diff changeset
  1543
!
ea202da7dc44 dimensionCallBack
Claus Gittinger <cg@exept.de>
parents: 1053
diff changeset
  1544
1550
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1545
hasMultipleImages
1773
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1546
    ^ imageSequence size > 1
1550
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1547
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1548
    "Created: 4.4.1997 / 21:37:06 / cg"
1773
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1549
    "Modified: 24.6.1997 / 15:33:43 / cg"
1550
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1550
!
afee7c032a57 rudimentary support for multiple images.
Claus Gittinger <cg@exept.de>
parents: 1358
diff changeset
  1551
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1552
height 
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1553
    "return the height of the image"
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1554
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1555
    ^ height
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1556
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1557
    "Modified: 22.4.1996 / 19:15:39 / cg"
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1558
!
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1559
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1560
image
1772
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1561
    "return the image as represented by myself;
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1562
     If my file contained multiple images, return the first one."
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1563
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1564
    |image depth|
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1565
1773
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1566
    imageSequence size > 0 ifTrue:[
1775
833aee145064 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1773
diff changeset
  1567
        ^  self images first.
1772
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1568
    ].
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1569
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1570
    depth := self bitsPerPixel.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1571
    image := (Image implementorForDepth:depth) new.
1661
5b4c1f6ab871 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1648
diff changeset
  1572
    image depth:depth.
593
a3264954cf83 commentary
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1573
    image 
a3264954cf83 commentary
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1574
        width:width 
a3264954cf83 commentary
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1575
        height:height
a3264954cf83 commentary
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1576
        photometric:photometric
a3264954cf83 commentary
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1577
        samplesPerPixel:samplesPerPixel
a3264954cf83 commentary
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1578
        bitsPerSample:bitsPerSample
a3264954cf83 commentary
Claus Gittinger <cg@exept.de>
parents: 583
diff changeset
  1579
        colorMap:colorMap
893
24dc4b26a486 prepare to read mask/alpha channel
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  1580
        bits:data
24dc4b26a486 prepare to read mask/alpha channel
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  1581
        mask:mask.
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1582
    ^ image
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1583
1775
833aee145064 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1773
diff changeset
  1584
    "Modified: 24.6.1997 / 15:53:23 / cg"
893
24dc4b26a486 prepare to read mask/alpha channel
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  1585
!
24dc4b26a486 prepare to read mask/alpha channel
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  1586
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1587
images
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1588
    "return a collection of all images as represented by myself.
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1589
     For compatibility with single-image formats, return a collection
1773
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1590
     containing my single image here if the reader does not support
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1591
     multiple images.
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1592
     Readers for formats with multiple images should leave the images
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1593
     in the imageSequence instVar as a side effect of reading."
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1594
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1595
    |img|
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1596
1773
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1597
    imageSequence notNil ifTrue:[
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1598
        ^ imageSequence
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1599
    ].
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1600
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1601
    img := self image.
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1602
    img isNil ifTrue:[
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1603
        ^ img
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1604
    ].
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1605
    ^ Array with:img
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1606
1773
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1607
    "Modified: 24.6.1997 / 15:35:40 / cg"
1551
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1608
!
1e1f4820b93a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1550
diff changeset
  1609
893
24dc4b26a486 prepare to read mask/alpha channel
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  1610
mask
24dc4b26a486 prepare to read mask/alpha channel
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  1611
    "return the image mask (or nil)"
24dc4b26a486 prepare to read mask/alpha channel
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  1612
24dc4b26a486 prepare to read mask/alpha channel
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  1613
    ^ mask
24dc4b26a486 prepare to read mask/alpha channel
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  1614
24dc4b26a486 prepare to read mask/alpha channel
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  1615
    "Modified: 22.4.1996 / 19:15:31 / cg"
24dc4b26a486 prepare to read mask/alpha channel
Claus Gittinger <cg@exept.de>
parents: 665
diff changeset
  1616
    "Created: 20.6.1996 / 17:08:29 / cg"
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1617
!
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1618
1772
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1619
numberOfImages
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1620
    "return the number of images as read.
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1621
     By default (here), I hold a single image;
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1622
     however, some fileFormats allow for multiple images"
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1623
1773
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1624
    |n|
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1625
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1626
    (n := imageSequence size) > 0 ifTrue:[
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1627
        ^ n
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1628
    ].
1772
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1629
    ^ 1
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1630
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1631
    "Created: 21.6.1997 / 18:33:45 / cg"
1773
e12d18fb2b4c multiple images changes
Claus Gittinger <cg@exept.de>
parents: 1772
diff changeset
  1632
    "Modified: 24.6.1997 / 15:33:26 / cg"
1772
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1633
!
56b3ae478bbb changes to support multiple images
Claus Gittinger <cg@exept.de>
parents: 1661
diff changeset
  1634
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1635
photometric
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1636
    "return the photometric interpretation of the image data"
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1637
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1638
    ^ photometric
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1639
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1640
    "Modified: 22.4.1996 / 19:15:57 / cg"
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1641
!
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1642
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1643
samplesPerPixel
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1644
    "return the number of samples per pixel"
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1645
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1646
    ^ samplesPerPixel
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1647
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1648
    "Modified: 22.4.1996 / 19:16:03 / cg"
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1649
!
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1650
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1651
width
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1652
    "return the width of the image"
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1653
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1654
    ^ width
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1655
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1656
    "Modified: 22.4.1996 / 19:16:10 / cg"
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1657
! !
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1658
1355
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1659
!ImageReader methodsFor:'accessing - private'!
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1660
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1661
byteOrder:aSymbol
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1662
    "set the byte order - either #lsb or #msb"
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1663
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1664
    byteOrder := aSymbol
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1665
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1666
    "Created: 15.2.1997 / 13:58:50 / cg"
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1667
!
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1668
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1669
inStream
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1670
    ^ inStream
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1671
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1672
    "Created: 15.2.1997 / 13:57:40 / cg"
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1673
!
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1674
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1675
inStream:aStream
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1676
    inStream := aStream
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1677
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1678
    "Created: 15.2.1997 / 13:57:35 / cg"
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1679
! !
a7ec624230c0 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1300
diff changeset
  1680
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1681
!ImageReader methodsFor:'i/o support'!
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1682
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1683
readLong
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1684
    "return the next 4-byte long, honoring the byte-order"
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1685
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1686
    ^ inStream nextLongMSB:(byteOrder ~~ #lsb)
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1687
!
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1688
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1689
readShort
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1690
    "return the next 2-byte short, honoring the byte-order"
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1691
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1692
    ^ inStream nextUnsignedShortMSB:(byteOrder ~~ #lsb)
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1693
!
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1694
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1695
readShortLong
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1696
    "return the next 2-byte short, honoring the byte-order.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1697
     There are actually 4 bytes read, but only 2 looked at."
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1698
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1699
    |bytes val|
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1700
153
claus
parents: 134
diff changeset
  1701
    bytes := ByteArray uninitializedNew:4.
105
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1702
    inStream nextBytes:4 into:bytes.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1703
    (byteOrder == #lsb) ifTrue:[
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1704
	val := bytes at:2.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1705
	val := val * 256 + (bytes at:1)
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1706
    ] ifFalse:[
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1707
	val := bytes at:3.
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1708
	val := val * 256 + (bytes at:4)
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1709
    ].
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1710
    ^ val
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1711
!
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1712
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1713
writeLong:anInteger
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1714
    "write a 4-byte long, honoring the byte-order."
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1715
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1716
    outStream nextPutLong:anInteger MSB:(byteOrder ~~ #lsb)
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1717
!
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1718
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1719
writeShort:anInteger
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1720
    "write a 2-byte short, honoring the byte-order."
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1721
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1722
    outStream nextPutShort:anInteger MSB:(byteOrder ~~ #lsb)
6a4a21c17e5d *** empty log message ***
claus
parents: 97
diff changeset
  1723
! !
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1724
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1725
!ImageReader methodsFor:'image reading'!
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1726
929
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1727
buildMaskFromColor:maskPixelValue
1631
fc944d181796 use ImageMask instead of Depth1Image
Claus Gittinger <cg@exept.de>
parents: 1574
diff changeset
  1728
    "helper for image formats, where an individual pixel value
fc944d181796 use ImageMask instead of Depth1Image
Claus Gittinger <cg@exept.de>
parents: 1574
diff changeset
  1729
     has been defined as a mask-pixel (i.e. GIF).
fc944d181796 use ImageMask instead of Depth1Image
Claus Gittinger <cg@exept.de>
parents: 1574
diff changeset
  1730
     Creates a maskImage, with zeros at positions where the image
fc944d181796 use ImageMask instead of Depth1Image
Claus Gittinger <cg@exept.de>
parents: 1574
diff changeset
  1731
     has the given pixelValue; all other mask pixels are set to 1."
fc944d181796 use ImageMask instead of Depth1Image
Claus Gittinger <cg@exept.de>
parents: 1574
diff changeset
  1732
929
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1733
    |maskArray bytesPerMaskRow|
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1734
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1735
    bytesPerMaskRow := (width+7) // 8.
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1736
1631
fc944d181796 use ImageMask instead of Depth1Image
Claus Gittinger <cg@exept.de>
parents: 1574
diff changeset
  1737
    maskArray := ByteArray uninitializedNew:bytesPerMaskRow * height.
929
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1738
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1739
%{
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1740
    int __w = __intVal(__INST(width));
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1741
    int __h = __intVal(__INST(height));
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1742
    int __x, __y;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1743
    int __outBits, __nOut;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1744
    unsigned char *__inP, *__outP, *__nextOutRow;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1745
    int __bpr = __intVal(bytesPerMaskRow);
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1746
    int __maskPixel = __intVal(maskPixelValue);
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1747
#ifdef DEBUG
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1748
    unsigned char *outEnd;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1749
#endif
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1750
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1751
    if (! __isByteArray(__INST(data))) goto fail;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1752
    if (! __isByteArray(maskArray)) goto fail;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1753
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1754
    __inP = __ByteArrayInstPtr(__INST(data))->ba_element;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1755
    __outP = __ByteArrayInstPtr(maskArray)->ba_element;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1756
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1757
#ifdef DEBUG
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1758
    outEnd = __outP + (__byteArraySize(maskArray));
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1759
#endif
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1760
/*
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1761
printf("outP: %x outEnd: %x sz: %d\n", __outP, outEnd, __byteArraySize(maskArray));
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1762
*/
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1763
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1764
    for (__y=__h; __y>0; __y--) {
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1765
        __outBits = 0;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1766
        __nOut = 8;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1767
        __nextOutRow = __outP + __bpr;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1768
1828
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1769
        for (__x=__w; __x>=8; __x-=8) {
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1770
            if (__inP[0] != __maskPixel) { __outBits |= 0x80; };
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1771
            if (__inP[1] != __maskPixel) { __outBits |= 0x40; };
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1772
            if (__inP[2] != __maskPixel) { __outBits |= 0x20; };
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1773
            if (__inP[3] != __maskPixel) { __outBits |= 0x10; };
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1774
            if (__inP[4] != __maskPixel) { __outBits |= 0x08; };
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1775
            if (__inP[5] != __maskPixel) { __outBits |= 0x04; };
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1776
            if (__inP[6] != __maskPixel) { __outBits |= 0x02; };
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1777
            if (__inP[7] != __maskPixel) { __outBits |= 0x01; };
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1778
            __inP += 8;
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1779
            *__outP++ = __outBits;
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1780
            __outBits = 0;
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1781
        }
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1782
        for (; __x>0; __x--) {
929
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1783
            __outBits <<= 1;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1784
            if (*__inP != __maskPixel) {
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1785
                __outBits |= 1;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1786
            }
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1787
            __inP++;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1788
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1789
/*
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1790
 printf("x: %d  bits: %x\n", __x, __outBits);
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1791
*/
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1792
            if (--__nOut == 0) {
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1793
#ifdef DEBUG
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1794
                if (__outP >= outEnd) {
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1795
                 printf("oops\n");
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1796
                 goto fail;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1797
                }
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1798
#endif
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1799
                *__outP = __outBits;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1800
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1801
                __outP++;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1802
                __nOut = 8;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1803
                __outBits = 0;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1804
            }
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1805
        }
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1806
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1807
        if (__nOut != 8) {
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1808
            __outBits <<= __nOut;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1809
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1810
#ifdef DEBUG
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1811
            if (__outP >= outEnd) {
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1812
             printf("oops2\n");
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1813
             goto fail;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1814
            }
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1815
#endif
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1816
            *__outP = __outBits;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1817
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1818
        }
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1819
        __outP = __nextOutRow;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1820
    }
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1821
fail: ;
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1822
%}.
1631
fc944d181796 use ImageMask instead of Depth1Image
Claus Gittinger <cg@exept.de>
parents: 1574
diff changeset
  1823
    mask := ImageMask width:width height:height fromArray:maskArray.
929
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1824
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1825
    "Created: 21.6.1996 / 11:43:47 / cg"
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1826
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1827
!
f792d9689def Moved #buildMask from GIFReader to #buildMaskFromColor:
Stefan Vogel <sv@exept.de>
parents: 893
diff changeset
  1828
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1829
fromStream:aStream
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1830
    "read an image in my format from aStream.
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1831
     Leave image description in instance variables."
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1832
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1833
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1834
    ^ self subclassResponsibility
583
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1835
211abfdb4db5 commentary
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
  1836
    "Modified: 22.4.1996 / 19:11:31 / cg"
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1837
! !
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1838
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1839
!ImageReader methodsFor:'image writing'!
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1840
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1841
save:image onFile:aFileName
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1842
    "save image in my format on aFile"
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1843
1574
7c25ed84ad12 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1551
diff changeset
  1844
    ^ Image cannotRepresentImageSignal 
7c25ed84ad12 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1551
diff changeset
  1845
        raiseWith:image
7c25ed84ad12 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1551
diff changeset
  1846
        errorString:('image save not implemented for this format').
7c25ed84ad12 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1551
diff changeset
  1847
7c25ed84ad12 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1551
diff changeset
  1848
    "Modified: 10.4.1997 / 17:43:52 / cg"
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1849
! !
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1850
1358
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1851
!ImageReader methodsFor:'initialization'!
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1852
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1853
initialize
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1854
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1855
    "Created: 18.2.1997 / 17:08:31 / cg"
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1856
! !
193570ad2ff5 added dummy #initialize
Claus Gittinger <cg@exept.de>
parents: 1355
diff changeset
  1857
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 1055
diff changeset
  1858
!ImageReader class methodsFor:'documentation'!
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1859
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1860
version
1828
6bde6b02a671 tuned #buildMaskFromColor:
Claus Gittinger <cg@exept.de>
parents: 1819
diff changeset
  1861
    ^ '$Header: /cvs/stx/stx/libview/ImageReader.st,v 1.53 1997-07-24 16:05:20 cg Exp $'
285
1effedd62f30 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 219
diff changeset
  1862
! !