WindowsIconReader.st
author claus
Wed, 13 Oct 1993 01:32:33 +0100
changeset 3 78aaa5408119
parent 0 3f9277473954
child 5 4d55b551dc57
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
3f9277473954 Initial revision
claus
parents:
diff changeset
    28
%W% %E%
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
3f9277473954 Initial revision
claus
parents:
diff changeset
    39
    inStream := FileStream readonlyFileNamed:aFilename.
3f9277473954 Initial revision
claus
parents:
diff changeset
    40
    inStream isNil ifTrue:[
3f9277473954 Initial revision
claus
parents:
diff changeset
    41
        'open error' printNewline. 
3f9277473954 Initial revision
claus
parents:
diff changeset
    42
        ^ nil
3f9277473954 Initial revision
claus
parents:
diff changeset
    43
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
    44
3f9277473954 Initial revision
claus
parents:
diff changeset
    45
    inStream binary.
3f9277473954 Initial revision
claus
parents:
diff changeset
    46
    fileSize := inStream size.
3f9277473954 Initial revision
claus
parents:
diff changeset
    47
3f9277473954 Initial revision
claus
parents:
diff changeset
    48
    "read the header"
3f9277473954 Initial revision
claus
parents:
diff changeset
    49
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
    50
    header := ByteArray uninitializedNew:16r50.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    51
    inStream nextBytes:16r50 into:header.
3f9277473954 Initial revision
claus
parents:
diff changeset
    52
    width := header at:7.
3f9277473954 Initial revision
claus
parents:
diff changeset
    53
    height := header at:8.
3f9277473954 Initial revision
claus
parents:
diff changeset
    54
    inDepth := header at:16r25.
3f9277473954 Initial revision
claus
parents:
diff changeset
    55
3f9277473954 Initial revision
claus
parents:
diff changeset
    56
    "read the colormap"
3f9277473954 Initial revision
claus
parents:
diff changeset
    57
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
    58
    rawMap := ByteArray uninitializedNew:(16*3).
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    59
    inStream nextBytes:(16*3) into:rawMap.
3f9277473954 Initial revision
claus
parents:
diff changeset
    60
    rMap := Array new:16.
3f9277473954 Initial revision
claus
parents:
diff changeset
    61
    gMap := Array new:16.
3f9277473954 Initial revision
claus
parents:
diff changeset
    62
    bMap := Array new:16.
3f9277473954 Initial revision
claus
parents:
diff changeset
    63
    srcIndex := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    64
    1 to:16 do:[:i |
3f9277473954 Initial revision
claus
parents:
diff changeset
    65
        rMap at:i put:(rawMap at:srcIndex).
3f9277473954 Initial revision
claus
parents:
diff changeset
    66
        srcIndex := srcIndex + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    67
        gMap at:i put:(rawMap at:srcIndex).
3f9277473954 Initial revision
claus
parents:
diff changeset
    68
        srcIndex := srcIndex + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    69
        bMap at:i put:(rawMap at:srcIndex).
3f9277473954 Initial revision
claus
parents:
diff changeset
    70
        srcIndex := srcIndex + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    71
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
    72
3f9277473954 Initial revision
claus
parents:
diff changeset
    73
    inStream position:16r7F.
3f9277473954 Initial revision
claus
parents:
diff changeset
    74
3f9277473954 Initial revision
claus
parents:
diff changeset
    75
    "read the data bits"
3f9277473954 Initial revision
claus
parents:
diff changeset
    76
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
    77
    bytesPerRow := width * inDepth + 7 // 8.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
    78
    data4 := ByteArray uninitializedNew:(height * bytesPerRow).
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    79
    inStream nextBytes:(height * bytesPerRow) into:data4.
3f9277473954 Initial revision
claus
parents:
diff changeset
    80
3f9277473954 Initial revision
claus
parents:
diff changeset
    81
    "read mask"
3f9277473954 Initial revision
claus
parents:
diff changeset
    82
3f9277473954 Initial revision
claus
parents:
diff changeset
    83
"
3f9277473954 Initial revision
claus
parents:
diff changeset
    84
    mask := ByteArray new:(width * height / 8).
3f9277473954 Initial revision
claus
parents:
diff changeset
    85
    inStream nextBytes:(width * height / 8) into:mask.
3f9277473954 Initial revision
claus
parents:
diff changeset
    86
"
3f9277473954 Initial revision
claus
parents:
diff changeset
    87
3f9277473954 Initial revision
claus
parents:
diff changeset
    88
    "stupid: last row first"
3f9277473954 Initial revision
claus
parents:
diff changeset
    89
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
    90
    tmp := ByteArray uninitializedNew:(height * bytesPerRow).
0
3f9277473954 Initial revision
claus
parents:
diff changeset
    91
    srcIndex := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    92
    dstIndex := (height - 1) * bytesPerRow + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
    93
    1 to:height do:[:row |
3f9277473954 Initial revision
claus
parents:
diff changeset
    94
        tmp replaceFrom:dstIndex to:(dstIndex + bytesPerRow - 1)
3f9277473954 Initial revision
claus
parents:
diff changeset
    95
                   with:data4 startingAt:srcIndex.
3f9277473954 Initial revision
claus
parents:
diff changeset
    96
        srcIndex := srcIndex + bytesPerRow.
3f9277473954 Initial revision
claus
parents:
diff changeset
    97
        dstIndex := dstIndex - bytesPerRow.
3f9277473954 Initial revision
claus
parents:
diff changeset
    98
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
    99
    data4 := tmp.
3f9277473954 Initial revision
claus
parents:
diff changeset
   100
3f9277473954 Initial revision
claus
parents:
diff changeset
   101
    "expand into bytes"
3f9277473954 Initial revision
claus
parents:
diff changeset
   102
3f9277473954 Initial revision
claus
parents:
diff changeset
   103
    data := ByteArray new:(width * height).
3f9277473954 Initial revision
claus
parents:
diff changeset
   104
    data4 expandPixels:inDepth width:width height:height
3f9277473954 Initial revision
claus
parents:
diff changeset
   105
                  into:data mapping:nil.
3f9277473954 Initial revision
claus
parents:
diff changeset
   106
3f9277473954 Initial revision
claus
parents:
diff changeset
   107
    photometric := #palette.
3f9277473954 Initial revision
claus
parents:
diff changeset
   108
    samplesPerPixel := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   109
    bitsPerSample := #(8).
3f9277473954 Initial revision
claus
parents:
diff changeset
   110
    colorMap := Array with:rMap with:gMap with:bMap.
3f9277473954 Initial revision
claus
parents:
diff changeset
   111
    inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   112
3f9277473954 Initial revision
claus
parents:
diff changeset
   113
    "
3f9277473954 Initial revision
claus
parents:
diff changeset
   114
     |i f|
3f9277473954 Initial revision
claus
parents:
diff changeset
   115
     i := Image fromFile:'/LocalLibrary/Images/WIN_icons/ibm.ico'.
3f9277473954 Initial revision
claus
parents:
diff changeset
   116
     f := i asFormOn:Display.
3f9277473954 Initial revision
claus
parents:
diff changeset
   117
     v drawOpaqueForm:(f ) x:5 y:5.
3f9277473954 Initial revision
claus
parents:
diff changeset
   118
     v drawOpaqueForm:(f magnifyBy:2@2) x:45 y:5
3f9277473954 Initial revision
claus
parents:
diff changeset
   119
    "
3f9277473954 Initial revision
claus
parents:
diff changeset
   120
!
3f9277473954 Initial revision
claus
parents:
diff changeset
   121
3f9277473954 Initial revision
claus
parents:
diff changeset
   122
fromOS2File: aFilename 
3f9277473954 Initial revision
claus
parents:
diff changeset
   123
    | fileSize header inDepth
3f9277473954 Initial revision
claus
parents:
diff changeset
   124
      rawMap rMap gMap bMap srcIndex dstIndex
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   125
      data4 mask tmp bytesPerRow nColors nByte|
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   126
3f9277473954 Initial revision
claus
parents:
diff changeset
   127
    inStream := FileStream readonlyFileNamed:aFilename.
3f9277473954 Initial revision
claus
parents:
diff changeset
   128
    inStream isNil ifTrue:[
3f9277473954 Initial revision
claus
parents:
diff changeset
   129
        'open error' printNewline. 
3f9277473954 Initial revision
claus
parents:
diff changeset
   130
        ^ nil
3f9277473954 Initial revision
claus
parents:
diff changeset
   131
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   132
3f9277473954 Initial revision
claus
parents:
diff changeset
   133
    inStream binary.
3f9277473954 Initial revision
claus
parents:
diff changeset
   134
    fileSize := inStream size.
3f9277473954 Initial revision
claus
parents:
diff changeset
   135
3f9277473954 Initial revision
claus
parents:
diff changeset
   136
    "read the header"
3f9277473954 Initial revision
claus
parents:
diff changeset
   137
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   138
    header := ByteArray uninitializedNew:8r110.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   139
    inStream nextBytes:16 into:header.
3f9277473954 Initial revision
claus
parents:
diff changeset
   140
    (header startsWith:#(73 67)) ifTrue:[
3f9277473954 Initial revision
claus
parents:
diff changeset
   141
        "IC format"
3f9277473954 Initial revision
claus
parents:
diff changeset
   142
        inStream nextBytes:10 into:header startingAt:17.
3f9277473954 Initial revision
claus
parents:
diff changeset
   143
        width := header at:7.
3f9277473954 Initial revision
claus
parents:
diff changeset
   144
        height := header at:9.
3f9277473954 Initial revision
claus
parents:
diff changeset
   145
        inDepth := 2 "header at:11". "where is it"
3f9277473954 Initial revision
claus
parents:
diff changeset
   146
    ] ifFalse:[
3f9277473954 Initial revision
claus
parents:
diff changeset
   147
        inStream nextBytes:(8r110-16) into:header startingAt:17.
3f9277473954 Initial revision
claus
parents:
diff changeset
   148
        width := header at:8r101.
3f9277473954 Initial revision
claus
parents:
diff changeset
   149
        height := header at:8r103.
3f9277473954 Initial revision
claus
parents:
diff changeset
   150
        inDepth := header at:8r107.
3f9277473954 Initial revision
claus
parents:
diff changeset
   151
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   152
3f9277473954 Initial revision
claus
parents:
diff changeset
   153
    "read the colormap"
3f9277473954 Initial revision
claus
parents:
diff changeset
   154
3f9277473954 Initial revision
claus
parents:
diff changeset
   155
    nColors := 1 bitShift:inDepth.
3f9277473954 Initial revision
claus
parents:
diff changeset
   156
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   157
    rawMap := ByteArray uninitializedNew:(nColors*3).
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   158
    inStream nextBytes:(nColors*3) into:rawMap.
3f9277473954 Initial revision
claus
parents:
diff changeset
   159
    rMap := Array new:nColors.
3f9277473954 Initial revision
claus
parents:
diff changeset
   160
    gMap := Array new:nColors.
3f9277473954 Initial revision
claus
parents:
diff changeset
   161
    bMap := Array new:nColors.
3f9277473954 Initial revision
claus
parents:
diff changeset
   162
    srcIndex := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   163
    1 to:nColors do:[:i |
3f9277473954 Initial revision
claus
parents:
diff changeset
   164
        bMap at:i put:(rawMap at:srcIndex).
3f9277473954 Initial revision
claus
parents:
diff changeset
   165
        srcIndex := srcIndex + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   166
        gMap at:i put:(rawMap at:srcIndex).
3f9277473954 Initial revision
claus
parents:
diff changeset
   167
        srcIndex := srcIndex + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   168
        rMap at:i put:(rawMap at:srcIndex).
3f9277473954 Initial revision
claus
parents:
diff changeset
   169
        srcIndex := srcIndex + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   170
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   171
3f9277473954 Initial revision
claus
parents:
diff changeset
   172
    "read mask"
3f9277473954 Initial revision
claus
parents:
diff changeset
   173
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   174
    nByte := width * height + 7 // 8.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   175
    mask := ByteArray uninitializedNew:nByte.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   176
    inStream nextBytes:nByte into:mask.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   177
3f9277473954 Initial revision
claus
parents:
diff changeset
   178
    "what is this"
3f9277473954 Initial revision
claus
parents:
diff changeset
   179
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   180
    inStream nextBytes:nByte into:mask.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   181
3f9277473954 Initial revision
claus
parents:
diff changeset
   182
    "read the data bits"
3f9277473954 Initial revision
claus
parents:
diff changeset
   183
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   184
    bytesPerRow := width * inDepth + 7 // 8.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   185
    data4 := ByteArray uninitializedNew:(height * bytesPerRow).
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   186
    inStream nextBytes:(height * bytesPerRow) into:data4.
3f9277473954 Initial revision
claus
parents:
diff changeset
   187
3f9277473954 Initial revision
claus
parents:
diff changeset
   188
    "stupid: last row first"
3f9277473954 Initial revision
claus
parents:
diff changeset
   189
3f9277473954 Initial revision
claus
parents:
diff changeset
   190
    tmp := ByteArray new:(height * bytesPerRow).
3f9277473954 Initial revision
claus
parents:
diff changeset
   191
    srcIndex := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   192
    dstIndex := (height - 1) * bytesPerRow + 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   193
    1 to:height do:[:row |
3f9277473954 Initial revision
claus
parents:
diff changeset
   194
        tmp replaceFrom:dstIndex to:(dstIndex + bytesPerRow - 1)
3f9277473954 Initial revision
claus
parents:
diff changeset
   195
                   with:data4 startingAt:srcIndex.
3f9277473954 Initial revision
claus
parents:
diff changeset
   196
        srcIndex := srcIndex + bytesPerRow.
3f9277473954 Initial revision
claus
parents:
diff changeset
   197
        dstIndex := dstIndex - bytesPerRow.
3f9277473954 Initial revision
claus
parents:
diff changeset
   198
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   199
    data4 := tmp.
3f9277473954 Initial revision
claus
parents:
diff changeset
   200
3f9277473954 Initial revision
claus
parents:
diff changeset
   201
    "expand into bytes"
3f9277473954 Initial revision
claus
parents:
diff changeset
   202
3f9277473954 Initial revision
claus
parents:
diff changeset
   203
    data := ByteArray new:(width * height).
3f9277473954 Initial revision
claus
parents:
diff changeset
   204
    data4 expandPixels:inDepth width:width height:height
3f9277473954 Initial revision
claus
parents:
diff changeset
   205
                  into:data mapping:nil.
3f9277473954 Initial revision
claus
parents:
diff changeset
   206
3f9277473954 Initial revision
claus
parents:
diff changeset
   207
    photometric := #palette.
3f9277473954 Initial revision
claus
parents:
diff changeset
   208
    samplesPerPixel := 1.
3f9277473954 Initial revision
claus
parents:
diff changeset
   209
    bitsPerSample := #(8).
3f9277473954 Initial revision
claus
parents:
diff changeset
   210
    colorMap := Array with:rMap with:gMap with:bMap.
3f9277473954 Initial revision
claus
parents:
diff changeset
   211
    inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   212
3f9277473954 Initial revision
claus
parents:
diff changeset
   213
    "
3f9277473954 Initial revision
claus
parents:
diff changeset
   214
     |i f|
3f9277473954 Initial revision
claus
parents:
diff changeset
   215
     i := Image fromFile:'/LocalLibrary/Images/OS2/dos3.ico'.
3f9277473954 Initial revision
claus
parents:
diff changeset
   216
     f := i asFormOn:Display.
3f9277473954 Initial revision
claus
parents:
diff changeset
   217
     v drawOpaqueForm:(f magnifyBy:2@2) x:5 y:5
3f9277473954 Initial revision
claus
parents:
diff changeset
   218
    "
3f9277473954 Initial revision
claus
parents:
diff changeset
   219
!
3f9277473954 Initial revision
claus
parents:
diff changeset
   220
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   221
fromWindowsBMPFile: aFilename 
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   222
    | fileSize header inDepth
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   223
      rawMap rMap gMap bMap srcIndex dstIndex
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   224
      data4 mask tmp bytesPerRow|
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   225
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   226
    inStream := FileStream readonlyFileNamed:aFilename.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   227
    inStream isNil ifTrue:[
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   228
        'open error' printNewline. 
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   229
        ^ nil
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   230
    ].
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   231
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   232
    inStream binary.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   233
    fileSize := inStream size.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   234
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   235
    "read the header"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   236
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   237
    header := ByteArray uninitializedNew:16r50.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   238
    inStream nextBytes:16r50 into:header.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   239
    ((header at:15) == 40) ifTrue:[
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   240
        width := (header at:19) + ((header at:20) * 256).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   241
        height := (header at:23) + ((header at:24) * 256).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   242
        inDepth := header at:29.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   243
    ].
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   244
    ((header at:15) == 12) ifTrue:[
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   245
        width := (header at:19) + ((header at:20) * 256).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   246
        height := (header at:21) + ((header at:22) * 256).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   247
        inDepth := header at:25.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   248
    ].
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   249
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   250
    width isNil ifTrue:[
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   251
        ^ nil
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   252
    ].
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   253
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   254
    "read the colormap"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   255
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   256
    rawMap := ByteArray uninitializedNew:(16*3).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   257
    inStream nextBytes:(16*3) into:rawMap.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   258
    rMap := Array new:16.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   259
    gMap := Array new:16.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   260
    bMap := Array new:16.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   261
    srcIndex := 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   262
    1 to:16 do:[:i |
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   263
        rMap at:i put:(rawMap at:srcIndex).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   264
        srcIndex := srcIndex + 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   265
        gMap at:i put:(rawMap at:srcIndex).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   266
        srcIndex := srcIndex + 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   267
        bMap at:i put:(rawMap at:srcIndex).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   268
        srcIndex := srcIndex + 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   269
    ].
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   270
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   271
    inStream position:16r78.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   272
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   273
    "read the data bits"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   274
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   275
    bytesPerRow := width * inDepth + 7 // 8.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   276
    data4 := ByteArray uninitializedNew:(height * bytesPerRow).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   277
    inStream nextBytes:(height * bytesPerRow) into:data4.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   278
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   279
    "read mask"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   280
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   281
"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   282
    mask := ByteArray new:(width * height / 8).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   283
    inStream nextBytes:(width * height / 8) into:mask.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   284
"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   285
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   286
    "stupid: last row first"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   287
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   288
    tmp := ByteArray uninitializedNew:(height * bytesPerRow).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   289
    srcIndex := 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   290
    dstIndex := (height - 1) * bytesPerRow + 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   291
    1 to:height do:[:row |
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   292
        tmp replaceFrom:dstIndex to:(dstIndex + bytesPerRow - 1)
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   293
                   with:data4 startingAt:srcIndex.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   294
        srcIndex := srcIndex + bytesPerRow.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   295
        dstIndex := dstIndex - bytesPerRow.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   296
    ].
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   297
    data4 := tmp.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   298
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   299
    "expand into bytes"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   300
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   301
    data := ByteArray new:(width * height).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   302
    data4 expandPixels:inDepth width:width height:height
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   303
                  into:data mapping:nil.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   304
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   305
    photometric := #palette.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   306
    samplesPerPixel := 1.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   307
    bitsPerSample := #(8).
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   308
    colorMap := Array with:rMap with:gMap with:bMap.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   309
    inStream close.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   310
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   311
!
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   312
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   313
fromFile: aFilename 
3f9277473954 Initial revision
claus
parents:
diff changeset
   314
    | fileSize header |
3f9277473954 Initial revision
claus
parents:
diff changeset
   315
3f9277473954 Initial revision
claus
parents:
diff changeset
   316
    inStream := FileStream readonlyFileNamed:aFilename.
3f9277473954 Initial revision
claus
parents:
diff changeset
   317
    inStream isNil ifTrue:[
3f9277473954 Initial revision
claus
parents:
diff changeset
   318
        'open error' printNewline. 
3f9277473954 Initial revision
claus
parents:
diff changeset
   319
        ^ nil
3f9277473954 Initial revision
claus
parents:
diff changeset
   320
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   321
3f9277473954 Initial revision
claus
parents:
diff changeset
   322
    inStream binary.
3f9277473954 Initial revision
claus
parents:
diff changeset
   323
    fileSize := inStream size.
3f9277473954 Initial revision
claus
parents:
diff changeset
   324
3f9277473954 Initial revision
claus
parents:
diff changeset
   325
    fileSize < 16 ifTrue:[
3f9277473954 Initial revision
claus
parents:
diff changeset
   326
        inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   327
        self error:'short file'.
3f9277473954 Initial revision
claus
parents:
diff changeset
   328
        ^ nil
3f9277473954 Initial revision
claus
parents:
diff changeset
   329
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   330
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   331
    header := ByteArray uninitializedNew:16.
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   332
    inStream nextBytes:16 into:header.
3
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   333
    (header startsWith:#(66 77)) ifTrue:[     "BM"
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   334
        inStream close.
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   335
        ^ self fromWindowsBMPFile:aFilename
78aaa5408119 *** empty log message ***
claus
parents: 0
diff changeset
   336
    ].
0
3f9277473954 Initial revision
claus
parents:
diff changeset
   337
    (header startsWith:#(66 65)) ifTrue:[     "BA"
3f9277473954 Initial revision
claus
parents:
diff changeset
   338
        inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   339
        ^ self fromOS2File:aFilename
3f9277473954 Initial revision
claus
parents:
diff changeset
   340
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   341
    (header startsWith:#(73 67)) ifTrue:[     "IC"
3f9277473954 Initial revision
claus
parents:
diff changeset
   342
        inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   343
        ^ self fromOS2File:aFilename
3f9277473954 Initial revision
claus
parents:
diff changeset
   344
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   345
    (header startsWith:#(0 0 1 0 1 0)) ifTrue:[
3f9277473954 Initial revision
claus
parents:
diff changeset
   346
        inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   347
        ^ self fromWindowsFile:aFilename
3f9277473954 Initial revision
claus
parents:
diff changeset
   348
    ].
3f9277473954 Initial revision
claus
parents:
diff changeset
   349
    self error:'format not supported'.
3f9277473954 Initial revision
claus
parents:
diff changeset
   350
    inStream close.
3f9277473954 Initial revision
claus
parents:
diff changeset
   351
    ^ nil
3f9277473954 Initial revision
claus
parents:
diff changeset
   352
3f9277473954 Initial revision
claus
parents:
diff changeset
   353
    "Image fromFile:'/LocalLibrary/Images/OS2_icons/dos.ico'"
3f9277473954 Initial revision
claus
parents:
diff changeset
   354
! !