Image.st
author claus
Mon, 13 Dec 1993 18:10:47 +0100
changeset 17 be9898c59977
parent 12 9f0995fac1fa
child 24 e810b1be068b
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
48194c26a46c Initial revision
claus
parents:
diff changeset
     1
"
6
7ee0cfde237d *** empty log message ***
claus
parents: 5
diff changeset
     2
 COPYRIGHT (c) 1991 by Claus Gittinger
0
48194c26a46c Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
48194c26a46c Initial revision
claus
parents:
diff changeset
     4
48194c26a46c Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
48194c26a46c Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
48194c26a46c Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
48194c26a46c Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
48194c26a46c Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
48194c26a46c Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
48194c26a46c Initial revision
claus
parents:
diff changeset
    11
"
48194c26a46c Initial revision
claus
parents:
diff changeset
    12
48194c26a46c Initial revision
claus
parents:
diff changeset
    13
Object subclass:#Image
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    14
         instanceVariableNames:'bytes width height 
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    15
                                bitsPerSample samplesPerPixel
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    16
                                colorMap photometric 
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    17
                                device deviceForm monoDeviceForm
48194c26a46c Initial revision
claus
parents:
diff changeset
    18
                                fullColorDeviceForm'
48194c26a46c Initial revision
claus
parents:
diff changeset
    19
         classVariableNames:'lobby
48194c26a46c Initial revision
claus
parents:
diff changeset
    20
                             DitherAlgorithm NumberOfDitherColors
48194c26a46c Initial revision
claus
parents:
diff changeset
    21
                             FileFormats'
48194c26a46c Initial revision
claus
parents:
diff changeset
    22
         poolDictionaries:''
48194c26a46c Initial revision
claus
parents:
diff changeset
    23
         category:'Graphics-Display Objects'
48194c26a46c Initial revision
claus
parents:
diff changeset
    24
!
48194c26a46c Initial revision
claus
parents:
diff changeset
    25
48194c26a46c Initial revision
claus
parents:
diff changeset
    26
Image comment:'
48194c26a46c Initial revision
claus
parents:
diff changeset
    27
6
7ee0cfde237d *** empty log message ***
claus
parents: 5
diff changeset
    28
COPYRIGHT (c) 1991 by Claus Gittinger
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    29
              All Rights Reserved
48194c26a46c Initial revision
claus
parents:
diff changeset
    30
17
be9898c59977 *** empty log message ***
claus
parents: 12
diff changeset
    31
$Header: /cvs/stx/stx/libview/Image.st,v 1.6 1993-12-13 17:09:53 claus Exp $
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    32
written Summer 91 by claus
48194c26a46c Initial revision
claus
parents:
diff changeset
    33
'!
48194c26a46c Initial revision
claus
parents:
diff changeset
    34
48194c26a46c Initial revision
claus
parents:
diff changeset
    35
!Image class methodsFor:'documentation'!
48194c26a46c Initial revision
claus
parents:
diff changeset
    36
48194c26a46c Initial revision
claus
parents:
diff changeset
    37
documentation
48194c26a46c Initial revision
claus
parents:
diff changeset
    38
"
48194c26a46c Initial revision
claus
parents:
diff changeset
    39
this class provides (some time in the future) representation
48194c26a46c Initial revision
claus
parents:
diff changeset
    40
for all kinds of images (monochrome, greyscale and color)
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    41
and will finally replace Form - its still under construction.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    42
48194c26a46c Initial revision
claus
parents:
diff changeset
    43
An Image keeps all info in a device independent way, but may get
48194c26a46c Initial revision
claus
parents:
diff changeset
    44
associated to a device. The data held keeps all information which
48194c26a46c Initial revision
claus
parents:
diff changeset
    45
was originally present, even if the display-device has lower resolution.
48194c26a46c Initial revision
claus
parents:
diff changeset
    46
Therefore, it is even on low color resolution displays possible, to
48194c26a46c Initial revision
claus
parents:
diff changeset
    47
process and manipulate images without loosing color information.
48194c26a46c Initial revision
claus
parents:
diff changeset
    48
48194c26a46c Initial revision
claus
parents:
diff changeset
    49
Usually, you get a device specific representation of the image by
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    50
sending an image the 'on:aDevice' message, which will create
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    51
a (possibly) dithered form representing the image using the currently
48194c26a46c Initial revision
claus
parents:
diff changeset
    52
available colors.
48194c26a46c Initial revision
claus
parents:
diff changeset
    53
Sometimes, a monochrome representation is needed (X servers take monochrome
48194c26a46c Initial revision
claus
parents:
diff changeset
    54
icons only), this will be created by 'image>>monochromeOn:aDevice'.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    55
Also, it is planned to generate another hi-color resolution version,
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    56
which needs its own colormap to be installed and allows use of all
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    57
256 colors on an 8bit display (not currently implemented).
48194c26a46c Initial revision
claus
parents:
diff changeset
    58
48194c26a46c Initial revision
claus
parents:
diff changeset
    59
To convert pictures from/to external file-formats, readers are used
48194c26a46c Initial revision
claus
parents:
diff changeset
    60
which have the file-format knowledge (see TIFFReader, GIFReader etc.).
48194c26a46c Initial revision
claus
parents:
diff changeset
    61
48194c26a46c Initial revision
claus
parents:
diff changeset
    62
The algorithms in here (especially dithering & color allocation) are
48194c26a46c Initial revision
claus
parents:
diff changeset
    63
experimental and far from beeing perfect (some are very slow). 
48194c26a46c Initial revision
claus
parents:
diff changeset
    64
Much more work is needed and will be done in the near future ...
48194c26a46c Initial revision
claus
parents:
diff changeset
    65
Dithering is done as:
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    66
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    67
   DitherAlgorithm:
48194c26a46c Initial revision
claus
parents:
diff changeset
    68
48194c26a46c Initial revision
claus
parents:
diff changeset
    69
   nil                  a simple threshold algorithm
48194c26a46c Initial revision
claus
parents:
diff changeset
    70
                        (i.e. for mono, p<0.5 -> black, p>=0.5 -> white)
48194c26a46c Initial revision
claus
parents:
diff changeset
    71
48194c26a46c Initial revision
claus
parents:
diff changeset
    72
   #pattern             patterned dither
48194c26a46c Initial revision
claus
parents:
diff changeset
    73
                        (for p, take dithered color to fill pixel;
48194c26a46c Initial revision
claus
parents:
diff changeset
    74
                         uses dithering in color-class)
48194c26a46c Initial revision
claus
parents:
diff changeset
    75
48194c26a46c Initial revision
claus
parents:
diff changeset
    76
   #error               error diffusion dither (Floyd-Steinberg)
48194c26a46c Initial revision
claus
parents:
diff changeset
    77
                        planned
48194c26a46c Initial revision
claus
parents:
diff changeset
    78
48194c26a46c Initial revision
claus
parents:
diff changeset
    79
File formats are handled by subclasses of ImageReader, which understand
48194c26a46c Initial revision
claus
parents:
diff changeset
    80
a specific format. You can add more readers, by adding an association
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    81
such as ('.jpg' -> JPEGReader) to the class variable 'FileFormats' (see
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    82
Image initialize.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    83
48194c26a46c Initial revision
claus
parents:
diff changeset
    84
instance variables:
48194c26a46c Initial revision
claus
parents:
diff changeset
    85
48194c26a46c Initial revision
claus
parents:
diff changeset
    86
width               <Integer>       the width in pixels
48194c26a46c Initial revision
claus
parents:
diff changeset
    87
height              <Integer>       the height in pixels
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
    88
bytes               <ByteArray>     the full image information
0
48194c26a46c Initial revision
claus
parents:
diff changeset
    89
photometric         <Symbol>        #rgb, #palette, #blackIs0 or #whiteIs0
48194c26a46c Initial revision
claus
parents:
diff changeset
    90
samplesPerPixel     <Integer>       the number of planes
48194c26a46c Initial revision
claus
parents:
diff changeset
    91
bitsPerSample       <Array>         the number of bits per plane
48194c26a46c Initial revision
claus
parents:
diff changeset
    92
colorMap            <Array>         an Array of 3 arrays containing red,
48194c26a46c Initial revision
claus
parents:
diff changeset
    93
                                    green and blue values (0..255 biased)
48194c26a46c Initial revision
claus
parents:
diff changeset
    94
device              <Workstation>   the device on which deviceForm,
48194c26a46c Initial revision
claus
parents:
diff changeset
    95
                                    monoDeviceForm and lowResDeviceForm are
48194c26a46c Initial revision
claus
parents:
diff changeset
    96
deviceForm          <Form>          the device form which gives the best
48194c26a46c Initial revision
claus
parents:
diff changeset
    97
                                    possible aproximation of the image on
48194c26a46c Initial revision
claus
parents:
diff changeset
    98
                                    device using standard colors.
48194c26a46c Initial revision
claus
parents:
diff changeset
    99
monoDeviceForm      <Form>          the device form which gives a monochrome
48194c26a46c Initial revision
claus
parents:
diff changeset
   100
                                    aproximation of the image on device.
48194c26a46c Initial revision
claus
parents:
diff changeset
   101
fullColorDeviceForm <Form>          the device form which gives the best
48194c26a46c Initial revision
claus
parents:
diff changeset
   102
                                    possible aproximation of the image on
48194c26a46c Initial revision
claus
parents:
diff changeset
   103
                                    device using private colors.
48194c26a46c Initial revision
claus
parents:
diff changeset
   104
48194c26a46c Initial revision
claus
parents:
diff changeset
   105
class variables:
48194c26a46c Initial revision
claus
parents:
diff changeset
   106
48194c26a46c Initial revision
claus
parents:
diff changeset
   107
lobby               <Registry>      keeps track of known images
48194c26a46c Initial revision
claus
parents:
diff changeset
   108
DitherAlgorithm     <Symbol>        defines how to dither
48194c26a46c Initial revision
claus
parents:
diff changeset
   109
NumberOfDitherColors <Integer>      defines, how many dither colors to use
48194c26a46c Initial revision
claus
parents:
diff changeset
   110
FileFormats         <Dictionary>    associates filename extensions to
48194c26a46c Initial revision
claus
parents:
diff changeset
   111
                                    image reader classes
48194c26a46c Initial revision
claus
parents:
diff changeset
   112
"
48194c26a46c Initial revision
claus
parents:
diff changeset
   113
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   114
48194c26a46c Initial revision
claus
parents:
diff changeset
   115
!Image class methodsFor:'misc'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   116
48194c26a46c Initial revision
claus
parents:
diff changeset
   117
dither:aSymbol
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   118
    "define how to dither - #pattern, #error or none;
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   119
     error diffusion dithering is currently not implemented,
48194c26a46c Initial revision
claus
parents:
diff changeset
   120
     pattern dither is currently very slow."
48194c26a46c Initial revision
claus
parents:
diff changeset
   121
48194c26a46c Initial revision
claus
parents:
diff changeset
   122
    DitherAlgorithm := aSymbol
48194c26a46c Initial revision
claus
parents:
diff changeset
   123
48194c26a46c Initial revision
claus
parents:
diff changeset
   124
    "Image dither:#pattern"
48194c26a46c Initial revision
claus
parents:
diff changeset
   125
    "Image dither:#error"
48194c26a46c Initial revision
claus
parents:
diff changeset
   126
    "Image dither:nil"
48194c26a46c Initial revision
claus
parents:
diff changeset
   127
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   128
48194c26a46c Initial revision
claus
parents:
diff changeset
   129
numberOfDitherColors:n
48194c26a46c Initial revision
claus
parents:
diff changeset
   130
    "define how many colors (i.e. patterns) to use when
48194c26a46c Initial revision
claus
parents:
diff changeset
   131
     doing a pattern dither (good values are:)"
48194c26a46c Initial revision
claus
parents:
diff changeset
   132
48194c26a46c Initial revision
claus
parents:
diff changeset
   133
    NumberOfDitherColors := n
48194c26a46c Initial revision
claus
parents:
diff changeset
   134
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   135
48194c26a46c Initial revision
claus
parents:
diff changeset
   136
!Image class methodsFor:'initialization'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   137
48194c26a46c Initial revision
claus
parents:
diff changeset
   138
initialize
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   139
    "initialize class constants"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   140
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   141
    "setup tracker of known pictures"
48194c26a46c Initial revision
claus
parents:
diff changeset
   142
    lobby isNil ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   143
        lobby := Registry new.
48194c26a46c Initial revision
claus
parents:
diff changeset
   144
        ObjectMemory addDependent:self.
48194c26a46c Initial revision
claus
parents:
diff changeset
   145
    ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   146
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   147
    "define algorithm to use for dithering - currently only nil or #pattern supported"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   148
    DitherAlgorithm := #pattern.   "will be changed to error as soon as implemented"
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   149
    (Display notNil and:[Display hasGreyscales]) ifFalse:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   150
        NumberOfDitherColors := 64
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   151
    ] ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   152
        "as far as I remember, this is about the number of grey values, the eye can distinguish"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   153
        NumberOfDitherColors := 100
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   154
    ].
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   155
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   156
    "define reader classes"
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   157
    FileFormats isNil ifTrue:[
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   158
        FileFormats := Dictionary new.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   159
        FileFormats at:'.xbm'  put:XBMReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   160
        FileFormats at:'.tiff' put:TIFFReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   161
        FileFormats at:'.tif'  put:TIFFReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   162
        FileFormats at:'.gif'  put:GIFReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   163
        FileFormats at:'.img'  put:IMGReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   164
        FileFormats at:'.pcx'  put:PCXReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   165
        FileFormats at:'.mac'  put:MacPaintReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   166
        FileFormats at:'.im8'  put:SunRasterReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   167
        FileFormats at:'.icon' put:SunRasterReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   168
        FileFormats at:'.face' put:FaceReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   169
        FileFormats at:'.g3'   put:G3FileReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   170
        FileFormats at:'.bmp'  put:WindowsIconReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   171
        FileFormats at:'.ico'  put:WindowsIconReader.
17
be9898c59977 *** empty log message ***
claus
parents: 12
diff changeset
   172
        FileFormats at:'.BMP'  put:WindowsIconReader.
be9898c59977 *** empty log message ***
claus
parents: 12
diff changeset
   173
        FileFormats at:'.ICO'  put:WindowsIconReader.
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   174
        FileFormats at:'.jpg'  put:JPEGReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   175
        FileFormats at:'.jpeg' put:JPEGReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   176
        FileFormats at:'.ppm'  put:PBMReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   177
        FileFormats at:'.pbm'  put:PBMReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   178
        FileFormats at:'.pgm'  put:PBMReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   179
        FileFormats at:'.form' put:ST80FormReader.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   180
    ].
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   181
!
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   182
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   183
fileFormats
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   184
    "return the collection of supported file formats"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   185
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   186
    ^ FileFormats
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   187
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   188
48194c26a46c Initial revision
claus
parents:
diff changeset
   189
flushDeviceImages
48194c26a46c Initial revision
claus
parents:
diff changeset
   190
    "simply unassign all pictures from their device"
48194c26a46c Initial revision
claus
parents:
diff changeset
   191
48194c26a46c Initial revision
claus
parents:
diff changeset
   192
    lobby contentsDo:[:anImage |
48194c26a46c Initial revision
claus
parents:
diff changeset
   193
        anImage restored
48194c26a46c Initial revision
claus
parents:
diff changeset
   194
    ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   195
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   196
48194c26a46c Initial revision
claus
parents:
diff changeset
   197
update:something
48194c26a46c Initial revision
claus
parents:
diff changeset
   198
    "flush all device specific stuff when restarted from a snapshot"
48194c26a46c Initial revision
claus
parents:
diff changeset
   199
48194c26a46c Initial revision
claus
parents:
diff changeset
   200
    (something == #restarted) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   201
        self flushDeviceImages
48194c26a46c Initial revision
claus
parents:
diff changeset
   202
    ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   203
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   204
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   205
!Image class methodsFor:'screen capture'!
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   206
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   207
fromScreen
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   208
    "return an image of the full screen"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   209
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   210
    ^ self fromScreen:(0@0 corner:(Display width@Display height))
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   211
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   212
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   213
fromScreen:aRectangle
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   214
    "return an image of a part of the screen"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   215
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   216
    |depth img|
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   217
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   218
    depth := Display depth.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   219
    img := (self implementorForDepth: depth) new.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   220
    ^ img fromScreen:aRectangle
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   221
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   222
    "Image fromScreen:(0@0 corner:100@100)"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   223
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   224
48194c26a46c Initial revision
claus
parents:
diff changeset
   225
!Image class methodsFor:'reading from file'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   226
48194c26a46c Initial revision
claus
parents:
diff changeset
   227
fromFile:aFileName
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   228
    "read an image from a file - this methods tries to find
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   229
     out the file format itself (by the extension and by contents)
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   230
     and lets the appropriate reader read the file"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   231
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   232
    |readerClass image name|
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   233
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   234
    name := aFileName.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   235
    (name endsWith:'.Z') ifTrue:[
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   236
        name := name copyTo:(name size - 2)
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   237
    ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   238
    FileFormats associationsDo:[:assoc |
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   239
        (name endsWith:(assoc key)) ifTrue:[
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   240
            readerClass := assoc value.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   241
            readerClass notNil ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   242
                image := readerClass fromFile:aFileName.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   243
                image notNil ifTrue:[^ image].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   244
            ]
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   245
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   246
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   247
    "no known extension - ask all readers if they know
48194c26a46c Initial revision
claus
parents:
diff changeset
   248
     this format ..."
48194c26a46c Initial revision
claus
parents:
diff changeset
   249
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   250
    FileFormats associationsDo:[:assoc |
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   251
        readerClass := assoc value.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   252
        readerClass notNil ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   253
            (readerClass isValidImageFile:aFileName) ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   254
                ^ readerClass fromFile:aFileName
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   255
            ]
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   256
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   257
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   258
48194c26a46c Initial revision
claus
parents:
diff changeset
   259
    "nope - unknown format"
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   260
    'unknown image file format: ' print. aFileName printNewline.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   261
    ^ nil
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   262
48194c26a46c Initial revision
claus
parents:
diff changeset
   263
    "Image fromFile:'bitmaps/dano.tiff'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   264
    "Image fromFile:'bitmaps/test.fax'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   265
    "Image fromFile:'bitmaps/voice.tiff'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   266
    "Image fromFile:'voice.tiff'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   267
48194c26a46c Initial revision
claus
parents:
diff changeset
   268
    "Image fromFile:'../fileIn/bitmaps/claus.gif'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   269
    "Image fromFile:'../fileIn/bitmaps/garfield.gif'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   270
48194c26a46c Initial revision
claus
parents:
diff changeset
   271
    "Image fromFile:'../fileIn/bitmaps/founders.im8'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   272
    "Image fromFile:'../goodies/faces/next.com/steve.face'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   273
48194c26a46c Initial revision
claus
parents:
diff changeset
   274
    "Image fromFile:'/LocalLibrary/Images/OS2/dos3.ico'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   275
    "Image fromFile:'bitmaps/globe1.xbm'"
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   276
    "Image fromFile:'bitmaps/globe1.xbm.Z'"
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   277
    "Image fromFile:'bitmaps/hello_world.icon'"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   278
! !
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   279
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   280
!Image class methodsFor:'queries'!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   281
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   282
implementorForDepth: depth
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   283
    "return the class, which best implements images of depth"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   284
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   285
    depth == 1 ifTrue:[^ Depth1Image].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   286
    depth == 2 ifTrue:[^ Depth2Image].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   287
    depth == 4 ifTrue:[^ Depth4Image].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   288
    depth == 8 ifTrue:[^ Depth8Image].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   289
    depth == 24 ifTrue:[^ Depth24Image].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   290
    ^ self
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   291
! !
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   292
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   293
!Image methodsFor:'instance release'!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   294
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   295
restored
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   296
    "flush device specifics after a snapin or binary restore"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   297
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   298
    device := nil.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   299
    deviceForm := nil.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   300
    monoDeviceForm := nil.
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   301
    fullColorDeviceForm := nil.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   302
    lobby unregister:self
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   303
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   304
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   305
disposed
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   306
    "some Image has been collected - nothing to do"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   307
! !
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   308
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   309
!Image methodsFor:'inpecting'!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   310
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   311
inspect
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   312
    "redefined to launch an ImageInspector on the receiver
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   313
     (instead of the default InspectorView)."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   314
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   315
    ImageInspectorView isNil ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   316
        super inspect
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   317
    ] ifFalse:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   318
        ImageInspectorView openOn:self
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   319
    ]
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   320
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   321
48194c26a46c Initial revision
claus
parents:
diff changeset
   322
!Image methodsFor:'accessing'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   323
48194c26a46c Initial revision
claus
parents:
diff changeset
   324
device
48194c26a46c Initial revision
claus
parents:
diff changeset
   325
    "return the device, the receiver is associated with.
48194c26a46c Initial revision
claus
parents:
diff changeset
   326
     Return nil, if the image is unassigned."
48194c26a46c Initial revision
claus
parents:
diff changeset
   327
48194c26a46c Initial revision
claus
parents:
diff changeset
   328
    ^ device
48194c26a46c Initial revision
claus
parents:
diff changeset
   329
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   330
48194c26a46c Initial revision
claus
parents:
diff changeset
   331
id
48194c26a46c Initial revision
claus
parents:
diff changeset
   332
    "return the id of the image on the device.
48194c26a46c Initial revision
claus
parents:
diff changeset
   333
     Return nil, if the image is unassigned."
48194c26a46c Initial revision
claus
parents:
diff changeset
   334
48194c26a46c Initial revision
claus
parents:
diff changeset
   335
    deviceForm isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
   336
    ^ deviceForm id
48194c26a46c Initial revision
claus
parents:
diff changeset
   337
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   338
48194c26a46c Initial revision
claus
parents:
diff changeset
   339
monochromeId
48194c26a46c Initial revision
claus
parents:
diff changeset
   340
    "return the id of the monochrome image on the device.
48194c26a46c Initial revision
claus
parents:
diff changeset
   341
     Return nil, if the image is unassigned."
48194c26a46c Initial revision
claus
parents:
diff changeset
   342
48194c26a46c Initial revision
claus
parents:
diff changeset
   343
    monoDeviceForm isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
   344
    ^ monoDeviceForm id
48194c26a46c Initial revision
claus
parents:
diff changeset
   345
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   346
48194c26a46c Initial revision
claus
parents:
diff changeset
   347
fullColorId
48194c26a46c Initial revision
claus
parents:
diff changeset
   348
    "return the id of the full color image on the device.
48194c26a46c Initial revision
claus
parents:
diff changeset
   349
     Return nil, if the image is unassigned."
48194c26a46c Initial revision
claus
parents:
diff changeset
   350
48194c26a46c Initial revision
claus
parents:
diff changeset
   351
    fullColorDeviceForm isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
   352
    ^ fullColorDeviceForm id
48194c26a46c Initial revision
claus
parents:
diff changeset
   353
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   354
48194c26a46c Initial revision
claus
parents:
diff changeset
   355
width
48194c26a46c Initial revision
claus
parents:
diff changeset
   356
    "return the width of the image"
48194c26a46c Initial revision
claus
parents:
diff changeset
   357
48194c26a46c Initial revision
claus
parents:
diff changeset
   358
    ^ width
48194c26a46c Initial revision
claus
parents:
diff changeset
   359
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   360
48194c26a46c Initial revision
claus
parents:
diff changeset
   361
width:aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   362
    "set the width of the image"
48194c26a46c Initial revision
claus
parents:
diff changeset
   363
48194c26a46c Initial revision
claus
parents:
diff changeset
   364
    width := aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   365
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   366
48194c26a46c Initial revision
claus
parents:
diff changeset
   367
height
48194c26a46c Initial revision
claus
parents:
diff changeset
   368
    "return the height of the image"
48194c26a46c Initial revision
claus
parents:
diff changeset
   369
48194c26a46c Initial revision
claus
parents:
diff changeset
   370
    ^ height
48194c26a46c Initial revision
claus
parents:
diff changeset
   371
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   372
48194c26a46c Initial revision
claus
parents:
diff changeset
   373
height:aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   374
    "set the height of the image"
48194c26a46c Initial revision
claus
parents:
diff changeset
   375
48194c26a46c Initial revision
claus
parents:
diff changeset
   376
    height := aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   377
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   378
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   379
extent
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   380
    "return the images extent"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   381
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   382
    ^ width@height
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   383
!
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   384
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   385
samplesPerPixel
48194c26a46c Initial revision
claus
parents:
diff changeset
   386
    "return the number of samples per pixel in the image.
48194c26a46c Initial revision
claus
parents:
diff changeset
   387
     The return value is an array of bits-per-plane."
48194c26a46c Initial revision
claus
parents:
diff changeset
   388
48194c26a46c Initial revision
claus
parents:
diff changeset
   389
    ^ samplesPerPixel
48194c26a46c Initial revision
claus
parents:
diff changeset
   390
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   391
48194c26a46c Initial revision
claus
parents:
diff changeset
   392
samplesPerPixel:aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   393
    "set the array of samples per pixel"
48194c26a46c Initial revision
claus
parents:
diff changeset
   394
48194c26a46c Initial revision
claus
parents:
diff changeset
   395
    samplesPerPixel := aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   396
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   397
48194c26a46c Initial revision
claus
parents:
diff changeset
   398
depth
48194c26a46c Initial revision
claus
parents:
diff changeset
   399
    "return the depth of the image"
48194c26a46c Initial revision
claus
parents:
diff changeset
   400
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   401
    ^ self bitsPerPixel
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   402
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   403
48194c26a46c Initial revision
claus
parents:
diff changeset
   404
bitsPerSample
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   405
    "return the number of bits per sample.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   406
     The return value is an array of bits-per-plane."
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   407
48194c26a46c Initial revision
claus
parents:
diff changeset
   408
    ^ bitsPerSample
48194c26a46c Initial revision
claus
parents:
diff changeset
   409
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   410
48194c26a46c Initial revision
claus
parents:
diff changeset
   411
bitsPerSample:aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   412
    bitsPerSample := aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   413
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   414
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   415
bitsPerPixel
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   416
    "return the number of bits per pixel"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   417
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   418
    ^ (bitsPerSample inject:0 into:[:sum :i | sum + i])
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   419
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   420
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   421
bitsPerRow
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   422
    "return the number of bits in one scanline of the image"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   423
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   424
    ^  width * (self bitsPerPixel).
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   425
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   426
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   427
bytesPerRow
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   428
    "return the number of bytes in one scanline of the image"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   429
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   430
    |bitsPerRow bytesPerRow|
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   431
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   432
    bitsPerRow := width * (self bitsPerPixel).
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   433
    bytesPerRow := bitsPerRow // 8.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   434
    ((bitsPerRow \\ 8) ~~ 0) ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   435
        bytesPerRow := bytesPerRow + 1
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   436
    ].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   437
    ^ bytesPerRow
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   438
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   439
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   440
data
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   441
    "for backward compatibility - will vanish"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   442
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   443
    ^ bytes
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   444
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   445
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   446
data:aByteArray
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   447
    "for backward compatibility - will vanish"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   448
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   449
    bytes := aByteArray
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   450
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   451
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   452
bits:aByteArray
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   453
    "set the raw data"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   454
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   455
    bytes := aByteArray
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   456
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   457
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   458
bits
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   459
    "return the raw image data; depending on the photometric,
48194c26a46c Initial revision
claus
parents:
diff changeset
   460
     this has to be interpreted as monochrome, greyscale,
48194c26a46c Initial revision
claus
parents:
diff changeset
   461
     palette or rgb data. It is also packed to be dense, so
48194c26a46c Initial revision
claus
parents:
diff changeset
   462
     a 4 bitPerSample palette image will store 2 pixels per byte."
48194c26a46c Initial revision
claus
parents:
diff changeset
   463
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   464
    ^ bytes
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   465
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   466
48194c26a46c Initial revision
claus
parents:
diff changeset
   467
photometric
48194c26a46c Initial revision
claus
parents:
diff changeset
   468
    "return the photometric, a symbol such as #palette, #rgb etc."
48194c26a46c Initial revision
claus
parents:
diff changeset
   469
48194c26a46c Initial revision
claus
parents:
diff changeset
   470
    ^ photometric
48194c26a46c Initial revision
claus
parents:
diff changeset
   471
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   472
48194c26a46c Initial revision
claus
parents:
diff changeset
   473
photometric:aSymbol
48194c26a46c Initial revision
claus
parents:
diff changeset
   474
    "set the photometric"
48194c26a46c Initial revision
claus
parents:
diff changeset
   475
48194c26a46c Initial revision
claus
parents:
diff changeset
   476
    photometric := aSymbol
48194c26a46c Initial revision
claus
parents:
diff changeset
   477
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   478
48194c26a46c Initial revision
claus
parents:
diff changeset
   479
colorMap:anArrayOfArrays
48194c26a46c Initial revision
claus
parents:
diff changeset
   480
    colorMap := anArrayOfArrays
48194c26a46c Initial revision
claus
parents:
diff changeset
   481
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   482
48194c26a46c Initial revision
claus
parents:
diff changeset
   483
colorMap
48194c26a46c Initial revision
claus
parents:
diff changeset
   484
    "return the colormap"
48194c26a46c Initial revision
claus
parents:
diff changeset
   485
48194c26a46c Initial revision
claus
parents:
diff changeset
   486
    ^ colorMap
48194c26a46c Initial revision
claus
parents:
diff changeset
   487
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   488
48194c26a46c Initial revision
claus
parents:
diff changeset
   489
at:aPoint
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   490
    "retrieve the pixel at aPoint; return a color.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   491
     Pixels start at 0@0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   492
     width-1@height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   493
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   494
     very slow ..."
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   495
48194c26a46c Initial revision
claus
parents:
diff changeset
   496
    ^ self atX:aPoint x y:aPoint y
48194c26a46c Initial revision
claus
parents:
diff changeset
   497
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   498
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   499
valueAt:aPoint
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   500
    "retrieve the pixel at aPoint; return a pixel value.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   501
     Pixels start at 0@0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   502
     width-1@height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   503
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   504
     very slow ..."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   505
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   506
    ^ self valueAtX:aPoint x y:aPoint y
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   507
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   508
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   509
atX:x y:y
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   510
    "retrieve a pixel at x/y; return a color.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   511
     Pixels start at x=0 , y=0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   512
     x = width-1, y=height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   513
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   514
     very slow ..."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   515
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   516
    ^ self subclassResponsibility
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   517
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   518
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   519
valueAtX:x y:y
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   520
    "retrieve the pixel at aPoint; return a pixel value.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   521
     Pixels start at x=0 , y=0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   522
     width-1@height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   523
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   524
     very slow ..."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   525
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   526
    ^ self subclassResponsibility
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   527
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   528
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   529
at:aPoint put:aColor
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   530
    "set the pixel at aPoint to aColor.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   531
     Pixels start at 0@0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   532
     width-1@height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   533
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   534
     very slow ..."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   535
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   536
    ^ self atX:aPoint x y:aPoint y put:aColor
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   537
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   538
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   539
atX:x y:y put:aColor
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   540
    "set the pixel at x/y to aColor.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   541
     Pixels start at x=0 , y=0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   542
     x = width-1, y=height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   543
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   544
     very slow ..."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   545
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   546
    ^ self subclassResponsibility
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   547
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   548
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   549
atX:x y:y putValue:aPixelValue
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   550
    "set the pixel at x/y to aPixelValue.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   551
     Pixels start at x=0 , y=0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   552
     x = width-1, y=height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   553
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   554
     very slow ..."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   555
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   556
    ^ self subclassResponsibility
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   557
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   558
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   559
atY:y from:x1 to:x2 do:aBlock
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   560
    "perform aBlock for each pixel from x1 to x2 in row y.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   561
     The block is passed the color at each pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   562
     This method allows slighly faster processing of an
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   563
     image than using atX:y:, since some processing can be 
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   564
     avoided when going from pixel to pixel. However, for 
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   565
     real image processing, specialized methods should be written."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   566
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   567
    ^ self subclassResponsibility.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   568
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   569
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   570
!Image methodsFor:'storing'!
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   571
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   572
storeOn:aStream
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   573
    aStream nextPutAll:'(' , self class name , ' new)'.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   574
    aStream nextPutAll:' width: '. width storeOn:aStream.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   575
    aStream nextPutAll:'; height: '. height storeOn:aStream.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   576
    aStream nextPutAll:'; photometric:('. photometric storeOn:aStream.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   577
    aStream nextPutAll:'); bitsPerSample:('. bitsPerSample storeOn:aStream.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   578
    aStream nextPutAll:'); samplesPerPixel:('. samplesPerPixel storeOn:aStream. 
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   579
    aStream nextPutAll:'); bits:('. bytes storeOn:aStream. aStream nextPutAll:'); '.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   580
    colorMap notNil ifTrue:[
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   581
        aStream nextPutAll:'; colorMap:('.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   582
        colorMap storeOn:aStream.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   583
        aStream nextPutAll:')'.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   584
    ].
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   585
    aStream nextPutAll:' yourself'
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   586
! !
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   587
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   588
!Image methodsFor:'screen capture'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   589
48194c26a46c Initial revision
claus
parents:
diff changeset
   590
fromScreen:aRectangle
48194c26a46c Initial revision
claus
parents:
diff changeset
   591
    "read an image from the display screen"
48194c26a46c Initial revision
claus
parents:
diff changeset
   592
48194c26a46c Initial revision
claus
parents:
diff changeset
   593
    ^ self fromScreen:aRectangle on:Display
48194c26a46c Initial revision
claus
parents:
diff changeset
   594
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   595
48194c26a46c Initial revision
claus
parents:
diff changeset
   596
fromScreen:aRectangle on:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   597
    "read an image from aDevices display screen.
48194c26a46c Initial revision
claus
parents:
diff changeset
   598
     Since I have no other displays, only the MonoChrome, StaticGrey 
48194c26a46c Initial revision
claus
parents:
diff changeset
   599
     and PseudoColor cases have been tested ... 
48194c26a46c Initial revision
claus
parents:
diff changeset
   600
     (especially True- and DirectColor may be wrong)"
48194c26a46c Initial revision
claus
parents:
diff changeset
   601
48194c26a46c Initial revision
claus
parents:
diff changeset
   602
    |depth visType root 
48194c26a46c Initial revision
claus
parents:
diff changeset
   603
     x        "{ Class: SmallInteger }"
48194c26a46c Initial revision
claus
parents:
diff changeset
   604
     y        "{ Class: SmallInteger }"
48194c26a46c Initial revision
claus
parents:
diff changeset
   605
     w        "{ Class: SmallInteger }"
48194c26a46c Initial revision
claus
parents:
diff changeset
   606
     h        "{ Class: SmallInteger }"
48194c26a46c Initial revision
claus
parents:
diff changeset
   607
     dstIndex "{ Class: SmallInteger }" 
48194c26a46c Initial revision
claus
parents:
diff changeset
   608
     srcIndex "{ Class: SmallInteger }" 
48194c26a46c Initial revision
claus
parents:
diff changeset
   609
     inData tmpData usedColors nUsed 
48194c26a46c Initial revision
claus
parents:
diff changeset
   610
     rMap gMap bMap bitsPerPixel bytesPerLine
48194c26a46c Initial revision
claus
parents:
diff changeset
   611
     info bytesPerLineIn|
48194c26a46c Initial revision
claus
parents:
diff changeset
   612
48194c26a46c Initial revision
claus
parents:
diff changeset
   613
    visType := aDevice visualType.
48194c26a46c Initial revision
claus
parents:
diff changeset
   614
    depth := aDevice depth.
48194c26a46c Initial revision
claus
parents:
diff changeset
   615
    (visType == #StaticGray) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   616
        (aDevice blackpixel == 0) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   617
            photometric := #blackIs0
48194c26a46c Initial revision
claus
parents:
diff changeset
   618
        ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   619
            photometric := #whiteIs0
48194c26a46c Initial revision
claus
parents:
diff changeset
   620
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   621
        samplesPerPixel := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   622
        bitsPerPixel := depth.
48194c26a46c Initial revision
claus
parents:
diff changeset
   623
        bitsPerSample := Array with:bitsPerPixel.
48194c26a46c Initial revision
claus
parents:
diff changeset
   624
    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   625
        ((visType == #PseudoColor) or:[visType == #StaticColor]) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   626
            photometric := #palette.
48194c26a46c Initial revision
claus
parents:
diff changeset
   627
            samplesPerPixel := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   628
            bitsPerPixel := depth.
48194c26a46c Initial revision
claus
parents:
diff changeset
   629
            bitsPerSample := Array with:bitsPerPixel.
48194c26a46c Initial revision
claus
parents:
diff changeset
   630
        ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   631
            ((visType == #TrueColor) or:[visType == #DirectColor]) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   632
                photometric := #rgb.
48194c26a46c Initial revision
claus
parents:
diff changeset
   633
                samplesPerPixel := 3.
48194c26a46c Initial revision
claus
parents:
diff changeset
   634
                bitsPerPixel := 24.
48194c26a46c Initial revision
claus
parents:
diff changeset
   635
                bitsPerSample := #(8 8 8)
48194c26a46c Initial revision
claus
parents:
diff changeset
   636
            ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   637
                self error:'screen visual not supported'.
48194c26a46c Initial revision
claus
parents:
diff changeset
   638
                ^ nil
48194c26a46c Initial revision
claus
parents:
diff changeset
   639
            ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   640
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   641
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   642
48194c26a46c Initial revision
claus
parents:
diff changeset
   643
    "dont know yet, how display pads, assume worst case"
48194c26a46c Initial revision
claus
parents:
diff changeset
   644
48194c26a46c Initial revision
claus
parents:
diff changeset
   645
    w := width := aRectangle width.
48194c26a46c Initial revision
claus
parents:
diff changeset
   646
    h := height := aRectangle height.
48194c26a46c Initial revision
claus
parents:
diff changeset
   647
    x := aRectangle left.
48194c26a46c Initial revision
claus
parents:
diff changeset
   648
    y := aRectangle top.
48194c26a46c Initial revision
claus
parents:
diff changeset
   649
48194c26a46c Initial revision
claus
parents:
diff changeset
   650
    bytesPerLine := (w * bitsPerPixel + 31) // 8.
48194c26a46c Initial revision
claus
parents:
diff changeset
   651
    inData := ByteArray uninitializedNew:(bytesPerLine * height).
48194c26a46c Initial revision
claus
parents:
diff changeset
   652
48194c26a46c Initial revision
claus
parents:
diff changeset
   653
    root := DisplayRootView on:aDevice.
48194c26a46c Initial revision
claus
parents:
diff changeset
   654
    info := aDevice getBitsFrom:root id x:x y:y width:w height:h into:inData. 
48194c26a46c Initial revision
claus
parents:
diff changeset
   655
48194c26a46c Initial revision
claus
parents:
diff changeset
   656
    "if the padding is not correct .."
48194c26a46c Initial revision
claus
parents:
diff changeset
   657
    bytesPerLineIn := (info at:3).                                "what I got"
48194c26a46c Initial revision
claus
parents:
diff changeset
   658
    bytesPerLine := (w * bitsPerPixel + 7) // 8.                  "what I want"
48194c26a46c Initial revision
claus
parents:
diff changeset
   659
    (bytesPerLine ~~ bytesPerLineIn) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   660
        tmpData := inData.
48194c26a46c Initial revision
claus
parents:
diff changeset
   661
        inData := ByteArray uninitializedNew:(bytesPerLine * height).
48194c26a46c Initial revision
claus
parents:
diff changeset
   662
        srcIndex := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   663
        dstIndex := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   664
        1 to:height do:[:h |
48194c26a46c Initial revision
claus
parents:
diff changeset
   665
            inData replaceFrom:dstIndex to:(dstIndex + bytesPerLine - 1)
48194c26a46c Initial revision
claus
parents:
diff changeset
   666
                          with:tmpData startingAt:srcIndex.
48194c26a46c Initial revision
claus
parents:
diff changeset
   667
            dstIndex := dstIndex + bytesPerLine.
48194c26a46c Initial revision
claus
parents:
diff changeset
   668
            srcIndex := srcIndex + bytesPerLineIn
48194c26a46c Initial revision
claus
parents:
diff changeset
   669
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   670
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   671
48194c26a46c Initial revision
claus
parents:
diff changeset
   672
    "info printNewline. "
48194c26a46c Initial revision
claus
parents:
diff changeset
   673
48194c26a46c Initial revision
claus
parents:
diff changeset
   674
    ((visType == #StaticGray) or:[visType == #TrueColor]) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   675
        "were done, the pixel values are the rgb/grey values"
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   676
        bytes := inData.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   677
        ^ self
48194c26a46c Initial revision
claus
parents:
diff changeset
   678
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   679
48194c26a46c Initial revision
claus
parents:
diff changeset
   680
    "what we have now are the color numbers - still need the r/g/b values"
48194c26a46c Initial revision
claus
parents:
diff changeset
   681
    "find out, which colors are in the picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
   682
48194c26a46c Initial revision
claus
parents:
diff changeset
   683
    usedColors := inData usedValues.
48194c26a46c Initial revision
claus
parents:
diff changeset
   684
    nUsed := usedColors maximumValue + 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   685
48194c26a46c Initial revision
claus
parents:
diff changeset
   686
    "get the palette"
48194c26a46c Initial revision
claus
parents:
diff changeset
   687
    rMap := Array new:nUsed.
48194c26a46c Initial revision
claus
parents:
diff changeset
   688
    gMap := Array new:nUsed.
48194c26a46c Initial revision
claus
parents:
diff changeset
   689
    bMap := Array new:nUsed.
48194c26a46c Initial revision
claus
parents:
diff changeset
   690
    usedColors do:[:colorIndex |
48194c26a46c Initial revision
claus
parents:
diff changeset
   691
        |i scale|
48194c26a46c Initial revision
claus
parents:
diff changeset
   692
48194c26a46c Initial revision
claus
parents:
diff changeset
   693
        i := colorIndex + 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   694
        scale := 255.0 / 100.0.
48194c26a46c Initial revision
claus
parents:
diff changeset
   695
        aDevice getRGBFrom:colorIndex into:[:r :g :b |
48194c26a46c Initial revision
claus
parents:
diff changeset
   696
            rMap at:i put:(r * scale) rounded.
48194c26a46c Initial revision
claus
parents:
diff changeset
   697
            gMap at:i put:(g * scale) rounded.
48194c26a46c Initial revision
claus
parents:
diff changeset
   698
            bMap at:i put:(b * scale) rounded
48194c26a46c Initial revision
claus
parents:
diff changeset
   699
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   700
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   701
    colorMap := Array with:rMap with:gMap with:bMap.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   702
    bytes := inData.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   703
48194c26a46c Initial revision
claus
parents:
diff changeset
   704
    "Image new fromScreen:((0 @ 0) corner:(100 @ 100)) on:Display"
48194c26a46c Initial revision
claus
parents:
diff changeset
   705
    "Image new fromScreen:((0 @ 0) corner:(500 @ 500)) on:Display"
48194c26a46c Initial revision
claus
parents:
diff changeset
   706
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   707
48194c26a46c Initial revision
claus
parents:
diff changeset
   708
!Image methodsFor:'saving on file'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   709
48194c26a46c Initial revision
claus
parents:
diff changeset
   710
saveOn:aFileName
48194c26a46c Initial revision
claus
parents:
diff changeset
   711
    FileFormats associationsDo:[:a |
48194c26a46c Initial revision
claus
parents:
diff changeset
   712
        (aFileName endsWith:(a key)) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   713
            ^ (a value) save:self onFile:aFileName
48194c26a46c Initial revision
claus
parents:
diff changeset
   714
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   715
    ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   716
    "no known extension - could ask user for the format here.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   717
     currently default to tiff format."
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   718
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   719
    'unknown extension - could not figure out format - using tiff' printNewline.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   720
    ^ self saveOn:aFileName using:TIFFReader
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   721
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   722
48194c26a46c Initial revision
claus
parents:
diff changeset
   723
saveOn:aFileName using:readerClass
48194c26a46c Initial revision
claus
parents:
diff changeset
   724
    "save the receiver using the representation class"
48194c26a46c Initial revision
claus
parents:
diff changeset
   725
48194c26a46c Initial revision
claus
parents:
diff changeset
   726
    readerClass save:self onFile:aFileName
48194c26a46c Initial revision
claus
parents:
diff changeset
   727
48194c26a46c Initial revision
claus
parents:
diff changeset
   728
    "anImage saveOn:'myImage' using:TIFFReader"
48194c26a46c Initial revision
claus
parents:
diff changeset
   729
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   730
48194c26a46c Initial revision
claus
parents:
diff changeset
   731
!Image methodsFor:'converting'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   732
48194c26a46c Initial revision
claus
parents:
diff changeset
   733
on:aDevice
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   734
    "make the image device dependent for aDevice"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   735
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   736
    ((aDevice == device) and:[deviceForm notNil]) ifTrue:[^ self].
48194c26a46c Initial revision
claus
parents:
diff changeset
   737
    deviceForm := self asFormOn:aDevice.
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   738
    deviceForm notNil ifTrue:[
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   739
        device isNil ifTrue:[
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   740
            device := aDevice.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   741
            lobby register:self
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   742
        ] ifFalse:[
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   743
            device := aDevice.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   744
            lobby changed:self
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   745
        ].
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   746
        deviceForm forgetBits
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   747
    ]
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   748
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   749
48194c26a46c Initial revision
claus
parents:
diff changeset
   750
monochromeOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   751
    ((aDevice == device) and:[monoDeviceForm notNil]) ifTrue:[^ self].
48194c26a46c Initial revision
claus
parents:
diff changeset
   752
    monoDeviceForm := self asMonochromeFormOn:aDevice.
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   753
    monoDeviceForm notNil ifTrue:[
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   754
        device := aDevice.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   755
        monoDeviceForm forgetBits
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
   756
    ]
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   757
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   758
48194c26a46c Initial revision
claus
parents:
diff changeset
   759
asFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   760
    "get a device form, with best possible approximation"
48194c26a46c Initial revision
claus
parents:
diff changeset
   761
48194c26a46c Initial revision
claus
parents:
diff changeset
   762
    (photometric == #palette) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   763
        ^ self paletteImageAsFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   764
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   765
48194c26a46c Initial revision
claus
parents:
diff changeset
   766
    (photometric == #rgb) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   767
        ^ self rgbImageAsFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   768
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   769
48194c26a46c Initial revision
claus
parents:
diff changeset
   770
    ^ self greyImageAsFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   771
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   772
48194c26a46c Initial revision
claus
parents:
diff changeset
   773
asMonochromeFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   774
    "get a monochrome device form"
48194c26a46c Initial revision
claus
parents:
diff changeset
   775
48194c26a46c Initial revision
claus
parents:
diff changeset
   776
    (photometric == #palette) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   777
        ^ self paletteImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   778
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   779
48194c26a46c Initial revision
claus
parents:
diff changeset
   780
    (photometric == #rgb) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   781
        ^ self rgbImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   782
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   783
48194c26a46c Initial revision
claus
parents:
diff changeset
   784
    ^ self greyImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   785
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   786
48194c26a46c Initial revision
claus
parents:
diff changeset
   787
!Image methodsFor:'converting rgb images'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   788
48194c26a46c Initial revision
claus
parents:
diff changeset
   789
rgbImageAsFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   790
    "convert am rgb image to a device form form aDevice.
48194c26a46c Initial revision
claus
parents:
diff changeset
   791
     Return the device form."
48194c26a46c Initial revision
claus
parents:
diff changeset
   792
48194c26a46c Initial revision
claus
parents:
diff changeset
   793
    |visual|
48194c26a46c Initial revision
claus
parents:
diff changeset
   794
48194c26a46c Initial revision
claus
parents:
diff changeset
   795
    visual := aDevice visualType.
48194c26a46c Initial revision
claus
parents:
diff changeset
   796
    (visual == #StaticGray) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   797
        ^ self rgbImageAsGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   798
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   799
    (visual == #TrueColor) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   800
        ^ self rgbImageAsTrueFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   801
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   802
    ^ self rgbImageAsPseudoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   803
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   804
48194c26a46c Initial revision
claus
parents:
diff changeset
   805
rgbImageAsGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   806
    "convert an rgb image to a grey image for greyscale displays"
48194c26a46c Initial revision
claus
parents:
diff changeset
   807
48194c26a46c Initial revision
claus
parents:
diff changeset
   808
    |deviceDepth|
48194c26a46c Initial revision
claus
parents:
diff changeset
   809
48194c26a46c Initial revision
claus
parents:
diff changeset
   810
    deviceDepth := aDevice depth.
48194c26a46c Initial revision
claus
parents:
diff changeset
   811
48194c26a46c Initial revision
claus
parents:
diff changeset
   812
    "I have specially tuned methods for monochrome"
48194c26a46c Initial revision
claus
parents:
diff changeset
   813
    (deviceDepth == 1) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   814
        DitherAlgorithm == #error ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   815
            ^ self rgbImageAsErrorDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   816
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   817
        DitherAlgorithm == #pattern ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   818
            ^ self rgbImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   819
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   820
        ^ self rgbImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   821
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   822
48194c26a46c Initial revision
claus
parents:
diff changeset
   823
    "and for 2plane greyscale (i.e. NeXTs)"
48194c26a46c Initial revision
claus
parents:
diff changeset
   824
    (deviceDepth == 2) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   825
        DitherAlgorithm == #error  ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   826
            ^ self rgbImageAsErrorDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   827
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   828
        DitherAlgorithm == #pattern  ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   829
            ^ self rgbImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   830
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   831
        ^ self rgbImageAs2PlaneFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   832
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   833
48194c26a46c Initial revision
claus
parents:
diff changeset
   834
    (deviceDepth == 8) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   835
        ^ self rgbImageAs8BitGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   836
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   837
48194c26a46c Initial revision
claus
parents:
diff changeset
   838
    "mhmh need another converter ...
48194c26a46c Initial revision
claus
parents:
diff changeset
   839
     till then we do:"
48194c26a46c Initial revision
claus
parents:
diff changeset
   840
    DitherAlgorithm == #error  ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   841
        ^ self rgbImageAsErrorDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   842
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   843
    DitherAlgorithm == #pattern  ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   844
        ^ self rgbImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   845
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   846
    ^ self rgbImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   847
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   848
48194c26a46c Initial revision
claus
parents:
diff changeset
   849
rgbImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   850
    "return a 1-bit monochrome form for aDevice from the rgb picture,
48194c26a46c Initial revision
claus
parents:
diff changeset
   851
     using a threshold algorithm. 
48194c26a46c Initial revision
claus
parents:
diff changeset
   852
     (i.e. grey value < 0.5 -> black, grey value >= 0.5 -> white)."
48194c26a46c Initial revision
claus
parents:
diff changeset
   853
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   854
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   855
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   856
48194c26a46c Initial revision
claus
parents:
diff changeset
   857
rgbImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   858
    "return a dithered greyForm for aDevice from the palette picture.
48194c26a46c Initial revision
claus
parents:
diff changeset
   859
     works for any destination depth.
48194c26a46c Initial revision
claus
parents:
diff changeset
   860
     A slow algorithm, using draw into the form (which indirectly does
48194c26a46c Initial revision
claus
parents:
diff changeset
   861
     the dither) - should be rewritten."
48194c26a46c Initial revision
claus
parents:
diff changeset
   862
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   863
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   864
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   865
48194c26a46c Initial revision
claus
parents:
diff changeset
   866
rgbImageAs2PlaneFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   867
    "return a 2-bit device form for aDevice from the rgb picture,
48194c26a46c Initial revision
claus
parents:
diff changeset
   868
     using a threshold algorithm. 
48194c26a46c Initial revision
claus
parents:
diff changeset
   869
     (i.e. grey value < 0.25 -> black // 0.25..0.5 -> darkgrey //
48194c26a46c Initial revision
claus
parents:
diff changeset
   870
      0.5 .. 0.75 -> lightgrey // > 0.75 -> white)."
48194c26a46c Initial revision
claus
parents:
diff changeset
   871
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   872
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   873
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   874
48194c26a46c Initial revision
claus
parents:
diff changeset
   875
rgbImageAs8BitGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   876
    "return an 8-bit greyForm from the rgb picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
   877
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   878
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   879
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   880
48194c26a46c Initial revision
claus
parents:
diff changeset
   881
rgbImageAsPseudoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   882
    "return a pseudocolor form from the rgb-picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
   883
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   884
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   885
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   886
48194c26a46c Initial revision
claus
parents:
diff changeset
   887
!Image methodsFor:'converting palette images'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   888
48194c26a46c Initial revision
claus
parents:
diff changeset
   889
paletteImageAsFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   890
    (aDevice visualType == #StaticGray) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   891
        (aDevice depth == 8) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   892
            ^ self paletteImageAsGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   893
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   894
48194c26a46c Initial revision
claus
parents:
diff changeset
   895
        DitherAlgorithm == #pattern ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   896
            ^ self paletteImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   897
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   898
48194c26a46c Initial revision
claus
parents:
diff changeset
   899
        (aDevice depth == 2) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   900
            ^ self paletteImageAs2PlaneFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   901
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   902
48194c26a46c Initial revision
claus
parents:
diff changeset
   903
        ^ self paletteImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   904
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   905
    ^ self paletteImageAsPseudoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   906
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   907
48194c26a46c Initial revision
claus
parents:
diff changeset
   908
paletteImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   909
    "return a 1-bit monoForm from the palette picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
   910
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   911
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   912
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   913
48194c26a46c Initial revision
claus
parents:
diff changeset
   914
paletteImageAs2PlaneFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   915
    "return a 2-bit greyForm from the palette picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
   916
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   917
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   918
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   919
48194c26a46c Initial revision
claus
parents:
diff changeset
   920
paletteImageAsPseudoFormOn:aDevice
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   921
    "return a pseudoForm from the palette picture."
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   922
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   923
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   924
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   925
48194c26a46c Initial revision
claus
parents:
diff changeset
   926
paletteImageAsGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   927
    "return an 8-bit greyForm from the palette picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
   928
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   929
    ^ self subclassResponsibility
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   930
!
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   931
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   932
paletteImageAsPatternDitheredGreyFormOn:aDevice
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   933
    "return a dithered greyForm from the palette picture."
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   934
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   935
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   936
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   937
48194c26a46c Initial revision
claus
parents:
diff changeset
   938
!Image methodsFor:'converting greyscale images'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   939
48194c26a46c Initial revision
claus
parents:
diff changeset
   940
greyImageAsFormOn:aDevice
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   941
    "return a thresholded greyForm from the grey picture."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   942
 
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   943
    |pictureDepth nPlanes f|
48194c26a46c Initial revision
claus
parents:
diff changeset
   944
48194c26a46c Initial revision
claus
parents:
diff changeset
   945
    nPlanes := samplesPerPixel.
48194c26a46c Initial revision
claus
parents:
diff changeset
   946
    (nPlanes == 2) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   947
        'alpha plane ignored' printNewline.
48194c26a46c Initial revision
claus
parents:
diff changeset
   948
        nPlanes := 1
48194c26a46c Initial revision
claus
parents:
diff changeset
   949
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   950
48194c26a46c Initial revision
claus
parents:
diff changeset
   951
    pictureDepth := bitsPerSample at:1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   952
48194c26a46c Initial revision
claus
parents:
diff changeset
   953
    "monochrome is very easy ..."
48194c26a46c Initial revision
claus
parents:
diff changeset
   954
48194c26a46c Initial revision
claus
parents:
diff changeset
   955
    (pictureDepth == 1) ifTrue:[
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   956
        ^ Form width:width height:height fromArray:bytes on:aDevice
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   957
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   958
48194c26a46c Initial revision
claus
parents:
diff changeset
   959
    (aDevice visualType == #StaticGray) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   960
        (aDevice depth == pictureDepth) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   961
48194c26a46c Initial revision
claus
parents:
diff changeset
   962
            "greyscale is easy, if the depths match"
48194c26a46c Initial revision
claus
parents:
diff changeset
   963
48194c26a46c Initial revision
claus
parents:
diff changeset
   964
            f := Form width:width height:height depth:pictureDepth on:aDevice.
48194c26a46c Initial revision
claus
parents:
diff changeset
   965
            f isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
   966
            f initGC.
48194c26a46c Initial revision
claus
parents:
diff changeset
   967
48194c26a46c Initial revision
claus
parents:
diff changeset
   968
            "if device has white at the opposite corner ..."
48194c26a46c Initial revision
claus
parents:
diff changeset
   969
            ((aDevice blackpixel == 0) == (photometric == #blackIs0)) ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   970
                "have to invert bits"
48194c26a46c Initial revision
claus
parents:
diff changeset
   971
                f function:#copyInverted
48194c26a46c Initial revision
claus
parents:
diff changeset
   972
            ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   973
            aDevice drawBits:bytes depth:pictureDepth width:width height:height
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   974
                            x:0 y:0
48194c26a46c Initial revision
claus
parents:
diff changeset
   975
                         into:(f id)
48194c26a46c Initial revision
claus
parents:
diff changeset
   976
                            x:0 y:0 width:width height:height with:(f gcId).
48194c26a46c Initial revision
claus
parents:
diff changeset
   977
            ^ f
48194c26a46c Initial revision
claus
parents:
diff changeset
   978
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   979
48194c26a46c Initial revision
claus
parents:
diff changeset
   980
        "the image has more greylevels than the display - dither"
48194c26a46c Initial revision
claus
parents:
diff changeset
   981
48194c26a46c Initial revision
claus
parents:
diff changeset
   982
"
48194c26a46c Initial revision
claus
parents:
diff changeset
   983
coming soon ...
48194c26a46c Initial revision
claus
parents:
diff changeset
   984
        DitherAlgorithm == #error ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   985
            ^ self greyImageAsErrorDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   986
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   987
"
48194c26a46c Initial revision
claus
parents:
diff changeset
   988
        DitherAlgorithm == #pattern ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   989
            ^ self greyImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   990
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   991
48194c26a46c Initial revision
claus
parents:
diff changeset
   992
        "no dither, simply cut off information"
48194c26a46c Initial revision
claus
parents:
diff changeset
   993
        (aDevice depth == 1) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   994
            "for monochrome, there is a special method to do this"
48194c26a46c Initial revision
claus
parents:
diff changeset
   995
            ^ self greyImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   996
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   997
        "the general case, will take as many bits from the image
48194c26a46c Initial revision
claus
parents:
diff changeset
   998
         as possible for the device"
48194c26a46c Initial revision
claus
parents:
diff changeset
   999
        ^ self greyImageAsGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
  1000
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1001
48194c26a46c Initial revision
claus
parents:
diff changeset
  1002
48194c26a46c Initial revision
claus
parents:
diff changeset
  1003
    (aDevice visualType == #PseudoColor) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1004
        ^ self greyImageAsPseudoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
  1005
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1006
48194c26a46c Initial revision
claus
parents:
diff changeset
  1007
    self error:'cannot convert this format'.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1008
    ^ nil
48194c26a46c Initial revision
claus
parents:
diff changeset
  1009
!
48194c26a46c Initial revision
claus
parents:
diff changeset
  1010
48194c26a46c Initial revision
claus
parents:
diff changeset
  1011
greyImageAsMonoFormOn:aDevice
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1012
    "return a (thresholded) monochrome Form from the picture."
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1013
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1014
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1015
!
48194c26a46c Initial revision
claus
parents:
diff changeset
  1016
48194c26a46c Initial revision
claus
parents:
diff changeset
  1017
greyImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
  1018
    "return a dithered greyForm from the grey picture.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1019
     Works for any source/destination depths, but very very slow
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1020
     since each pixel is processed individually.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1021
     Usually redefined by subclasses for more performance"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1022
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1023
    |f last      
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1024
     x0            "{Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1025
     w             "{Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1026
     h             "{Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1027
     v             "{Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1028
     run           "{Class: SmallInteger }" |
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1029
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1030
    Transcript showCr:'slow dithering ..'. Transcript endEntry.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1031
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1032
    w := width - 1.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1033
    h := height - 1.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1034
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1035
    "draw each pixel using dither color (let others do the dithering)
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1036
     although the code is simple, its very slow"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1037
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1038
    f := Form width:width height:height depth:aDevice depth on:aDevice.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1039
    f isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1040
    f initGC.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1041
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1042
    0 to:h do:[:dstY |
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1043
        x0 := 0.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1044
        run := 0.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1045
        last := nil.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1046
        self atY:dstY from:0 to:w do:[:x :srcColor |
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1047
            |dstColor|
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1048
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1049
            srcColor ~~ last ifTrue:[
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1050
                (run ~~ 0) ifTrue:[
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1051
                    f fillRectangleX:x0 y:dstY width:run height:1.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1052
                ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1053
                run := 0.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1054
                dstColor := Color grey:(srcColor greyIntensity).
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1055
                f paint:dstColor.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1056
                last := srcColor.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1057
                x0 := x
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1058
            ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1059
            run := run + 1
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1060
        ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1061
        f fillRectangleX:x0 y:dstY width:run height:1.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1062
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1063
    ^ f
48194c26a46c Initial revision
claus
parents:
diff changeset
  1064
!
48194c26a46c Initial revision
claus
parents:
diff changeset
  1065
48194c26a46c Initial revision
claus
parents:
diff changeset
  1066
greyImageAsGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
  1067
    "return an 8-bit Form from the grey picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1068
48194c26a46c Initial revision
claus
parents:
diff changeset
  1069
    |wideBits pictureDepth f map shift nplanes ncells
48194c26a46c Initial revision
claus
parents:
diff changeset
  1070
     inverse oldValue newValue
48194c26a46c Initial revision
claus
parents:
diff changeset
  1071
     shift2 shift3 shift4|
48194c26a46c Initial revision
claus
parents:
diff changeset
  1072
48194c26a46c Initial revision
claus
parents:
diff changeset
  1073
    (aDevice depth == 8) ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1074
        'non-8 plane displays not supported' printNewline.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1075
        ^ self greyImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
  1076
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1077
48194c26a46c Initial revision
claus
parents:
diff changeset
  1078
    pictureDepth := bitsPerSample at:1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1079
48194c26a46c Initial revision
claus
parents:
diff changeset
  1080
    wideBits := ByteArray uninitializedNew:(width * height).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1081
48194c26a46c Initial revision
claus
parents:
diff changeset
  1082
    map := ByteArray uninitializedNew:(1 bitShift:pictureDepth).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1083
48194c26a46c Initial revision
claus
parents:
diff changeset
  1084
    "find the real number of server-planes"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1085
    nplanes := 8.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1086
    ncells := 256.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1087
    [aDevice ncells < ncells] whileTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1088
        nplanes := nplanes - 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1089
        ncells := ncells // 2
48194c26a46c Initial revision
claus
parents:
diff changeset
  1090
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1091
48194c26a46c Initial revision
claus
parents:
diff changeset
  1092
    "prepare translation table"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1093
48194c26a46c Initial revision
claus
parents:
diff changeset
  1094
    shift := nplanes - pictureDepth.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1095
    shift2 := shift - pictureDepth.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1096
    shift3 := shift2 - pictureDepth.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1097
    shift4 := shift3 - pictureDepth.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1098
48194c26a46c Initial revision
claus
parents:
diff changeset
  1099
    inverse := aDevice blackpixel ~~ 0.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1100
    photometric == #blackIs0 ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1101
        inverse := inverse not
48194c26a46c Initial revision
claus
parents:
diff changeset
  1102
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1103
    1 to:(map size) do:[:index |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1104
        oldValue := index - 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1105
        newValue := oldValue bitShift:shift.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1106
        newValue := newValue bitOr:(oldValue bitShift:shift2).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1107
        newValue := newValue bitOr:(oldValue bitShift:shift3).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1108
        newValue := newValue bitOr:(oldValue bitShift:shift4).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1109
        inverse ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1110
            map at:(map size - index + 1) put:newValue
48194c26a46c Initial revision
claus
parents:
diff changeset
  1111
        ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1112
            map at:index put:newValue
48194c26a46c Initial revision
claus
parents:
diff changeset
  1113
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
  1114
    ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1115
    bytes expandPixels:pictureDepth
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1116
                width:width 
48194c26a46c Initial revision
claus
parents:
diff changeset
  1117
               height:height
48194c26a46c Initial revision
claus
parents:
diff changeset
  1118
                 into:wideBits
48194c26a46c Initial revision
claus
parents:
diff changeset
  1119
              mapping:map.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1120
48194c26a46c Initial revision
claus
parents:
diff changeset
  1121
    f := Form width:width height:height depth:8 on:aDevice.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1122
    f isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1123
    f initGC.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1124
    aDevice drawBits:wideBits depth:8 width:width height:height
48194c26a46c Initial revision
claus
parents:
diff changeset
  1125
                       x:0 y:0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1126
                    into:(f id) x:0 y:0 width:width height:height with:(f gcId).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1127
    ^ f
48194c26a46c Initial revision
claus
parents:
diff changeset
  1128
!
48194c26a46c Initial revision
claus
parents:
diff changeset
  1129
48194c26a46c Initial revision
claus
parents:
diff changeset
  1130
greyImageAsPseudoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
  1131
    "return an 8-bit pseudo Form from the grey picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1132
48194c26a46c Initial revision
claus
parents:
diff changeset
  1133
    |wideBits pictureDepth f map  
48194c26a46c Initial revision
claus
parents:
diff changeset
  1134
     colorMap usedColors nUsed aColor nColors range|
48194c26a46c Initial revision
claus
parents:
diff changeset
  1135
48194c26a46c Initial revision
claus
parents:
diff changeset
  1136
    pictureDepth := bitsPerSample at:1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1137
48194c26a46c Initial revision
claus
parents:
diff changeset
  1138
    (#(2 4 8) includes:pictureDepth) ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1139
        self error:'currently only depth-2, 4 or 8 supported'.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1140
        ^ nil
48194c26a46c Initial revision
claus
parents:
diff changeset
  1141
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1142
48194c26a46c Initial revision
claus
parents:
diff changeset
  1143
    wideBits := ByteArray uninitializedNew:(width * height).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1144
48194c26a46c Initial revision
claus
parents:
diff changeset
  1145
    (pictureDepth == 8) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1146
        "for 8bits, we scan for used colors first;
48194c26a46c Initial revision
claus
parents:
diff changeset
  1147
         to avoid allocating too many colors"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1148
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1149
        usedColors := bytes usedValues.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1150
        nUsed := usedColors maximumValue + 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1151
48194c26a46c Initial revision
claus
parents:
diff changeset
  1152
        colorMap := Array new:nUsed.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1153
        photometric == #blackIs0 ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1154
            usedColors do:[:grey |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1155
                colorMap at:(grey + 1) put:(Color grey:(100.0 / 256.0 * grey))
48194c26a46c Initial revision
claus
parents:
diff changeset
  1156
            ]
48194c26a46c Initial revision
claus
parents:
diff changeset
  1157
        ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1158
            usedColors do:[:grey |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1159
                colorMap at:(grey + 1) put:(Color grey:(100 - (100.0 / 256.0 * grey)))
48194c26a46c Initial revision
claus
parents:
diff changeset
  1160
            ]
48194c26a46c Initial revision
claus
parents:
diff changeset
  1161
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
  1162
    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1163
        nColors := (1 bitShift:pictureDepth).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1164
        colorMap := Array new:nColors.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1165
        range := 100 / (nColors - 1) asFloat.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1166
        1 to:nColors do:[:i |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1167
            colorMap at:i put:(Color grey:(i - 1) * range).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1168
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1169
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1170
48194c26a46c Initial revision
claus
parents:
diff changeset
  1171
    "XXX should reduce 8->6->4->2 planes, if not all colors could be allocated"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1172
48194c26a46c Initial revision
claus
parents:
diff changeset
  1173
    "setup the translation map"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1174
    map := ByteArray uninitializedNew:256.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1175
    1 to:(colorMap size) do:[:i |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1176
        aColor := colorMap at:i.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1177
        aColor notNil ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1178
            map at:i put:(aColor on:aDevice) colorId
48194c26a46c Initial revision
claus
parents:
diff changeset
  1179
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
  1180
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1181
48194c26a46c Initial revision
claus
parents:
diff changeset
  1182
    "expand & translate"
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1183
    bytes expandPixels:pictureDepth
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1184
                width:width 
48194c26a46c Initial revision
claus
parents:
diff changeset
  1185
               height:height
48194c26a46c Initial revision
claus
parents:
diff changeset
  1186
                 into:wideBits
48194c26a46c Initial revision
claus
parents:
diff changeset
  1187
              mapping:map.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1188
48194c26a46c Initial revision
claus
parents:
diff changeset
  1189
    f := Form width:width height:height depth:8 on:aDevice.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1190
    f isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1191
    f colorMap:colorMap. 
48194c26a46c Initial revision
claus
parents:
diff changeset
  1192
    f initGC.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1193
    aDevice drawBits:wideBits depth:8 width:width height:height
48194c26a46c Initial revision
claus
parents:
diff changeset
  1194
                       x:0 y:0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1195
                    into:(f id) x:0 y:0 width:width height:height with:(f gcId).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1196
    ^ f
48194c26a46c Initial revision
claus
parents:
diff changeset
  1197
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
  1198
48194c26a46c Initial revision
claus
parents:
diff changeset
  1199
!Image methodsFor:'image manipulations'!
48194c26a46c Initial revision
claus
parents:
diff changeset
  1200
48194c26a46c Initial revision
claus
parents:
diff changeset
  1201
magnifyBy:extent
48194c26a46c Initial revision
claus
parents:
diff changeset
  1202
    "return a new image magnified by extent, aPoint.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1203
     If non-integral magnify is asked for, pass the work on to 'hardMagnifyBy:'"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1204
48194c26a46c Initial revision
claus
parents:
diff changeset
  1205
    |mX mY srcOffset dstOffset dstStep first
48194c26a46c Initial revision
claus
parents:
diff changeset
  1206
     newWidth newHeight newImage newBits bitsPerPixel newBytesPerRow oldBytesPerRow|
48194c26a46c Initial revision
claus
parents:
diff changeset
  1207
48194c26a46c Initial revision
claus
parents:
diff changeset
  1208
    mX := extent x.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1209
    mY := extent y.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1210
    ((mX < 0) or:[mY < 0]) ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1211
    ((mX = 1) and:[mY = 1]) ifTrue:[^ self].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1212
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1213
    ((mX isMemberOf:SmallInteger) and:[mY isMemberOf:SmallInteger]) ifFalse:[
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1214
        ^ self hardMagnifyBy:extent
48194c26a46c Initial revision
claus
parents:
diff changeset
  1215
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1216
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1217
    bitsPerPixel := self depth.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1218
    oldBytesPerRow := ((width * bitsPerPixel) + 7) // 8.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1219
48194c26a46c Initial revision
claus
parents:
diff changeset
  1220
    newWidth := width * mX.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1221
    newHeight := height * mY.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1222
    newBytesPerRow := ((newWidth * bitsPerPixel) + 7) // 8.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1223
    newBits := ByteArray uninitializedNew:(newBytesPerRow * newHeight).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1224
48194c26a46c Initial revision
claus
parents:
diff changeset
  1225
    newImage := self species new.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1226
    newImage bits:newBits.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1227
    newImage width:newWidth.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1228
    newImage height:newHeight.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1229
    newImage photometric:photometric.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1230
    newImage samplesPerPixel:samplesPerPixel.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1231
    newImage bitsPerSample:bitsPerSample.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1232
    newImage colorMap:colorMap copy.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1233
48194c26a46c Initial revision
claus
parents:
diff changeset
  1234
    mX = 1 ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1235
        "expand rows only"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1236
        srcOffset := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1237
        dstOffset := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1238
48194c26a46c Initial revision
claus
parents:
diff changeset
  1239
        1 to:height do:[:row |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1240
            1 to:mY do:[:i |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1241
                newBits replaceFrom:dstOffset to:(dstOffset + oldBytesPerRow - 1)
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1242
                               with:bytes startingAt:srcOffset.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1243
                dstOffset := dstOffset + newBytesPerRow
48194c26a46c Initial revision
claus
parents:
diff changeset
  1244
            ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1245
            srcOffset := srcOffset + oldBytesPerRow.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1246
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1247
    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1248
        "expand cols"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1249
        (mX > 1) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1250
            dstOffset := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1251
            srcOffset := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1252
            1 to:height do:[:row |
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1253
                self magnifyRowFrom:bytes offset:srcOffset  
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1254
                               into:newBits offset:dstOffset factor:mX.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1255
48194c26a46c Initial revision
claus
parents:
diff changeset
  1256
                first := dstOffset.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1257
                dstOffset := dstOffset + newBytesPerRow.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1258
                " and copy for row expansion "
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1259
                2 to:mY do:[:i |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1260
                    newBits replaceFrom:dstOffset to:(dstOffset + newBytesPerRow - 1)
48194c26a46c Initial revision
claus
parents:
diff changeset
  1261
                                   with:newBits startingAt:first.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1262
                    dstOffset := dstOffset + newBytesPerRow
48194c26a46c Initial revision
claus
parents:
diff changeset
  1263
                ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1264
                srcOffset := srcOffset + oldBytesPerRow.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1265
            ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1266
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
  1267
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1268
    ^ newImage
48194c26a46c Initial revision
claus
parents:
diff changeset
  1269
48194c26a46c Initial revision
claus
parents:
diff changeset
  1270
    "((Image fromFile:'bitmaps/claus.gif') magnifyBy:1@2)"
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1271
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1272
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1273
hardMagnifyBy:extent
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1274
    "return a new image magnified by extent, aPoint.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1275
     This is  the general magnification method, handling non-integral values"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1276
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1277
    |mX mY    
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1278
     newWidth  "{ Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1279
     newHeight "{ Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1280
     w         "{ Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1281
     h         "{ Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1282
     newImage newBits bitsPerPixel newBytesPerRow
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1283
     value srcRow|
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1284
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1285
    mX := extent x.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1286
    mY := extent y.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1287
    ((mX < 0) or:[mY < 0]) ifTrue:[^ nil].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1288
    ((mX = 1) and:[mY = 1]) ifTrue:[^ self].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1289
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1290
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1291
    newWidth := (width * mX) truncated.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1292
    newHeight := (height * mY) truncated.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1293
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1294
    bitsPerPixel := self depth.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1295
    newBytesPerRow := ((newWidth * bitsPerPixel) + 7) // 8.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1296
    newBits := ByteArray uninitializedNew:(newBytesPerRow * newHeight).
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1297
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1298
    newImage := self species new.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1299
    newImage bits:newBits.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1300
    newImage width:newWidth.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1301
    newImage height:newHeight.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1302
    newImage photometric:photometric.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1303
    newImage samplesPerPixel:samplesPerPixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1304
    newImage bitsPerSample:bitsPerSample.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1305
    newImage colorMap:colorMap copy.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1306
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1307
    "walk over destination image fetching pixels from source image"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1308
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1309
    w := newWidth - 1.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1310
    h := newHeight - 1.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1311
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1312
    0 to:h do:[:row |
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1313
        srcRow := (row // mY).
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1314
        0 to:w do:[:col |
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1315
            value := self valueAtX:(col // mX) y:srcRow.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1316
            newImage atX:col y:row putValue:value.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1317
        ]
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1318
    ].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1319
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1320
    ^ newImage
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1321
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1322
    "((Image fromFile:'bitmaps/claus.gif') magnifyBy:0.5@0.5)"
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1323
!
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1324
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1325
flipHorizontal
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1326
    "inplace horizontal flip"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1327
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1328
    |w "{Class: SmallInteger }"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1329
     h "{Class: SmallInteger }"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1330
     c2 "{Class: SmallInteger }" 
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1331
     value |
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1332
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1333
    w := width - 1.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1334
    h := height - 1.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1335
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1336
    0 to:h do:[:row |
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1337
        c2 := w.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1338
        0 to:(w // 2) do:[:col |
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1339
            value := self valueAtX:col y:row.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1340
            self atX:col y:row putValue:(self valueAtX:c2 y:row).
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1341
            self atX:c2 y:row putValue:value.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1342
            c2 := c2 - 1.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1343
        ]
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1344
    ].
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1345
    "flush device info"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1346
    self restored
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1347
!
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1348
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1349
flipVertical
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1350
    "inplace vertical flip"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1351
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1352
    |h "{Class: SmallInteger }"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1353
     bytesPerRow buffer indexLow indexHi|
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1354
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1355
    bytesPerRow := self bytesPerRow.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1356
    buffer := ByteArray new:bytesPerRow.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1357
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1358
    h := height - 1.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1359
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1360
    indexLow := 1.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1361
    indexHi := bytesPerRow * h + 1.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1362
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1363
    0 to:(h // 2) do:[:row |
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1364
        buffer replaceFrom:1 to:bytesPerRow with:bytes startingAt:indexLow.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1365
        bytes replaceFrom:indexLow to:(indexLow + bytesPerRow - 1) with:bytes startingAt:indexHi.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1366
        bytes replaceFrom:indexHi to:(indexHi + bytesPerRow - 1) with:buffer startingAt:1.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1367
        indexLow := indexLow + bytesPerRow.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1368
        indexHi := indexHi - bytesPerRow.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1369
    ].
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1370
    "flush device info"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1371
    self restored
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1372
!
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1373
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1374
rotated:degrees
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1375
    "return a new image from the old one, by rotating the image
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1376
     degrees clockwise"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1377
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1378
    |w "{Class: SmallInteger }"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1379
     h "{Class: SmallInteger }"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1380
     c2 "{Class: SmallInteger }" 
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1381
     value newImage newBits newBytesPerRow d|
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1382
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1383
    d := degrees.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1384
    [d < 0] whileTrue:[d := d + 360].
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1385
    d >= 360 ifTrue:[d := d \\ 360].
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1386
    d = 0 ifTrue:[^ self].
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1387
    ((d ~= 90) and:[d ~= 270]) ifTrue:[
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1388
        ^ self hardRotated:d
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1389
    ].
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1390
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1391
    newBytesPerRow := ((height * self depth) + 7) // 8.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1392
    newBits := ByteArray uninitializedNew:(newBytesPerRow * width).
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1393
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1394
    newImage := self species new.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1395
    newImage bits:newBits.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1396
    newImage width:height.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1397
    newImage height:width.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1398
    newImage photometric:photometric.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1399
    newImage samplesPerPixel:samplesPerPixel.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1400
    newImage bitsPerSample:bitsPerSample.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1401
    newImage colorMap:colorMap copy.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1402
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1403
    w := width - 1.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1404
    h := height - 1.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1405
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1406
    d == 90 ifTrue:[
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1407
        0 to:h do:[:row |
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1408
            c2 := h-row.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1409
            0 to:w do:[:col |
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1410
                newImage atX:c2 y:col putValue:(self valueAtX:col y:row).
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1411
            ]
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1412
        ]
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1413
    ].
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1414
    d == 270 ifTrue:[
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1415
        0 to:h do:[:row |
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1416
            0 to:w do:[:col |
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1417
                newImage atX:row y:(w-col) putValue:(self valueAtX:col y:row).
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1418
            ]
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1419
        ]
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1420
    ].
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1421
    ^ newImage
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1422
!
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1423
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1424
blurr
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1425
    "inplace blurr"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1426
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1427
    "flush device info"
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1428
    self restored
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1429
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
  1430
48194c26a46c Initial revision
claus
parents:
diff changeset
  1431
!Image methodsFor:'private'!
48194c26a46c Initial revision
claus
parents:
diff changeset
  1432
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1433
magnifyRowFrom:srcBytes offset:srcStart pixels:oldPixels 
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1434
          into:dstBytes offset:dstStart factor:mX
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1435
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1436
    "magnify a single pixel row - can only magnify by integer factors,
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1437
     can only magnify 1,2,4,8 and 24 bit-per-pixel images. But this is done fast."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1438
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1439
    self subclassResponsibility
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1440
! !
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1441
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1442
!Image methodsFor: 'binary storage'!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1443
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1444
readBinaryContentsFrom: stream manager: manager
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1445
    "tell the newly restored Image about restoration"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1446
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1447
    super readBinaryContentsFrom: stream manager: manager.
12
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1448
    device := nil.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1449
    deviceForm := nil.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1450
    monoDeviceForm := nil.
9f0995fac1fa *** empty log message ***
claus
parents: 6
diff changeset
  1451
    fullColorDeviceForm := nil.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1452
! !