WindowsIconReader.st
author Claus Gittinger <cg@exept.de>
Sat, 27 Feb 2016 23:37:02 +0100
changeset 3571 a830f0388ef6
parent 3568 a8900d28752b
child 3578 6bd3a34492f9
permissions -rw-r--r--
#FEATURE class: WindowsIconReader changed: #canRepresent:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3571
a830f0388ef6 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3568
diff changeset
     1
"{ Encoding: utf8 }"
a830f0388ef6 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3568
diff changeset
     2
0
3f9277473954 Initial revision
claus
parents:
diff changeset
     3
"
3f9277473954 Initial revision
claus
parents:
diff changeset
     4
 COPYRIGHT (c) 1993 by Claus Gittinger
28
8daff0234d2e *** empty log message ***
claus
parents: 24
diff changeset
     5
	      All Rights Reserved
0
3f9277473954 Initial revision
claus
parents:
diff changeset
     6
3f9277473954 Initial revision
claus
parents:
diff changeset
     7
 This software is furnished under a license and may be used
3f9277473954 Initial revision
claus
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
3f9277473954 Initial revision
claus
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
3f9277473954 Initial revision
claus
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
3f9277473954 Initial revision
claus
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
3f9277473954 Initial revision
claus
parents:
diff changeset
    12
 hereby transferred.
3f9277473954 Initial revision
claus
parents:
diff changeset
    13
"
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    14
"{ Package: 'stx:libview2' }"
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    15
3568
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
    16
"{ NameSpace: Smalltalk }"
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
    17
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    18
ImageReader subclass:#WindowsIconReader
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
    19
	instanceVariableNames:'compression inDepth'
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
    20
	classVariableNames:''
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
    21
	poolDictionaries:''
1745
4fa0fad2a463 code cleanup (colorMap handling)
Claus Gittinger <cg@exept.de>
parents: 1734
diff changeset
    22
	category:'Graphics-Images-Readers'
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    23
!
3f9277473954 Initial revision
claus
parents:
diff changeset
    24
21
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    25
!WindowsIconReader class methodsFor:'documentation'!
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    26
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    27
copyright
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    28
"
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    29
 COPYRIGHT (c) 1993 by Claus Gittinger
28
8daff0234d2e *** empty log message ***
claus
parents: 24
diff changeset
    30
	      All Rights Reserved
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    31
21
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    32
 This software is furnished under a license and may be used
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    33
 only in accordance with the terms of that license and with the
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    35
 be provided or otherwise made available to, or used by, any
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    36
 other person.  No title to or ownership of the software is
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    37
 hereby transferred.
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    38
"
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    39
!
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    40
21
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    41
documentation
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    42
"
32
6bdcb6da4d4f *** empty log message ***
claus
parents: 28
diff changeset
    43
    this class provides methods for loading Windows and OS2 icon files.
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
    44
    Image writing is only supported for BMP format with depth 1,4,8 and 24 bit images.
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
    45
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
    46
    The reader tries to figure out which version of BMP/ICO is used.
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
    47
    It seems to be able to load most formats, but who knows ...
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
    48
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    49
    The class name *IconReader is a bad, historic choice - it ws originally
3158
b017a13ec3f5 class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 2812
diff changeset
    50
    written to read icons only, but evolved over time and is now also
b017a13ec3f5 class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 2812
diff changeset
    51
    capable of reading/writing bmp and cursor files.
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    52
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
    53
    [See also:]
3158
b017a13ec3f5 class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 2812
diff changeset
    54
        Image Form Icon
b017a13ec3f5 class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 2812
diff changeset
    55
        BlitImageReader FaceReader GIFReader JPEGReader PBMReader PCXReader
b017a13ec3f5 class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 2812
diff changeset
    56
        ST80FormReader SunRasterReader TargaReader TIFFReader
b017a13ec3f5 class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 2812
diff changeset
    57
        XBMReader XPMReader XWDReader
21
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
    58
"
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    59
!
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    60
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    61
fileFormatDescription
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    62
"
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    63
    Information from http://www.daubnet.com/formats/BMP.html - no Warranty.
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    64
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    65
	  Name           Size                Description
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    66
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    67
      Header            14 bytes            Windows Structure: BITMAPFILEHEADER
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    68
	  Signature      2 bytes             'BM'
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    69
	  FileSize       4 bytes             File size in bytes
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    70
	  reserved       4 bytes             unused (=0)
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    71
	  DataOffset     4 bytes             File offset to Raster Data
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    72
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    73
      InfoHeader        40 bytes            Windows Structure: BITMAPINFOHEADER
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    74
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    75
	  Size           4 bytes             Size of InfoHeader =40
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    76
	  Width          4 bytes             Bitmap Width
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    77
	  Height         4 bytes             Bitmap Height
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    78
	  Planes         2 bytes             Number of Planes (=1)
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    79
	  BitCount       2 bytes             Bits per Pixel
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    80
					     1 = monochrome palette. NumColors = 1
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    81
					     4 = 4bit palletized. NumColors = 16
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    82
					     8 = 8bit palletized. NumColors = 256
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    83
					     16 = 16bit RGB. NumColors = 65536 (?)
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    84
					     24 = 24bit RGB. NumColors = 16M
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    85
	  Compression    4 bytes             Type of Compression
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    86
					     0 = BI_RGB   no compression
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    87
					     1 = BI_RLE8 8bit RLE encoding
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    88
					     2 = BI_RLE4 4bit RLE encoding
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    89
	  ImageSize      4 bytes             (compressed) Size of Image
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    90
					     It is valid to set this =0 if Compression = 0
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    91
	  XpixelsPerM    4 bytes             horizontal resolution: Pixels/meter
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    92
	  YpixelsPerM    4 bytes             vertical resolution: Pixels/meter
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    93
	  ColorsUsed     4 bytes             Number of actually used colors
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    94
	  ColorsImportant
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    95
			 4 bytes             Number of important colors
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    96
					     0 = all
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
    97
       ColorTable        4 * NumColors bytes
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    98
					     present only if Info.BitsPerPixel <= 8
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
    99
					     colors should be ordered by importance
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   100
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   101
	    Red           1 byte              Red intensity
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   102
	    Green         1 byte              Green intensity
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   103
	    Blue          1 byte              Blue intensity
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   104
	    reserved      1 byte             unused (=0)
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   105
	  repeated NumColors times
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   106
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   107
       Raster Data      Info.ImageSize bytes     The pixel data
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   108
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   109
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   110
Raster Data encoding:
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   111
       Depending on the image's BitCount and on the Compression flag there are 6 different encoding schemes.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   112
       All of them share the following:
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   113
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   114
       Pixels are stored bottom-up, left-to-right. Pixel lines are padded with zeros to end on a 32bit (4byte) boundary. For
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   115
       uncompressed formats every line will have the same number of bytes. Color indices are zero based, meaning a pixel
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   116
       color of 0 represents the first color table entry, a pixel color of 255 (if there are that many) represents the 256th entry.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   117
       For images with more than 256 colors there is no color table.
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   118
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   119
Raster Data encoding for 1bit / black & white images:
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   120
       BitCount = 1 Compression = 0
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   121
       Every byte holds 8 pixels, its highest order bit representing the leftmost pixel of those. There are 2 color table entries.
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   122
       Some readers will ignore them though, and assume that 0 is black and 1 is white. If you are storing black and white
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   123
       pictures you should stick to this, with any other 2 colors this is not an issue. Remember padding with zeros up to a
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   124
       32bit boundary (This can be up to 31 zeros/pixels!!)
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   125
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   126
Raster Data encoding for 4bit / 16 color images:
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   127
       BitCount = 4 Compression = 0
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   128
       Every byte holds 2 pixels, its high order 4 bits representing the left of those. There are 16 color table entries. These
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   129
       colors do not have to be the 16 MS-Windows standard colors. Padding each line with zeros up to a 32bit boundary
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   130
       will result in up to 28 zeros = 7 'wasted pixels'.
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   131
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   132
Raster Data encoding for 8bit / 256 color images:
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   133
       BitCount = 8 Compression = 0
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   134
       Every byte holds 1 pixel. There are 256 color table entries. Padding each line with zeros up to a 32bit boundary will
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   135
       result in up to 3 bytes of zeros = 3 'wasted pixels'.
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   136
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   137
Raster Data encoding for 16bit / hicolor images:
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   138
       BitCount = 16 Compression = 0
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   139
       Every 2bytes / 16bit holds 1 pixel.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   140
       <information missing: the 16 bit was introduced together with Video For Windows? Is it a memory-only-format?>
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   141
       The pixels are no color table pointers. There are no color table entries. Padding each line with zeros up to a 16bit
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   142
       boundary will result in up to 2 zero bytes.
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   143
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   144
Raster Data encoding for 24bit / truecolor images:
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   145
       BitCount = 24 Compression = 0
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   146
       Every 4bytes / 32bit holds 1 pixel. The first holds its red, the second its green, and the third its blue intensity. The
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   147
       fourth byte is reserved and should be zero. There are no color table entries. The pixels are no color table pointers. No
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   148
       zero padding necessary.
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   149
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   150
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   151
Raster Data compression for 4bit / 16 color images:
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   152
       BitCount = 4 Compression = 2
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   153
       The pixel data is stored in 2bytes / 16bit chunks.  The first of these specifies the number of consecutive pixels with the
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   154
       same pair of color. The second byte defines two color indices. The resulting pixel pattern will be interleaved
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   155
       high-order 4bits and low order 4 bits (ABABA...). If the first byte is zero, the second defines an escape code. The
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   156
       End-of-Bitmap is zero padded to end on a 32bit boundary. Due to the 16bit-ness of this structure this will always be
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   157
       either two zero bytes or none.
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   158
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   159
	n (byte 1) c (Byte 2)                                       Description
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   160
	>0        any      n pixels are to be drawn. The 1st, 3rd, 5th, ... pixels' color is in c's high-order 4 bits, the even
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   161
			    pixels' color is in c's low-order 4 bits. If both color indices are the same, it results in just n
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   162
			    pixels of color c
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   163
	0         0        End-of-line
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   164
	0         1        End-of-Bitmap
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   165
	0         2        Delta. The following 2 bytes define an unsigned offset in x and y direction (y being up) The
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   166
			    skipped pixels should get a color zero.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   167
	0         >=3      The following c bytes will be read as single pixel colors just as in uncompressed files. up to 12
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   168
			    bits of zeros follow, to put the file/memory pointer on a 16bit boundary again.
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   169
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   170
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   171
				      Example for 4bit RLE
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   172
	Compressed Data                           Expanded data
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   173
	03 04              0 4 0
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   174
	05 06              0 6 0 6 0
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   175
	00 06 45 56 67 00  4 5 5 6 6 7
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   176
	04 78              7 8 7 8
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   177
	00 02 05 01        Move 5 right and 1 up. (Windows docs say down, which is wrong)
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   178
	00 00              End-of-line
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   179
	09 1E              1 E 1 E 1 E 1 E 1
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   180
	00 01              EndofBitmap
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   181
	00 00              Zero padding for 32bit boundary
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   182
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   183
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   184
Raster Data compression for 8bit / 256 color images:
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   185
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   186
       BitCount = 8 Compression = 1
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   187
       The pixel data is stored in 2bytes / 16bit chunks.  The first of these specifies the number of consecutive pixels with the
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   188
       same color. The second byte defines their color index. If the first byte is zero, the second defines an escape code. The
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   189
       End-of-Bitmap is zero padded to end on a 32bit boundary. Due to the 16bit-ness of this structure this will always be
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   190
       either two zero bytes or none.
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   191
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   192
	n (byte 1)   c (Byte 2)                                    Description
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   193
	>0       any        n pixels of color number c
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   194
	0        0          End-of-line
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   195
	0        1          End Of Bitmap
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   196
	0        2          Delta. The following 2 bytes define an unsigned offset in x and y direction (y being up) The
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   197
			    skipped pixels should get a color zero.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   198
	0        >=3        The following c bytes will be read as single pixel colors just as in uncompressed files. A zero
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   199
			    follows, if c is odd, putting the file/memory pointer on a 16bit boundary again.
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   200
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   201
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   202
				      Example for 8bit RLE
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   203
	Compressed Data                           Expanded data
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   204
	03 04              04 04 04
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   205
	05 06              06 06 06 06 06
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   206
	00 03 45 56 67 00  45 56 67
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   207
	02 78              78 78
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   208
	00 02 05 01        Move 5 right and 1 up. (Windows docs say down, which is wrong)
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   209
	00 00              End-of-line
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   210
	09 1E              1E 1E 1E 1E 1E 1E 1E 1E 1E
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   211
	00 01              End-of-bitmap
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   212
	00 00              Zero padding for 32bit boundary
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   213
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   214
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   215
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   216
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   217
Portability:
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   218
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   219
       Although BMPs were invented by Microsoft for its Windows platform, a lot of programs on other platforms are capable
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   220
       of reading and writing them. Notice the Intel order in 2byte and 4-byte integer values (Least significant byte first). The
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   221
       16bit BMPs have been introduced to Windows after the others, still puzzling many applications.
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   222
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   223
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   224
Trademarks, Patents and Royalties
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   225
       To my knowledge: None.
1385
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   226
"
Claus Gittinger <cg@exept.de>
parents: 1233
diff changeset
   227
21
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
   228
! !
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   229
28
8daff0234d2e *** empty log message ***
claus
parents: 24
diff changeset
   230
!WindowsIconReader class methodsFor:'initialization'!
8daff0234d2e *** empty log message ***
claus
parents: 24
diff changeset
   231
8daff0234d2e *** empty log message ***
claus
parents: 24
diff changeset
   232
initialize
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   233
    "tell Image-class, that a new fileReader is present
398
aef700d15416 new suffix-table
Claus Gittinger <cg@exept.de>
parents: 387
diff changeset
   234
     for the '.bmp' and '.ico' extensions."
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   235
647
6f26c76aa0c9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 623
diff changeset
   236
    MIMETypes defineImageType:'image/x-MS-bitmap' suffix:'bmp' reader:self.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   237
    MIMETypes defineImageType:'image/bmp'         suffix:'bmp' reader:self.
647
6f26c76aa0c9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 623
diff changeset
   238
    MIMETypes defineImageType:nil                 suffix:'ico' reader:self.
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   239
398
aef700d15416 new suffix-table
Claus Gittinger <cg@exept.de>
parents: 387
diff changeset
   240
    "Modified: 1.2.1997 / 15:03:59 / cg"
28
8daff0234d2e *** empty log message ***
claus
parents: 24
diff changeset
   241
! !
8daff0234d2e *** empty log message ***
claus
parents: 24
diff changeset
   242
102
claus
parents: 99
diff changeset
   243
!WindowsIconReader class methodsFor:'testing'!
claus
parents: 99
diff changeset
   244
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
   245
canRepresent:anImage
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
   246
    "return true, if anImage can be represented in my file format.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
   247
     BMP supports depth 1,4,8 and 24."
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
   248
3571
a830f0388ef6 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3568
diff changeset
   249
    (#(1 4 8 24) includes:anImage depth) ifTrue:[^true].
a830f0388ef6 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3568
diff changeset
   250
    ('WindwsIconReader [info]: image depth is not 1,4,8 or 24.') infoPrintCR.
a830f0388ef6 #FEATURE
Claus Gittinger <cg@exept.de>
parents: 3568
diff changeset
   251
    ^ false
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
   252
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
   253
    "Created: 17.10.1997 / 20:18:23 / cg"
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
   254
!
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
   255
102
claus
parents: 99
diff changeset
   256
isValidImageFile:aFileName
claus
parents: 99
diff changeset
   257
    "return true, if aFileName contains a valid windows bitmap-file image"
claus
parents: 99
diff changeset
   258
claus
parents: 99
diff changeset
   259
    |inStream header ok|
claus
parents: 99
diff changeset
   260
claus
parents: 99
diff changeset
   261
    inStream := self streamReadingFile:aFileName.
claus
parents: 99
diff changeset
   262
    inStream isNil ifTrue:[^ false].
claus
parents: 99
diff changeset
   263
claus
parents: 99
diff changeset
   264
    inStream binary.
104
claus
parents: 103
diff changeset
   265
    ok := false.
692
e6af4c70e066 size is going to be eliminated from the stream
Claus Gittinger <cg@exept.de>
parents: 678
diff changeset
   266
    inStream fileSize > 16 ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   267
	header := ByteArray uninitializedNew:4.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   268
	inStream nextBytes:4 into:header.
102
claus
parents: 99
diff changeset
   269
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   270
	(header startsWith:#(66 77)) ifTrue:[     "BM"
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   271
	    ok := true.
104
claus
parents: 103
diff changeset
   272
"/            'WINREADER: Win3.x or OS/2 vsn 2 BM format' infoPrintNL.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   273
	].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   274
	(header startsWith:#(66 65)) ifTrue:[     "BA"
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   275
	    ok := true.
104
claus
parents: 103
diff changeset
   276
"/            'WINREADER: OS/2 vsn 2 BA format' infoPrintNL.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   277
	].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   278
	(header startsWith:#(73 67)) ifTrue:[     "IC"
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   279
	    ok := true.
104
claus
parents: 103
diff changeset
   280
"/            'WINREADER: OS/2 IC format' infoPrintNL.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   281
	].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   282
	(header startsWith:#(80 84)) ifTrue:[     "PT"
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   283
	    ok := true.
104
claus
parents: 103
diff changeset
   284
"/            'WINREADER: OS/2 PT format' infoPrintNL.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   285
	].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   286
	(header startsWith:#(0 0 1 0)) ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   287
	    ok := true.
104
claus
parents: 103
diff changeset
   288
"/            'WINREADER: Win3.x ICO format' infoPrintNL.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   289
	].
102
claus
parents: 99
diff changeset
   290
    ].
104
claus
parents: 103
diff changeset
   291
    inStream close.
claus
parents: 103
diff changeset
   292
    ^ ok
102
claus
parents: 99
diff changeset
   293
claus
parents: 99
diff changeset
   294
    "
claus
parents: 99
diff changeset
   295
     WindowsIconReader isValidImageFile:'/phys/clam2/LocalLibrary/Images/OS2_icons/dos.ico'
claus
parents: 99
diff changeset
   296
    "
claus
parents: 99
diff changeset
   297
claus
parents: 99
diff changeset
   298
    "Created: 17.9.1995 / 17:14:20 / claus"
claus
parents: 99
diff changeset
   299
! !
claus
parents: 99
diff changeset
   300
103
claus
parents: 102
diff changeset
   301
!WindowsIconReader methodsFor:'private'!
claus
parents: 102
diff changeset
   302
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   303
swapBytesFromRGB_to_BGR
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   304
    |idx bytesPerRow|
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   305
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   306
    "/ Depth24Image keeps its data r/g/b; BMP has it b/g/r (sigh)
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   307
    idx := 1.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   308
    bytesPerRow := self bytesPerRow.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   309
    1 to:height do:[:y |
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   310
	self class swap:bytesPerRow bytesFromRGB_to_BGR_in:data startingAt:idx.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   311
	idx := idx + bytesPerRow.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   312
    ].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   313
! !
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   314
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   315
!WindowsIconReader methodsFor:'private-reading'!
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   316
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   317
loadBMP1From:aStream into:aByteArray
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   318
    "load bmp-1 bit per pixel imagedata."
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   319
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   320
    compression == 0 ifFalse:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   321
	^ false
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   322
    ].
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   323
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   324
    ^ self loadUncompressedFrom:aStream into:aByteArray
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   325
!
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   326
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   327
loadBMP2From:aStream into:aByteArray
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   328
    "load bmp-2 bit per pixel imagedata."
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   329
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   330
    compression == 0 ifFalse:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   331
	^ false
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   332
    ].
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   333
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   334
    ^ self loadUncompressedFrom:aStream into:aByteArray
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   335
!
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   336
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   337
loadBMP4From:aStream into:aByteArray
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   338
    "load bmp-4 bit per pixel imagedata."
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   339
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   340
    compression == 0 ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   341
	^ self loadUncompressedFrom:aStream into:aByteArray
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   342
    ].
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   343
    compression == 2 ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   344
	^ self loadRLECompressedBMP4From:aStream into:aByteArray
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   345
    ].
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   346
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   347
    ^ false
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   348
!
160
ee4d64b12c94 handle depth 24 rgb BMP files
Claus Gittinger <cg@exept.de>
parents: 114
diff changeset
   349
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   350
loadBMPWidth:w height:h bytesPerPixel:bpp from:aStream into:data
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   351
    |buff idx fileBytesPerRow imgBytesPerRow align|
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   352
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   353
    align := 4.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   354
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   355
    compression == 0 ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   356
	imgBytesPerRow := w * bpp.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   357
	fileBytesPerRow := imgBytesPerRow.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   358
	(fileBytesPerRow bitAnd:(align-1)) ~~ 0 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   359
	    fileBytesPerRow := (fileBytesPerRow bitAnd:((align-1) bitInvert)) + align.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   360
	].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   361
	"/
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   362
	"/ stupid - last row comes first
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   363
	"/
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   364
	idx := imgBytesPerRow * (h - 1) + 1.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   365
	buff := ByteArray uninitializedNew:fileBytesPerRow.
160
ee4d64b12c94 handle depth 24 rgb BMP files
Claus Gittinger <cg@exept.de>
parents: 114
diff changeset
   366
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   367
	1 to:h do:[:row |
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   368
	    (aStream nextBytes:fileBytesPerRow into:buff) ~~ fileBytesPerRow ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   369
		^ false
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   370
	    ].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   371
	    data replaceFrom:idx to:idx+imgBytesPerRow-1 with:buff.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   372
	    idx := idx - imgBytesPerRow.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   373
	].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   374
	^ true
160
ee4d64b12c94 handle depth 24 rgb BMP files
Claus Gittinger <cg@exept.de>
parents: 114
diff changeset
   375
    ].
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   376
    ^ false.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   377
!
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   378
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   379
loadBMPWidth:w height:h depth:d from:aStream into:data
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   380
    "helper: load a BMP image"
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   381
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   382
    d == 8 ifTrue:[
2756
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   383
        compression == 0 ifTrue:[
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   384
            ^ self loadUncompressedFrom:aStream into:data.
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   385
        ].
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   386
        compression == 1 ifTrue:[
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   387
            ^ self loadRLECompressedBMP8From:aStream into:data.
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   388
        ].
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   389
        self breakPoint:#cg info:'unhandled compression'.
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   390
        ^ false
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   391
    ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   392
    d == 4 ifTrue:[
2756
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   393
        ^ self loadBMP4From:aStream into:data
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   394
    ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   395
    d == 2 ifTrue:[
2756
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   396
        ^ self loadBMP2From:aStream into:data
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   397
    ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   398
    d == 1 ifTrue:[
2756
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   399
        ^ self loadBMP1From:aStream into:data
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   400
    ].
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   401
    ((d == 16)
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   402
    or:[ (d == 24)
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   403
    or:[ (d == 32) ]]) ifTrue:[
2756
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   404
        (self loadBMPWidth:w height:h bytesPerPixel:(d // 8) from:aStream into:data) ifFalse:[
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   405
            ^ false
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   406
        ].
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   407
        inDepth == 16 ifTrue:[
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   408
            "/ Depth16Image keeps its data MSB (sigh); here they come LSB.
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   409
            data swapBytes.
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   410
        ].
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   411
        inDepth == 24 ifTrue:[
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   412
            "/ Depth24Image keeps its data r/g/b; BMP has it b/g/r (sigh)
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   413
            self swapBytesFromRGB_to_BGR.
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   414
        ].
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   415
2756
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
   416
        ^ true
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   417
    ].
819
e358c08e45ea common error reporter
Claus Gittinger <cg@exept.de>
parents: 713
diff changeset
   418
    ^ false
103
claus
parents: 102
diff changeset
   419
819
e358c08e45ea common error reporter
Claus Gittinger <cg@exept.de>
parents: 713
diff changeset
   420
    "Created: / 17.9.1995 / 18:48:11 / claus"
e358c08e45ea common error reporter
Claus Gittinger <cg@exept.de>
parents: 713
diff changeset
   421
    "Modified: / 3.2.1998 / 20:21:16 / cg"
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   422
!
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   423
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   424
loadRLECompressedBMP8From:aStream into:aByteArray
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   425
    "load bmp-8 bit per pixel imagedata"
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   426
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   427
    |bytesPerRowInData x y dstIndex lineStartIndex cnt clr code n|
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   428
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   429
    bytesPerRowInData := self bytesPerRow.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   430
    x := 0.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   431
    y := height - 1.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   432
    lineStartIndex := (y * bytesPerRowInData) + 1.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   433
    dstIndex := lineStartIndex.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   434
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   435
    [ y < height ] whileTrue:[
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   436
        cnt := aStream nextByte.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   437
        clr := aStream nextByte.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   438
        cnt ~~ 0 ifTrue:[
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   439
            aByteArray from:dstIndex to:dstIndex+cnt-1 put:clr.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   440
            x := x + cnt.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   441
            dstIndex := dstIndex + cnt.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   442
        ] ifFalse:[
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   443
            "/ cnt == 0: escape codes */
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   444
            code := clr.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   445
            code == 0 ifTrue:[
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   446
                "/ end of line
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   447
                x := 0.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   448
                y := y - 1.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   449
                lineStartIndex := lineStartIndex - bytesPerRowInData.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   450
                dstIndex := lineStartIndex.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   451
            ] ifFalse:[
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   452
                code == 1 ifTrue:[
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   453
                    "/ end of pic
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   454
                    ^ true
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   455
                ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   456
                code == 2 ifTrue:[
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   457
                    "/ delta
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   458
                    x := x + aStream nextSignedByte.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   459
                    y := y - aStream nextSignedByte.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   460
                    lineStartIndex := (y * bytesPerRowInData) + 1.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   461
                    dstIndex := lineStartIndex + x.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   462
                ] ifFalse:[
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   463
                    "/ absolute; cnt pixels coming
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   464
                    cnt := code.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   465
                    n := aStream nextBytes:cnt into:aByteArray startingAt:dstIndex.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   466
                    n ~~ cnt ifTrue:[^ false].
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   467
                    x := x + cnt.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   468
                    dstIndex := dstIndex + cnt.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   469
                    "/ odd count - padd
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   470
                    cnt odd ifTrue:[
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   471
                        aStream skip:1.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   472
                    ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   473
                ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   474
            ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   475
        ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   476
    ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   477
    ^ true.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   478
!
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   479
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   480
loadUncompressedFrom:aStream into:aByteArray
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   481
    "load bmp-1,2,4 and 8 bit per pixel imagedata."
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   482
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   483
    |bytesPerRowInStream bytesPerRowInData skip dstIndex n|
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   484
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   485
    compression == 0 ifFalse:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   486
	^ false
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   487
    ].
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   488
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   489
    bytesPerRowInStream := Image bytesPerRowForWidth:width depth:inDepth padding:32.
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   490
    bytesPerRowInData := self bytesPerRow.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   491
    skip := bytesPerRowInStream - bytesPerRowInData.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   492
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   493
    "/ bottom row first...
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   494
    dstIndex := (height - 1) * bytesPerRowInData + 1.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   495
    height to:1 by:-1 do:[:y |
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   496
	n := aStream nextBytes:bytesPerRowInData into:aByteArray startingAt:dstIndex.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   497
	n ~~ bytesPerRowInData ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   498
	    ^ false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   499
	].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   500
	skip ~~ 0 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   501
	    aStream skip:skip.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   502
	].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   503
	dstIndex := dstIndex - bytesPerRowInData.
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   504
    ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   505
    ^ true.
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   506
!
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   507
1848
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   508
readColorMap:nColors numBytesPerColor:nRawBytesPerColor from:aStream
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   509
    "read the colormap; notice: its in BGR order (sigh)."
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   510
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   511
    |rawMap rMap gMap bMap
1848
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   512
     srcIndex  "{ Class: SmallInteger }"
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   513
     skipDelta "{ Class: SmallInteger }"|
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   514
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   515
    rawMap := ByteArray uninitializedNew:(nColors*nRawBytesPerColor).
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   516
    aStream nextBytes:(nColors*nRawBytesPerColor) into:rawMap.
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   517
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   518
    rMap := ByteArray new:nColors.
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   519
    gMap := ByteArray new:nColors.
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   520
    bMap := ByteArray new:nColors.
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   521
    srcIndex := 1.
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   522
    skipDelta := nRawBytesPerColor - 3.
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   523
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   524
    "/ stupid: this is a BGR-ordered map (otherwise, could use #rgbBytesVector:-message)
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   525
    "/ also, there might be a fourth byte (alpha ?) which is (currently) skipped.
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   526
    1 to:nColors do:[:i |
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   527
	bMap at:i put:(rawMap at:srcIndex).
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   528
	srcIndex := srcIndex + 1.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   529
	gMap at:i put:(rawMap at:srcIndex).
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   530
	srcIndex := srcIndex + 1.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   531
	rMap at:i put:(rawMap at:srcIndex).
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   532
	srcIndex := srcIndex + 1.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   533
	srcIndex := srcIndex + skipDelta.
1848
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   534
    ].
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   535
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   536
    ^ MappedPalette
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   537
	redVector:rMap
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   538
	greenVector:gMap
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   539
	blueVector:bMap.
1848
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   540
! !
864ca2cd4e71 category
Claus Gittinger <cg@exept.de>
parents: 1846
diff changeset
   541
1805
93f557cbe600 category changes
Claus Gittinger <cg@exept.de>
parents: 1790
diff changeset
   542
!WindowsIconReader methodsFor:'reading'!
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   543
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   544
fromOS2File:aFilename
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   545
    "read an image from an OS/2 BMP file"
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   546
41
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   547
    |reader stream|
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   548
1790
41f36b5a29c3 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1759
diff changeset
   549
    stream := self class streamReadingFile:aFilename.
41
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   550
    stream isNil ifTrue:[^ nil].
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   551
    reader := self class new.
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   552
    reader fromOS2Stream:stream.
41
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   553
    stream close.
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   554
    ^ reader image
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   555
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   556
    "Modified: / 30-05-2007 / 16:52:50 / cg"
21
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
   557
!
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   558
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   559
fromOS2Stream:aStream
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   560
    "read an image from an OS/2 BMP stream"
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   561
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   562
    ^ self fromOS2Stream:aStream alreadyRead:nil
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   563
!
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   564
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   565
fromOS2Stream:aStream alreadyRead:bytesAlreadyRead
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   566
    "read an image from an OS/2 BMP stream"
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   567
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   568
    |header inBytesPerRow mask bytesPerRow nColors nByte|
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   569
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   570
    inStream := aStream.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   571
    aStream binary.
2031
c8527bd15f50 .ico stuff - ongoing work
Claus Gittinger <cg@exept.de>
parents: 1848
diff changeset
   572
    byteOrder := #lsb.
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   573
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   574
    "read the header"
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   575
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   576
    header := ByteArray uninitializedNew:8r110.
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   577
    bytesAlreadyRead size > 0 ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   578
	header replaceFrom:1 with:bytesAlreadyRead
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   579
    ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   580
    aStream nextBytes:(16-bytesAlreadyRead size) into:header startingAt:(1+bytesAlreadyRead size).
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   581
445
899af8ff2a5d checkin from browser
Claus Gittinger <cg@exept.de>
parents: 430
diff changeset
   582
    (header startsWith:#(73 67)) ifTrue:[         "IC"
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   583
	"IC format"
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   584
	aStream nextBytes:10 into:header startingAt:17.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   585
	width := header at:7.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   586
	height := header at:9.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   587
	inDepth := 2 "header at:11". "where is it"
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   588
    ] ifFalse:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   589
	(header startsWith:#(67 73)) ifTrue:[     "CI"
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   590
	    ^ self fileFormatError:'unsupported format: CI'.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   591
	] ifFalse:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   592
	    aStream nextBytes:(8r110-16) into:header startingAt:17.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   593
	    width := header at:8r101.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   594
	    height := header at:8r103.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   595
	    inDepth := header at:8r107.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   596
	]
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   597
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   598
1846
d29322944b05 dimensionReport
Claus Gittinger <cg@exept.de>
parents: 1805
diff changeset
   599
    self reportDimension.
d29322944b05 dimensionReport
Claus Gittinger <cg@exept.de>
parents: 1805
diff changeset
   600
1745
4fa0fad2a463 code cleanup (colorMap handling)
Claus Gittinger <cg@exept.de>
parents: 1734
diff changeset
   601
    "read the colormap; notice: its in BGR order (sigh)"
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   602
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   603
    nColors := 1 bitShift:inDepth.
1745
4fa0fad2a463 code cleanup (colorMap handling)
Claus Gittinger <cg@exept.de>
parents: 1734
diff changeset
   604
    colorMap := self readColorMap:nColors numBytesPerColor:3 from:aStream.
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   605
1745
4fa0fad2a463 code cleanup (colorMap handling)
Claus Gittinger <cg@exept.de>
parents: 1734
diff changeset
   606
    "read the mask"
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   607
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   608
    nByte := ((width * height) + 7) // 8.
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   609
    mask := ByteArray uninitializedNew:nByte.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   610
    aStream nextBytes:nByte into:mask.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   611
1745
4fa0fad2a463 code cleanup (colorMap handling)
Claus Gittinger <cg@exept.de>
parents: 1734
diff changeset
   612
    "what is this ?"
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   613
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   614
    aStream nextBytes:nByte into:mask.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   615
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   616
"/    "read the data bits"
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   617
"/
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   618
"/    bytesPerRow := width * inDepth + 7 // 8.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   619
"/    data4 := ByteArray uninitializedNew:(height * bytesPerRow).
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   620
"/    inDepth == 8 ifTrue:[
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   621
"/    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   622
"/    aStream nextBytes:(height * bytesPerRow) into:data4.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   623
"/
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   624
"/    "stupid: last row first"
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   625
"/
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   626
"/    tmp := ByteArray new:(height * bytesPerRow).
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   627
"/    srcIndex := 1.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   628
"/    dstIndex := (height - 1) * bytesPerRow + 1.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   629
"/    1 to:height do:[:row |
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   630
"/        tmp replaceFrom:dstIndex to:(dstIndex + bytesPerRow - 1)
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   631
"/                   with:data4 startingAt:srcIndex.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   632
"/        srcIndex := srcIndex + bytesPerRow.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   633
"/        dstIndex := dstIndex - bytesPerRow.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   634
"/    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   635
"/    data4 := tmp.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   636
"/
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   637
"/    "expand into bytes"
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   638
"/
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   639
"/    data := ByteArray new:(width * height).
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   640
"/    data4 expandPixels:inDepth width:width height:height
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   641
"/                  into:data mapping:nil.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   642
"/
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   643
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   644
    bytesPerRow := ((width * inDepth) + 7) // 8.
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   645
    "/ bmp data is always 32bit aligned; if required,
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   646
    inBytesPerRow := ((bytesPerRow + 3) // 4) * 4.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   647
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   648
    data := ByteArray uninitializedNew:(height * width "bytesPerRow").
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   649
    compression := 0.
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   650
    (self loadBMPWidth:width height:height depth:inDepth from:aStream into:data) ifFalse:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   651
	^ nil
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   652
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   653
    photometric := #palette.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   654
    samplesPerPixel := 1.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   655
    bitsPerSample := #(8).
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   656
    ^ self image
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   657
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   658
    "
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   659
     |i f|
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   660
     i := Image fromFile:'/LocalLibrary/Images/OS2/dos3.ico'.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   661
     f := i asFormOn:Display.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   662
     v displayOpaqueForm:(f magnifyBy:2@2) x:5 y:5
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   663
    "
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   664
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   665
    "Modified: / 17-09-1995 / 18:49:24 / claus"
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   666
    "Modified: / 30-05-2007 / 16:53:24 / cg"
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   667
!
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   668
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   669
fromStream:aStream
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   670
    "figure out which format the stream contains
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   671
     (there are various different bmp/ico formats around)
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   672
     and read the image."
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   673
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   674
    |fileSize header|
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   675
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   676
    inStream := aStream.
2031
c8527bd15f50 .ico stuff - ongoing work
Claus Gittinger <cg@exept.de>
parents: 1848
diff changeset
   677
    byteOrder := #lsb.
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   678
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   679
    aStream binary.
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   680
    aStream isFileStream ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   681
	fileSize := aStream fileSize.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   682
	fileSize < 16 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   683
	    ^ self fileFormatError:'short file'.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   684
	].
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   685
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   686
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   687
    header := ByteArray uninitializedNew:4.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   688
    aStream nextBytes:4 into:header.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   689
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   690
    (header startsWith:#(66 77)) ifTrue:[     "BM"
387
0f4c8ef0e973 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 298
diff changeset
   691
"/        'WinIconReader [info]: Win3.x or OS/2 vsn 2 BM format' infoPrintNL.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   692
	^ self fromWindowsBMPStream:aStream alreadyRead:header
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   693
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   694
    (header startsWith:#(66 65)) ifTrue:[     "BA"
387
0f4c8ef0e973 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 298
diff changeset
   695
"/        'WinIconReader [info]: OS/2 vsn 2 BA format' infoPrintNL.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   696
	^ self fromOS2Stream:aStream alreadyRead:header
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   697
    ].
445
899af8ff2a5d checkin from browser
Claus Gittinger <cg@exept.de>
parents: 430
diff changeset
   698
    (header startsWith:#(67 73)) ifTrue:[     "CI"
899af8ff2a5d checkin from browser
Claus Gittinger <cg@exept.de>
parents: 430
diff changeset
   699
"/        'WinIconReader [info]: OS/2 vsn 2 BA format' infoPrintNL.
2031
c8527bd15f50 .ico stuff - ongoing work
Claus Gittinger <cg@exept.de>
parents: 1848
diff changeset
   700
"/        ^ self fromOS2Stream:aStream
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   701
	^ self fileFormatError:'OS/2 CI format not supported'.
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   702
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   703
    (header startsWith:#(73 67)) ifTrue:[     "IC"
387
0f4c8ef0e973 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 298
diff changeset
   704
"/        'WinIconReader [info]: OS/2 IC format' infoPrintNL.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   705
	^ self fromOS2Stream:aStream alreadyRead:header
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   706
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   707
    (header startsWith:#(80 84)) ifTrue:[     "PT"
387
0f4c8ef0e973 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 298
diff changeset
   708
"/        'WinIconReader [info]: OS/2 PT format' infoPrintNL.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   709
	^ self fromOS2Stream:aStream alreadyRead:header
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   710
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   711
    (header startsWith:#(16r53 16r5A)) ifTrue:[     "SZ"
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
   712
"/        'WinIconReader [info]: OS/2 SZ format' infoPrintNL.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
   713
"/        ^ self fromOS2Stream:aStream
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   714
	^ self fileFormatError:'OS/2 SZ format not supported'.
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   715
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   716
    (header startsWith:#(0 0 1 0)) ifTrue:[
387
0f4c8ef0e973 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 298
diff changeset
   717
"/        'WinIconReader [info]: Win3.x ICO format' infoPrintNL.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   718
	^ self fromWindowsICOStream:aStream alreadyRead:header
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   719
    ].
819
e358c08e45ea common error reporter
Claus Gittinger <cg@exept.de>
parents: 713
diff changeset
   720
    ^ self fileFormatError:('format not supported:'
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   721
			    , ((header at:1) printStringRadix:16)
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   722
			    , ' '
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   723
			    , ((header at:2) printStringRadix:16)).
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   724
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   725
    "
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   726
     Image fromFile:'/phys/clam//LocalLibrary/Images/OS2_icons/dos.ico'
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   727
    "
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   728
819
e358c08e45ea common error reporter
Claus Gittinger <cg@exept.de>
parents: 713
diff changeset
   729
    "Modified: / 17.9.1995 / 18:59:07 / claus"
e358c08e45ea common error reporter
Claus Gittinger <cg@exept.de>
parents: 713
diff changeset
   730
    "Modified: / 3.2.1998 / 20:18:14 / cg"
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   731
!
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   732
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   733
fromWindowsBMPFile: aFilename
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   734
    "read an image from a windows BMP file"
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   735
41
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   736
    |reader stream|
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   737
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   738
    stream := self class streamReadingFile:aFilename.
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   739
    stream isNil ifTrue:[^ nil].
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   740
    reader := self class new.
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   741
    reader fromWindowsBMPStream:stream.
41
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   742
    stream close.
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   743
    ^ reader image.
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   744
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   745
    "Modified: / 30-05-2007 / 16:53:48 / cg"
21
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
   746
!
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
   747
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   748
fromWindowsBMPStream:aStream
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   749
    "read an image from a windows BMP stream"
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   750
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   751
    ^ self fromWindowsBMPStream:aStream alreadyRead:nil
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   752
!
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   753
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   754
fromWindowsBMPStream:aStream alreadyRead:bytesAlreadyRead
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   755
    "read an image from a windows BMP stream"
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   756
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   757
    | header iSize inPlanes
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   758
      imgSize resH resV numColor numImportantColor
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   759
      dataStart redMask greenMask blueMask alphaMask
1745
4fa0fad2a463 code cleanup (colorMap handling)
Claus Gittinger <cg@exept.de>
parents: 1734
diff changeset
   760
      bytesPerRow numBytesPerColorInColormap|
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   761
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   762
    inStream := aStream.
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   763
    aStream binary.
2031
c8527bd15f50 .ico stuff - ongoing work
Claus Gittinger <cg@exept.de>
parents: 1848
diff changeset
   764
    byteOrder := #lsb.
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   765
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   766
    "read the header"
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   767
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   768
    header := ByteArray uninitializedNew:16r54.
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   769
    bytesAlreadyRead size > 0 ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   770
	header replaceFrom:1 with:bytesAlreadyRead
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   771
    ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   772
    aStream nextBytes:(18-bytesAlreadyRead size) into:header startingAt:(1+bytesAlreadyRead size).
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   773
518
c9d492fbb1b6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 445
diff changeset
   774
    iSize := header at:(16r0E + 1).
c9d492fbb1b6 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 445
diff changeset
   775
    (iSize == 40) ifTrue:[    "header-size"
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   776
	"/
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   777
	"/ a Windows3.x BMP file
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   778
	"/
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   779
	"/ 'WinIconReader [info]: Win3.x format' infoPrintCR.
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   780
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   781
	aStream nextBytes:(40-4) into:header startingAt:19.
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   782
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   783
	width := header wordAt:(16r12 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   784
	height := header wordAt:(16r16 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   785
	inPlanes := header wordAt:(16r1A + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   786
	inDepth := header wordAt:(16r1C + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   787
	compression := header wordAt:(16r1E + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   788
	imgSize := header doubleWordAt:(16r22 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   789
	resH := header doubleWordAt:(16r26 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   790
	resV := header doubleWordAt:(16r2A + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   791
	numColor := header doubleWordAt:(16r2E + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   792
	numImportantColor := header doubleWordAt:(16r32 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   793
	redMask := header doubleWordAt:(16r36 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   794
	greenMask := header doubleWordAt:(16r3A + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   795
	blueMask := header doubleWordAt:(16r3E + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   796
	alphaMask := header doubleWordAt:(16r42 + 1) MSB:false.
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   797
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   798
	numColor == 0 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   799
	    "
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   800
	     some bmp-writers seem to leave this as zero (which is wrong)
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   801
	    "
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   802
	    inDepth <= 8 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   803
		numColor := 1 bitShift:inDepth.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   804
		"/ 'WinIconReader [warning]: missing nColor in header - assume ' infoPrint. numColor infoPrintCR
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   805
	    ]
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   806
	].
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   807
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   808
	numBytesPerColorInColormap := 4.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   809
	dataStart := header wordAt:(16r0A + 1) MSB:false
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   810
    ] ifFalse:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   811
	((iSize == 12) or:[iSize >= 64]) ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   812
	    "/
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   813
	    "/ its an OS/2 BMP file
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   814
	    "/
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   815
	    "/ 'WinIconReader [info]: OS/2 format' infoPrintCR.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   816
	    aStream nextBytes:(iSize-4) into:header startingAt:19.
1745
4fa0fad2a463 code cleanup (colorMap handling)
Claus Gittinger <cg@exept.de>
parents: 1734
diff changeset
   817
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   818
	    numBytesPerColorInColormap := 3.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   819
	    dataStart := nil.
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   820
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   821
	    iSize == 12 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   822
		width := header wordAt:(16r12 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   823
		height := header wordAt:(16r14 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   824
		inPlanes := header wordAt:(16r16 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   825
		inDepth := header wordAt:(16r18 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   826
		"/ dataStart := header wordAt:(16r0A + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   827
		compression := 0.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   828
	    ].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   829
	    iSize >= 64 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   830
		"/
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   831
		"/ its an OS/2 (vsn2) BMP file
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   832
		"/
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   833
		width := header doubleWordAt:(16r12 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   834
		height := header doubleWordAt:(16r16 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   835
		inPlanes := header wordAt:(16r1A + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   836
		inDepth := header wordAt:(16r1c + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   837
		compression := header doubleWordAt:(16r1e + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   838
		numColor := header doubleWordAt:(16r2E + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   839
		numImportantColor := header doubleWordAt:(16r32 + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   840
		dataStart := header wordAt:(16r0A + 1) MSB:false.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   841
	    ].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   842
	    numColor := 1 bitShift:inDepth.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   843
	] ifFalse:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   844
	    ^ self fileFormatError:'unknown format'.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   845
	].
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   846
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   847
1846
d29322944b05 dimensionReport
Claus Gittinger <cg@exept.de>
parents: 1805
diff changeset
   848
    self reportDimension.
d29322944b05 dimensionReport
Claus Gittinger <cg@exept.de>
parents: 1805
diff changeset
   849
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   850
    numColor ~~ 0 ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   851
	"read the colormap - notice: its in BGR order (sigh)"
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   852
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   853
	colorMap := self
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   854
			readColorMap:numColor
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   855
			numBytesPerColor:numBytesPerColorInColormap
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   856
			from:aStream.
1745
4fa0fad2a463 code cleanup (colorMap handling)
Claus Gittinger <cg@exept.de>
parents: 1734
diff changeset
   857
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   858
	numColor > (1 bitShift:inDepth) ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   859
	    'funny number of colors in image' infoPrintCR.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   860
	    numColor := 1 bitShift:inDepth.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   861
	    colorMap := colorMap copyTo:numColor.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   862
	].
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   863
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   864
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   865
    "/ check for valid compression
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   866
    compression ~~ 0 ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   867
	"/ some compression
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   868
	compression == 1 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   869
	    "/ RLE8 - must be depth-8
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   870
	    inDepth ~~ 8 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   871
		^ self fileFormatError:'RLE8 compression only supported with depth8 images'.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   872
	    ].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   873
	].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   874
	compression == 2 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   875
	    "/ RLE4 - must be depth-4
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   876
	    inDepth ~~ 4 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   877
		^ self fileFormatError:'RLE4 compression only supported with depth4 images'.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   878
	    ].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   879
	].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   880
	compression == 3 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   881
	    "/ BITFIELDS - must be depth-16 or 32
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   882
	    ((inDepth ~~ 16) and:[inDepth ~~ 32]) ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   883
		^ self fileFormatError:'BITFIELDS compression only supported with depth16/32 images'.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   884
	    ].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   885
	].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   886
	compression >= 4 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   887
	     ^ self fileFormatError:'unsupported compression'.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   888
	].
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   889
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   890
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   891
    inPlanes ~~ 1 ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   892
	^ self fileFormatError:'only 1 plane images supported'.
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   893
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   894
565
03b84a590f49 fixed os2 bmp reading
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
   895
    dataStart notNil ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   896
	aStream position:dataStart.
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   897
    ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   898
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   899
    inDepth <= 8 ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   900
	samplesPerPixel := 1.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   901
	bitsPerSample := Array with:inDepth.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   902
	photometric := #palette.
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   903
    ] ifFalse:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   904
	inDepth == 16 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   905
	    photometric := #palette.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   906
	    samplesPerPixel := 3.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   907
	    bitsPerSample := #(5 5 5).
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   908
	    colorMap := FixedPalette
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   909
			    redShift:10 redMask:16r1f
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   910
			    greenShift:5 greenMask:16r1f
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   911
			    blueShift:0 blueMask:16r1F.
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   912
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   913
	] ifFalse:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   914
	    inDepth == 24 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   915
		photometric := #rgb.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   916
		samplesPerPixel := 3.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   917
		bitsPerSample := #(8 8 8).
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   918
	    ] ifFalse:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   919
		inDepth == 32 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   920
		    photometric := #rgb.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   921
		    samplesPerPixel := 4.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   922
		    bitsPerSample := #(8 8 8 8).
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   923
		] ifFalse:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   924
		    ^ self fileFormatError:'unsupported depth'.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   925
		]
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   926
	    ]
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   927
	]
565
03b84a590f49 fixed os2 bmp reading
Claus Gittinger <cg@exept.de>
parents: 518
diff changeset
   928
    ].
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   929
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   930
    inDepth == 24 ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   931
	bytesPerRow := width * 3
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   932
    ] ifFalse:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   933
	inDepth == 16 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   934
	    bytesPerRow := width * 2
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   935
	] ifFalse:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   936
	    inDepth == 32 ifTrue:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   937
		bytesPerRow := width * 4
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   938
	    ] ifFalse:[
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   939
		bytesPerRow := self bytesPerRow
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   940
	    ].
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   941
	].
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   942
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   943
    data := ByteArray uninitializedNew:(height * bytesPerRow).
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   944
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   945
    "/ read & possibly decompress
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   946
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   947
    (self loadBMPWidth:width height:height depth:inDepth from:aStream into:data) ifFalse:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   948
	self fileFormatError:('read/decompression error').
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   949
	^ nil
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   950
    ].
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   951
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   952
    ^ self image
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   953
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   954
    "Modified: / 17-09-1995 / 18:48:46 / claus"
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   955
    "Modified: / 30-05-2007 / 16:57:39 / cg"
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   956
!
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
   957
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   958
fromWindowsICOFile:aFilename
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   959
    "read an image from a windows ICO file"
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   960
41
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   961
    |reader stream|
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   962
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   963
    stream := self class streamReadingFile:aFilename.
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   964
    stream isNil ifTrue:[^ nil].
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   965
    reader := self class new.
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   966
    reader fromWindowsICOStream:stream.
41
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   967
    stream close.
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   968
    ^ reader image.
21
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
   969
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
   970
    "
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
   971
     Image fromFile:'/phys/clam2//LocalLibrary/Images/WIN_icons/ibm.ico'.
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
   972
    "
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   973
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
   974
    "Modified: / 30-05-2007 / 16:57:52 / cg"
21
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
   975
!
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
   976
41
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   977
fromWindowsICOStream:aStream
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   978
    "read an image from a windows ICO stream"
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
   979
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   980
    ^ self fromWindowsICOStream:aStream alreadyRead:nil
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   981
!
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   982
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   983
fromWindowsICOStream:aStream alreadyRead:bytesAlreadyRead
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   984
    "read an image from a windows ICO stream"
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   985
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
   986
    |header
2034
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
   987
     srcIndex dstIndex
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
   988
     rawData tmp bytesPerRow nColor cmapSize|
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   989
41
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   990
    inStream := aStream.
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
   991
    aStream binary.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   992
3f9277473954 Initial revision
claus
parents:
diff changeset
   993
    "read the header"
3f9277473954 Initial revision
claus
parents:
diff changeset
   994
2034
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
   995
    header := ByteArray uninitializedNew:(6 + 16 + 40).
3404
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
   996
    bytesAlreadyRead notEmptyOrNil ifTrue:[
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
   997
        header replaceFrom:1 with:bytesAlreadyRead
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   998
    ].
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
   999
    aStream nextBytes:((6 + 16 + 40)-bytesAlreadyRead size) into:header startingAt:(1+bytesAlreadyRead size).
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
  1000
21
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
  1001
    width := header at:(6+1).
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
  1002
    height := header at:(7+1).
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
  1003
    nColor := header at:(8+1).
430
50b841f4851d commentary
Claus Gittinger <cg@exept.de>
parents: 398
diff changeset
  1004
    "/ reserved := header at:(9+1).
2034
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
  1005
    "/ nPlanes := header wordAt:(10+1).
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
  1006
    "/ nBitsPerPel := header wordAt:(12+1).
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
  1007
    "/ nBytesInResource := header doubleWordAt:(14+1).
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
  1008
    "/ ordinal := header wordAt:(18+1).
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
  1009
    "21, 22               ?"
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
  1010
    "23, ... , 62         ?"
21
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
  1011
2034
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
  1012
    inDepth := header at:16r25.
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
  1013
    "/ mhmh - some depth4 icons seem to have a 0 in the depth field ...
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
  1014
    inDepth == 0 ifTrue:[
3404
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1015
        inDepth := 4
1386
2d02a4fba456 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1385
diff changeset
  1016
    ].
3404
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1017
    (#(4 8 32) includes:inDepth) ifFalse:[
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1018
        "/ only tested for depth 4/8 images.
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1019
        ^ self fileFormatError:'only depth 4/8/32 ico-images supported (depth is ' , inDepth printString , ')'.
1569
3954e576ff38 support depth 8 ico files
Claus Gittinger <cg@exept.de>
parents: 1507
diff changeset
  1020
"/        self halt:'only depth 4 ico-images supported (depth is ' , inDepth printString , ')'.
1171
d848c46349ab sorry: only depth4 images are handled.
Claus Gittinger <cg@exept.de>
parents: 1168
diff changeset
  1021
    ].
1846
d29322944b05 dimensionReport
Claus Gittinger <cg@exept.de>
parents: 1805
diff changeset
  1022
    self reportDimension.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1023
3404
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1024
    nColor > 0 ifTrue:[
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1025
        "read the colormap"
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1026
        cmapSize := (1 bitShift:inDepth).
2034
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
  1027
3404
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1028
        colorMap := self readColorMap:cmapSize numBytesPerColor:4 from:aStream.
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1029
    ].
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1030
2034
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
  1031
    "read the data bits"
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1032
2571
ae60c0d0452d many fixes
Claus Gittinger <cg@exept.de>
parents: 2333
diff changeset
  1033
    bytesPerRow := ((width * inDepth) + 7) // 8.
1569
3954e576ff38 support depth 8 ico files
Claus Gittinger <cg@exept.de>
parents: 1507
diff changeset
  1034
    rawData := ByteArray uninitializedNew:(height * bytesPerRow).
3954e576ff38 support depth 8 ico files
Claus Gittinger <cg@exept.de>
parents: 1507
diff changeset
  1035
    aStream nextBytes:(height * bytesPerRow) into:rawData.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1036
3f9277473954 Initial revision
claus
parents:
diff changeset
  1037
    "read mask"
2034
Claus Gittinger <cg@exept.de>
parents: 2031
diff changeset
  1038
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1039
"
3f9277473954 Initial revision
claus
parents:
diff changeset
  1040
    mask := ByteArray new:(width * height / 8).
41
66edc847b9c8 *** empty log message ***
claus
parents: 36
diff changeset
  1041
    aStream nextBytes:(width * height / 8) into:mask.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1042
"
3f9277473954 Initial revision
claus
parents:
diff changeset
  1043
3f9277473954 Initial revision
claus
parents:
diff changeset
  1044
    "stupid: last row first"
3f9277473954 Initial revision
claus
parents:
diff changeset
  1045
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
  1046
    tmp := ByteArray uninitializedNew:(height * bytesPerRow).
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1047
    srcIndex := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
  1048
    dstIndex := (height - 1) * bytesPerRow + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
  1049
    1 to:height do:[:row |
3404
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1050
        tmp replaceFrom:dstIndex to:(dstIndex + bytesPerRow - 1)
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1051
                   with:rawData startingAt:srcIndex.
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1052
        srcIndex := srcIndex + bytesPerRow.
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1053
        dstIndex := dstIndex - bytesPerRow.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1054
    ].
3568
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1055
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1056
    inDepth == 32 ifTrue:[
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1057
        srcIndex := 1.
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1058
        1 to:height do:[:row |
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1059
            1 to:width do:[:row |
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1060
                |b1 b2 b3 b4|
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1061
                b1 := tmp at:srcIndex.
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1062
                b2 := tmp at:srcIndex+1.
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1063
                b3 := tmp at:srcIndex+2.
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1064
                b4 := tmp at:srcIndex+3.
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1065
                tmp at:srcIndex put:b3.
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1066
                tmp at:srcIndex+2 put:b1.
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1067
                
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1068
                srcIndex := srcIndex + 4.
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1069
            ].
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1070
        ].
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1071
    ].
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1072
1569
3954e576ff38 support depth 8 ico files
Claus Gittinger <cg@exept.de>
parents: 1507
diff changeset
  1073
    rawData := tmp.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1074
3404
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1075
    nColor > 0 ifTrue:[
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1076
        photometric := #palette.
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1077
        samplesPerPixel := 1.
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1078
        bitsPerSample := (Array with:inDepth).
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1079
    ] ifFalse:[
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1080
        inDepth == 32 ifTrue:[
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1081
            photometric := #rgba.
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1082
            samplesPerPixel := 4.
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1083
            bitsPerSample := #(8 8 8 8).
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1084
        ] ifFalse:[
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1085
            ^ self fileFormatError:'unsupported image depth: ' , inDepth printString.
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1086
        ]
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1087
    ].
298
cd59c474524a return .ico files as Depth4Images (not Depth8)
Claus Gittinger <cg@exept.de>
parents: 259
diff changeset
  1088
3404
703c3b400e7d class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 3213
diff changeset
  1089
    data := rawData.
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
  1090
    ^ self image
298
cd59c474524a return .ico files as Depth4Images (not Depth8)
Claus Gittinger <cg@exept.de>
parents: 259
diff changeset
  1091
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1092
    "
21
66b31c91177f *** empty log message ***
claus
parents: 18
diff changeset
  1093
     WindowsIconReader new fromWindowsICOFile:'/phys/clam2//LocalLibrary/Images/WIN_icons/ibm.ico'.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1094
    "
211
3eb140e89e2e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 172
diff changeset
  1095
2333
a93f1f5392bd from*Stream: methods return the image
Claus Gittinger <cg@exept.de>
parents: 2034
diff changeset
  1096
    "Modified: / 30-05-2007 / 16:58:11 / cg"
1805
93f557cbe600 category changes
Claus Gittinger <cg@exept.de>
parents: 1790
diff changeset
  1097
! !
93f557cbe600 category changes
Claus Gittinger <cg@exept.de>
parents: 1790
diff changeset
  1098
93f557cbe600 category changes
Claus Gittinger <cg@exept.de>
parents: 1790
diff changeset
  1099
!WindowsIconReader methodsFor:'writing'!
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1100
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1101
save:image onFile:aFileName
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1102
    "save image as BMP file on aFileName.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1103
     Only depth 1,4,8 and 24 images can be represented in this format."
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1104
1168
590e5660f69e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
  1105
    aFileName asFilename suffix asLowercase = 'ico' ifTrue:[
590e5660f69e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
  1106
"/        (image depth == 4
590e5660f69e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
  1107
"/        and:[image width == 32
590e5660f69e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
  1108
"/        and:[image height == 32]]) ifTrue:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1109
	    ^ self saveICO:image onFile:aFileName.
1168
590e5660f69e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
  1110
"/        ]
590e5660f69e checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1167
diff changeset
  1111
    ].
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1112
    self saveBMP:image onFile:aFileName.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1113
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1114
    "Modified: 17.10.1997 / 20:16:53 / cg"
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1115
!
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1116
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1117
saveBMP:image onFile:fileName
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1118
    "save image as BMP file on aFileName.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1119
     Only depth 1,4,8 and 24 images can be represented in this format."
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1120
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1121
    |depth bhSize biSize biClrUsed biSizeImage bfOffBits rowBytes imgBytesPerRow 
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1122
     bits srcIndex row|
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1123
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1124
    depth := image depth.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1125
    width := image width.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1126
    height := image height.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1127
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1128
    (#(1 4 8 24) includes:depth) ifFalse:[
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1129
        ^ Image cannotRepresentImageSignal
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1130
            raiseWith:image
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1131
            errorString:('BMP format only supports depths 1,4,8 and 24').
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1132
    ].
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1133
    image mask notNil ifTrue:[
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1134
        Image informationLostQuerySignal
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1135
            raiseWith:image
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1136
            errorString:('BMP format does not support an imageMask').
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1137
    ].
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1138
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1139
    bhSize := 14.  "# bytes in file header"
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1140
    biSize := 40.  "info header size in bytes"
1734
290f382d40e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1569
diff changeset
  1141
    biClrUsed := (depth >= 24) ifTrue:[0] ifFalse:[1 bitShift: depth].  "No. color table entries"
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1142
    bfOffBits := biSize + bhSize + (4*biClrUsed).
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1143
    "/ bmp aligns rows on a longword boundary
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1144
    rowBytes := (((depth min:24) * width + 31) // 32) * 4.
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1145
    biSizeImage := height * rowBytes.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1146
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1147
    outStream := fileName asFilename writeStream.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1148
    outStream binary.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1149
    byteOrder := #lsb.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1150
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1151
    "Write the file header"
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1152
    self writeShort:19778.  "bfType = BM"
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1153
    self writeLong:(bfOffBits + biSizeImage).  "Entire file size in bytes"
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1154
    self writeLong:0.  "bfReserved"
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1155
    self writeLong:bfOffBits.  "Offset of bitmap data from start of hdr (and file)"
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1156
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1157
    "Write the bitmap info header"
3213
f89acb58aa7e class: WindowsIconReader
Stefan Vogel <sv@exept.de>
parents: 3158
diff changeset
  1158
    outStream position: bhSize.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1159
    self writeLong:biSize.  "info header size in bytes"
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1160
    self writeLong:width.  "biWidth"
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1161
    self writeLong:height.  "biHeight"
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1162
    self writeShort:1.  "biPlanes"
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1163
    self writeShort:(depth min:24).  "biBitCount"
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1164
    self writeLong:0.  "biCompression"
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1165
    self writeLong:biSizeImage.  "size of image section in bytes"
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1166
    self writeLong:2800.  "biXPelsPerMeter"
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1167
    self writeLong:2800.  "biYPelsPerMeter"
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1168
    self writeLong:biClrUsed.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1169
    self writeLong:0.  "biClrImportant"
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1170
    1 to:biClrUsed do:[:i |  "Color map"
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1171
        |clr r g b|
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1172
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1173
        clr := image colorFromValue:i-1.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1174
        clr isNil ifTrue:[
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1175
            r := g := b := 0.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1176
        ] ifFalse:[
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1177
            r := clr redByte.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1178
            g := clr greenByte.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1179
            b := clr blueByte.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1180
        ].
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1181
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1182
        "/ put B,G,R
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1183
        outStream nextPut:b.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1184
        outStream nextPut:g.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1185
        outStream nextPut:r.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1186
        outStream nextPut:0.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1187
    ].
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1188
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1189
    imgBytesPerRow := image bytesPerRow.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1190
    bits := image bits.
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1191
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1192
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1193
    "/ sorry, must extract rows individually
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1194
    "/ (even if alignment is correct),
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1195
    "/ since BMP saves rows bottom-to-top
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1196
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1197
    row := ByteArray new:rowBytes.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1198
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1199
    srcIndex := 1 + (height * imgBytesPerRow).
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1200
    1 to:height do:[:i |
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1201
        srcIndex := srcIndex - imgBytesPerRow.
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1202
        row replaceFrom:1 to:imgBytesPerRow with:bits startingAt:srcIndex.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1203
        depth == 24 ifTrue:[
1507
9bae072abf64 fixed bmp saving 24bit image (red & blue channels exchanged)
Claus Gittinger <cg@exept.de>
parents: 1386
diff changeset
  1204
            "/ stupid must swap red & blue bytes
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1205
            self class swap:row size bytesFromRGB_to_BGR_in:row startingAt:1.
1507
9bae072abf64 fixed bmp saving 24bit image (red & blue channels exchanged)
Claus Gittinger <cg@exept.de>
parents: 1386
diff changeset
  1206
        ].
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1207
        outStream nextPutAll:row.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1208
    ].
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1209
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1210
    outStream close.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1211
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1212
    "
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1213
     |i|
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1214
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1215
     i := Image fromFile:'bitmaps/SBrowser.xbm'.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1216
     WindowsIconReader save:i onFile:'test.bmp'.
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1217
    "
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1218
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1219
    "
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1220
     |i i2|
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1221
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1222
     i := Image fromFile:'../../goodies/bitmaps/gifImages/garfield.gif'.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1223
     i inspect.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1224
     WindowsIconReader save:i onFile:'garfield.bmp'.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1225
     i2 := Image fromFile:'garfield.bmp'.
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1226
     i2 inspect.
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1227
    "
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1228
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1229
    "Modified: 21.10.1997 / 05:02:02 / cg"
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1230
!
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1231
2578
7d49dc8ecb63 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2571
diff changeset
  1232
saveICO:image onFile:fileName
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1233
    "save image as ICO file on aFileName.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1234
     Only depth 4 images of size 32x32 can be represented in this format."
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1235
1233
6587cabeab10 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1171
diff changeset
  1236
    |depth biSizeImage rowBytes imgBytesPerRow data srcIndex row|
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1237
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1238
    depth := image depth.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1239
    width := image width.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1240
    height := image height.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1241
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1242
    depth ~~ 4 ifTrue:[
2812
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1243
        ^ Image cannotRepresentImageSignal
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1244
            raiseWith:image
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1245
            errorString:('ICO format only supports depths 4').
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1246
    ].
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1247
    (width ~~ 32 or:[height ~~ 32]) ifTrue:[
2812
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1248
        ^ Image cannotRepresentImageSignal
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1249
            raiseWith:image
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1250
            errorString:('ICO format (currently) only supports 32x32 bitmaps').
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1251
    ].
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1252
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1253
    "/ align rows on a longword boundary
2812
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1254
    rowBytes := ((depth * width + 31) // 32) * 4.
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1255
    biSizeImage := height * rowBytes.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1256
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1257
    outStream := fileName asFilename writeStream.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1258
    outStream binary.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1259
    byteOrder := #lsb.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1260
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1261
    "Write the file header"
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1262
    outStream nextPutAll:#[0 0 1 0].    "/ ICO magic
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1263
    self writeShort:1.             "/ # of images in file
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1264
    outStream nextPut:image width.      "/
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1265
    outStream nextPut:image height.     "/
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1266
    outStream nextPut:(1 bitShift:image depth). "/ # of colors
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1267
    outStream nextPutAll:#[0 0 0 0 0 ]. "/ reserved
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1268
    self writeLong:16rE802.              "/ size pixels
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1269
    self writeLong:16r26.                "/ offset in file
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1270
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1271
    "/ 40 bytes - unknown format
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1272
    outStream nextPutAll:(ByteArray new:40).
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1273
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1274
    "/ 16-entry RGB map
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1275
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1276
    1 to:16 do:[:i |  "Color map"
2812
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1277
        |clr r g b|
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1278
2812
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1279
        clr := image colorFromValue:i-1.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1280
        clr isNil ifTrue:[
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1281
            r := g := b := 0.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1282
        ] ifFalse:[
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1283
            r := clr redByte.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1284
            g := clr greenByte.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1285
            b := clr blueByte.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1286
        ].
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1287
2812
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1288
        "/ put B,G,R
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1289
        outStream nextPut:b.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1290
        outStream nextPut:g.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1291
        outStream nextPut:r.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1292
        outStream nextPut:0.
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1293
    ].
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1294
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1295
    imgBytesPerRow := image bytesPerRow.
2812
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1296
    data := image bits.
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1297
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1298
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1299
    "/ sorry, must extract rows individually
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1300
    "/ (even if alignment is correct),
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1301
    "/ since ICO saves rows bottom-to-top
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1302
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1303
    row := ByteArray new:rowBytes.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1304
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1305
    srcIndex := 1 + (height * imgBytesPerRow).
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1306
    1 to:height do:[:i |
2812
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1307
        srcIndex := srcIndex - imgBytesPerRow.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1308
        row replaceFrom:1 to:imgBytesPerRow with:data startingAt:srcIndex.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1309
        outStream nextPutAll:row.
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1310
    ].
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1311
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1312
    "/ the mask ...
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1313
    image mask isNil ifTrue:[
2812
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1314
        outStream next:128 put:16rFF
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1315
    ] ifFalse:[
2812
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1316
        imgBytesPerRow := image mask bytesPerRow.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1317
        data := image mask data.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1318
        row := ByteArray new:4.
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1319
2812
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1320
        srcIndex := 1 + (height * imgBytesPerRow).
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1321
        1 to:height do:[:i |
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1322
            srcIndex := srcIndex - imgBytesPerRow.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1323
            row replaceFrom:1 to:imgBytesPerRow with:data startingAt:srcIndex.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1324
            outStream nextPutAll:row.
5d7701d5e48b changed: #saveICO:onFile:
Claus Gittinger <cg@exept.de>
parents: 2756
diff changeset
  1325
        ].
1167
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1326
    ].
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1327
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1328
    outStream close.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1329
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1330
    "
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1331
     |i|
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1332
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1333
     i := Image fromFile:'bitmaps/xpmBitmaps/SmalltalkX_clr.xpm'.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1334
     i := Depth4Image fromImage:i.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1335
     i := i magnifiedTo:32@32.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1336
     WindowsIconReader new saveICO:i onFile:'test.ico'.
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1337
    "
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1338
78084516ae7c first attempt in saving ICO files.
Claus Gittinger <cg@exept.de>
parents: 1073
diff changeset
  1339
    "Modified: 21.10.1997 / 05:02:02 / cg"
713
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1340
! !
548898fdd1dc *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 692
diff changeset
  1341
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1342
!WindowsIconReader class methodsFor:'documentation'!
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1343
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1344
version
3568
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1345
    ^ '$Header$'
2756
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
  1346
!
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
  1347
e8bf6a023191 halt in: #loadBMPWidth:height:depth:from:into:
Claus Gittinger <cg@exept.de>
parents: 2578
diff changeset
  1348
version_CVS
3568
a8900d28752b #BUGFIX
matilk
parents: 3404
diff changeset
  1349
    ^ '$Header$'
0
3f9277473954 Initial revision
claus
parents:
diff changeset
  1350
! !
1734
290f382d40e9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1569
diff changeset
  1351
3158
b017a13ec3f5 class: WindowsIconReader
Claus Gittinger <cg@exept.de>
parents: 2812
diff changeset
  1352
172
ee7d84977c86 use inforPrint instead of errorPrint (these are not fatal errors)
Claus Gittinger <cg@exept.de>
parents: 161
diff changeset
  1353
WindowsIconReader initialize!