Image.st
author claus
Wed, 13 Oct 1993 03:44:47 +0100
changeset 6 7ee0cfde237d
parent 5 e5942fea6925
child 12 9f0995fac1fa
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
6
7ee0cfde237d *** empty log message ***
claus
parents: 5
diff changeset
    31
$Header: /cvs/stx/stx/libview/Image.st,v 1.4 1993-10-13 02:43:36 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"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   157
    FileFormats := Dictionary new.
48194c26a46c Initial revision
claus
parents:
diff changeset
   158
    FileFormats at:'.xbm'  put:XBMReader.
48194c26a46c Initial revision
claus
parents:
diff changeset
   159
    FileFormats at:'.tiff' put:TIFFReader.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   160
    FileFormats at:'.tif'  put:TIFFReader.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   161
    FileFormats at:'.gif'  put:GIFReader.
48194c26a46c Initial revision
claus
parents:
diff changeset
   162
    FileFormats at:'.img'  put:IMGReader.
48194c26a46c Initial revision
claus
parents:
diff changeset
   163
    FileFormats at:'.pcx'  put:PCXReader.
48194c26a46c Initial revision
claus
parents:
diff changeset
   164
    FileFormats at:'.mac'  put:MacPaintReader.
48194c26a46c Initial revision
claus
parents:
diff changeset
   165
    FileFormats at:'.im8'  put:SunRasterReader.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   166
    FileFormats at:'.icon' put:SunRasterReader.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   167
    FileFormats at:'.face' put:FaceReader.
48194c26a46c Initial revision
claus
parents:
diff changeset
   168
    FileFormats at:'.g3'   put:G3FileReader.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   169
    FileFormats at:'.bmp'  put:WindowsIconReader.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   170
    FileFormats at:'.ico'  put:WindowsIconReader.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   171
    FileFormats at:'.jpg'  put:JPEGReader.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   172
    FileFormats at:'.jpeg' put:JPEGReader.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   173
    FileFormats at:'.ppm'  put:PBMReader.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   174
    FileFormats at:'.pbm'  put:PBMReader.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   175
    FileFormats at:'.pgm'  put:PBMReader.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   176
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   177
48194c26a46c Initial revision
claus
parents:
diff changeset
   178
flushDeviceImages
48194c26a46c Initial revision
claus
parents:
diff changeset
   179
    "simply unassign all pictures from their device"
48194c26a46c Initial revision
claus
parents:
diff changeset
   180
48194c26a46c Initial revision
claus
parents:
diff changeset
   181
    lobby contentsDo:[:anImage |
48194c26a46c Initial revision
claus
parents:
diff changeset
   182
        anImage restored
48194c26a46c Initial revision
claus
parents:
diff changeset
   183
    ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   184
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   185
48194c26a46c Initial revision
claus
parents:
diff changeset
   186
update:something
48194c26a46c Initial revision
claus
parents:
diff changeset
   187
    "flush all device specific stuff when restarted from a snapshot"
48194c26a46c Initial revision
claus
parents:
diff changeset
   188
48194c26a46c Initial revision
claus
parents:
diff changeset
   189
    (something == #restarted) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   190
        self flushDeviceImages
48194c26a46c Initial revision
claus
parents:
diff changeset
   191
    ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   192
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   193
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   194
!Image class methodsFor:'screen capture'!
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   195
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   196
fromScreen
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   197
    "return an image of the full screen"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   198
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   199
    ^ self fromScreen:(0@0 corner:(Display width@Display height))
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   200
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   201
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   202
fromScreen:aRectangle
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   203
    "return an image of a part of the screen"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   204
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   205
    |depth img|
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   206
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   207
    depth := Display depth.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   208
    img := (self implementorForDepth: depth) new.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   209
    ^ img fromScreen:aRectangle
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   210
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   211
    "Image fromScreen:(0@0 corner:100@100)"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   212
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   213
48194c26a46c Initial revision
claus
parents:
diff changeset
   214
!Image class methodsFor:'reading from file'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   215
48194c26a46c Initial revision
claus
parents:
diff changeset
   216
fromFile:aFileName
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   217
    |readerClass image|
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   218
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   219
    FileFormats associationsDo:[:assoc |
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   220
        (aFileName endsWith:(assoc key)) ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   221
            readerClass := assoc value.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   222
            readerClass notNil ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   223
                image := readerClass fromFile:aFileName.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   224
                image notNil ifTrue:[^ image].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   225
            ]
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   226
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   227
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   228
    "no known extension - ask all readers if they know
48194c26a46c Initial revision
claus
parents:
diff changeset
   229
     this format ..."
48194c26a46c Initial revision
claus
parents:
diff changeset
   230
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   231
    FileFormats associationsDo:[:assoc |
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   232
        readerClass := assoc value.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   233
        readerClass notNil ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   234
            (readerClass isValidImageFile:aFileName) ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   235
                ^ readerClass fromFile:aFileName
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   236
            ]
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   237
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   238
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   239
48194c26a46c Initial revision
claus
parents:
diff changeset
   240
    "nope - unknown format"
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   241
'unknown image file format' printNewline.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   242
    ^ nil
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   243
48194c26a46c Initial revision
claus
parents:
diff changeset
   244
    "Image fromFile:'bitmaps/dano.tiff'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   245
    "Image fromFile:'bitmaps/test.fax'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   246
    "Image fromFile:'bitmaps/voice.tiff'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   247
    "Image fromFile:'voice.tiff'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   248
48194c26a46c Initial revision
claus
parents:
diff changeset
   249
    "Image fromFile:'../fileIn/bitmaps/claus.gif'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   250
    "Image fromFile:'../fileIn/bitmaps/garfield.gif'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   251
48194c26a46c Initial revision
claus
parents:
diff changeset
   252
    "Image fromFile:'../fileIn/bitmaps/founders.im8'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   253
    "Image fromFile:'../goodies/faces/next.com/steve.face'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   254
48194c26a46c Initial revision
claus
parents:
diff changeset
   255
    "Image fromFile:'/LocalLibrary/Images/OS2/dos3.ico'"
48194c26a46c Initial revision
claus
parents:
diff changeset
   256
    "Image fromFile:'bitmaps/globe1.xbm'"
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   257
    "Image fromFile:'bitmaps/hello_world.icon'"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   258
! !
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   259
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   260
!Image class methodsFor:'queries'!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   261
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   262
implementorForDepth: depth
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   263
    "return the class, which best implements images of depth"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   264
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   265
    depth == 1 ifTrue:[^ Depth1Image].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   266
    depth == 2 ifTrue:[^ Depth2Image].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   267
    depth == 4 ifTrue:[^ Depth4Image].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   268
    depth == 8 ifTrue:[^ Depth8Image].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   269
    depth == 24 ifTrue:[^ Depth24Image].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   270
    ^ self
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   271
! !
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   272
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   273
!Image methodsFor:'instance release'!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   274
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   275
restored
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   276
    device := nil.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   277
    deviceForm := nil.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   278
    monoDeviceForm := nil.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   279
    fullColorDeviceForm := nil
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   280
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   281
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   282
disposed
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   283
    "some Image has been collected - nothing to do"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   284
! !
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   285
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   286
!Image methodsFor:'inpecting'!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   287
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   288
inspect
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   289
    "redefined to launch an ImageInspector on the receiver
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   290
     (instead of the default InspectorView)."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   291
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   292
    ImageInspectorView isNil ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   293
        super inspect
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   294
    ] ifFalse:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   295
        ImageInspectorView openOn:self
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   296
    ]
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   297
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   298
48194c26a46c Initial revision
claus
parents:
diff changeset
   299
!Image methodsFor:'accessing'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   300
48194c26a46c Initial revision
claus
parents:
diff changeset
   301
device
48194c26a46c Initial revision
claus
parents:
diff changeset
   302
    "return the device, the receiver is associated with.
48194c26a46c Initial revision
claus
parents:
diff changeset
   303
     Return nil, if the image is unassigned."
48194c26a46c Initial revision
claus
parents:
diff changeset
   304
48194c26a46c Initial revision
claus
parents:
diff changeset
   305
    ^ device
48194c26a46c Initial revision
claus
parents:
diff changeset
   306
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   307
48194c26a46c Initial revision
claus
parents:
diff changeset
   308
id
48194c26a46c Initial revision
claus
parents:
diff changeset
   309
    "return the id of the image on the device.
48194c26a46c Initial revision
claus
parents:
diff changeset
   310
     Return nil, if the image is unassigned."
48194c26a46c Initial revision
claus
parents:
diff changeset
   311
48194c26a46c Initial revision
claus
parents:
diff changeset
   312
    deviceForm isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
   313
    ^ deviceForm id
48194c26a46c Initial revision
claus
parents:
diff changeset
   314
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   315
48194c26a46c Initial revision
claus
parents:
diff changeset
   316
monochromeId
48194c26a46c Initial revision
claus
parents:
diff changeset
   317
    "return the id of the monochrome image on the device.
48194c26a46c Initial revision
claus
parents:
diff changeset
   318
     Return nil, if the image is unassigned."
48194c26a46c Initial revision
claus
parents:
diff changeset
   319
48194c26a46c Initial revision
claus
parents:
diff changeset
   320
    monoDeviceForm isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
   321
    ^ monoDeviceForm id
48194c26a46c Initial revision
claus
parents:
diff changeset
   322
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   323
48194c26a46c Initial revision
claus
parents:
diff changeset
   324
fullColorId
48194c26a46c Initial revision
claus
parents:
diff changeset
   325
    "return the id of the full color image on the device.
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
    fullColorDeviceForm isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
   329
    ^ fullColorDeviceForm id
48194c26a46c Initial revision
claus
parents:
diff changeset
   330
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   331
48194c26a46c Initial revision
claus
parents:
diff changeset
   332
width
48194c26a46c Initial revision
claus
parents:
diff changeset
   333
    "return the width of the image"
48194c26a46c Initial revision
claus
parents:
diff changeset
   334
48194c26a46c Initial revision
claus
parents:
diff changeset
   335
    ^ width
48194c26a46c Initial revision
claus
parents:
diff changeset
   336
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   337
48194c26a46c Initial revision
claus
parents:
diff changeset
   338
width:aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   339
    "set the width of the image"
48194c26a46c Initial revision
claus
parents:
diff changeset
   340
48194c26a46c Initial revision
claus
parents:
diff changeset
   341
    width := aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   342
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   343
48194c26a46c Initial revision
claus
parents:
diff changeset
   344
height
48194c26a46c Initial revision
claus
parents:
diff changeset
   345
    "return the height of the image"
48194c26a46c Initial revision
claus
parents:
diff changeset
   346
48194c26a46c Initial revision
claus
parents:
diff changeset
   347
    ^ height
48194c26a46c Initial revision
claus
parents:
diff changeset
   348
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   349
48194c26a46c Initial revision
claus
parents:
diff changeset
   350
height:aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   351
    "set the height of the image"
48194c26a46c Initial revision
claus
parents:
diff changeset
   352
48194c26a46c Initial revision
claus
parents:
diff changeset
   353
    height := aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   354
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   355
48194c26a46c Initial revision
claus
parents:
diff changeset
   356
samplesPerPixel
48194c26a46c Initial revision
claus
parents:
diff changeset
   357
    "return the number of samples per pixel in the image.
48194c26a46c Initial revision
claus
parents:
diff changeset
   358
     The return value is an array of bits-per-plane."
48194c26a46c Initial revision
claus
parents:
diff changeset
   359
48194c26a46c Initial revision
claus
parents:
diff changeset
   360
    ^ samplesPerPixel
48194c26a46c Initial revision
claus
parents:
diff changeset
   361
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   362
48194c26a46c Initial revision
claus
parents:
diff changeset
   363
samplesPerPixel:aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   364
    "set the array of samples per pixel"
48194c26a46c Initial revision
claus
parents:
diff changeset
   365
48194c26a46c Initial revision
claus
parents:
diff changeset
   366
    samplesPerPixel := aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   367
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   368
48194c26a46c Initial revision
claus
parents:
diff changeset
   369
depth
48194c26a46c Initial revision
claus
parents:
diff changeset
   370
    "return the depth of the image"
48194c26a46c Initial revision
claus
parents:
diff changeset
   371
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   372
    ^ self bitsPerPixel
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   373
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   374
48194c26a46c Initial revision
claus
parents:
diff changeset
   375
bitsPerSample
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   376
    "return the number of bits per sample.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   377
     The return value is an array of bits-per-plane."
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   378
48194c26a46c Initial revision
claus
parents:
diff changeset
   379
    ^ bitsPerSample
48194c26a46c Initial revision
claus
parents:
diff changeset
   380
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   381
48194c26a46c Initial revision
claus
parents:
diff changeset
   382
bitsPerSample:aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   383
    bitsPerSample := aNumber
48194c26a46c Initial revision
claus
parents:
diff changeset
   384
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   385
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   386
bitsPerPixel
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   387
    "return the number of bits per pixel"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   388
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   389
    ^ (bitsPerSample inject:0 into:[:sum :i | sum + i])
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   390
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   391
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   392
bitsPerRow
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   393
    "return the number of bits in one scanline of the image"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   394
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   395
    ^  width * (self bitsPerPixel).
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   396
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   397
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   398
bytesPerRow
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   399
    "return the number of bytes in one scanline of the image"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   400
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   401
    |bitsPerRow bytesPerRow|
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   402
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   403
    bitsPerRow := width * (self bitsPerPixel).
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   404
    bytesPerRow := bitsPerRow // 8.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   405
    ((bitsPerRow \\ 8) ~~ 0) ifTrue:[
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   406
        bytesPerRow := bytesPerRow + 1
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   407
    ].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   408
    ^ bytesPerRow
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   409
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   410
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   411
data
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   412
    "for backward compatibility - will vanish"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   413
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   414
    ^ bytes
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   415
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   416
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   417
data:aByteArray
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   418
    "for backward compatibility - will vanish"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   419
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   420
    bytes := aByteArray
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   421
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   422
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   423
bits:aByteArray
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   424
    "set the raw data"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   425
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   426
    bytes := aByteArray
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   427
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   428
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   429
bits
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   430
    "return the raw image data; depending on the photometric,
48194c26a46c Initial revision
claus
parents:
diff changeset
   431
     this has to be interpreted as monochrome, greyscale,
48194c26a46c Initial revision
claus
parents:
diff changeset
   432
     palette or rgb data. It is also packed to be dense, so
48194c26a46c Initial revision
claus
parents:
diff changeset
   433
     a 4 bitPerSample palette image will store 2 pixels per byte."
48194c26a46c Initial revision
claus
parents:
diff changeset
   434
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   435
    ^ bytes
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   436
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   437
48194c26a46c Initial revision
claus
parents:
diff changeset
   438
photometric
48194c26a46c Initial revision
claus
parents:
diff changeset
   439
    "return the photometric, a symbol such as #palette, #rgb etc."
48194c26a46c Initial revision
claus
parents:
diff changeset
   440
48194c26a46c Initial revision
claus
parents:
diff changeset
   441
    ^ photometric
48194c26a46c Initial revision
claus
parents:
diff changeset
   442
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   443
48194c26a46c Initial revision
claus
parents:
diff changeset
   444
photometric:aSymbol
48194c26a46c Initial revision
claus
parents:
diff changeset
   445
    "set the photometric"
48194c26a46c Initial revision
claus
parents:
diff changeset
   446
48194c26a46c Initial revision
claus
parents:
diff changeset
   447
    photometric := aSymbol
48194c26a46c Initial revision
claus
parents:
diff changeset
   448
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   449
48194c26a46c Initial revision
claus
parents:
diff changeset
   450
colorMap:anArrayOfArrays
48194c26a46c Initial revision
claus
parents:
diff changeset
   451
    colorMap := anArrayOfArrays
48194c26a46c Initial revision
claus
parents:
diff changeset
   452
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   453
48194c26a46c Initial revision
claus
parents:
diff changeset
   454
colorMap
48194c26a46c Initial revision
claus
parents:
diff changeset
   455
    "return the colormap"
48194c26a46c Initial revision
claus
parents:
diff changeset
   456
48194c26a46c Initial revision
claus
parents:
diff changeset
   457
    ^ colorMap
48194c26a46c Initial revision
claus
parents:
diff changeset
   458
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   459
48194c26a46c Initial revision
claus
parents:
diff changeset
   460
at:aPoint
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   461
    "retrieve the pixel at aPoint; return a color.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   462
     Pixels start at 0@0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   463
     width-1@height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   464
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   465
     very slow ..."
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   466
48194c26a46c Initial revision
claus
parents:
diff changeset
   467
    ^ self atX:aPoint x y:aPoint y
48194c26a46c Initial revision
claus
parents:
diff changeset
   468
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   469
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   470
valueAt:aPoint
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   471
    "retrieve the pixel at aPoint; return a pixel value.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   472
     Pixels start at 0@0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   473
     width-1@height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   474
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   475
     very slow ..."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   476
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   477
    ^ self valueAtX:aPoint x y:aPoint y
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   478
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   479
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   480
atX:x y:y
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   481
    "retrieve a pixel at x/y; return a color.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   482
     Pixels start at x=0 , y=0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   483
     x = width-1, y=height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   484
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   485
     very slow ..."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   486
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   487
    ^ self subclassResponsibility
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   488
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   489
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   490
valueAtX:x y:y
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   491
    "retrieve the pixel at aPoint; return a pixel value.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   492
     Pixels start at x=0 , y=0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   493
     width-1@height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   494
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   495
     very slow ..."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   496
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   497
    ^ self subclassResponsibility
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   498
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   499
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   500
at:aPoint put:aColor
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   501
    "set the pixel at aPoint to aColor.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   502
     Pixels start at 0@0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   503
     width-1@height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   504
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   505
     very slow ..."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   506
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   507
    ^ self atX:aPoint x y:aPoint y put:aColor
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   508
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   509
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   510
atX:x y:y put:aColor
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   511
    "set the pixel at x/y to aColor.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   512
     Pixels start at x=0 , y=0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   513
     x = width-1, y=height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   514
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   515
     very slow ..."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   516
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   517
    ^ self subclassResponsibility
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   518
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   519
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   520
atX:x y:y putValue:aPixelValue
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   521
    "set the pixel at x/y to aPixelValue.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   522
     Pixels start at x=0 , y=0 for upper left pixel, end at
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   523
     x = width-1, y=height-1 for lower right pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   524
     You should not use this method for image-processing, its
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   525
     very slow ..."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   526
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   527
    ^ self subclassResponsibility
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   528
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   529
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   530
atY:y from:x1 to:x2 do:aBlock
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   531
    "perform aBlock for each pixel from x1 to x2 in row y.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   532
     The block is passed the color at each pixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   533
     This method allows slighly faster processing of an
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   534
     image than using atX:y:, since some processing can be 
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   535
     avoided when going from pixel to pixel. However, for 
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   536
     real image processing, specialized methods should be written."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   537
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   538
    ^ self subclassResponsibility.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   539
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   540
48194c26a46c Initial revision
claus
parents:
diff changeset
   541
!Image methodsFor:'screen capture'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   542
48194c26a46c Initial revision
claus
parents:
diff changeset
   543
fromScreen:aRectangle
48194c26a46c Initial revision
claus
parents:
diff changeset
   544
    "read an image from the display screen"
48194c26a46c Initial revision
claus
parents:
diff changeset
   545
48194c26a46c Initial revision
claus
parents:
diff changeset
   546
    ^ self fromScreen:aRectangle on:Display
48194c26a46c Initial revision
claus
parents:
diff changeset
   547
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   548
48194c26a46c Initial revision
claus
parents:
diff changeset
   549
fromScreen:aRectangle on:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   550
    "read an image from aDevices display screen.
48194c26a46c Initial revision
claus
parents:
diff changeset
   551
     Since I have no other displays, only the MonoChrome, StaticGrey 
48194c26a46c Initial revision
claus
parents:
diff changeset
   552
     and PseudoColor cases have been tested ... 
48194c26a46c Initial revision
claus
parents:
diff changeset
   553
     (especially True- and DirectColor may be wrong)"
48194c26a46c Initial revision
claus
parents:
diff changeset
   554
48194c26a46c Initial revision
claus
parents:
diff changeset
   555
    |depth visType root 
48194c26a46c Initial revision
claus
parents:
diff changeset
   556
     x        "{ Class: SmallInteger }"
48194c26a46c Initial revision
claus
parents:
diff changeset
   557
     y        "{ Class: SmallInteger }"
48194c26a46c Initial revision
claus
parents:
diff changeset
   558
     w        "{ Class: SmallInteger }"
48194c26a46c Initial revision
claus
parents:
diff changeset
   559
     h        "{ Class: SmallInteger }"
48194c26a46c Initial revision
claus
parents:
diff changeset
   560
     dstIndex "{ Class: SmallInteger }" 
48194c26a46c Initial revision
claus
parents:
diff changeset
   561
     srcIndex "{ Class: SmallInteger }" 
48194c26a46c Initial revision
claus
parents:
diff changeset
   562
     inData tmpData usedColors nUsed 
48194c26a46c Initial revision
claus
parents:
diff changeset
   563
     rMap gMap bMap bitsPerPixel bytesPerLine
48194c26a46c Initial revision
claus
parents:
diff changeset
   564
     info bytesPerLineIn|
48194c26a46c Initial revision
claus
parents:
diff changeset
   565
48194c26a46c Initial revision
claus
parents:
diff changeset
   566
    visType := aDevice visualType.
48194c26a46c Initial revision
claus
parents:
diff changeset
   567
    depth := aDevice depth.
48194c26a46c Initial revision
claus
parents:
diff changeset
   568
    (visType == #StaticGray) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   569
        (aDevice blackpixel == 0) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   570
            photometric := #blackIs0
48194c26a46c Initial revision
claus
parents:
diff changeset
   571
        ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   572
            photometric := #whiteIs0
48194c26a46c Initial revision
claus
parents:
diff changeset
   573
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   574
        samplesPerPixel := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   575
        bitsPerPixel := depth.
48194c26a46c Initial revision
claus
parents:
diff changeset
   576
        bitsPerSample := Array with:bitsPerPixel.
48194c26a46c Initial revision
claus
parents:
diff changeset
   577
    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   578
        ((visType == #PseudoColor) or:[visType == #StaticColor]) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   579
            photometric := #palette.
48194c26a46c Initial revision
claus
parents:
diff changeset
   580
            samplesPerPixel := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   581
            bitsPerPixel := depth.
48194c26a46c Initial revision
claus
parents:
diff changeset
   582
            bitsPerSample := Array with:bitsPerPixel.
48194c26a46c Initial revision
claus
parents:
diff changeset
   583
        ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   584
            ((visType == #TrueColor) or:[visType == #DirectColor]) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   585
                photometric := #rgb.
48194c26a46c Initial revision
claus
parents:
diff changeset
   586
                samplesPerPixel := 3.
48194c26a46c Initial revision
claus
parents:
diff changeset
   587
                bitsPerPixel := 24.
48194c26a46c Initial revision
claus
parents:
diff changeset
   588
                bitsPerSample := #(8 8 8)
48194c26a46c Initial revision
claus
parents:
diff changeset
   589
            ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   590
                self error:'screen visual not supported'.
48194c26a46c Initial revision
claus
parents:
diff changeset
   591
                ^ nil
48194c26a46c Initial revision
claus
parents:
diff changeset
   592
            ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   593
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   594
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   595
48194c26a46c Initial revision
claus
parents:
diff changeset
   596
    "dont know yet, how display pads, assume worst case"
48194c26a46c Initial revision
claus
parents:
diff changeset
   597
48194c26a46c Initial revision
claus
parents:
diff changeset
   598
    w := width := aRectangle width.
48194c26a46c Initial revision
claus
parents:
diff changeset
   599
    h := height := aRectangle height.
48194c26a46c Initial revision
claus
parents:
diff changeset
   600
    x := aRectangle left.
48194c26a46c Initial revision
claus
parents:
diff changeset
   601
    y := aRectangle top.
48194c26a46c Initial revision
claus
parents:
diff changeset
   602
48194c26a46c Initial revision
claus
parents:
diff changeset
   603
    bytesPerLine := (w * bitsPerPixel + 31) // 8.
48194c26a46c Initial revision
claus
parents:
diff changeset
   604
    inData := ByteArray uninitializedNew:(bytesPerLine * height).
48194c26a46c Initial revision
claus
parents:
diff changeset
   605
48194c26a46c Initial revision
claus
parents:
diff changeset
   606
    root := DisplayRootView on:aDevice.
48194c26a46c Initial revision
claus
parents:
diff changeset
   607
    info := aDevice getBitsFrom:root id x:x y:y width:w height:h into:inData. 
48194c26a46c Initial revision
claus
parents:
diff changeset
   608
48194c26a46c Initial revision
claus
parents:
diff changeset
   609
    "if the padding is not correct .."
48194c26a46c Initial revision
claus
parents:
diff changeset
   610
    bytesPerLineIn := (info at:3).                                "what I got"
48194c26a46c Initial revision
claus
parents:
diff changeset
   611
    bytesPerLine := (w * bitsPerPixel + 7) // 8.                  "what I want"
48194c26a46c Initial revision
claus
parents:
diff changeset
   612
    (bytesPerLine ~~ bytesPerLineIn) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   613
        tmpData := inData.
48194c26a46c Initial revision
claus
parents:
diff changeset
   614
        inData := ByteArray uninitializedNew:(bytesPerLine * height).
48194c26a46c Initial revision
claus
parents:
diff changeset
   615
        srcIndex := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   616
        dstIndex := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   617
        1 to:height do:[:h |
48194c26a46c Initial revision
claus
parents:
diff changeset
   618
            inData replaceFrom:dstIndex to:(dstIndex + bytesPerLine - 1)
48194c26a46c Initial revision
claus
parents:
diff changeset
   619
                          with:tmpData startingAt:srcIndex.
48194c26a46c Initial revision
claus
parents:
diff changeset
   620
            dstIndex := dstIndex + bytesPerLine.
48194c26a46c Initial revision
claus
parents:
diff changeset
   621
            srcIndex := srcIndex + bytesPerLineIn
48194c26a46c Initial revision
claus
parents:
diff changeset
   622
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   623
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   624
48194c26a46c Initial revision
claus
parents:
diff changeset
   625
    "info printNewline. "
48194c26a46c Initial revision
claus
parents:
diff changeset
   626
48194c26a46c Initial revision
claus
parents:
diff changeset
   627
    ((visType == #StaticGray) or:[visType == #TrueColor]) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   628
        "were done, the pixel values are the rgb/grey values"
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   629
        bytes := inData.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   630
        ^ self
48194c26a46c Initial revision
claus
parents:
diff changeset
   631
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   632
48194c26a46c Initial revision
claus
parents:
diff changeset
   633
    "what we have now are the color numbers - still need the r/g/b values"
48194c26a46c Initial revision
claus
parents:
diff changeset
   634
    "find out, which colors are in the picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
   635
48194c26a46c Initial revision
claus
parents:
diff changeset
   636
    usedColors := inData usedValues.
48194c26a46c Initial revision
claus
parents:
diff changeset
   637
    nUsed := usedColors maximumValue + 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   638
48194c26a46c Initial revision
claus
parents:
diff changeset
   639
    "get the palette"
48194c26a46c Initial revision
claus
parents:
diff changeset
   640
    rMap := Array new:nUsed.
48194c26a46c Initial revision
claus
parents:
diff changeset
   641
    gMap := Array new:nUsed.
48194c26a46c Initial revision
claus
parents:
diff changeset
   642
    bMap := Array new:nUsed.
48194c26a46c Initial revision
claus
parents:
diff changeset
   643
    usedColors do:[:colorIndex |
48194c26a46c Initial revision
claus
parents:
diff changeset
   644
        |i scale|
48194c26a46c Initial revision
claus
parents:
diff changeset
   645
48194c26a46c Initial revision
claus
parents:
diff changeset
   646
        i := colorIndex + 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   647
        scale := 255.0 / 100.0.
48194c26a46c Initial revision
claus
parents:
diff changeset
   648
        aDevice getRGBFrom:colorIndex into:[:r :g :b |
48194c26a46c Initial revision
claus
parents:
diff changeset
   649
            rMap at:i put:(r * scale) rounded.
48194c26a46c Initial revision
claus
parents:
diff changeset
   650
            gMap at:i put:(g * scale) rounded.
48194c26a46c Initial revision
claus
parents:
diff changeset
   651
            bMap at:i put:(b * scale) rounded
48194c26a46c Initial revision
claus
parents:
diff changeset
   652
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   653
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   654
    colorMap := Array with:rMap with:gMap with:bMap.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   655
    bytes := inData.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   656
48194c26a46c Initial revision
claus
parents:
diff changeset
   657
    "Image new fromScreen:((0 @ 0) corner:(100 @ 100)) on:Display"
48194c26a46c Initial revision
claus
parents:
diff changeset
   658
    "Image new fromScreen:((0 @ 0) corner:(500 @ 500)) on:Display"
48194c26a46c Initial revision
claus
parents:
diff changeset
   659
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   660
48194c26a46c Initial revision
claus
parents:
diff changeset
   661
!Image methodsFor:'saving on file'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   662
48194c26a46c Initial revision
claus
parents:
diff changeset
   663
saveOn:aFileName
48194c26a46c Initial revision
claus
parents:
diff changeset
   664
    FileFormats associationsDo:[:a |
48194c26a46c Initial revision
claus
parents:
diff changeset
   665
        (aFileName endsWith:(a key)) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   666
            ^ (a value) save:self onFile:aFileName
48194c26a46c Initial revision
claus
parents:
diff changeset
   667
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   668
    ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   669
    "no known extension - could ask user for the format here.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   670
     currently default to tiff format."
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   671
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   672
    'unknown extension - could not figure out format - using tiff' printNewline.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   673
    ^ self saveOn:aFileName using:TIFFReader
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   674
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   675
48194c26a46c Initial revision
claus
parents:
diff changeset
   676
saveOn:aFileName using:readerClass
48194c26a46c Initial revision
claus
parents:
diff changeset
   677
    "save the receiver using the representation class"
48194c26a46c Initial revision
claus
parents:
diff changeset
   678
48194c26a46c Initial revision
claus
parents:
diff changeset
   679
    readerClass save:self onFile:aFileName
48194c26a46c Initial revision
claus
parents:
diff changeset
   680
48194c26a46c Initial revision
claus
parents:
diff changeset
   681
    "anImage saveOn:'myImage' using:TIFFReader"
48194c26a46c Initial revision
claus
parents:
diff changeset
   682
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   683
48194c26a46c Initial revision
claus
parents:
diff changeset
   684
!Image methodsFor:'converting'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   685
48194c26a46c Initial revision
claus
parents:
diff changeset
   686
on:aDevice
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   687
    "make the image device dependent for aDevice"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   688
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   689
    ((aDevice == device) and:[deviceForm notNil]) ifTrue:[^ self].
48194c26a46c Initial revision
claus
parents:
diff changeset
   690
    deviceForm := self asFormOn:aDevice.
48194c26a46c Initial revision
claus
parents:
diff changeset
   691
    device := aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   692
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   693
48194c26a46c Initial revision
claus
parents:
diff changeset
   694
monochromeOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   695
    ((aDevice == device) and:[monoDeviceForm notNil]) ifTrue:[^ self].
48194c26a46c Initial revision
claus
parents:
diff changeset
   696
    monoDeviceForm := self asMonochromeFormOn:aDevice.
48194c26a46c Initial revision
claus
parents:
diff changeset
   697
    device := aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   698
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   699
48194c26a46c Initial revision
claus
parents:
diff changeset
   700
asFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   701
    "get a device form, with best possible approximation"
48194c26a46c Initial revision
claus
parents:
diff changeset
   702
48194c26a46c Initial revision
claus
parents:
diff changeset
   703
    (photometric == #palette) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   704
        ^ self paletteImageAsFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   705
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   706
48194c26a46c Initial revision
claus
parents:
diff changeset
   707
    (photometric == #rgb) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   708
        ^ self rgbImageAsFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   709
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   710
48194c26a46c Initial revision
claus
parents:
diff changeset
   711
    ^ self greyImageAsFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   712
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   713
48194c26a46c Initial revision
claus
parents:
diff changeset
   714
asMonochromeFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   715
    "get a monochrome device form"
48194c26a46c Initial revision
claus
parents:
diff changeset
   716
48194c26a46c Initial revision
claus
parents:
diff changeset
   717
    (photometric == #palette) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   718
        ^ self paletteImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   719
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   720
48194c26a46c Initial revision
claus
parents:
diff changeset
   721
    (photometric == #rgb) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   722
        ^ self rgbImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   723
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   724
48194c26a46c Initial revision
claus
parents:
diff changeset
   725
    ^ self greyImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   726
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   727
48194c26a46c Initial revision
claus
parents:
diff changeset
   728
!Image methodsFor:'converting rgb images'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   729
48194c26a46c Initial revision
claus
parents:
diff changeset
   730
rgbImageAsFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   731
    "convert am rgb image to a device form form aDevice.
48194c26a46c Initial revision
claus
parents:
diff changeset
   732
     Return the device form."
48194c26a46c Initial revision
claus
parents:
diff changeset
   733
48194c26a46c Initial revision
claus
parents:
diff changeset
   734
    |visual|
48194c26a46c Initial revision
claus
parents:
diff changeset
   735
48194c26a46c Initial revision
claus
parents:
diff changeset
   736
    visual := aDevice visualType.
48194c26a46c Initial revision
claus
parents:
diff changeset
   737
    (visual == #StaticGray) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   738
        ^ self rgbImageAsGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   739
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   740
    (visual == #TrueColor) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   741
        ^ self rgbImageAsTrueFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   742
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   743
    ^ self rgbImageAsPseudoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   744
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   745
48194c26a46c Initial revision
claus
parents:
diff changeset
   746
rgbImageAsGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   747
    "convert an rgb image to a grey image for greyscale displays"
48194c26a46c Initial revision
claus
parents:
diff changeset
   748
48194c26a46c Initial revision
claus
parents:
diff changeset
   749
    |deviceDepth|
48194c26a46c Initial revision
claus
parents:
diff changeset
   750
48194c26a46c Initial revision
claus
parents:
diff changeset
   751
    deviceDepth := aDevice depth.
48194c26a46c Initial revision
claus
parents:
diff changeset
   752
48194c26a46c Initial revision
claus
parents:
diff changeset
   753
    "I have specially tuned methods for monochrome"
48194c26a46c Initial revision
claus
parents:
diff changeset
   754
    (deviceDepth == 1) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   755
        DitherAlgorithm == #error ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   756
            ^ self rgbImageAsErrorDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   757
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   758
        DitherAlgorithm == #pattern ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   759
            ^ self rgbImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   760
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   761
        ^ self rgbImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   762
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   763
48194c26a46c Initial revision
claus
parents:
diff changeset
   764
    "and for 2plane greyscale (i.e. NeXTs)"
48194c26a46c Initial revision
claus
parents:
diff changeset
   765
    (deviceDepth == 2) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   766
        DitherAlgorithm == #error  ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   767
            ^ self rgbImageAsErrorDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   768
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   769
        DitherAlgorithm == #pattern  ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   770
            ^ self rgbImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   771
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   772
        ^ self rgbImageAs2PlaneFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   773
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   774
48194c26a46c Initial revision
claus
parents:
diff changeset
   775
    (deviceDepth == 8) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   776
        ^ self rgbImageAs8BitGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   777
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   778
48194c26a46c Initial revision
claus
parents:
diff changeset
   779
    "mhmh need another converter ...
48194c26a46c Initial revision
claus
parents:
diff changeset
   780
     till then we do:"
48194c26a46c Initial revision
claus
parents:
diff changeset
   781
    DitherAlgorithm == #error  ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   782
        ^ self rgbImageAsErrorDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   783
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   784
    DitherAlgorithm == #pattern  ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   785
        ^ self rgbImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   786
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   787
    ^ self rgbImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   788
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   789
48194c26a46c Initial revision
claus
parents:
diff changeset
   790
rgbImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   791
    "return a 1-bit monochrome form for aDevice from the rgb picture,
48194c26a46c Initial revision
claus
parents:
diff changeset
   792
     using a threshold algorithm. 
48194c26a46c Initial revision
claus
parents:
diff changeset
   793
     (i.e. grey value < 0.5 -> black, grey value >= 0.5 -> white)."
48194c26a46c Initial revision
claus
parents:
diff changeset
   794
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   795
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   796
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   797
48194c26a46c Initial revision
claus
parents:
diff changeset
   798
rgbImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   799
    "return a dithered greyForm for aDevice from the palette picture.
48194c26a46c Initial revision
claus
parents:
diff changeset
   800
     works for any destination depth.
48194c26a46c Initial revision
claus
parents:
diff changeset
   801
     A slow algorithm, using draw into the form (which indirectly does
48194c26a46c Initial revision
claus
parents:
diff changeset
   802
     the dither) - should be rewritten."
48194c26a46c Initial revision
claus
parents:
diff changeset
   803
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   804
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   805
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   806
48194c26a46c Initial revision
claus
parents:
diff changeset
   807
rgbImageAs2PlaneFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   808
    "return a 2-bit device form for aDevice from the rgb picture,
48194c26a46c Initial revision
claus
parents:
diff changeset
   809
     using a threshold algorithm. 
48194c26a46c Initial revision
claus
parents:
diff changeset
   810
     (i.e. grey value < 0.25 -> black // 0.25..0.5 -> darkgrey //
48194c26a46c Initial revision
claus
parents:
diff changeset
   811
      0.5 .. 0.75 -> lightgrey // > 0.75 -> white)."
48194c26a46c Initial revision
claus
parents:
diff changeset
   812
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   813
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   814
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   815
48194c26a46c Initial revision
claus
parents:
diff changeset
   816
rgbImageAs8BitGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   817
    "return an 8-bit greyForm from the rgb picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
   818
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   819
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   820
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   821
48194c26a46c Initial revision
claus
parents:
diff changeset
   822
rgbImageAsPseudoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   823
    "return a pseudocolor form from the rgb-picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
   824
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   825
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   826
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   827
48194c26a46c Initial revision
claus
parents:
diff changeset
   828
!Image methodsFor:'converting palette images'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   829
48194c26a46c Initial revision
claus
parents:
diff changeset
   830
paletteImageAsFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   831
    (aDevice visualType == #StaticGray) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   832
        (aDevice depth == 8) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   833
            ^ self paletteImageAsGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   834
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   835
48194c26a46c Initial revision
claus
parents:
diff changeset
   836
        DitherAlgorithm == #pattern ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   837
            ^ self paletteImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   838
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   839
48194c26a46c Initial revision
claus
parents:
diff changeset
   840
        (aDevice depth == 2) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   841
            ^ self paletteImageAs2PlaneFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   842
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   843
48194c26a46c Initial revision
claus
parents:
diff changeset
   844
        ^ self paletteImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   845
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   846
    ^ self paletteImageAsPseudoFormOn: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
paletteImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   850
    "return a 1-bit monoForm from the palette picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
   851
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   852
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   853
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   854
48194c26a46c Initial revision
claus
parents:
diff changeset
   855
paletteImageAs2PlaneFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   856
    "return a 2-bit greyForm from the palette picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
   857
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   858
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   859
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   860
48194c26a46c Initial revision
claus
parents:
diff changeset
   861
paletteImageAsPseudoFormOn:aDevice
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   862
    "return a pseudoForm from the palette picture."
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   863
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   864
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   865
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   866
48194c26a46c Initial revision
claus
parents:
diff changeset
   867
paletteImageAsGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   868
    "return an 8-bit greyForm from the palette picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
   869
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   870
    ^ self subclassResponsibility
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   871
!
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   872
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   873
paletteImageAsPatternDitheredGreyFormOn:aDevice
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   874
    "return a dithered greyForm from the palette picture."
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   875
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   876
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   877
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   878
48194c26a46c Initial revision
claus
parents:
diff changeset
   879
!Image methodsFor:'converting greyscale images'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   880
48194c26a46c Initial revision
claus
parents:
diff changeset
   881
greyImageAsFormOn:aDevice
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   882
    "return a thresholded greyForm from the grey picture."
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   883
 
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   884
    |pictureDepth nPlanes f|
48194c26a46c Initial revision
claus
parents:
diff changeset
   885
48194c26a46c Initial revision
claus
parents:
diff changeset
   886
    nPlanes := samplesPerPixel.
48194c26a46c Initial revision
claus
parents:
diff changeset
   887
    (nPlanes == 2) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   888
        'alpha plane ignored' printNewline.
48194c26a46c Initial revision
claus
parents:
diff changeset
   889
        nPlanes := 1
48194c26a46c Initial revision
claus
parents:
diff changeset
   890
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   891
48194c26a46c Initial revision
claus
parents:
diff changeset
   892
    pictureDepth := bitsPerSample at:1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   893
48194c26a46c Initial revision
claus
parents:
diff changeset
   894
    "monochrome is very easy ..."
48194c26a46c Initial revision
claus
parents:
diff changeset
   895
48194c26a46c Initial revision
claus
parents:
diff changeset
   896
    (pictureDepth == 1) ifTrue:[
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   897
        ^ Form width:width height:height fromArray:bytes on:aDevice
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   898
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   899
48194c26a46c Initial revision
claus
parents:
diff changeset
   900
    (aDevice visualType == #StaticGray) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   901
        (aDevice depth == pictureDepth) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   902
48194c26a46c Initial revision
claus
parents:
diff changeset
   903
            "greyscale is easy, if the depths match"
48194c26a46c Initial revision
claus
parents:
diff changeset
   904
48194c26a46c Initial revision
claus
parents:
diff changeset
   905
            f := Form width:width height:height depth:pictureDepth on:aDevice.
48194c26a46c Initial revision
claus
parents:
diff changeset
   906
            f isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
   907
            f initGC.
48194c26a46c Initial revision
claus
parents:
diff changeset
   908
48194c26a46c Initial revision
claus
parents:
diff changeset
   909
            "if device has white at the opposite corner ..."
48194c26a46c Initial revision
claus
parents:
diff changeset
   910
            ((aDevice blackpixel == 0) == (photometric == #blackIs0)) ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   911
                "have to invert bits"
48194c26a46c Initial revision
claus
parents:
diff changeset
   912
                f function:#copyInverted
48194c26a46c Initial revision
claus
parents:
diff changeset
   913
            ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   914
            aDevice drawBits:bytes depth:pictureDepth width:width height:height
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   915
                            x:0 y:0
48194c26a46c Initial revision
claus
parents:
diff changeset
   916
                         into:(f id)
48194c26a46c Initial revision
claus
parents:
diff changeset
   917
                            x:0 y:0 width:width height:height with:(f gcId).
48194c26a46c Initial revision
claus
parents:
diff changeset
   918
            ^ f
48194c26a46c Initial revision
claus
parents:
diff changeset
   919
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   920
48194c26a46c Initial revision
claus
parents:
diff changeset
   921
        "the image has more greylevels than the display - dither"
48194c26a46c Initial revision
claus
parents:
diff changeset
   922
48194c26a46c Initial revision
claus
parents:
diff changeset
   923
"
48194c26a46c Initial revision
claus
parents:
diff changeset
   924
coming soon ...
48194c26a46c Initial revision
claus
parents:
diff changeset
   925
        DitherAlgorithm == #error ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   926
            ^ self greyImageAsErrorDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   927
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   928
"
48194c26a46c Initial revision
claus
parents:
diff changeset
   929
        DitherAlgorithm == #pattern ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   930
            ^ self greyImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   931
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   932
48194c26a46c Initial revision
claus
parents:
diff changeset
   933
        "no dither, simply cut off information"
48194c26a46c Initial revision
claus
parents:
diff changeset
   934
        (aDevice depth == 1) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   935
            "for monochrome, there is a special method to do this"
48194c26a46c Initial revision
claus
parents:
diff changeset
   936
            ^ self greyImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   937
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   938
        "the general case, will take as many bits from the image
48194c26a46c Initial revision
claus
parents:
diff changeset
   939
         as possible for the device"
48194c26a46c Initial revision
claus
parents:
diff changeset
   940
        ^ self greyImageAsGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   941
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   942
48194c26a46c Initial revision
claus
parents:
diff changeset
   943
48194c26a46c Initial revision
claus
parents:
diff changeset
   944
    (aDevice visualType == #PseudoColor) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   945
        ^ self greyImageAsPseudoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   946
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   947
48194c26a46c Initial revision
claus
parents:
diff changeset
   948
    self error:'cannot convert this format'.
48194c26a46c Initial revision
claus
parents:
diff changeset
   949
    ^ nil
48194c26a46c Initial revision
claus
parents:
diff changeset
   950
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   951
48194c26a46c Initial revision
claus
parents:
diff changeset
   952
greyImageAsMonoFormOn:aDevice
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   953
    "return a (thresholded) monochrome Form from the picture."
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   954
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   955
    ^ self subclassResponsibility
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   956
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   957
48194c26a46c Initial revision
claus
parents:
diff changeset
   958
greyImageAsPatternDitheredGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
   959
    "return a dithered greyForm from the grey picture.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   960
     Works for any source/destination depths, but very very slow
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   961
     since each pixel is processed individually.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   962
     Usually redefined by subclasses for more performance"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   963
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   964
    |f last      
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   965
     x0            "{Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   966
     w             "{Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   967
     h             "{Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   968
     v             "{Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   969
     run           "{Class: SmallInteger }" |
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   970
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   971
    Transcript showCr:'slow dithering ..'. Transcript endEntry.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   972
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   973
    w := width - 1.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   974
    h := height - 1.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   975
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   976
    "draw each pixel using dither color (let others do the dithering)
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   977
     although the code is simple, its very slow"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   978
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   979
    f := Form width:width height:height depth:aDevice depth on:aDevice.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   980
    f isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
   981
    f initGC.
48194c26a46c Initial revision
claus
parents:
diff changeset
   982
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   983
    0 to:h do:[:dstY |
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   984
        x0 := 0.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   985
        run := 0.
48194c26a46c Initial revision
claus
parents:
diff changeset
   986
        last := nil.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   987
        self atY:dstY from:0 to:w do:[:x :srcColor |
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   988
            |dstColor|
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   989
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   990
            srcColor ~~ last ifTrue:[
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   991
                (run ~~ 0) ifTrue:[
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   992
                    f fillRectangleX:x0 y:dstY width:run height:1.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   993
                ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   994
                run := 0.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   995
                dstColor := Color grey:(srcColor greyIntensity).
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   996
                f paint:dstColor.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   997
                last := srcColor.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
   998
                x0 := x
0
48194c26a46c Initial revision
claus
parents:
diff changeset
   999
            ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1000
            run := run + 1
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1001
        ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1002
        f fillRectangleX:x0 y:dstY width:run height:1.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1003
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1004
    ^ f
48194c26a46c Initial revision
claus
parents:
diff changeset
  1005
!
48194c26a46c Initial revision
claus
parents:
diff changeset
  1006
48194c26a46c Initial revision
claus
parents:
diff changeset
  1007
greyImageAsGreyFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
  1008
    "return an 8-bit Form from the grey picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1009
48194c26a46c Initial revision
claus
parents:
diff changeset
  1010
    |wideBits pictureDepth f map shift nplanes ncells
48194c26a46c Initial revision
claus
parents:
diff changeset
  1011
     inverse oldValue newValue
48194c26a46c Initial revision
claus
parents:
diff changeset
  1012
     shift2 shift3 shift4|
48194c26a46c Initial revision
claus
parents:
diff changeset
  1013
48194c26a46c Initial revision
claus
parents:
diff changeset
  1014
    (aDevice depth == 8) ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1015
        'non-8 plane displays not supported' printNewline.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1016
        ^ self greyImageAsMonoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
  1017
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1018
48194c26a46c Initial revision
claus
parents:
diff changeset
  1019
    pictureDepth := bitsPerSample at:1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1020
48194c26a46c Initial revision
claus
parents:
diff changeset
  1021
    wideBits := ByteArray uninitializedNew:(width * height).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1022
48194c26a46c Initial revision
claus
parents:
diff changeset
  1023
    map := ByteArray uninitializedNew:(1 bitShift:pictureDepth).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1024
48194c26a46c Initial revision
claus
parents:
diff changeset
  1025
    "find the real number of server-planes"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1026
    nplanes := 8.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1027
    ncells := 256.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1028
    [aDevice ncells < ncells] whileTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1029
        nplanes := nplanes - 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1030
        ncells := ncells // 2
48194c26a46c Initial revision
claus
parents:
diff changeset
  1031
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1032
48194c26a46c Initial revision
claus
parents:
diff changeset
  1033
    "prepare translation table"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1034
48194c26a46c Initial revision
claus
parents:
diff changeset
  1035
    shift := nplanes - pictureDepth.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1036
    shift2 := shift - pictureDepth.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1037
    shift3 := shift2 - pictureDepth.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1038
    shift4 := shift3 - pictureDepth.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1039
48194c26a46c Initial revision
claus
parents:
diff changeset
  1040
    inverse := aDevice blackpixel ~~ 0.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1041
    photometric == #blackIs0 ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1042
        inverse := inverse not
48194c26a46c Initial revision
claus
parents:
diff changeset
  1043
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1044
    1 to:(map size) do:[:index |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1045
        oldValue := index - 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1046
        newValue := oldValue bitShift:shift.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1047
        newValue := newValue bitOr:(oldValue bitShift:shift2).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1048
        newValue := newValue bitOr:(oldValue bitShift:shift3).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1049
        newValue := newValue bitOr:(oldValue bitShift:shift4).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1050
        inverse ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1051
            map at:(map size - index + 1) put:newValue
48194c26a46c Initial revision
claus
parents:
diff changeset
  1052
        ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1053
            map at:index put:newValue
48194c26a46c Initial revision
claus
parents:
diff changeset
  1054
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
  1055
    ].
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1056
    bytes expandPixels:pictureDepth
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1057
                width:width 
48194c26a46c Initial revision
claus
parents:
diff changeset
  1058
               height:height
48194c26a46c Initial revision
claus
parents:
diff changeset
  1059
                 into:wideBits
48194c26a46c Initial revision
claus
parents:
diff changeset
  1060
              mapping:map.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1061
48194c26a46c Initial revision
claus
parents:
diff changeset
  1062
    f := Form width:width height:height depth:8 on:aDevice.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1063
    f isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1064
    f initGC.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1065
    aDevice drawBits:wideBits depth:8 width:width height:height
48194c26a46c Initial revision
claus
parents:
diff changeset
  1066
                       x:0 y:0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1067
                    into:(f id) x:0 y:0 width:width height:height with:(f gcId).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1068
    ^ f
48194c26a46c Initial revision
claus
parents:
diff changeset
  1069
!
48194c26a46c Initial revision
claus
parents:
diff changeset
  1070
48194c26a46c Initial revision
claus
parents:
diff changeset
  1071
greyImageAsPseudoFormOn:aDevice
48194c26a46c Initial revision
claus
parents:
diff changeset
  1072
    "return an 8-bit pseudo Form from the grey picture"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1073
48194c26a46c Initial revision
claus
parents:
diff changeset
  1074
    |wideBits pictureDepth f map  
48194c26a46c Initial revision
claus
parents:
diff changeset
  1075
     colorMap usedColors nUsed aColor nColors range|
48194c26a46c Initial revision
claus
parents:
diff changeset
  1076
48194c26a46c Initial revision
claus
parents:
diff changeset
  1077
    pictureDepth := bitsPerSample at:1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1078
48194c26a46c Initial revision
claus
parents:
diff changeset
  1079
    (#(2 4 8) includes:pictureDepth) ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1080
        self error:'currently only depth-2, 4 or 8 supported'.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1081
        ^ nil
48194c26a46c Initial revision
claus
parents:
diff changeset
  1082
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1083
48194c26a46c Initial revision
claus
parents:
diff changeset
  1084
    wideBits := ByteArray uninitializedNew:(width * height).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1085
48194c26a46c Initial revision
claus
parents:
diff changeset
  1086
    (pictureDepth == 8) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1087
        "for 8bits, we scan for used colors first;
48194c26a46c Initial revision
claus
parents:
diff changeset
  1088
         to avoid allocating too many colors"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1089
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1090
        usedColors := bytes usedValues.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1091
        nUsed := usedColors maximumValue + 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1092
48194c26a46c Initial revision
claus
parents:
diff changeset
  1093
        colorMap := Array new:nUsed.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1094
        photometric == #blackIs0 ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1095
            usedColors do:[:grey |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1096
                colorMap at:(grey + 1) put:(Color grey:(100.0 / 256.0 * grey))
48194c26a46c Initial revision
claus
parents:
diff changeset
  1097
            ]
48194c26a46c Initial revision
claus
parents:
diff changeset
  1098
        ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1099
            usedColors do:[:grey |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1100
                colorMap at:(grey + 1) put:(Color grey:(100 - (100.0 / 256.0 * grey)))
48194c26a46c Initial revision
claus
parents:
diff changeset
  1101
            ]
48194c26a46c Initial revision
claus
parents:
diff changeset
  1102
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
  1103
    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1104
        nColors := (1 bitShift:pictureDepth).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1105
        colorMap := Array new:nColors.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1106
        range := 100 / (nColors - 1) asFloat.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1107
        1 to:nColors do:[:i |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1108
            colorMap at:i put:(Color grey:(i - 1) * range).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1109
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1110
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1111
48194c26a46c Initial revision
claus
parents:
diff changeset
  1112
    "XXX should reduce 8->6->4->2 planes, if not all colors could be allocated"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1113
48194c26a46c Initial revision
claus
parents:
diff changeset
  1114
    "setup the translation map"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1115
    map := ByteArray uninitializedNew:256.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1116
    1 to:(colorMap size) do:[:i |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1117
        aColor := colorMap at:i.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1118
        aColor notNil ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1119
            map at:i put:(aColor on:aDevice) colorId
48194c26a46c Initial revision
claus
parents:
diff changeset
  1120
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
  1121
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1122
48194c26a46c Initial revision
claus
parents:
diff changeset
  1123
    "expand & translate"
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1124
    bytes expandPixels:pictureDepth
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1125
                width:width 
48194c26a46c Initial revision
claus
parents:
diff changeset
  1126
               height:height
48194c26a46c Initial revision
claus
parents:
diff changeset
  1127
                 into:wideBits
48194c26a46c Initial revision
claus
parents:
diff changeset
  1128
              mapping:map.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1129
48194c26a46c Initial revision
claus
parents:
diff changeset
  1130
    f := Form width:width height:height depth:8 on:aDevice.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1131
    f isNil ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1132
    f colorMap:colorMap. 
48194c26a46c Initial revision
claus
parents:
diff changeset
  1133
    f initGC.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1134
    aDevice drawBits:wideBits depth:8 width:width height:height
48194c26a46c Initial revision
claus
parents:
diff changeset
  1135
                       x:0 y:0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1136
                    into:(f id) x:0 y:0 width:width height:height with:(f gcId).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1137
    ^ f
48194c26a46c Initial revision
claus
parents:
diff changeset
  1138
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
  1139
48194c26a46c Initial revision
claus
parents:
diff changeset
  1140
!Image methodsFor:'image manipulations'!
48194c26a46c Initial revision
claus
parents:
diff changeset
  1141
48194c26a46c Initial revision
claus
parents:
diff changeset
  1142
magnifyBy:extent
48194c26a46c Initial revision
claus
parents:
diff changeset
  1143
    "return a new image magnified by extent, aPoint.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1144
     If non-integral magnify is asked for, pass the work on to 'hardMagnifyBy:'"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1145
48194c26a46c Initial revision
claus
parents:
diff changeset
  1146
    |mX mY srcOffset dstOffset dstStep first
48194c26a46c Initial revision
claus
parents:
diff changeset
  1147
     newWidth newHeight newImage newBits bitsPerPixel newBytesPerRow oldBytesPerRow|
48194c26a46c Initial revision
claus
parents:
diff changeset
  1148
48194c26a46c Initial revision
claus
parents:
diff changeset
  1149
    mX := extent x.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1150
    mY := extent y.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1151
    ((mX < 0) or:[mY < 0]) ifTrue:[^ nil].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1152
    ((mX = 1) and:[mY = 1]) ifTrue:[^ self].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1153
48194c26a46c Initial revision
claus
parents:
diff changeset
  1154
    ((mX isKindOf:SmallInteger) and:[mY isKindOf:SmallInteger]) ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1155
        ^ self hardMagnifyBy:extent
48194c26a46c Initial revision
claus
parents:
diff changeset
  1156
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1157
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1158
    bitsPerPixel := self depth.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1159
    oldBytesPerRow := ((width * bitsPerPixel) + 7) // 8.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1160
48194c26a46c Initial revision
claus
parents:
diff changeset
  1161
    newWidth := width * mX.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1162
    newHeight := height * mY.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1163
    newBytesPerRow := ((newWidth * bitsPerPixel) + 7) // 8.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1164
    newBits := ByteArray uninitializedNew:(newBytesPerRow * newHeight).
48194c26a46c Initial revision
claus
parents:
diff changeset
  1165
48194c26a46c Initial revision
claus
parents:
diff changeset
  1166
    newImage := self species new.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1167
    newImage bits:newBits.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1168
    newImage width:newWidth.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1169
    newImage height:newHeight.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1170
    newImage photometric:photometric.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1171
    newImage samplesPerPixel:samplesPerPixel.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1172
    newImage bitsPerSample:bitsPerSample.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1173
    newImage colorMap:colorMap copy.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1174
48194c26a46c Initial revision
claus
parents:
diff changeset
  1175
    mX = 1 ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1176
        "expand rows only"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1177
        srcOffset := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1178
        dstOffset := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1179
48194c26a46c Initial revision
claus
parents:
diff changeset
  1180
        1 to:height do:[:row |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1181
            1 to:mY do:[:i |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1182
                newBits replaceFrom:dstOffset to:(dstOffset + oldBytesPerRow - 1)
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1183
                               with:bytes startingAt:srcOffset.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1184
                dstOffset := dstOffset + newBytesPerRow
48194c26a46c Initial revision
claus
parents:
diff changeset
  1185
            ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1186
            srcOffset := srcOffset + oldBytesPerRow.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1187
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1188
    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1189
        "expand cols"
48194c26a46c Initial revision
claus
parents:
diff changeset
  1190
        (mX > 1) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
  1191
            dstOffset := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1192
            srcOffset := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1193
            1 to:height do:[:row |
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1194
                self magnifyRowFrom:bytes offset:srcOffset  
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1195
                               into:newBits offset:dstOffset factor:mX.
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1196
48194c26a46c Initial revision
claus
parents:
diff changeset
  1197
                first := dstOffset.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1198
                dstOffset := dstOffset + newBytesPerRow.
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1199
                " and copy for row expansion "
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1200
                2 to:mY do:[:i |
48194c26a46c Initial revision
claus
parents:
diff changeset
  1201
                    newBits replaceFrom:dstOffset to:(dstOffset + newBytesPerRow - 1)
48194c26a46c Initial revision
claus
parents:
diff changeset
  1202
                                   with:newBits startingAt:first.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1203
                    dstOffset := dstOffset + newBytesPerRow
48194c26a46c Initial revision
claus
parents:
diff changeset
  1204
                ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1205
                srcOffset := srcOffset + oldBytesPerRow.
48194c26a46c Initial revision
claus
parents:
diff changeset
  1206
            ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1207
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
  1208
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
  1209
    ^ newImage
48194c26a46c Initial revision
claus
parents:
diff changeset
  1210
48194c26a46c Initial revision
claus
parents:
diff changeset
  1211
    "((Image fromFile:'bitmaps/claus.gif') magnifyBy:1@2)"
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1212
!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1213
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1214
hardMagnifyBy:extent
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1215
    "return a new image magnified by extent, aPoint.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1216
     This is  the general magnification method, handling non-integral values"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1217
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1218
    |mX mY    
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1219
     newWidth  "{ Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1220
     newHeight "{ Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1221
     w         "{ Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1222
     h         "{ Class: SmallInteger }"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1223
     newImage newBits bitsPerPixel newBytesPerRow
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1224
     value srcRow|
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1225
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1226
    mX := extent x.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1227
    mY := extent y.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1228
    ((mX < 0) or:[mY < 0]) ifTrue:[^ nil].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1229
    ((mX = 1) and:[mY = 1]) ifTrue:[^ self].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1230
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1231
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1232
    newWidth := (width * mX) truncated.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1233
    newHeight := (height * mY) truncated.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1234
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1235
    bitsPerPixel := self depth.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1236
    newBytesPerRow := ((newWidth * bitsPerPixel) + 7) // 8.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1237
    newBits := ByteArray uninitializedNew:(newBytesPerRow * newHeight).
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1238
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1239
    newImage := self species new.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1240
    newImage bits:newBits.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1241
    newImage width:newWidth.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1242
    newImage height:newHeight.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1243
    newImage photometric:photometric.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1244
    newImage samplesPerPixel:samplesPerPixel.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1245
    newImage bitsPerSample:bitsPerSample.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1246
    newImage colorMap:colorMap copy.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1247
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1248
    "walk over destination image fetching pixels from source image"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1249
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1250
    w := newWidth - 1.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1251
    h := newHeight - 1.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1252
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1253
    0 to:h do:[:row |
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1254
        srcRow := (row // mY).
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1255
        0 to:w do:[:col |
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1256
            value := self valueAtX:(col // mX) y:srcRow.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1257
            newImage atX:col y:row putValue:value.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1258
        ]
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1259
    ].
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1260
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1261
    ^ newImage
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1262
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1263
    "((Image fromFile:'bitmaps/claus.gif') magnifyBy:0.5@0.5)"
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1264
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
  1265
48194c26a46c Initial revision
claus
parents:
diff changeset
  1266
!Image methodsFor:'private'!
48194c26a46c Initial revision
claus
parents:
diff changeset
  1267
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1268
magnifyRowFrom:srcBytes offset:srcStart pixels:oldPixels 
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1269
          into:dstBytes offset:dstStart factor:mX
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1270
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1271
    "magnify a single pixel row - can only magnify by integer factors,
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1272
     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
  1273
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1274
    self subclassResponsibility
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1275
! !
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1276
2
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1277
!Image methodsFor: 'binary storage'!
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1278
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1279
readBinaryContentsFrom: stream manager: manager
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1280
    "tell the newly restored Image about restoration"
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1281
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1282
    super readBinaryContentsFrom: stream manager: manager.
b35336ab0de3 *** empty log message ***
claus
parents: 0
diff changeset
  1283
    self restored
0
48194c26a46c Initial revision
claus
parents:
diff changeset
  1284
! !