WindowsIconReader.st
author claus
Sun, 09 Jan 1994 22:53:13 +0100
changeset 18 5a1262eeb9d7
parent 12 6804b4ee340c
child 21 66b31c91177f
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
3f9277473954 Initial revision
claus
parents:
diff changeset
     1
"
3f9277473954 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1993 by Claus Gittinger
3f9277473954 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
3f9277473954 Initial revision
claus
parents:
diff changeset
     4
3f9277473954 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
3f9277473954 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
3f9277473954 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
3f9277473954 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
3f9277473954 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
3f9277473954 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
3f9277473954 Initial revision
claus
parents:
diff changeset
    11
"
3f9277473954 Initial revision
claus
parents:
diff changeset
    12
3f9277473954 Initial revision
claus
parents:
diff changeset
    13
ImageReader subclass:#WindowsIconReader
3f9277473954 Initial revision
claus
parents:
diff changeset
    14
         instanceVariableNames:''
3f9277473954 Initial revision
claus
parents:
diff changeset
    15
         classVariableNames:''
3f9277473954 Initial revision
claus
parents:
diff changeset
    16
         poolDictionaries:''
3f9277473954 Initial revision
claus
parents:
diff changeset
    17
         category:'Graphics-Support'
3f9277473954 Initial revision
claus
parents:
diff changeset
    18
!
3f9277473954 Initial revision
claus
parents:
diff changeset
    19
3f9277473954 Initial revision
claus
parents:
diff changeset
    20
WindowsIconReader comment:'
3f9277473954 Initial revision
claus
parents:
diff changeset
    21
3f9277473954 Initial revision
claus
parents:
diff changeset
    22
COPYRIGHT (c) 1993 by Claus Gittinger
3f9277473954 Initial revision
claus
parents:
diff changeset
    23
              All Rights Reserved
3f9277473954 Initial revision
claus
parents:
diff changeset
    24
3f9277473954 Initial revision
claus
parents:
diff changeset
    25
this class provides methods for loading and saving Windows and OS2
3f9277473954 Initial revision
claus
parents:
diff changeset
    26
icon files..
3f9277473954 Initial revision
claus
parents:
diff changeset
    27
18
5a1262eeb9d7 *** empty log message ***
claus
parents: 12
diff changeset
    28
$Header: /cvs/stx/stx/libview2/WindowsIconReader.st,v 1.5 1994-01-09 21:53:13 claus Exp $
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    29
written Jun 93 by claus
3f9277473954 Initial revision
claus
parents:
diff changeset
    30
'!
3f9277473954 Initial revision
claus
parents:
diff changeset
    31
3f9277473954 Initial revision
claus
parents:
diff changeset
    32
!WindowsIconReader methodsFor:'reading from file'!
3f9277473954 Initial revision
claus
parents:
diff changeset
    33
3f9277473954 Initial revision
claus
parents:
diff changeset
    34
fromWindowsFile: aFilename 
3f9277473954 Initial revision
claus
parents:
diff changeset
    35
    | fileSize header inDepth
3f9277473954 Initial revision
claus
parents:
diff changeset
    36
      rawMap rMap gMap bMap srcIndex dstIndex
3f9277473954 Initial revision
claus
parents:
diff changeset
    37
      data4 mask tmp bytesPerRow|
3f9277473954 Initial revision
claus
parents:
diff changeset
    38
12
6804b4ee340c *** empty log message ***
claus
parents: 5
diff changeset
    39
    inStream := self class streamReadingFile:aFilename.
6804b4ee340c *** empty log message ***
claus
parents: 5
diff changeset
    40
    inStream isNil ifTrue:[^ nil].
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    41
3f9277473954 Initial revision
claus
parents:
diff changeset
    42
    inStream binary.
3f9277473954 Initial revision
claus
parents:
diff changeset
    43
    fileSize := inStream size.
3f9277473954 Initial revision
claus
parents:
diff changeset
    44
3f9277473954 Initial revision
claus
parents:
diff changeset
    45
    "read the header"
3f9277473954 Initial revision
claus
parents:
diff changeset
    46
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
    47
    header := ByteArray uninitializedNew:16r50.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    48
    inStream nextBytes:16r50 into:header.
3f9277473954 Initial revision
claus
parents:
diff changeset
    49
    width := header at:7.
3f9277473954 Initial revision
claus
parents:
diff changeset
    50
    height := header at:8.
3f9277473954 Initial revision
claus
parents:
diff changeset
    51
    inDepth := header at:16r25.
3f9277473954 Initial revision
claus
parents:
diff changeset
    52
3f9277473954 Initial revision
claus
parents:
diff changeset
    53
    "read the colormap"
3f9277473954 Initial revision
claus
parents:
diff changeset
    54
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
    55
    rawMap := ByteArray uninitializedNew:(16*3).
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    56
    inStream nextBytes:(16*3) into:rawMap.
3f9277473954 Initial revision
claus
parents:
diff changeset
    57
    rMap := Array new:16.
3f9277473954 Initial revision
claus
parents:
diff changeset
    58
    gMap := Array new:16.
3f9277473954 Initial revision
claus
parents:
diff changeset
    59
    bMap := Array new:16.
3f9277473954 Initial revision
claus
parents:
diff changeset
    60
    srcIndex := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    61
    1 to:16 do:[:i |
3f9277473954 Initial revision
claus
parents:
diff changeset
    62
        rMap at:i put:(rawMap at:srcIndex).
3f9277473954 Initial revision
claus
parents:
diff changeset
    63
        srcIndex := srcIndex + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    64
        gMap at:i put:(rawMap at:srcIndex).
3f9277473954 Initial revision
claus
parents:
diff changeset
    65
        srcIndex := srcIndex + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    66
        bMap at:i put:(rawMap at:srcIndex).
3f9277473954 Initial revision
claus
parents:
diff changeset
    67
        srcIndex := srcIndex + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    68
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
    69
3f9277473954 Initial revision
claus
parents:
diff changeset
    70
    inStream position:16r7F.
3f9277473954 Initial revision
claus
parents:
diff changeset
    71
3f9277473954 Initial revision
claus
parents:
diff changeset
    72
    "read the data bits"
3f9277473954 Initial revision
claus
parents:
diff changeset
    73
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
    74
    bytesPerRow := width * inDepth + 7 // 8.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
    75
    data4 := ByteArray uninitializedNew:(height * bytesPerRow).
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    76
    inStream nextBytes:(height * bytesPerRow) into:data4.
3f9277473954 Initial revision
claus
parents:
diff changeset
    77
3f9277473954 Initial revision
claus
parents:
diff changeset
    78
    "read mask"
3f9277473954 Initial revision
claus
parents:
diff changeset
    79
3f9277473954 Initial revision
claus
parents:
diff changeset
    80
"
3f9277473954 Initial revision
claus
parents:
diff changeset
    81
    mask := ByteArray new:(width * height / 8).
3f9277473954 Initial revision
claus
parents:
diff changeset
    82
    inStream nextBytes:(width * height / 8) into:mask.
3f9277473954 Initial revision
claus
parents:
diff changeset
    83
"
3f9277473954 Initial revision
claus
parents:
diff changeset
    84
3f9277473954 Initial revision
claus
parents:
diff changeset
    85
    "stupid: last row first"
3f9277473954 Initial revision
claus
parents:
diff changeset
    86
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
    87
    tmp := ByteArray uninitializedNew:(height * bytesPerRow).
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    88
    srcIndex := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    89
    dstIndex := (height - 1) * bytesPerRow + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    90
    1 to:height do:[:row |
3f9277473954 Initial revision
claus
parents:
diff changeset
    91
        tmp replaceFrom:dstIndex to:(dstIndex + bytesPerRow - 1)
3f9277473954 Initial revision
claus
parents:
diff changeset
    92
                   with:data4 startingAt:srcIndex.
3f9277473954 Initial revision
claus
parents:
diff changeset
    93
        srcIndex := srcIndex + bytesPerRow.
3f9277473954 Initial revision
claus
parents:
diff changeset
    94
        dstIndex := dstIndex - bytesPerRow.
3f9277473954 Initial revision
claus
parents:
diff changeset
    95
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
    96
    data4 := tmp.
3f9277473954 Initial revision
claus
parents:
diff changeset
    97
3f9277473954 Initial revision
claus
parents:
diff changeset
    98
    "expand into bytes"
3f9277473954 Initial revision
claus
parents:
diff changeset
    99
3f9277473954 Initial revision
claus
parents:
diff changeset
   100
    data := ByteArray new:(width * height).
3f9277473954 Initial revision
claus
parents:
diff changeset
   101
    data4 expandPixels:inDepth width:width height:height
3f9277473954 Initial revision
claus
parents:
diff changeset
   102
                  into:data mapping:nil.
3f9277473954 Initial revision
claus
parents:
diff changeset
   103
3f9277473954 Initial revision
claus
parents:
diff changeset
   104
    photometric := #palette.
3f9277473954 Initial revision
claus
parents:
diff changeset
   105
    samplesPerPixel := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   106
    bitsPerSample := #(8).
3f9277473954 Initial revision
claus
parents:
diff changeset
   107
    colorMap := Array with:rMap with:gMap with:bMap.
3f9277473954 Initial revision
claus
parents:
diff changeset
   108
    inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   109
3f9277473954 Initial revision
claus
parents:
diff changeset
   110
    "
3f9277473954 Initial revision
claus
parents:
diff changeset
   111
     |i f|
3f9277473954 Initial revision
claus
parents:
diff changeset
   112
     i := Image fromFile:'/LocalLibrary/Images/WIN_icons/ibm.ico'.
3f9277473954 Initial revision
claus
parents:
diff changeset
   113
     f := i asFormOn:Display.
18
5a1262eeb9d7 *** empty log message ***
claus
parents: 12
diff changeset
   114
     v displayOpaqueForm:(f ) x:5 y:5.
5a1262eeb9d7 *** empty log message ***
claus
parents: 12
diff changeset
   115
     v displayOpaqueForm:(f magnifyBy:2@2) x:45 y:5
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   116
    "
3f9277473954 Initial revision
claus
parents:
diff changeset
   117
!
3f9277473954 Initial revision
claus
parents:
diff changeset
   118
3f9277473954 Initial revision
claus
parents:
diff changeset
   119
fromOS2File: aFilename 
3f9277473954 Initial revision
claus
parents:
diff changeset
   120
    | fileSize header inDepth
3f9277473954 Initial revision
claus
parents:
diff changeset
   121
      rawMap rMap gMap bMap srcIndex dstIndex
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   122
      data4 mask tmp bytesPerRow nColors nByte|
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   123
12
6804b4ee340c *** empty log message ***
claus
parents: 5
diff changeset
   124
    inStream := self class streamReadingFile:aFilename.
6804b4ee340c *** empty log message ***
claus
parents: 5
diff changeset
   125
    inStream isNil ifTrue:[^ nil].
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   126
3f9277473954 Initial revision
claus
parents:
diff changeset
   127
    inStream binary.
3f9277473954 Initial revision
claus
parents:
diff changeset
   128
    fileSize := inStream size.
3f9277473954 Initial revision
claus
parents:
diff changeset
   129
3f9277473954 Initial revision
claus
parents:
diff changeset
   130
    "read the header"
3f9277473954 Initial revision
claus
parents:
diff changeset
   131
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   132
    header := ByteArray uninitializedNew:8r110.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   133
    inStream nextBytes:16 into:header.
3f9277473954 Initial revision
claus
parents:
diff changeset
   134
    (header startsWith:#(73 67)) ifTrue:[
3f9277473954 Initial revision
claus
parents:
diff changeset
   135
        "IC format"
3f9277473954 Initial revision
claus
parents:
diff changeset
   136
        inStream nextBytes:10 into:header startingAt:17.
3f9277473954 Initial revision
claus
parents:
diff changeset
   137
        width := header at:7.
3f9277473954 Initial revision
claus
parents:
diff changeset
   138
        height := header at:9.
3f9277473954 Initial revision
claus
parents:
diff changeset
   139
        inDepth := 2 "header at:11". "where is it"
3f9277473954 Initial revision
claus
parents:
diff changeset
   140
    ] ifFalse:[
3f9277473954 Initial revision
claus
parents:
diff changeset
   141
        inStream nextBytes:(8r110-16) into:header startingAt:17.
3f9277473954 Initial revision
claus
parents:
diff changeset
   142
        width := header at:8r101.
3f9277473954 Initial revision
claus
parents:
diff changeset
   143
        height := header at:8r103.
3f9277473954 Initial revision
claus
parents:
diff changeset
   144
        inDepth := header at:8r107.
3f9277473954 Initial revision
claus
parents:
diff changeset
   145
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   146
3f9277473954 Initial revision
claus
parents:
diff changeset
   147
    "read the colormap"
3f9277473954 Initial revision
claus
parents:
diff changeset
   148
3f9277473954 Initial revision
claus
parents:
diff changeset
   149
    nColors := 1 bitShift:inDepth.
3f9277473954 Initial revision
claus
parents:
diff changeset
   150
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   151
    rawMap := ByteArray uninitializedNew:(nColors*3).
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   152
    inStream nextBytes:(nColors*3) into:rawMap.
3f9277473954 Initial revision
claus
parents:
diff changeset
   153
    rMap := Array new:nColors.
3f9277473954 Initial revision
claus
parents:
diff changeset
   154
    gMap := Array new:nColors.
3f9277473954 Initial revision
claus
parents:
diff changeset
   155
    bMap := Array new:nColors.
3f9277473954 Initial revision
claus
parents:
diff changeset
   156
    srcIndex := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   157
    1 to:nColors do:[:i |
3f9277473954 Initial revision
claus
parents:
diff changeset
   158
        bMap at:i put:(rawMap at:srcIndex).
3f9277473954 Initial revision
claus
parents:
diff changeset
   159
        srcIndex := srcIndex + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   160
        gMap at:i put:(rawMap at:srcIndex).
3f9277473954 Initial revision
claus
parents:
diff changeset
   161
        srcIndex := srcIndex + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   162
        rMap at:i put:(rawMap at:srcIndex).
3f9277473954 Initial revision
claus
parents:
diff changeset
   163
        srcIndex := srcIndex + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   164
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   165
3f9277473954 Initial revision
claus
parents:
diff changeset
   166
    "read mask"
3f9277473954 Initial revision
claus
parents:
diff changeset
   167
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   168
    nByte := width * height + 7 // 8.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   169
    mask := ByteArray uninitializedNew:nByte.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   170
    inStream nextBytes:nByte into:mask.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   171
3f9277473954 Initial revision
claus
parents:
diff changeset
   172
    "what is this"
3f9277473954 Initial revision
claus
parents:
diff changeset
   173
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   174
    inStream nextBytes:nByte into:mask.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   175
3f9277473954 Initial revision
claus
parents:
diff changeset
   176
    "read the data bits"
3f9277473954 Initial revision
claus
parents:
diff changeset
   177
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   178
    bytesPerRow := width * inDepth + 7 // 8.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   179
    data4 := ByteArray uninitializedNew:(height * bytesPerRow).
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   180
    inStream nextBytes:(height * bytesPerRow) into:data4.
3f9277473954 Initial revision
claus
parents:
diff changeset
   181
3f9277473954 Initial revision
claus
parents:
diff changeset
   182
    "stupid: last row first"
3f9277473954 Initial revision
claus
parents:
diff changeset
   183
3f9277473954 Initial revision
claus
parents:
diff changeset
   184
    tmp := ByteArray new:(height * bytesPerRow).
3f9277473954 Initial revision
claus
parents:
diff changeset
   185
    srcIndex := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   186
    dstIndex := (height - 1) * bytesPerRow + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   187
    1 to:height do:[:row |
3f9277473954 Initial revision
claus
parents:
diff changeset
   188
        tmp replaceFrom:dstIndex to:(dstIndex + bytesPerRow - 1)
3f9277473954 Initial revision
claus
parents:
diff changeset
   189
                   with:data4 startingAt:srcIndex.
3f9277473954 Initial revision
claus
parents:
diff changeset
   190
        srcIndex := srcIndex + bytesPerRow.
3f9277473954 Initial revision
claus
parents:
diff changeset
   191
        dstIndex := dstIndex - bytesPerRow.
3f9277473954 Initial revision
claus
parents:
diff changeset
   192
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   193
    data4 := tmp.
3f9277473954 Initial revision
claus
parents:
diff changeset
   194
3f9277473954 Initial revision
claus
parents:
diff changeset
   195
    "expand into bytes"
3f9277473954 Initial revision
claus
parents:
diff changeset
   196
3f9277473954 Initial revision
claus
parents:
diff changeset
   197
    data := ByteArray new:(width * height).
3f9277473954 Initial revision
claus
parents:
diff changeset
   198
    data4 expandPixels:inDepth width:width height:height
3f9277473954 Initial revision
claus
parents:
diff changeset
   199
                  into:data mapping:nil.
3f9277473954 Initial revision
claus
parents:
diff changeset
   200
3f9277473954 Initial revision
claus
parents:
diff changeset
   201
    photometric := #palette.
3f9277473954 Initial revision
claus
parents:
diff changeset
   202
    samplesPerPixel := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   203
    bitsPerSample := #(8).
3f9277473954 Initial revision
claus
parents:
diff changeset
   204
    colorMap := Array with:rMap with:gMap with:bMap.
3f9277473954 Initial revision
claus
parents:
diff changeset
   205
    inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   206
3f9277473954 Initial revision
claus
parents:
diff changeset
   207
    "
3f9277473954 Initial revision
claus
parents:
diff changeset
   208
     |i f|
3f9277473954 Initial revision
claus
parents:
diff changeset
   209
     i := Image fromFile:'/LocalLibrary/Images/OS2/dos3.ico'.
3f9277473954 Initial revision
claus
parents:
diff changeset
   210
     f := i asFormOn:Display.
18
5a1262eeb9d7 *** empty log message ***
claus
parents: 12
diff changeset
   211
     v displayOpaqueForm:(f magnifyBy:2@2) x:5 y:5
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   212
    "
3f9277473954 Initial revision
claus
parents:
diff changeset
   213
!
3f9277473954 Initial revision
claus
parents:
diff changeset
   214
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   215
fromWindowsBMPFile: aFilename 
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   216
    | fileSize header inDepth
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   217
      rawMap rMap gMap bMap srcIndex dstIndex
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   218
      data4 mask tmp bytesPerRow|
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   219
12
6804b4ee340c *** empty log message ***
claus
parents: 5
diff changeset
   220
    inStream := self class streamReadingFile:aFilename.
6804b4ee340c *** empty log message ***
claus
parents: 5
diff changeset
   221
    inStream isNil ifTrue:[^ nil].
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   222
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   223
    inStream binary.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   224
    fileSize := inStream size.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   225
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   226
    "read the header"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   227
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   228
    header := ByteArray uninitializedNew:16r50.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   229
    inStream nextBytes:16r50 into:header.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   230
    ((header at:15) == 40) ifTrue:[
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   231
        width := (header at:19) + ((header at:20) * 256).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   232
        height := (header at:23) + ((header at:24) * 256).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   233
        inDepth := header at:29.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   234
    ].
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   235
    ((header at:15) == 12) ifTrue:[
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   236
        width := (header at:19) + ((header at:20) * 256).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   237
        height := (header at:21) + ((header at:22) * 256).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   238
        inDepth := header at:25.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   239
    ].
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   240
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   241
    width isNil ifTrue:[
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   242
        ^ nil
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   243
    ].
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   244
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   245
    "read the colormap"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   246
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   247
    rawMap := ByteArray uninitializedNew:(16*3).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   248
    inStream nextBytes:(16*3) into:rawMap.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   249
    rMap := Array new:16.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   250
    gMap := Array new:16.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   251
    bMap := Array new:16.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   252
    srcIndex := 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   253
    1 to:16 do:[:i |
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   254
        rMap at:i put:(rawMap at:srcIndex).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   255
        srcIndex := srcIndex + 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   256
        gMap at:i put:(rawMap at:srcIndex).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   257
        srcIndex := srcIndex + 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   258
        bMap at:i put:(rawMap at:srcIndex).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   259
        srcIndex := srcIndex + 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   260
    ].
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   261
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   262
    inStream position:16r78.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   263
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   264
    "read the data bits"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   265
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   266
    bytesPerRow := width * inDepth + 7 // 8.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   267
    data4 := ByteArray uninitializedNew:(height * bytesPerRow).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   268
    inStream nextBytes:(height * bytesPerRow) into:data4.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   269
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   270
    "read mask"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   271
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   272
"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   273
    mask := ByteArray new:(width * height / 8).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   274
    inStream nextBytes:(width * height / 8) into:mask.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   275
"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   276
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   277
    "stupid: last row first"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   278
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   279
    tmp := ByteArray uninitializedNew:(height * bytesPerRow).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   280
    srcIndex := 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   281
    dstIndex := (height - 1) * bytesPerRow + 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   282
    1 to:height do:[:row |
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   283
        tmp replaceFrom:dstIndex to:(dstIndex + bytesPerRow - 1)
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   284
                   with:data4 startingAt:srcIndex.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   285
        srcIndex := srcIndex + bytesPerRow.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   286
        dstIndex := dstIndex - bytesPerRow.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   287
    ].
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   288
    data4 := tmp.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   289
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   290
    "expand into bytes"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   291
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   292
    data := ByteArray new:(width * height).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   293
    data4 expandPixels:inDepth width:width height:height
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   294
                  into:data mapping:nil.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   295
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   296
    photometric := #palette.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   297
    samplesPerPixel := 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   298
    bitsPerSample := #(8).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   299
    colorMap := Array with:rMap with:gMap with:bMap.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   300
    inStream close.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   301
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   302
!
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   303
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   304
fromFile: aFilename 
3f9277473954 Initial revision
claus
parents:
diff changeset
   305
    | fileSize header |
3f9277473954 Initial revision
claus
parents:
diff changeset
   306
12
6804b4ee340c *** empty log message ***
claus
parents: 5
diff changeset
   307
    inStream := self class streamReadingFile:aFilename.
6804b4ee340c *** empty log message ***
claus
parents: 5
diff changeset
   308
    inStream isNil ifTrue:[^ nil].
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   309
3f9277473954 Initial revision
claus
parents:
diff changeset
   310
    inStream binary.
3f9277473954 Initial revision
claus
parents:
diff changeset
   311
    fileSize := inStream size.
3f9277473954 Initial revision
claus
parents:
diff changeset
   312
3f9277473954 Initial revision
claus
parents:
diff changeset
   313
    fileSize < 16 ifTrue:[
3f9277473954 Initial revision
claus
parents:
diff changeset
   314
        inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   315
        self error:'short file'.
3f9277473954 Initial revision
claus
parents:
diff changeset
   316
        ^ nil
3f9277473954 Initial revision
claus
parents:
diff changeset
   317
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   318
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   319
    header := ByteArray uninitializedNew:16.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   320
    inStream nextBytes:16 into:header.
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   321
    (header startsWith:#(66 77)) ifTrue:[     "BM"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   322
        inStream close.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   323
        ^ self fromWindowsBMPFile:aFilename
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   324
    ].
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   325
    (header startsWith:#(66 65)) ifTrue:[     "BA"
3f9277473954 Initial revision
claus
parents:
diff changeset
   326
        inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   327
        ^ self fromOS2File:aFilename
3f9277473954 Initial revision
claus
parents:
diff changeset
   328
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   329
    (header startsWith:#(73 67)) ifTrue:[     "IC"
3f9277473954 Initial revision
claus
parents:
diff changeset
   330
        inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   331
        ^ self fromOS2File:aFilename
3f9277473954 Initial revision
claus
parents:
diff changeset
   332
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   333
    (header startsWith:#(0 0 1 0 1 0)) ifTrue:[
3f9277473954 Initial revision
claus
parents:
diff changeset
   334
        inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   335
        ^ self fromWindowsFile:aFilename
3f9277473954 Initial revision
claus
parents:
diff changeset
   336
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   337
    self error:'format not supported'.
3f9277473954 Initial revision
claus
parents:
diff changeset
   338
    inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   339
    ^ nil
3f9277473954 Initial revision
claus
parents:
diff changeset
   340
3f9277473954 Initial revision
claus
parents:
diff changeset
   341
    "Image fromFile:'/LocalLibrary/Images/OS2_icons/dos.ico'"
3f9277473954 Initial revision
claus
parents:
diff changeset
   342
! !