Depth8Image.st
author Claus Gittinger <cg@exept.de>
Sat, 11 Nov 1995 16:54:10 +0100
changeset 219 9ff0660f447f
parent 194 7ba58753a6b7
child 230 2e35533f0af2
permissions -rw-r--r--
uff - version methods changed to return stings
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5
claus
parents: 1
diff changeset
     1
"
claus
parents: 1
diff changeset
     2
 COPYRIGHT (c) 1993 by Claus Gittinger
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
     3
	      All Rights Reserved
5
claus
parents: 1
diff changeset
     4
claus
parents: 1
diff changeset
     5
 This software is furnished under a license and may be used
claus
parents: 1
diff changeset
     6
 only in accordance with the terms of that license and with the
claus
parents: 1
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
claus
parents: 1
diff changeset
     8
 be provided or otherwise made available to, or used by, any
claus
parents: 1
diff changeset
     9
 other person.  No title to or ownership of the software is
claus
parents: 1
diff changeset
    10
 hereby transferred.
claus
parents: 1
diff changeset
    11
"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    12
304f026e10cd Initial revision
claus
parents:
diff changeset
    13
Image subclass:#Depth8Image
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
    14
	 instanceVariableNames:''
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
    15
	 classVariableNames:''
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
    16
	 poolDictionaries:''
118
25e775072a89 *** empty log message ***
claus
parents: 112
diff changeset
    17
	 category:'Graphics-Images'
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    18
!
304f026e10cd Initial revision
claus
parents:
diff changeset
    19
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    20
!Depth8Image class methodsFor:'documentation'!
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    21
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    22
copyright
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    23
"
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    24
 COPYRIGHT (c) 1993 by Claus Gittinger
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
    25
	      All Rights Reserved
5
claus
parents: 1
diff changeset
    26
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    27
 This software is furnished under a license and may be used
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    28
 only in accordance with the terms of that license and with the
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    29
 inclusion of the above copyright notice.   This software may not
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    30
 be provided or otherwise made available to, or used by, any
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    31
 other person.  No title to or ownership of the software is
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    32
 hereby transferred.
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    33
"
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    34
!
5
claus
parents: 1
diff changeset
    35
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    36
version
219
9ff0660f447f uff - version methods changed to return stings
Claus Gittinger <cg@exept.de>
parents: 194
diff changeset
    37
    ^ '$Header: /cvs/stx/stx/libview/Depth8Image.st,v 1.30 1995-11-11 15:49:30 cg Exp $'
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    38
!
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    39
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    40
documentation
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    41
"
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    42
    this class represents 256-color (8 bit / pixel) images (palette, greyscale ...).
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    43
    It mainly consists of methods already implemented in Image,
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    44
    reimplemented here for more performance.
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    45
"
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    46
! !
5
claus
parents: 1
diff changeset
    47
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    48
!Depth8Image class methodsFor:'queries'!
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    49
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    50
imageDepth
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    51
    ^ 8
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    52
! !
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    53
194
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    54
!Depth8Image ignoredMethodsFor:'queries'!
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    55
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    56
bitsPerSample
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    57
    "return the number of bits per sample.
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    58
     The return value is an array of bits-per-plane."
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    59
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    60
    ^ #(8)
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    61
!
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    62
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    63
samplesPerPixel
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    64
    "return the number of samples per pixel in the image."
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    65
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    66
    ^ 1
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    67
! !
Claus Gittinger <cg@exept.de>
parents: 180
diff changeset
    68
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    69
!Depth8Image methodsFor:'queries'!
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    70
304f026e10cd Initial revision
claus
parents:
diff changeset
    71
bitsPerPixel
304f026e10cd Initial revision
claus
parents:
diff changeset
    72
    "return the number of bits per pixel"
304f026e10cd Initial revision
claus
parents:
diff changeset
    73
304f026e10cd Initial revision
claus
parents:
diff changeset
    74
    ^ 8
304f026e10cd Initial revision
claus
parents:
diff changeset
    75
!
304f026e10cd Initial revision
claus
parents:
diff changeset
    76
304f026e10cd Initial revision
claus
parents:
diff changeset
    77
bitsPerRow
304f026e10cd Initial revision
claus
parents:
diff changeset
    78
    "return the number of bits in one scanline of the image"
304f026e10cd Initial revision
claus
parents:
diff changeset
    79
304f026e10cd Initial revision
claus
parents:
diff changeset
    80
    ^  width * 8
304f026e10cd Initial revision
claus
parents:
diff changeset
    81
!
304f026e10cd Initial revision
claus
parents:
diff changeset
    82
304f026e10cd Initial revision
claus
parents:
diff changeset
    83
bytesPerRow
304f026e10cd Initial revision
claus
parents:
diff changeset
    84
    "return the number of bytes in one scanline of the image"
304f026e10cd Initial revision
claus
parents:
diff changeset
    85
304f026e10cd Initial revision
claus
parents:
diff changeset
    86
    ^ width
304f026e10cd Initial revision
claus
parents:
diff changeset
    87
!
304f026e10cd Initial revision
claus
parents:
diff changeset
    88
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    89
usedValues
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    90
    "return a collection of color values used in the receiver."
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    91
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    92
    ^ bytes usedValues
81
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
    93
! !
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
    94
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
    95
!Depth8Image methodsFor:'accessing'!
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    96
304f026e10cd Initial revision
claus
parents:
diff changeset
    97
atX:x y:y
304f026e10cd Initial revision
claus
parents:
diff changeset
    98
    "retrieve a pixel at x/y; return a color.
304f026e10cd Initial revision
claus
parents:
diff changeset
    99
     Pixels start at x=0 , y=0 for upper left pixel, end at
304f026e10cd Initial revision
claus
parents:
diff changeset
   100
     x = width-1, y=height-1 for lower right pixel"
304f026e10cd Initial revision
claus
parents:
diff changeset
   101
38
2652fc96e660 *** empty log message ***
claus
parents: 35
diff changeset
   102
    |value "{ Class: SmallInteger }"
2652fc96e660 *** empty log message ***
claus
parents: 35
diff changeset
   103
     index "{ Class: SmallInteger }"|
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   104
304f026e10cd Initial revision
claus
parents:
diff changeset
   105
    index := (width * y) + 1 + x.
304f026e10cd Initial revision
claus
parents:
diff changeset
   106
    value := bytes at:index.
304f026e10cd Initial revision
claus
parents:
diff changeset
   107
304f026e10cd Initial revision
claus
parents:
diff changeset
   108
    photometric == #whiteIs0 ifTrue:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   109
	^ Color grey:100 - (100 / 255 * value)
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   110
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
   111
    photometric == #blackIs0 ifTrue:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   112
	^ Color grey:(100 / 255 * value)
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   113
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
   114
    photometric ~~ #palette ifTrue:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   115
	self error:'format not supported'.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   116
	^ nil
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   117
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
   118
    index := value + 1.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   119
    ^ colorMap at:index
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   120
!
304f026e10cd Initial revision
claus
parents:
diff changeset
   121
304f026e10cd Initial revision
claus
parents:
diff changeset
   122
valueAtX:x y:y
304f026e10cd Initial revision
claus
parents:
diff changeset
   123
    "retrieve a pixel at x/y; return a pixelValue.
304f026e10cd Initial revision
claus
parents:
diff changeset
   124
     Pixels start at x=0 , y=0 for upper left pixel, end at
304f026e10cd Initial revision
claus
parents:
diff changeset
   125
     x = width-1, y=height-1 for lower right pixel"
304f026e10cd Initial revision
claus
parents:
diff changeset
   126
304f026e10cd Initial revision
claus
parents:
diff changeset
   127
    |index "{ Class: SmallInteger }"|
304f026e10cd Initial revision
claus
parents:
diff changeset
   128
304f026e10cd Initial revision
claus
parents:
diff changeset
   129
    index := (width * y) + 1 + x.
304f026e10cd Initial revision
claus
parents:
diff changeset
   130
    ^ bytes at:index.
304f026e10cd Initial revision
claus
parents:
diff changeset
   131
!
304f026e10cd Initial revision
claus
parents:
diff changeset
   132
304f026e10cd Initial revision
claus
parents:
diff changeset
   133
atX:x y:y putValue:aPixelValue
304f026e10cd Initial revision
claus
parents:
diff changeset
   134
    "set the pixel at x/y to aPixelValue.
304f026e10cd Initial revision
claus
parents:
diff changeset
   135
     Pixels start at x=0 , y=0 for upper left pixel, end at
304f026e10cd Initial revision
claus
parents:
diff changeset
   136
     x = width-1, y=height-1 for lower right pixel"
304f026e10cd Initial revision
claus
parents:
diff changeset
   137
304f026e10cd Initial revision
claus
parents:
diff changeset
   138
    |index "{ Class: SmallInteger }"|
304f026e10cd Initial revision
claus
parents:
diff changeset
   139
304f026e10cd Initial revision
claus
parents:
diff changeset
   140
    index := (width * y) + 1 + x.
304f026e10cd Initial revision
claus
parents:
diff changeset
   141
    bytes at:index put:aPixelValue.
81
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   142
! !
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   143
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   144
!Depth8Image methodsFor:'enumerating'!
81
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   145
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   146
valueAtY:y from:xLow to:xHigh do:aBlock
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   147
    "perform aBlock for each pixelValue from x1 to x2 in row y.
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   148
     The block is passed the pixelValue at each pixel.
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   149
     This method allows slighly faster processing of an
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   150
     image than using valueAtX:y:, since some processing can be
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   151
     avoided when going from pixel to pixel. However, for
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   152
     real image processing, specialized methods should be written."
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   153
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   154
    |srcIndex   "{ Class: SmallInteger }"
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   155
     pixelValue "{ Class: SmallInteger }"
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   156
     x1         "{ Class: SmallInteger }"
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   157
     x2         "{ Class: SmallInteger }"|
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   158
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   159
    x1 := xLow.
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   160
    x2 := xHigh.
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   161
    srcIndex := (width * y) + 1 + x1.
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   162
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   163
    x1 to:x2 do:[:x |
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   164
	pixelValue := bytes at:srcIndex.
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   165
	srcIndex := srcIndex + 1.
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   166
	aBlock value:x value:pixelValue 
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
   167
    ]
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   168
!
304f026e10cd Initial revision
claus
parents:
diff changeset
   169
304f026e10cd Initial revision
claus
parents:
diff changeset
   170
atY:y from:xLow to:xHigh do:aBlock
304f026e10cd Initial revision
claus
parents:
diff changeset
   171
    "perform aBlock for each pixel from x1 to x2 in row y.
304f026e10cd Initial revision
claus
parents:
diff changeset
   172
     The block is passed the color at each pixel.
304f026e10cd Initial revision
claus
parents:
diff changeset
   173
     This method allows slighly faster processing of an
304f026e10cd Initial revision
claus
parents:
diff changeset
   174
     image than using atX:y:, since some processing can be
304f026e10cd Initial revision
claus
parents:
diff changeset
   175
     avoided when going from pixel to pixel. However, for
304f026e10cd Initial revision
claus
parents:
diff changeset
   176
     real image processing, specialized methods should be written."
304f026e10cd Initial revision
claus
parents:
diff changeset
   177
304f026e10cd Initial revision
claus
parents:
diff changeset
   178
    |srcIndex "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   179
     index    "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   180
     value    "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   181
     x1       "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   182
     x2       "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   183
     color colors last|
304f026e10cd Initial revision
claus
parents:
diff changeset
   184
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   185
    photometric == #palette ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   186
	colors := colorMap.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   187
    ] ifFalse:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   188
	colors := Array new:256.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   189
    ].
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   190
304f026e10cd Initial revision
claus
parents:
diff changeset
   191
    x1 := xLow.
304f026e10cd Initial revision
claus
parents:
diff changeset
   192
    x2 := xHigh.
304f026e10cd Initial revision
claus
parents:
diff changeset
   193
    srcIndex := (width * y) + 1 + x1.
304f026e10cd Initial revision
claus
parents:
diff changeset
   194
304f026e10cd Initial revision
claus
parents:
diff changeset
   195
    x1 to:x2 do:[:x |
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   196
	value := bytes at:srcIndex.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   197
	srcIndex := srcIndex + 1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   198
	value ~~ last ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   199
	    last := value.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   200
	    index := value + 1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   201
	    color := colors at:index.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   202
	    color isNil ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   203
		photometric == #whiteIs0 ifTrue:[
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   204
		    color := (Color grey:100 - (100 * value / 255))
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   205
		] ifFalse:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   206
		    photometric == #blackIs0 ifTrue:[
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   207
			color := (Color grey:(100 * value / 255))
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   208
		    ] ifFalse:[
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   209
			photometric ~~ #palette ifTrue:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   210
			    self error:'format not supported'.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   211
			    ^ nil
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   212
			]
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   213
		    ]
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   214
		].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   215
		colors at:index put:color
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   216
	    ]
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   217
	].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   218
	aBlock value:x value:color
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   219
    ]
304f026e10cd Initial revision
claus
parents:
diff changeset
   220
! !
304f026e10cd Initial revision
claus
parents:
diff changeset
   221
304f026e10cd Initial revision
claus
parents:
diff changeset
   222
!Depth8Image methodsFor:'private'!
304f026e10cd Initial revision
claus
parents:
diff changeset
   223
304f026e10cd Initial revision
claus
parents:
diff changeset
   224
dither1PlaneUsingMap:map on:aDevice
304f026e10cd Initial revision
claus
parents:
diff changeset
   225
    "a helper for dithering palette and greyscale images"
304f026e10cd Initial revision
claus
parents:
diff changeset
   226
304f026e10cd Initial revision
claus
parents:
diff changeset
   227
    |f
304f026e10cd Initial revision
claus
parents:
diff changeset
   228
     patterns formBytes
304f026e10cd Initial revision
claus
parents:
diff changeset
   229
     pixel0bytes pixel1bytes
304f026e10cd Initial revision
claus
parents:
diff changeset
   230
     clr ditherPattern
304f026e10cd Initial revision
claus
parents:
diff changeset
   231
     nColors       "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   232
     w             "{Class: SmallInteger }"
107
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   233
     h             "{Class: SmallInteger }"|
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   234
304f026e10cd Initial revision
claus
parents:
diff changeset
   235
    nColors := map size.
304f026e10cd Initial revision
claus
parents:
diff changeset
   236
    w := width.
304f026e10cd Initial revision
claus
parents:
diff changeset
   237
    h := height.
304f026e10cd Initial revision
claus
parents:
diff changeset
   238
304f026e10cd Initial revision
claus
parents:
diff changeset
   239
    formBytes := ByteArray uninitializedNew:(w + 7 // 8) * h.
304f026e10cd Initial revision
claus
parents:
diff changeset
   240
    patterns := Array new:nColors.
304f026e10cd Initial revision
claus
parents:
diff changeset
   241
    pixel0bytes := ByteArray uninitializedNew:nColors.
304f026e10cd Initial revision
claus
parents:
diff changeset
   242
    pixel1bytes := ByteArray uninitializedNew:nColors.
304f026e10cd Initial revision
claus
parents:
diff changeset
   243
38
2652fc96e660 *** empty log message ***
claus
parents: 35
diff changeset
   244
    "
2652fc96e660 *** empty log message ***
claus
parents: 35
diff changeset
   245
     extract dither patterns and values to use for 1/0 bits
2652fc96e660 *** empty log message ***
claus
parents: 35
diff changeset
   246
     in those from the dithercolors
2652fc96e660 *** empty log message ***
claus
parents: 35
diff changeset
   247
    "
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   248
    1 to:nColors do:[:i |
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   249
	clr := (map at:i) on:aDevice.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   250
	ditherPattern := clr ditherForm.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   251
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   252
	ditherPattern isNil ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   253
	    patterns at:i put:#[2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   254
				2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   255
				2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   256
				2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   257
				2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   258
				2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   259
				2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   260
				2r11111111].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   261
	    pixel0bytes at:i put:clr colorId.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   262
	    pixel1bytes at:i put:clr colorId
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   263
	] ifFalse:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   264
	    patterns at:i put:(ditherPattern bits).
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   265
	    pixel0bytes at:i put:(ditherPattern colorMap at:1) colorId.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   266
	    pixel1bytes at:i put:(ditherPattern colorMap at:2) colorId.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   267
	].
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   268
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
   269
304f026e10cd Initial revision
claus
parents:
diff changeset
   270
%{
304f026e10cd Initial revision
claus
parents:
diff changeset
   271
    unsigned char *_srcP, *_dstP;
304f026e10cd Initial revision
claus
parents:
diff changeset
   272
    OBJ _patternBytes;
304f026e10cd Initial revision
claus
parents:
diff changeset
   273
    unsigned char _mask = 0x80;
304f026e10cd Initial revision
claus
parents:
diff changeset
   274
    unsigned char _outBits = 0;
304f026e10cd Initial revision
claus
parents:
diff changeset
   275
    unsigned char _last, _v, _patternBits, _p0, _p1;
304f026e10cd Initial revision
claus
parents:
diff changeset
   276
    int _h, _w;
304f026e10cd Initial revision
claus
parents:
diff changeset
   277
    int _patternOffset = 0;
304f026e10cd Initial revision
claus
parents:
diff changeset
   278
304f026e10cd Initial revision
claus
parents:
diff changeset
   279
    _srcP = _ByteArrayInstPtr(_INST(bytes))->ba_element;
304f026e10cd Initial revision
claus
parents:
diff changeset
   280
    _dstP = _ByteArrayInstPtr(formBytes)->ba_element;
304f026e10cd Initial revision
claus
parents:
diff changeset
   281
    for (_h = _intVal(h); _h; _h--) {
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   282
	_last = -1;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   283
	for (_w = _intVal(w); _w; _w--) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   284
	    _v = *_srcP++;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   285
	    if (_v != _last) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   286
		_patternBytes = _ArrayInstPtr(patterns)->a_element[_v];
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   287
		if (__isByteArray(_patternBytes)) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   288
		    _patternBits = _ByteArrayInstPtr(_patternBytes)->ba_element[_patternOffset];
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   289
		} else if (__isArray(_patternBytes)) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   290
		    _patternBits = _intVal(_ArrayInstPtr(_patternBytes)->a_element[_patternOffset]);
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   291
		}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   292
		_p0 = _ByteArrayInstPtr(pixel0bytes)->ba_element[_v];
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   293
		_p1 = _ByteArrayInstPtr(pixel1bytes)->ba_element[_v];
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   294
		_last = _v;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   295
	    }
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   296
	    _outBits <<= 1;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   297
	    if (_patternBits & _mask)
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   298
		_outBits |= _p1;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   299
	    else
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   300
		_outBits |= _p0;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   301
	    _mask >>= 1;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   302
	    if (_mask == 0) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   303
		_mask = 0x80;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   304
		*_dstP++ = _outBits;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   305
		_outBits = 0;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   306
	    }
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   307
	}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   308
	if (_mask != 0x80) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   309
	    while (_mask != 0) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   310
		_outBits <<= 1;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   311
		_mask >>= 1;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   312
	    }
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   313
	    *_dstP++ = _outBits;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   314
	    _mask = 0x80;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   315
	    _outBits = 0;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   316
	}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   317
	_patternOffset++;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   318
	if (_patternOffset == 8)
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   319
	    _patternOffset = 0;
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   320
    }
304f026e10cd Initial revision
claus
parents:
diff changeset
   321
%}
304f026e10cd Initial revision
claus
parents:
diff changeset
   322
.
304f026e10cd Initial revision
claus
parents:
diff changeset
   323
    f := Form width:w height:h fromArray:formBytes.
304f026e10cd Initial revision
claus
parents:
diff changeset
   324
    ^ f
304f026e10cd Initial revision
claus
parents:
diff changeset
   325
!
304f026e10cd Initial revision
claus
parents:
diff changeset
   326
304f026e10cd Initial revision
claus
parents:
diff changeset
   327
dither2PlaneUsingMap:map on:aDevice
304f026e10cd Initial revision
claus
parents:
diff changeset
   328
    "a helper for dithering palette and greyscale images"
304f026e10cd Initial revision
claus
parents:
diff changeset
   329
304f026e10cd Initial revision
claus
parents:
diff changeset
   330
    |f
304f026e10cd Initial revision
claus
parents:
diff changeset
   331
     patterns formBytes
304f026e10cd Initial revision
claus
parents:
diff changeset
   332
     pixel0bytes pixel1bytes
304f026e10cd Initial revision
claus
parents:
diff changeset
   333
     clr ditherPattern
304f026e10cd Initial revision
claus
parents:
diff changeset
   334
     nColors       "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   335
     w             "{Class: SmallInteger }"
107
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   336
     h             "{Class: SmallInteger }"|
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   337
304f026e10cd Initial revision
claus
parents:
diff changeset
   338
    nColors := map size.
304f026e10cd Initial revision
claus
parents:
diff changeset
   339
    w := width.
304f026e10cd Initial revision
claus
parents:
diff changeset
   340
    h := height.
304f026e10cd Initial revision
claus
parents:
diff changeset
   341
304f026e10cd Initial revision
claus
parents:
diff changeset
   342
    formBytes := ByteArray uninitializedNew:(w * 2 + 7 // 8) * h.
304f026e10cd Initial revision
claus
parents:
diff changeset
   343
    patterns := Array new:nColors.
304f026e10cd Initial revision
claus
parents:
diff changeset
   344
    pixel0bytes := ByteArray uninitializedNew:nColors.
304f026e10cd Initial revision
claus
parents:
diff changeset
   345
    pixel1bytes := ByteArray uninitializedNew:nColors.
304f026e10cd Initial revision
claus
parents:
diff changeset
   346
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   347
    "extract dither patterns and values to use for 1/0 bits
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   348
     in those from the dithercolors"
304f026e10cd Initial revision
claus
parents:
diff changeset
   349
304f026e10cd Initial revision
claus
parents:
diff changeset
   350
    1 to:nColors do:[:i |
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   351
	clr := (map at:i) on:aDevice.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   352
	ditherPattern := clr ditherForm.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   353
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   354
	ditherPattern isNil ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   355
	    patterns at:i put:#[2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   356
				2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   357
				2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   358
				2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   359
				2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   360
				2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   361
				2r11111111
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   362
				2r11111111].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   363
	    pixel0bytes at:i put:clr colorId.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   364
	    pixel1bytes at:i put:clr colorId
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   365
	] ifFalse:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   366
	    patterns at:i put:(ditherPattern bits).
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   367
	    pixel0bytes at:i put:(ditherPattern colorMap at:1) colorId.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   368
	    pixel1bytes at:i put:(ditherPattern colorMap at:2) colorId.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   369
	].
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   370
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
   371
304f026e10cd Initial revision
claus
parents:
diff changeset
   372
%{
304f026e10cd Initial revision
claus
parents:
diff changeset
   373
    unsigned char *_srcP, *_dstP;
304f026e10cd Initial revision
claus
parents:
diff changeset
   374
    OBJ _patternBytes;
304f026e10cd Initial revision
claus
parents:
diff changeset
   375
    unsigned char _mask = 0x80;
304f026e10cd Initial revision
claus
parents:
diff changeset
   376
    unsigned char _outBits = 0;
304f026e10cd Initial revision
claus
parents:
diff changeset
   377
    unsigned char _last, _v, _patternBits, _p0, _p1;
304f026e10cd Initial revision
claus
parents:
diff changeset
   378
    int _h, _w;
304f026e10cd Initial revision
claus
parents:
diff changeset
   379
    int _patternOffset = 0;
304f026e10cd Initial revision
claus
parents:
diff changeset
   380
    int _outCount;
304f026e10cd Initial revision
claus
parents:
diff changeset
   381
304f026e10cd Initial revision
claus
parents:
diff changeset
   382
    _srcP = _ByteArrayInstPtr(_INST(bytes))->ba_element;
304f026e10cd Initial revision
claus
parents:
diff changeset
   383
    _dstP = _ByteArrayInstPtr(formBytes)->ba_element;
304f026e10cd Initial revision
claus
parents:
diff changeset
   384
    for (_h = _intVal(h); _h; _h--) {
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   385
	_last = -1;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   386
	_outCount = 0;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   387
	for (_w = _intVal(w); _w; _w--) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   388
	    _v = *_srcP++;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   389
	    if (_v != _last) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   390
		_patternBytes = _ArrayInstPtr(patterns)->a_element[_v];
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   391
		if (__isByteArray(_patternBytes)) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   392
		    _patternBits = _ByteArrayInstPtr(_patternBytes)->ba_element[_patternOffset];
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   393
		} else if (__isArray(_patternBytes)) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   394
		    _patternBits = _intVal(_ArrayInstPtr(_patternBytes)->a_element[_patternOffset]);
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   395
		}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   396
		_p0 = _ByteArrayInstPtr(pixel0bytes)->ba_element[_v];
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   397
		_p1 = _ByteArrayInstPtr(pixel1bytes)->ba_element[_v];
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   398
		_last = _v;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   399
	    }
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   400
	    _outBits <<= 2;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   401
	    if (_patternBits & _mask)
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   402
		_outBits |= _p1;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   403
	    else
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   404
		_outBits |= _p0;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   405
	    _mask >>= 1;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   406
	    _outCount++;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   407
	    if (_outCount == 4) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   408
		*_dstP++ = _outBits;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   409
		_outCount = 0;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   410
		if (_mask == 0) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   411
		    _mask = 0x80;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   412
		}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   413
	    }
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   414
	}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   415
	if (_outCount) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   416
	    do {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   417
		_outBits <<= 2;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   418
	    } while (++_outCount != 4);
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   419
	    *_dstP++ = _outBits;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   420
	}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   421
	_mask = 0x80;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   422
	_outBits = 0;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   423
	_patternOffset++;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   424
	if (_patternOffset == 8)
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   425
	    _patternOffset = 0;
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   426
    }
304f026e10cd Initial revision
claus
parents:
diff changeset
   427
%}
304f026e10cd Initial revision
claus
parents:
diff changeset
   428
.
304f026e10cd Initial revision
claus
parents:
diff changeset
   429
    f := Form width:w height:h depth:2.
304f026e10cd Initial revision
claus
parents:
diff changeset
   430
    f initGC.
304f026e10cd Initial revision
claus
parents:
diff changeset
   431
    f device drawBits:formBytes depth:2 width:w height:h x:0 y:0
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   432
		 into:f id x:0 y:0 width:w height:h with:f gcId.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   433
    ^ f
304f026e10cd Initial revision
claus
parents:
diff changeset
   434
! !
304f026e10cd Initial revision
claus
parents:
diff changeset
   435
304f026e10cd Initial revision
claus
parents:
diff changeset
   436
!Depth8Image methodsFor:'converting palette images'!
304f026e10cd Initial revision
claus
parents:
diff changeset
   437
304f026e10cd Initial revision
claus
parents:
diff changeset
   438
paletteImageAsMonoFormOn:aDevice
304f026e10cd Initial revision
claus
parents:
diff changeset
   439
    "return a 1-bit monoForm from the palette picture -
304f026e10cd Initial revision
claus
parents:
diff changeset
   440
     the result is a thresholded form, with white for
304f026e10cd Initial revision
claus
parents:
diff changeset
   441
     brightness values above 50%, black below"
304f026e10cd Initial revision
claus
parents:
diff changeset
   442
304f026e10cd Initial revision
claus
parents:
diff changeset
   443
    |monoBits f
107
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   444
     map
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   445
     failed
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   446
     w        "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   447
     h        "{ Class: SmallInteger }"
107
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   448
"/     v        "{ Class: SmallInteger }"
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   449
"/     bitCount "{ Class: SmallInteger }"
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   450
"/     bits     "{ Class: SmallInteger }"
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   451
"/     srcIndex "{ Class: SmallInteger }"
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   452
"/     dstIndex "{ Class: SmallInteger }"
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   453
     mapSize  "{ Class: SmallInteger }"|
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   454
304f026e10cd Initial revision
claus
parents:
diff changeset
   455
    w := width.
304f026e10cd Initial revision
claus
parents:
diff changeset
   456
    h := height.
304f026e10cd Initial revision
claus
parents:
diff changeset
   457
    monoBits := ByteArray uninitializedNew:(((w + 7) // 8) * h).
304f026e10cd Initial revision
claus
parents:
diff changeset
   458
304f026e10cd Initial revision
claus
parents:
diff changeset
   459
    map := ByteArray uninitializedNew:256.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   460
    mapSize := colorMap size.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   461
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   462
    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   463
     map entries: 0 for dark entries, 1 for bright entries
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   464
    "
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   465
    1 to:mapSize do:[:i |
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   466
	map at:i put:(colorMap at:i) brightness rounded
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   467
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
   468
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   469
    failed := true.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   470
%{
304f026e10cd Initial revision
claus
parents:
diff changeset
   471
    register unsigned char *srcPtr, *dstPtr, *mapPtr;
86
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   472
    register __v, __bits, __bitCount;
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   473
    register j;
304f026e10cd Initial revision
claus
parents:
diff changeset
   474
    register i;
304f026e10cd Initial revision
claus
parents:
diff changeset
   475
    extern OBJ ByteArray;
304f026e10cd Initial revision
claus
parents:
diff changeset
   476
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   477
    if (__isByteArray(_INST(bytes))
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   478
     && __isByteArray(map)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   479
     && __isByteArray(monoBits)) {
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   480
	failed = false;
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   481
	srcPtr = _ByteArrayInstPtr(_INST(bytes))->ba_element;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   482
	dstPtr = _ByteArrayInstPtr(monoBits)->ba_element;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   483
	mapPtr = _ByteArrayInstPtr(map)->ba_element;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   484
	for (i=_intVal(h); i>0; i--) {
86
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   485
	    __bitCount = 0;
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   486
	    __bits = 0;
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   487
	    for (j=_intVal(w); j>0; j--) {
86
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   488
		__v = mapPtr[*srcPtr++];
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   489
		__bits = (__bits<<1) | __v; 
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   490
		__bitCount++;
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   491
		if (__bitCount == 8) {
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   492
		    *dstPtr++ = __bits;
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   493
		    __bits = 0;
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   494
		    __bitCount = 0;
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   495
		}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   496
	    }
86
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   497
	    if (__bitCount != 0) {
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   498
		*dstPtr++ = __bits;
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   499
	    }
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   500
	}
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   501
    }
304f026e10cd Initial revision
claus
parents:
diff changeset
   502
%}
304f026e10cd Initial revision
claus
parents:
diff changeset
   503
.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   504
    failed ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   505
"/
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   506
"/ the above code is equivalent to:
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   507
"/
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   508
"/        srcIndex := 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   509
"/        dstIndex := 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   510
"/        1 to:h do:[:row |
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   511
"/
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   512
"/            bitCount := 0.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   513
"/            bits := 0.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   514
"/            1 to:w do:[:col |
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   515
"/                v := bytes at:srcIndex.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   516
"/                srcIndex := srcIndex + 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   517
"/                v := map at:(v + 1).
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   518
"/                bits := (bits bitShift:1) bitOr:v.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   519
"/                bitCount := bitCount + 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   520
"/                (bitCount == 8) ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   521
"/                    monoBits at:dstIndex put:bits.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   522
"/                    dstIndex := dstIndex + 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   523
"/                    bits := 0.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   524
"/                    bitCount := 0
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   525
"/                ]
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   526
"/            ].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   527
"/            (bitCount ~~ 0) ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   528
"/                monoBits at:dstIndex put:bits.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   529
"/                dstIndex := dstIndex + 1
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   530
"/            ]
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   531
"/        ]
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   532
"/
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   533
"/ we dont need the fall-back code; so trigger an error
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   534
	self primitiveFailed.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   535
	^ nil
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   536
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
   537
304f026e10cd Initial revision
claus
parents:
diff changeset
   538
    f := Form width:w height:h depth:1 on:aDevice.
304f026e10cd Initial revision
claus
parents:
diff changeset
   539
    f isNil ifTrue:[^ nil].
304f026e10cd Initial revision
claus
parents:
diff changeset
   540
    f initGC.
38
2652fc96e660 *** empty log message ***
claus
parents: 35
diff changeset
   541
"/    (aDevice blackpixel == 0) ifFalse:[
2652fc96e660 *** empty log message ***
claus
parents: 35
diff changeset
   542
"/        "have to invert bits"
2652fc96e660 *** empty log message ***
claus
parents: 35
diff changeset
   543
"/        f function:#copyInverted
2652fc96e660 *** empty log message ***
claus
parents: 35
diff changeset
   544
"/    ].
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   545
    aDevice drawBits:monoBits depth:1 width:w height:h
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   546
		   x:0 y:0
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   547
		into:(f id) x:0 y:0 width:w height:h with:(f gcId).
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   548
    ^ f
304f026e10cd Initial revision
claus
parents:
diff changeset
   549
!
304f026e10cd Initial revision
claus
parents:
diff changeset
   550
304f026e10cd Initial revision
claus
parents:
diff changeset
   551
paletteImageAs2PlaneFormOn:aDevice
304f026e10cd Initial revision
claus
parents:
diff changeset
   552
    "return a 2-bit greyForm from the palette picture -
304f026e10cd Initial revision
claus
parents:
diff changeset
   553
     the result is a thresholded form, with white/lightGrey/darkGrey
304f026e10cd Initial revision
claus
parents:
diff changeset
   554
     and black for brightness values 100..75, 75..50, 50..25 and 25..0 %"
304f026e10cd Initial revision
claus
parents:
diff changeset
   555
304f026e10cd Initial revision
claus
parents:
diff changeset
   556
    |twoPlaneBits f
107
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   557
     map failed
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   558
     w        "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   559
     h        "{ Class: SmallInteger }"
107
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   560
"/     v        "{ Class: SmallInteger }"
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   561
"/     bitCount "{ Class: SmallInteger }"
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   562
"/     bits     "{ Class: SmallInteger }"
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   563
"/     srcIndex "{ Class: SmallInteger }"
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   564
"/     dstIndex "{ Class: SmallInteger }"
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
   565
     mapSize  "{ Class: SmallInteger }" |
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   566
304f026e10cd Initial revision
claus
parents:
diff changeset
   567
    w := width.
304f026e10cd Initial revision
claus
parents:
diff changeset
   568
    h := height.
304f026e10cd Initial revision
claus
parents:
diff changeset
   569
    twoPlaneBits := ByteArray uninitializedNew:(((w * 2 + 7) // 8) * h).
304f026e10cd Initial revision
claus
parents:
diff changeset
   570
304f026e10cd Initial revision
claus
parents:
diff changeset
   571
    map := ByteArray uninitializedNew:256.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   572
    mapSize := colorMap size.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   573
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   574
    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   575
     map entries: 0 .. 3 give brightness in 4 thresholded steps
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   576
    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   577
    1 to:mapSize do:[:i |
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   578
	map at:i put:(colorMap at:i) brightness * 3 rounded
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   579
    ].
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   580
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   581
    failed := true.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   582
%{
304f026e10cd Initial revision
claus
parents:
diff changeset
   583
    register unsigned char *srcPtr, *dstPtr, *mapPtr;
86
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   584
    register __v, __bits, __bitCount;
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   585
    register j;
304f026e10cd Initial revision
claus
parents:
diff changeset
   586
    register i;
304f026e10cd Initial revision
claus
parents:
diff changeset
   587
    extern OBJ ByteArray;
304f026e10cd Initial revision
claus
parents:
diff changeset
   588
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   589
    if ((__isByteArray(_INST(bytes)))
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   590
     && (__isByteArray(map))
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   591
     && (__isByteArray(twoPlaneBits))) {
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   592
	failed = false;
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   593
	srcPtr = _ByteArrayInstPtr(_INST(bytes))->ba_element;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   594
	dstPtr = _ByteArrayInstPtr(twoPlaneBits)->ba_element;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   595
	mapPtr = _ByteArrayInstPtr(map)->ba_element;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   596
	for (i=_intVal(h); i>0; i--) {
86
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   597
	    __bitCount = 0;
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   598
	    __bits = 0;
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   599
	    for (j=_intVal(w); j>0; j--) {
86
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   600
		__v = mapPtr[*srcPtr++];
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   601
		__bits = (__bits<<2) | __v; 
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   602
		__bitCount++;
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   603
		if (__bitCount == 4) {
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   604
		    *dstPtr++ = __bits;
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   605
		    __bits = 0;
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   606
		    __bitCount = 0;
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   607
		}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   608
	    }
86
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   609
	    if (__bitCount != 0) {
032006651226 *** empty log message ***
claus
parents: 81
diff changeset
   610
		*dstPtr++ = __bits;
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   611
	    }
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   612
	}
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   613
    }
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   614
%}.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   615
    failed ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   616
"/
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   617
"/ the above code is equivalent to:
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   618
"/
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   619
"/        srcIndex := 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   620
"/        dstIndex := 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   621
"/        1 to:h do:[:row |
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   622
"/            bitCount := 0.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   623
"/            bits := 0.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   624
"/            1 to:w do:[:col |
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   625
"/                v := bytes at:srcIndex.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   626
"/                srcIndex := srcIndex + 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   627
"/                v := map at:(v + 1).
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   628
"/                bits := (bits bitShift:2) bitOr:v.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   629
"/                bitCount := bitCount + 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   630
"/                (bitCount == 4) ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   631
"/                    twoPlaneBits at:dstIndex put:bits.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   632
"/                    dstIndex := dstIndex + 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   633
"/                    bits := 0.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   634
"/                    bitCount := 0
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   635
"/                ]
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   636
"/            ].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   637
"/            (bitCount ~~ 0) ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   638
"/                twoPlaneBits at:dstIndex put:bits.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   639
"/                dstIndex := dstIndex + 1
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   640
"/            ]
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   641
"/        ]
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   642
"/
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   643
	self primitiveFailed.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   644
	^ nil
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   645
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
   646
304f026e10cd Initial revision
claus
parents:
diff changeset
   647
    f := Form width:w height:h depth:2 on:aDevice.
304f026e10cd Initial revision
claus
parents:
diff changeset
   648
    f isNil ifTrue:[^ nil].
304f026e10cd Initial revision
claus
parents:
diff changeset
   649
    f initGC.
304f026e10cd Initial revision
claus
parents:
diff changeset
   650
    (aDevice blackpixel == 0) ifFalse:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   651
	"have to invert bits"
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   652
	f function:#copyInverted
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   653
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
   654
    aDevice drawBits:twoPlaneBits depth:2 width:w height:h
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   655
		   x:0 y:0
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
   656
		into:(f id) x:0 y:0 width:w height:h with:(f gcId).
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   657
    ^ f
304f026e10cd Initial revision
claus
parents:
diff changeset
   658
!
304f026e10cd Initial revision
claus
parents:
diff changeset
   659
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   660
paletteImageAsDitheredPseudoFormOn:aDevice
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   661
    "return a dithered pseudoForm from the palette picture. Depend
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   662
     on dither colors being preallocated (see Color>>getColors*)"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   663
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   664
    ^ self paletteImageAsDitheredPseudoFormOn:aDevice 
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   665
	   colors:Color fixColors 
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   666
	   nRed:Color numFixRed
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   667
	   nGreen:Color numFixGreen
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   668
	   nBlue:Color numFixBlue
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   669
!
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   670
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   671
paletteImageAsDitheredPseudoFormOn:aDevice colors:fixColors nRed:nRed nGreen:nGreen nBlue:nBlue 
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   672
    "return a dithered pseudoForm from the palette picture. 
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   673
     Use the colors in the fixColors array, which must be fixR x fixG x fixB
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   674
     colors assigned to aDevice, such as the preallocated colors of the
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   675
     Color class. 
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   676
     By passing the ditherColors as extra array, this method can
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   677
     also be used to dither an 8bit image into a smaller number of colors,
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   678
     for example to create Depth4Images."
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   679
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   680
    "the code below is a q&d hack - it needs a rewrite to use a
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   681
     floyd-steinberg dither (currently, the error is only forwarded
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   682
     to the next pixel on the right, which seems ok for photograph-like
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   683
     images, but leads to more artifacts with equal colored areas).
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   684
    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   685
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   686
    |pseudoBits f has8BitImage deviceDepth
156
claus
parents: 155
diff changeset
   687
     rgbBytes
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   688
     w     "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   689
     h     "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   690
     index "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   691
     fixR  "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   692
     fixG  "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   693
     fixB  "{Class: SmallInteger }"
156
claus
parents: 155
diff changeset
   694
     fixIds failed map colorMapSize
claus
parents: 155
diff changeset
   695
     error|
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   696
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   697
    aDevice ~~ Display ifTrue:[^ nil].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   698
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   699
    fixR := nRed.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   700
    fixR == 0 ifTrue:[ ^ nil].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   701
    fixG := nGreen.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   702
    fixG == 0 ifTrue:[ ^ nil].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   703
    fixB := nBlue.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   704
    fixB == 0 ifTrue:[ ^ nil].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   705
    "/ simple check
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   706
    (fixR * fixG * fixB) ~~ fixColors size ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   707
	self error:'invalid color array passed'.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   708
	^ nil
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   709
    ].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   710
    fixIds := (fixColors asArray collect:[:clr | clr colorId]) asByteArray.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   711
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   712
    deviceDepth := aDevice depth.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   713
    deviceDepth == 8 ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   714
	has8BitImage := true.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   715
    ] ifFalse:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   716
	has8BitImage := false.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   717
	aDevice supportedImageFormats do:[:fmt |
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   718
	    (fmt at:2) == 8 ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   719
		has8BitImage := true.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   720
	    ]
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   721
	]
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   722
    ].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   723
    has8BitImage ifFalse:[^ nil].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   724
151
claus
parents: 134
diff changeset
   725
    'D8IMAGE: dithering ...' infoPrintNL.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   726
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   727
    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   728
     collect color components as integer values
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   729
     (code below uses components percent * 2.55 asInteger everywhere, to avoid
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   730
      float arithmetic, rounding etc. Thus, the range is 0..255 here)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   731
    "
156
claus
parents: 155
diff changeset
   732
    colorMapSize := colorMap size.
claus
parents: 155
diff changeset
   733
    rgbBytes := ByteArray uninitializedNew:colorMapSize * 3.
claus
parents: 155
diff changeset
   734
claus
parents: 155
diff changeset
   735
    index := 1.
claus
parents: 155
diff changeset
   736
    1 to:colorMapSize do:[:i |
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   737
	|clr|
156
claus
parents: 155
diff changeset
   738
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   739
	clr := colorMap at:i.
156
claus
parents: 155
diff changeset
   740
	rgbBytes at:index put:(clr red * 2.55) asInteger.
claus
parents: 155
diff changeset
   741
	rgbBytes at:index+1 put:(clr green * 2.55) asInteger.
claus
parents: 155
diff changeset
   742
	rgbBytes at:index+2 put:(clr blue * 2.55) asInteger.
claus
parents: 155
diff changeset
   743
	index := index + 3.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   744
    ].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   745
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   746
    pseudoBits := ByteArray uninitializedNew:(width * height).
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   747
156
claus
parents: 155
diff changeset
   748
    w := width + 2.
claus
parents: 155
diff changeset
   749
    error := ByteArray new:w*(3*2).
claus
parents: 155
diff changeset
   750
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   751
    w := width.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   752
    h := height.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   753
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   754
    failed := true.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   755
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   756
%{
156
claus
parents: 155
diff changeset
   757
/*
claus
parents: 155
diff changeset
   758
 * #   define FLOYD_STEINBERG
claus
parents: 155
diff changeset
   759
 */
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   760
    int __x, __y;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   761
    int __eR, __eG, __eB;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   762
    unsigned char *srcP, *dstP;
156
claus
parents: 155
diff changeset
   763
    unsigned char *rgbP;
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   764
    unsigned char *idP;
156
claus
parents: 155
diff changeset
   765
    short *errP, *eP;
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   766
    int __fR, __fG, __fB;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   767
    int iR, iG, iB;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   768
    int idx;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   769
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   770
    if (__isByteArray(_INST(bytes))
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   771
     && __isByteArray(pseudoBits)
156
claus
parents: 155
diff changeset
   772
     && __isByteArray(rgbBytes)
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   773
     && __isByteArray(fixIds)
156
claus
parents: 155
diff changeset
   774
     && __isByteArray(error)
97
dd6116883ac0 *** empty log message ***
claus
parents: 89
diff changeset
   775
     && __bothSmallInteger(fixR, fixG)
dd6116883ac0 *** empty log message ***
claus
parents: 89
diff changeset
   776
     && __isSmallInteger(fixB)) {
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   777
	failed = false;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   778
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   779
	srcP = _ByteArrayInstPtr(_INST(bytes))->ba_element;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   780
	dstP = _ByteArrayInstPtr(pseudoBits)->ba_element;
156
claus
parents: 155
diff changeset
   781
	rgbP = _ByteArrayInstPtr(rgbBytes)->ba_element;
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   782
	idP = _ByteArrayInstPtr(fixIds)->ba_element;
156
claus
parents: 155
diff changeset
   783
	errP = (short *) _ByteArrayInstPtr(error)->ba_element;
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   784
	__fR = _intVal(fixR)-1;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   785
	__fG = _intVal(fixG)-1;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   786
	__fB = _intVal(fixB)-1;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   787
156
claus
parents: 155
diff changeset
   788
#ifdef FLOYD_STEINBERG
claus
parents: 155
diff changeset
   789
	/*
claus
parents: 155
diff changeset
   790
	 * clear error accumulator
claus
parents: 155
diff changeset
   791
	 */
claus
parents: 155
diff changeset
   792
	eP = errP;
claus
parents: 155
diff changeset
   793
	for (__x=_intVal(w)+1; __x>=0; __x--) {
claus
parents: 155
diff changeset
   794
	    eP[0] = 0; eP[1] = 0; eP[2] = 0;
claus
parents: 155
diff changeset
   795
	    eP += 3;
claus
parents: 155
diff changeset
   796
	}
claus
parents: 155
diff changeset
   797
#endif
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   798
	for (__y=_intVal(h); __y>0; __y--) {
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   799
	    __eR = __eG = __eB = 0;
156
claus
parents: 155
diff changeset
   800
#ifdef FLOYD_STEINBERG
claus
parents: 155
diff changeset
   801
	    eP = &(errP[3]);
claus
parents: 155
diff changeset
   802
	    __eR += eP[0];
claus
parents: 155
diff changeset
   803
	    __eG += eP[1];
claus
parents: 155
diff changeset
   804
	    __eB += eP[2];
claus
parents: 155
diff changeset
   805
#endif
claus
parents: 155
diff changeset
   806
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   807
	    for (__x=_intVal(w); __x>0; __x--) {
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   808
		int __want;
155
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   809
		int pix;
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   810
		int __wantR, __wantG, __wantB;
156
claus
parents: 155
diff changeset
   811
		int idx;
claus
parents: 155
diff changeset
   812
		int tR, tG, tB;
claus
parents: 155
diff changeset
   813
		int nR, nG, nB;
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   814
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   815
		pix = *srcP++;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   816
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   817
		/*
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   818
		 * wR, wG and wB is the wanted r/g/b value;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   819
		 * compute the index into the dId table ..
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   820
		 * values: 0..255; scale to 0..fR-1, 0..fG-1, 0..fB-1
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   821
		 *
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   822
		 * bad kludge: knows how to index into FixColor table
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   823
		 */
156
claus
parents: 155
diff changeset
   824
		idx = pix+pix+pix;  /* pix * 3 */
claus
parents: 155
diff changeset
   825
claus
parents: 155
diff changeset
   826
		__wantR = rgbP[idx]   + __eR;
claus
parents: 155
diff changeset
   827
		__wantG = rgbP[idx+1] + __eG;
claus
parents: 155
diff changeset
   828
		__wantB = rgbP[idx+2] + __eB;
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   829
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   830
		if (__wantR > 255) __want = 255;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   831
		else if (__wantR < 0) __want = 0;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   832
		else __want = __wantR;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   833
155
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   834
		iR = (__want * __fR + 128) / 255; /* red index rounded */
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   835
		idx = iR * (__fG+1);
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   836
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   837
		if (__wantG > 255) __want = 255;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   838
		else if (__wantG < 0) __want = 0;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   839
		else __want = __wantG;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   840
155
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   841
		iG = (__want * __fG + 128) / 255; /* green index rounded */
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   842
		idx = (idx + iG) * (__fB+1);
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   843
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   844
		if (__wantB > 255) __want = 255;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   845
		else if (__wantB < 0) __want = 0;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   846
		else __want = __wantB;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   847
155
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   848
		iB = (__want * __fB + 128) / 255; /* blue index rounded */
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   849
		idx = idx + iB;
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   850
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   851
		/*
155
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   852
		 * store the corresponding dither colors colorId
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   853
		 */
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   854
		*dstP++ = idP[idx];
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   855
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   856
		/*
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   857
		 * the new error:
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   858
		 */
156
claus
parents: 155
diff changeset
   859
		__eR = __wantR - (iR * 255 / __fR); 
claus
parents: 155
diff changeset
   860
		__eG = __wantG - (iG * 255 / __fG); 
claus
parents: 155
diff changeset
   861
		__eB = __wantB - (iB * 255 / __fB); 
claus
parents: 155
diff changeset
   862
#ifdef FLOYD_STEINBERG
claus
parents: 155
diff changeset
   863
		/*
claus
parents: 155
diff changeset
   864
		 * distribute the error
claus
parents: 155
diff changeset
   865
		 */
claus
parents: 155
diff changeset
   866
		tR = __eR >> 4;  /* 16th of error */
claus
parents: 155
diff changeset
   867
		tG = __eG >> 4;
claus
parents: 155
diff changeset
   868
		tB = __eB >> 4;
claus
parents: 155
diff changeset
   869
claus
parents: 155
diff changeset
   870
		nR = eP[3] + (tR * 7);/* from accu: error for (x+1 / y) */
claus
parents: 155
diff changeset
   871
		nG = eP[4] + (tG * 7);/* plus 7/16'th of this error */
claus
parents: 155
diff changeset
   872
		nB = eP[5] + (tB * 7);
claus
parents: 155
diff changeset
   873
claus
parents: 155
diff changeset
   874
		eP[0] = tR*5;         /* 5/16th for (x / y+1) */
claus
parents: 155
diff changeset
   875
		eP[1] = tG*5;
claus
parents: 155
diff changeset
   876
		eP[2] = tB*5;
claus
parents: 155
diff changeset
   877
claus
parents: 155
diff changeset
   878
		eP[-3] = tR*3;        /* 3/16th for (x-1 / y+1) */
claus
parents: 155
diff changeset
   879
		eP[-2] = tG*3;
claus
parents: 155
diff changeset
   880
		eP[-1] = tB*3;
claus
parents: 155
diff changeset
   881
claus
parents: 155
diff changeset
   882
		eP[3] = __eR - (tR*15);  /* 1/16th for (x+1 / y+1) */
claus
parents: 155
diff changeset
   883
		eP[4] = __eG - (tG*15);
claus
parents: 155
diff changeset
   884
		eP[5] = __eB - (tB*15);
claus
parents: 155
diff changeset
   885
claus
parents: 155
diff changeset
   886
		__eR = nR;
claus
parents: 155
diff changeset
   887
		__eG = nG;
claus
parents: 155
diff changeset
   888
		__eB = nB;
claus
parents: 155
diff changeset
   889
claus
parents: 155
diff changeset
   890
		eP += 3;
claus
parents: 155
diff changeset
   891
#endif
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   892
	    }
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   893
	}
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   894
    }
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   895
%}.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   896
    failed ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   897
	self primitiveFailed.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   898
	^ nil
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   899
    ].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   900
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   901
    f := Form width:width height:height depth:deviceDepth on:aDevice.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   902
    f isNil ifTrue:[^ nil].
155
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   903
    "/
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   904
    "/ have to create a funny colorMap, where
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   905
    "/ color at:index == color colorId:index
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   906
    "/
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   907
    map := Array new:256.
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   908
    fixColors do:[:clr |
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   909
	map at:clr colorId + 1 put:clr
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   910
    ].
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   911
    f colorMap:map. 
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   912
    f initGC.
155
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   913
    f bits:pseudoBits.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   914
    aDevice drawBits:pseudoBits bitsPerPixel:8 depth:deviceDepth  
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   915
	       width:width height:height
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   916
		   x:0 y:0
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   917
		into:(f id) x:0 y:0 
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   918
	       width:width height:height with:(f gcId).
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   919
    ^ f
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   920
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   921
    "
155
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   922
     example: 
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   923
	color reduction from Depth8 to Depth4 (dithering) can be done by:
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   924
155
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   925
     |img8 reducedImg8 img4 map form|
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   926
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   927
     map := #( 
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   928
		  (0     0   0)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   929
		  (0     0 100)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   930
		  (0    50   0)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   931
		  (0    50 100)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   932
		  (0   100   0)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   933
		  (0   100 100)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   934
		  (100   0   0)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   935
		  (100   0 100)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   936
		  (100  50   0)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   937
		  (100  50 100)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   938
		  (100 100   0)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   939
		  (100 100 100)) collect:[:rgb | (Color red:(rgb at:1)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   940
						      green:(rgb at:2)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   941
						       blue:(rgb at:3)) on:Display].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   942
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   943
     img8 := Image fromFile:'bitmaps/bf.im8'.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   944
     form := img8 paletteImageAsDitheredPseudoFormOn:Display 
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   945
		      colors:map 
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   946
			nRed:2
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   947
		      nGreen:3
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   948
		       nBlue:2.
155
9fdfa550dba1 *** empty log message ***
claus
parents: 154
diff changeset
   949
     img8 := Depth8Image fromForm:form.    'dithered version of original image'.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   950
     img4 := Depth4Image fromImage:img8.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   951
    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   952
!
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   953
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   954
paletteImageAsPseudoFormOn:aDevice
304f026e10cd Initial revision
claus
parents:
diff changeset
   955
    "return a pseudoForm from the palette picture. The main work is
304f026e10cd Initial revision
claus
parents:
diff changeset
   956
     in color reduction, when not all colors can be aquired."
304f026e10cd Initial revision
claus
parents:
diff changeset
   957
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
   958
    |pseudoBits f gcRound has8BitImage deviceDepth
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
   959
     imgMap newImage pxl
154
claus
parents: 151
diff changeset
   960
     usedColors usageCounts maxIndex map
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   961
     fit scale lastOK error 
154
claus
parents: 151
diff changeset
   962
     div 
claus
parents: 151
diff changeset
   963
     bitsPerRGB "{Class: SmallInteger }"
claus
parents: 151
diff changeset
   964
     shift      "{Class: SmallInteger }"
claus
parents: 151
diff changeset
   965
     m          "{Class: SmallInteger }" |
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   966
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   967
    Color fixColors notNil ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   968
	f := self paletteImageAsDitheredPseudoFormOn:aDevice.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   969
	f notNil ifTrue:[^ f].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   970
    ].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   971
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   972
    "find used colors"
304f026e10cd Initial revision
claus
parents:
diff changeset
   973
154
claus
parents: 151
diff changeset
   974
    usedColors := bytes usedValues.    "gets us an array filled with used values"
claus
parents: 151
diff changeset
   975
				       "(could use bytes asBag)"
claus
parents: 151
diff changeset
   976
    maxIndex := usedColors max + 1.
claus
parents: 151
diff changeset
   977
180
claus
parents: 158
diff changeset
   978
    usedColors size > 20 ifTrue:[
claus
parents: 158
diff changeset
   979
	('D8IMAGE: allocating ' , usedColors size printString , ' colors ...') infoPrintNL.
claus
parents: 158
diff changeset
   980
    ].
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   981
304f026e10cd Initial revision
claus
parents:
diff changeset
   982
    "sort by usage"
304f026e10cd Initial revision
claus
parents:
diff changeset
   983
    usageCounts := bytes usageCounts.
304f026e10cd Initial revision
claus
parents:
diff changeset
   984
    usageCounts := usedColors asArray collect:[:clr | usageCounts at:(clr + 1)].
304f026e10cd Initial revision
claus
parents:
diff changeset
   985
    usageCounts sort:[:a :b | a > b] with:usedColors.
304f026e10cd Initial revision
claus
parents:
diff changeset
   986
304f026e10cd Initial revision
claus
parents:
diff changeset
   987
    "allocate the colors (in order of usage count)"
304f026e10cd Initial revision
claus
parents:
diff changeset
   988
154
claus
parents: 151
diff changeset
   989
    imgMap := Array new:maxIndex.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   990
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   991
    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   992
     first, try to get the exact colors ...
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
   993
    "
154
claus
parents: 151
diff changeset
   994
    bitsPerRGB := aDevice bitsPerRGB.
claus
parents: 151
diff changeset
   995
    shift := (8 - bitsPerRGB) negated.
claus
parents: 151
diff changeset
   996
    m := (1 bitShift:bitsPerRGB) - 1.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   997
    div := m asFloat.
304f026e10cd Initial revision
claus
parents:
diff changeset
   998
304f026e10cd Initial revision
claus
parents:
diff changeset
   999
    fit := true.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1000
    scale := 100.0 / div.       "to scale 0..255 into 0.0 .. 100.0"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1001
    lastOK := 0.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1002
    gcRound := 0.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1003
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1004
    usedColors do:[:aColorIndex |
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1005
	|devColor color
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1006
	 r        "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1007
	 g        "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1008
	 b        "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1009
	 mapIndex "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1010
	 rMask    "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1011
	 gMask    "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1012
	 bMask    "{Class: SmallInteger }"|
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1013
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1014
	fit ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1015
	    gMask := bMask := rMask := m.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1016
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1017
	    mapIndex := aColorIndex + 1.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1018
	    color := colorMap at:mapIndex.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1019
	    color colorId notNil ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1020
		"wow - an immediate hit"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1021
		devColor := color
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1022
	    ] ifFalse:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1023
		devColor := color exactOn:aDevice.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1024
		devColor isNil ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1025
		    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1026
		     could not allocate color - on the first round, do a GC to flush 
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1027
		     unused colors - this may help if some colors where locked by 
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1028
		     already free images.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1029
		    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1030
		    gcRound == 0 ifTrue:[
112
88383d87f382 *** empty log message ***
claus
parents: 107
diff changeset
  1031
			ObjectMemory scavenge; finalize.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1032
			devColor := color exactOn:aDevice.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1033
			gcRound := 1
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1034
		    ].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1035
		    devColor isNil ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1036
			gcRound == 1 ifTrue:[
158
claus
parents: 157
diff changeset
  1037
			    CollectGarbageWhenRunningOutOfColors ifTrue:[
claus
parents: 157
diff changeset
  1038
				'D8IMAGE: force GC for possible color reclamation.' infoPrintNL.
claus
parents: 157
diff changeset
  1039
				ObjectMemory incrementalGC; finalize.
claus
parents: 157
diff changeset
  1040
				devColor := color exactOn:aDevice.
claus
parents: 157
diff changeset
  1041
			    ].    
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1042
			    gcRound := 2
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1043
			]
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1044
		    ]
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1045
		].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1046
	    ].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1047
	    (devColor notNil and:[devColor colorId notNil]) ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1048
		imgMap at:mapIndex put:devColor.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1049
		lastOK := lastOK + 1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1050
	    ] ifFalse:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1051
		fit := false
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1052
	    ]
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1053
	]
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1054
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1055
304f026e10cd Initial revision
claus
parents:
diff changeset
  1056
    fit ifFalse:[
157
claus
parents: 156
diff changeset
  1057
"/        |tree|
claus
parents: 156
diff changeset
  1058
"/
claus
parents: 156
diff changeset
  1059
"/        "/ first, create an octTree containing colors which we got ...
claus
parents: 156
diff changeset
  1060
"/        tree := ColorOctree new.
claus
parents: 156
diff changeset
  1061
"/
claus
parents: 156
diff changeset
  1062
"/        usedColors from:1 to:lastOK do:[:aColorIndex |
claus
parents: 156
diff changeset
  1063
"/            tree insert:(colorMap at:aColorIndex + 1).
claus
parents: 156
diff changeset
  1064
"/        ].
claus
parents: 156
diff changeset
  1065
"/
claus
parents: 156
diff changeset
  1066
"/        "/ then, remap remaining, using nearest from those already allocated
claus
parents: 156
diff changeset
  1067
"/
claus
parents: 156
diff changeset
  1068
"/        usedColors from:(lastOK+1) to:(usedColors size) do:[:aColorIndex |      
claus
parents: 156
diff changeset
  1069
"/            |mapIndex|
claus
parents: 156
diff changeset
  1070
"/
claus
parents: 156
diff changeset
  1071
"/            mapIndex := aColorIndex + 1.
claus
parents: 156
diff changeset
  1072
"/            imgMap at:mapIndex put:(tree findBest:(colorMap at:mapIndex))
claus
parents: 156
diff changeset
  1073
"/        ].
claus
parents: 156
diff changeset
  1074
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1075
	"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1076
	 again, this time allow wrong colors (loop while increasing allowed error)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1077
	"
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1078
	error := 10.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1079
	[fit] whileFalse:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1080
	    fit := true.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1081
	    usedColors from:(lastOK+1) to:(usedColors size) do:[:aColorIndex |
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1082
		|devColor color
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1083
		 r        "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1084
		 g        "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1085
		 b        "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1086
		 mapIndex "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1087
		 rMask    "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1088
		 gMask    "{Class: SmallInteger }"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1089
		 bMask    "{Class: SmallInteger }"|
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1090
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1091
		fit ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1092
		    gMask := bMask := rMask := m.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1093
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1094
		    mapIndex := aColorIndex + 1.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1095
		    color := colorMap at:mapIndex.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1096
		    r := (color red * 255 / 100) rounded.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1097
		    g := (color green * 255 / 100) rounded.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1098
		    b := (color blue * 255 / 100) rounded.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1099
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1100
		    color := Color red:((r bitShift:shift) bitAnd:rMask) * scale
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1101
				 green:((g bitShift:shift) bitAnd:gMask) * scale
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1102
				  blue:((b bitShift:shift) bitAnd:bMask) * scale.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1103
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1104
		    color colorId notNil ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1105
			"wow - an immediate hit"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1106
			devColor := color
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1107
		    ] ifFalse:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1108
			devColor := color nearestOn:aDevice error:error.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1109
			devColor isNil ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1110
			    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1111
			     no free color - on the first round, do a GC to flush unused
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1112
			     colors - this may help if some colors where locked by already
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1113
			     free images.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1114
			    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1115
			    gcRound == 0 ifTrue:[
112
88383d87f382 *** empty log message ***
claus
parents: 107
diff changeset
  1116
				ObjectMemory scavenge; finalize.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1117
				devColor := color nearestOn:aDevice error:error.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1118
				gcRound := 1
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1119
			    ].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1120
			    devColor isNil ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1121
				gcRound == 1 ifTrue:[
151
claus
parents: 134
diff changeset
  1122
				    'D8IMAGE: force GC for possible color reclamation.' infoPrintNL.
112
88383d87f382 *** empty log message ***
claus
parents: 107
diff changeset
  1123
				    ObjectMemory incrementalGC; finalize.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1124
				    devColor := color nearestOn:aDevice error:error.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1125
				    gcRound := 2
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1126
				]
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1127
			    ]
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1128
			].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1129
		    ].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1130
		    (devColor notNil and:[devColor colorId notNil]) ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1131
			imgMap at:mapIndex put:devColor.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1132
			lastOK := lastOK + 1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1133
		    ] ifFalse:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1134
			fit := false
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1135
		    ]
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1136
		].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1137
	    ].
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1138
	    error := error * 2.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1139
	    error > 1000 ifTrue:[
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1140
		"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1141
		 break out, if the error becomes too big.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1142
		"
151
claus
parents: 134
diff changeset
  1143
		'D8IMAGE: hard color allocation problem - revert to b&w' infoPrintNL.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1144
		"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1145
		 map to b&w as a last fallback.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1146
		 (should really do a dither here)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1147
		"
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1148
		usedColors from:(lastOK+1) to:(usedColors size) do:[:aColorIndex |
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1149
		    |color
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1150
		     mapIndex "{ Class: SmallInteger }"|
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1151
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1152
		    mapIndex := aColorIndex + 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1153
		    color := colorMap at:mapIndex.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1154
		    color brightness > 0.5 ifTrue:[
154
claus
parents: 151
diff changeset
  1155
			color := Color white.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1156
		    ] ifFalse:[
154
claus
parents: 151
diff changeset
  1157
			color := Color black.
claus
parents: 151
diff changeset
  1158
		    ].
claus
parents: 151
diff changeset
  1159
		    imgMap at:mapIndex put:(color on:aDevice).
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1160
		].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1161
		fit := true.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1162
	    ]
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1163
	].
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1164
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1165
	error > 100 ifTrue:[
151
claus
parents: 134
diff changeset
  1166
	    'D8IMAGE: not enough colors for a reasonable image' infoPrintNL
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1167
	] ifFalse:[
151
claus
parents: 134
diff changeset
  1168
	    'D8IMAGE: not enough colors for exact picture' infoPrintNL.
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1169
	]
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1170
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1171
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1172
    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1173
     create translation map (from image colors to allocated colorIds)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1174
    "
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1175
    map := ByteArray new:256.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1176
    1 to:imgMap size do:[:i |
154
claus
parents: 151
diff changeset
  1177
	|clr|
claus
parents: 151
diff changeset
  1178
claus
parents: 151
diff changeset
  1179
	(clr := imgMap at:i) notNil ifTrue:[
claus
parents: 151
diff changeset
  1180
	    map at:i put:clr colorId
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1181
	]
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1182
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1183
154
claus
parents: 151
diff changeset
  1184
    "
claus
parents: 151
diff changeset
  1185
     does the device support 8-bit images ?
claus
parents: 151
diff changeset
  1186
    "
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1187
    deviceDepth := aDevice depth.
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1188
    deviceDepth == 8 ifTrue:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1189
	has8BitImage := true.
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1190
    ] ifFalse:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1191
	has8BitImage := false.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1192
	aDevice supportedImageFormats do:[:fmt |
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1193
	    (fmt at:2) == 8 ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1194
		has8BitImage := true.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1195
	    ]
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1196
	]
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1197
    ].
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1198
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1199
    "
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1200
     finally, create a form on the device and copy (& translate)
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1201
     the pixel values
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1202
    "
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1203
    has8BitImage ifTrue:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1204
	pseudoBits := ByteArray uninitializedNew:(width * height).
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1205
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1206
	bytes expandPixels:8         "xlate only"
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1207
		    width:width 
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1208
		   height:height
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1209
		     into:pseudoBits
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1210
		  mapping:map.
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1211
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1212
	map := nil.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1213
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1214
	f := Form width:width height:height depth:deviceDepth on:aDevice.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1215
	f isNil ifTrue:[^ nil].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1216
	f colorMap:imgMap. 
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1217
	f initGC.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1218
	aDevice drawBits:pseudoBits bitsPerPixel:8 depth:deviceDepth  
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1219
		   width:width height:height
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1220
		       x:0 y:0
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1221
		    into:(f id) x:0 y:0 
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1222
		   width:width height:height with:(f gcId).
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1223
	^ f
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1224
    ].
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1225
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1226
    "
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1227
     slow fall back: convert into appropriate depth image,
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1228
     by looping over each pixel individually
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1229
    "
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1230
    newImage := (Image implementorForDepth:deviceDepth) new.
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1231
    newImage width:width.
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1232
    newImage height:height.
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1233
    newImage bits:(ByteArray uninitializedNew:(height * newImage bytesPerRow)).
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1234
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1235
    0 to:height-1 do:[:row |
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1236
	0 to:width-1 do:[:col |
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1237
	    pxl := self valueAtX:col y:row.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1238
	    newImage atX:col y:row putValue:(map at:pxl)
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1239
	]
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1240
    ].
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1241
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1242
    f := Form width:width height:height depth:deviceDepth on:aDevice.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1243
    f isNil ifTrue:[^ nil].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1244
    f colorMap:imgMap. 
304f026e10cd Initial revision
claus
parents:
diff changeset
  1245
    f initGC.
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1246
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1247
    aDevice drawBits:(newImage bits) depth:deviceDepth width:width height:height
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1248
		   x:0 y:0
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1249
		into:(f id) x:0 y:0 
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1250
	       width:width height:height with:(f gcId).
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
  1251
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1252
    ^ f
304f026e10cd Initial revision
claus
parents:
diff changeset
  1253
!
304f026e10cd Initial revision
claus
parents:
diff changeset
  1254
304f026e10cd Initial revision
claus
parents:
diff changeset
  1255
paletteImageAsGreyFormOn:aDevice
304f026e10cd Initial revision
claus
parents:
diff changeset
  1256
    "return an 8-bit greyForm from the 8-bit palette picture;
304f026e10cd Initial revision
claus
parents:
diff changeset
  1257
     only a translation has to be done"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1258
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1259
    |greyBits f map
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1260
     mapSize "{ Class: SmallInteger }"|
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1261
304f026e10cd Initial revision
claus
parents:
diff changeset
  1262
    greyBits := ByteArray uninitializedNew:(width * height).
304f026e10cd Initial revision
claus
parents:
diff changeset
  1263
304f026e10cd Initial revision
claus
parents:
diff changeset
  1264
    map := ByteArray uninitializedNew:256.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1265
    mapSize := colorMap size.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1266
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1267
    1 to:mapSize do:[:i |
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1268
	map at:i put:((colorMap at:i) brightness * 255) rounded
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1269
    ].
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1270
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1271
    bytes expandPixels:8         "xlate only"
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1272
		width:width 
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1273
	       height:height
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1274
		 into:greyBits
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1275
	      mapping:map.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1276
304f026e10cd Initial revision
claus
parents:
diff changeset
  1277
    f := Form width:width height:height depth:8 on:aDevice.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1278
    f isNil ifTrue:[^ nil].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1279
    f initGC.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1280
    aDevice drawBits:greyBits depth:8 width:width height:height
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1281
		       x:0 y:0
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1282
		    into:(f id) x:0 y:0 
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1283
		   width:width height:height with:(f gcId).
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1284
    ^ f
304f026e10cd Initial revision
claus
parents:
diff changeset
  1285
!
304f026e10cd Initial revision
claus
parents:
diff changeset
  1286
107
ef48048a8b34 *** empty log message ***
claus
parents: 97
diff changeset
  1287
paletteImageAsPatteredGreyFormOn:aDevice
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1288
    "return a dithered greyForm from the 8-bit palette picture.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1289
     works for any destination depth - but is very slow for some."
304f026e10cd Initial revision
claus
parents:
diff changeset
  1290
304f026e10cd Initial revision
claus
parents:
diff changeset
  1291
    |f 
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1292
     map run last ditherColors first delta
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1293
     clr depth grey
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1294
     nDither       "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1295
     nColors       "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1296
     w             "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1297
     h             "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1298
     v             "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1299
     srcIndex      "{Class: SmallInteger }"|
304f026e10cd Initial revision
claus
parents:
diff changeset
  1300
304f026e10cd Initial revision
claus
parents:
diff changeset
  1301
304f026e10cd Initial revision
claus
parents:
diff changeset
  1302
    Transcript showCr:'dithering ..'. Transcript endEntry.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1303
304f026e10cd Initial revision
claus
parents:
diff changeset
  1304
    nDither := NumberOfDitherColors.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1305
    ditherColors := Array new:nDither.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1306
304f026e10cd Initial revision
claus
parents:
diff changeset
  1307
    first := (100 / nDither / 2).
304f026e10cd Initial revision
claus
parents:
diff changeset
  1308
    delta := 100 / nDither.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1309
    0 to:nDither-1 do:[:i |
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1310
	ditherColors at:i+1 put:(Color grey:(i * delta + first)).
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1311
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1312
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1313
    nColors := colorMap size.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1314
    map := Array new:nColors.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1315
    1 to:nColors do:[:i |
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1316
	clr := colorMap at:i.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1317
	grey := clr brightness.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1318
	map at:i put:(ditherColors at:(v * (nDither - 1)) rounded)
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1319
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1320
304f026e10cd Initial revision
claus
parents:
diff changeset
  1321
    "tuning - code below is so slooow"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1322
    "get the patterns, fill form bytes here"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1323
304f026e10cd Initial revision
claus
parents:
diff changeset
  1324
    depth := aDevice depth.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1325
    depth == 1 ifTrue:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1326
	^ self dither1PlaneUsingMap:map on:aDevice
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1327
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1328
    depth == 2 ifTrue:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1329
	^ self dither2PlaneUsingMap:map on:aDevice
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1330
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1331
304f026e10cd Initial revision
claus
parents:
diff changeset
  1332
    "draw each pixel using dither color (let others do the dithering)
304f026e10cd Initial revision
claus
parents:
diff changeset
  1333
     although the code is simple, its very slow"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1334
304f026e10cd Initial revision
claus
parents:
diff changeset
  1335
    w := width.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1336
    h := height.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1337
304f026e10cd Initial revision
claus
parents:
diff changeset
  1338
    f := Form width:w height:h depth:depth on:aDevice.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1339
    f isNil ifTrue:[^ nil].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1340
    f initGC.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1341
304f026e10cd Initial revision
claus
parents:
diff changeset
  1342
    srcIndex := 1.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1343
    1 to:h do:[:dstY |
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1344
	run := 0.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1345
	last := nil.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1346
	1 to:w do:[:dstX |
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1347
	    v := bytes at:srcIndex.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1348
	    srcIndex := srcIndex + 1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1349
	    clr := map at:(v + 1).
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1350
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1351
	    clr == last ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1352
		run := run + 1
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1353
	    ] ifFalse:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1354
		(run ~~ 0) ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1355
		    f fillRectangleX:dstX-run-1 y:dstY-1 width:run height:1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1356
		].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1357
		run := 1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1358
		f paint:clr.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1359
		last := clr
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1360
	    ].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1361
	].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1362
	f fillRectangleX:w-run y:dstY-1 width:run height:1.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1363
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1364
    ^ f
304f026e10cd Initial revision
claus
parents:
diff changeset
  1365
! !
304f026e10cd Initial revision
claus
parents:
diff changeset
  1366
304f026e10cd Initial revision
claus
parents:
diff changeset
  1367
!Depth8Image methodsFor:'converting greyscale images'!
304f026e10cd Initial revision
claus
parents:
diff changeset
  1368
304f026e10cd Initial revision
claus
parents:
diff changeset
  1369
greyImageAsMonoFormOn:aDevice
304f026e10cd Initial revision
claus
parents:
diff changeset
  1370
    "return a (thresholded) monochrome Form from the picture."
304f026e10cd Initial revision
claus
parents:
diff changeset
  1371
304f026e10cd Initial revision
claus
parents:
diff changeset
  1372
    |bytesPerRow
304f026e10cd Initial revision
claus
parents:
diff changeset
  1373
     bytesPerMonoRow monoData
304f026e10cd Initial revision
claus
parents:
diff changeset
  1374
     pixel       "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1375
     byte        "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1376
     mask        "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1377
     srcIndex    "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1378
     dstIndex    "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1379
     nextSrc     "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1380
     nextDst     "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1381
     bitNumber   "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1382
     w           "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1383
     h           "{Class: SmallInteger }" |
304f026e10cd Initial revision
claus
parents:
diff changeset
  1384
304f026e10cd Initial revision
claus
parents:
diff changeset
  1385
    w := width.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1386
    h := height.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1387
304f026e10cd Initial revision
claus
parents:
diff changeset
  1388
    bytesPerRow := self bytesPerRow.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1389
    bytesPerMonoRow := w // 8.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1390
    ((w \\ 8) ~~ 0) ifTrue:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1391
	bytesPerMonoRow := bytesPerMonoRow + 1
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1392
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1393
    monoData := ByteArray uninitializedNew:(bytesPerMonoRow * h).
304f026e10cd Initial revision
claus
parents:
diff changeset
  1394
304f026e10cd Initial revision
claus
parents:
diff changeset
  1395
    "8 bit -> 1 bit extract; take most significant bit"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1396
304f026e10cd Initial revision
claus
parents:
diff changeset
  1397
    srcIndex := 1.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1398
    dstIndex := 1.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1399
    1 to:h do:[:count |
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1400
	nextSrc := srcIndex + bytesPerRow.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1401
	nextDst := dstIndex + bytesPerMonoRow.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1402
	bitNumber := 1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1403
	mask := 2r10000000.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1404
	[bitNumber <= w] whileTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1405
	    byte := 0.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1406
	    pixel := bytes at:srcIndex.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1407
	    srcIndex := srcIndex + 1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1408
	    ((pixel bitAnd:2r10000000) ~~ 0) ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1409
		byte := byte bitOr:mask
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1410
	    ].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1411
	    mask := mask bitShift: -1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1412
	    (mask == 0) ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1413
		monoData at:dstIndex put:byte.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1414
		dstIndex := dstIndex + 1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1415
		byte := 0.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1416
		mask := 2r10000000
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1417
	    ].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1418
	    bitNumber := bitNumber + 1
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1419
	].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1420
	(mask == 2r10000000) ifFalse:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1421
	    monoData at:dstIndex put:byte.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1422
	    dstIndex := dstIndex + 1
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1423
	].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1424
	srcIndex := nextSrc.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1425
	dstIndex := nextDst
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1426
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1427
304f026e10cd Initial revision
claus
parents:
diff changeset
  1428
    ^ Form width:w height:h fromArray:monoData on:aDevice
304f026e10cd Initial revision
claus
parents:
diff changeset
  1429
!
304f026e10cd Initial revision
claus
parents:
diff changeset
  1430
304f026e10cd Initial revision
claus
parents:
diff changeset
  1431
greyImageAsPatternDitheredGreyFormOn:aDevice
304f026e10cd Initial revision
claus
parents:
diff changeset
  1432
    "return a dithered greyForm from the grey picture.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1433
     Works for any destination depth.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1434
     Used to reduce the number of grey levels."
304f026e10cd Initial revision
claus
parents:
diff changeset
  1435
304f026e10cd Initial revision
claus
parents:
diff changeset
  1436
    |f depth
304f026e10cd Initial revision
claus
parents:
diff changeset
  1437
     map pixel0bytes pixel1bytes clr ditherPattern
304f026e10cd Initial revision
claus
parents:
diff changeset
  1438
     last ditherColors nDither first delta patterns formBytes
304f026e10cd Initial revision
claus
parents:
diff changeset
  1439
     w             "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1440
     h             "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1441
     v             "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1442
     run           "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1443
     srcIndex      "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1444
     dstIndex      "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1445
     mask          "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1446
     outBits       "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1447
     patternOffset "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1448
     patternBytes
304f026e10cd Initial revision
claus
parents:
diff changeset
  1449
     patternBits   "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1450
     index         "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1451
     p0            "{Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1452
     p1            "{Class: SmallInteger }" |
304f026e10cd Initial revision
claus
parents:
diff changeset
  1453
304f026e10cd Initial revision
claus
parents:
diff changeset
  1454
    Transcript showCr:'dithering ..'. Transcript endEntry.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1455
304f026e10cd Initial revision
claus
parents:
diff changeset
  1456
    nDither := NumberOfDitherColors.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1457
    ditherColors := Array new:nDither.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1458
304f026e10cd Initial revision
claus
parents:
diff changeset
  1459
    first := (100 / nDither / 2).
304f026e10cd Initial revision
claus
parents:
diff changeset
  1460
    delta := 100 / nDither.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1461
    0 to:nDither-1 do:[:i |
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1462
	ditherColors at:i+1 put:(Color grey:(i * delta + first)).
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1463
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1464
304f026e10cd Initial revision
claus
parents:
diff changeset
  1465
    map := Array new:256.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1466
    1 to:256 do:[:i |
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1467
	v := i - 1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1468
	v := (v * (nDither - 1) // 255) rounded.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1469
	" v is now 0 .. nDither-1 "
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1470
	map at:i put:(ditherColors at:(v + 1))
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1471
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1472
304f026e10cd Initial revision
claus
parents:
diff changeset
  1473
    depth := aDevice depth.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1474
304f026e10cd Initial revision
claus
parents:
diff changeset
  1475
    "tuning (general code is too slow)
304f026e10cd Initial revision
claus
parents:
diff changeset
  1476
     get the patterns, fill form bytes here"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1477
304f026e10cd Initial revision
claus
parents:
diff changeset
  1478
    w := width.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1479
    h := height.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1480
304f026e10cd Initial revision
claus
parents:
diff changeset
  1481
    depth == 1 ifTrue:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1482
	^ self dither1PlaneUsingMap:map on:aDevice.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1483
304f026e10cd Initial revision
claus
parents:
diff changeset
  1484
        
154
claus
parents: 151
diff changeset
  1485
"/      formBytes := ByteArray uninitializedNew:(w + 7 // 8) * h.
claus
parents: 151
diff changeset
  1486
"/      patterns := Array new:256.
claus
parents: 151
diff changeset
  1487
"/      pixel0bytes := ByteArray uninitializedNew:256.
claus
parents: 151
diff changeset
  1488
"/      pixel1bytes := ByteArray uninitializedNew:256.
claus
parents: 151
diff changeset
  1489
"/
claus
parents: 151
diff changeset
  1490
"/      "extract dither patterns and values to use for 1/0 bits
claus
parents: 151
diff changeset
  1491
"/       in those from the dithercolors"
claus
parents: 151
diff changeset
  1492
"/
claus
parents: 151
diff changeset
  1493
"/      1 to:256 do:[:i |
claus
parents: 151
diff changeset
  1494
"/          clr := (map at:i) on:aDevice.
claus
parents: 151
diff changeset
  1495
"/          ditherPattern := clr ditherForm.
claus
parents: 151
diff changeset
  1496
"/
claus
parents: 151
diff changeset
  1497
"/          ditherPattern isNil ifTrue:[
claus
parents: 151
diff changeset
  1498
"/              patterns at:i put:#[2r11111111
claus
parents: 151
diff changeset
  1499
"/                                  2r11111111
claus
parents: 151
diff changeset
  1500
"/                                  2r11111111
claus
parents: 151
diff changeset
  1501
"/                                  2r11111111
claus
parents: 151
diff changeset
  1502
"/                                  2r11111111
claus
parents: 151
diff changeset
  1503
"/                                  2r11111111
claus
parents: 151
diff changeset
  1504
"/                                  2r11111111
claus
parents: 151
diff changeset
  1505
"/                                  2r11111111].
claus
parents: 151
diff changeset
  1506
"/              pixel0bytes at:i put:clr colorId.
claus
parents: 151
diff changeset
  1507
"/              pixel1bytes at:i put:clr colorId
claus
parents: 151
diff changeset
  1508
"/          ] ifFalse:[
claus
parents: 151
diff changeset
  1509
"/              patterns at:i put:(ditherPattern bits).
claus
parents: 151
diff changeset
  1510
"/              pixel0bytes at:i put:(ditherPattern colorMap at:1) colorId.
claus
parents: 151
diff changeset
  1511
"/              pixel1bytes at:i put:(ditherPattern colorMap at:2) colorId.
claus
parents: 151
diff changeset
  1512
"/          ].
claus
parents: 151
diff changeset
  1513
"/      ].
claus
parents: 151
diff changeset
  1514
"/
claus
parents: 151
diff changeset
  1515
"/      srcIndex := 1.
claus
parents: 151
diff changeset
  1516
"/      dstIndex := 1.
claus
parents: 151
diff changeset
  1517
"/      mask := 16r80.
claus
parents: 151
diff changeset
  1518
"/      outBits := 0.
claus
parents: 151
diff changeset
  1519
"/      patternOffset := 1.
claus
parents: 151
diff changeset
  1520
"/      1 to:h do:[:dstY |
claus
parents: 151
diff changeset
  1521
"/          last := nil.
claus
parents: 151
diff changeset
  1522
"/          1 to:w do:[:dstX |
claus
parents: 151
diff changeset
  1523
"/              v := bytes at:srcIndex.                             "pixel value"
claus
parents: 151
diff changeset
  1524
"/              srcIndex := srcIndex + 1.
claus
parents: 151
diff changeset
  1525
"/
claus
parents: 151
diff changeset
  1526
"/              v == last ifFalse:[
claus
parents: 151
diff changeset
  1527
"/                  index := v + 1.                                "index into map"
claus
parents: 151
diff changeset
  1528
"/
claus
parents: 151
diff changeset
  1529
"/                  patternBytes := patterns at:index.             "dither pattern for color"
claus
parents: 151
diff changeset
  1530
"/                  patternBits := patternBytes at:patternOffset.  "dither row"
claus
parents: 151
diff changeset
  1531
"/                  p0 := pixel0bytes at:index.                         "value for 0-dither bit"
claus
parents: 151
diff changeset
  1532
"/                  p1 := pixel1bytes at:index.                         "value for 1-dither bit"
claus
parents: 151
diff changeset
  1533
"/                  last := v.
claus
parents: 151
diff changeset
  1534
"/              ].
claus
parents: 151
diff changeset
  1535
"/              outBits := outBits bitShift:1.
claus
parents: 151
diff changeset
  1536
"/              (patternBits bitAnd:mask) == 0 ifTrue:[
claus
parents: 151
diff changeset
  1537
"/                  outBits := outBits bitOr:p0.
claus
parents: 151
diff changeset
  1538
"/              ] ifFalse:[
claus
parents: 151
diff changeset
  1539
"/                  outBits := outBits bitOr:p1
claus
parents: 151
diff changeset
  1540
"/              ].
claus
parents: 151
diff changeset
  1541
"/              mask := mask bitShift:-1.
claus
parents: 151
diff changeset
  1542
"/              mask == 0 ifTrue:[
claus
parents: 151
diff changeset
  1543
"/                  mask := 16r80.
claus
parents: 151
diff changeset
  1544
"/                  formBytes at:dstIndex put:outBits.
claus
parents: 151
diff changeset
  1545
"/                  dstIndex := dstIndex + 1.
claus
parents: 151
diff changeset
  1546
"/                  outBits := 0
claus
parents: 151
diff changeset
  1547
"/              ]
claus
parents: 151
diff changeset
  1548
"/          ].
claus
parents: 151
diff changeset
  1549
"/          mask == 16r80 ifFalse:[
claus
parents: 151
diff changeset
  1550
"/              dstIndex := dstIndex + 1.
claus
parents: 151
diff changeset
  1551
"/              mask := 16r80.
claus
parents: 151
diff changeset
  1552
"/              outBits := 0
claus
parents: 151
diff changeset
  1553
"/          ].
claus
parents: 151
diff changeset
  1554
"/          patternOffset := patternOffset + 1.
claus
parents: 151
diff changeset
  1555
"/          patternOffset == 9 ifTrue:[
claus
parents: 151
diff changeset
  1556
"/              patternOffset := 1
claus
parents: 151
diff changeset
  1557
"/          ]
claus
parents: 151
diff changeset
  1558
"/      ].
claus
parents: 151
diff changeset
  1559
"/      f := Form width:w height:h fromArray:formBytes.
claus
parents: 151
diff changeset
  1560
"/      ^ f
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1561
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1562
304f026e10cd Initial revision
claus
parents:
diff changeset
  1563
    depth == 2 ifTrue:[
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1564
	^ self dither2PlaneUsingMap:map on:aDevice.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1565
154
claus
parents: 151
diff changeset
  1566
"/      formBytes := ByteArray uninitializedNew:(w * 2 + 7 // 8) * h.
claus
parents: 151
diff changeset
  1567
"/      patterns := Array new:256.
claus
parents: 151
diff changeset
  1568
"/      pixel0bytes := ByteArray uninitializedNew:256.
claus
parents: 151
diff changeset
  1569
"/      pixel1bytes := ByteArray uninitializedNew:256.
claus
parents: 151
diff changeset
  1570
"/
claus
parents: 151
diff changeset
  1571
"/      "extract dither patterns and values to use for 1/o bits
claus
parents: 151
diff changeset
  1572
"/       in those from the dithercolors"
claus
parents: 151
diff changeset
  1573
"/
claus
parents: 151
diff changeset
  1574
"/      1 to:256 do:[:i |
claus
parents: 151
diff changeset
  1575
"/          clr := (map at:i) on:aDevice.
claus
parents: 151
diff changeset
  1576
"/          ditherPattern := clr ditherForm.
claus
parents: 151
diff changeset
  1577
"/
claus
parents: 151
diff changeset
  1578
"/          ditherPattern isNil ifTrue:[
claus
parents: 151
diff changeset
  1579
"/              patterns at:i put:#[2r11111111
claus
parents: 151
diff changeset
  1580
"/                                  2r11111111
claus
parents: 151
diff changeset
  1581
"/                                  2r11111111
claus
parents: 151
diff changeset
  1582
"/                                  2r11111111
claus
parents: 151
diff changeset
  1583
"/                                  2r11111111
claus
parents: 151
diff changeset
  1584
"/                                  2r11111111
claus
parents: 151
diff changeset
  1585
"/                                  2r11111111
claus
parents: 151
diff changeset
  1586
"/                                  2r11111111].
claus
parents: 151
diff changeset
  1587
"/              pixel0bytes at:i put:clr colorId.
claus
parents: 151
diff changeset
  1588
"/              pixel1bytes at:i put:clr colorId
claus
parents: 151
diff changeset
  1589
"/          ] ifFalse:[
claus
parents: 151
diff changeset
  1590
"/              patterns at:i put:(ditherPattern bits).
claus
parents: 151
diff changeset
  1591
"/              pixel0bytes at:i put:(ditherPattern colorMap at:1) colorId.
claus
parents: 151
diff changeset
  1592
"/              pixel1bytes at:i put:(ditherPattern colorMap at:2) colorId.
claus
parents: 151
diff changeset
  1593
"/          ].
claus
parents: 151
diff changeset
  1594
"/      ].
claus
parents: 151
diff changeset
  1595
"/
claus
parents: 151
diff changeset
  1596
"/      srcIndex := 1.
claus
parents: 151
diff changeset
  1597
"/      dstIndex := 1.
claus
parents: 151
diff changeset
  1598
"/      mask := 16r80.
claus
parents: 151
diff changeset
  1599
"/      outBits := 0.
claus
parents: 151
diff changeset
  1600
"/      patternOffset := 1.
claus
parents: 151
diff changeset
  1601
"/      1 to:h do:[:dstY |
claus
parents: 151
diff changeset
  1602
"/          last := nil.
claus
parents: 151
diff changeset
  1603
"/          1 to:w do:[:dstX |
claus
parents: 151
diff changeset
  1604
"/              v := bytes at:srcIndex.                             "pixel value"
claus
parents: 151
diff changeset
  1605
"/              srcIndex := srcIndex + 1.
claus
parents: 151
diff changeset
  1606
"/
claus
parents: 151
diff changeset
  1607
"/              v == last ifFalse:[
claus
parents: 151
diff changeset
  1608
"/                  index := v + 1.                                "index into map"
claus
parents: 151
diff changeset
  1609
"/
claus
parents: 151
diff changeset
  1610
"/                  patternBytes := patterns at:index.             "dither pattern for color"
claus
parents: 151
diff changeset
  1611
"/                  patternBits := patternBytes at:patternOffset.  "dither row"
claus
parents: 151
diff changeset
  1612
"/                  p0 := pixel0bytes at:index.                         "value for 0-dither bit"
claus
parents: 151
diff changeset
  1613
"/                  p1 := pixel1bytes at:index.                         "value for 1-dither bit"
claus
parents: 151
diff changeset
  1614
"/                  last := v.
claus
parents: 151
diff changeset
  1615
"/              ].
claus
parents: 151
diff changeset
  1616
"/              outBits := outBits bitShift:2.
claus
parents: 151
diff changeset
  1617
"/
claus
parents: 151
diff changeset
  1618
"/              (patternBits bitAnd:mask) == 0 ifTrue:[
claus
parents: 151
diff changeset
  1619
"/                  outBits := outBits bitOr:p0.
claus
parents: 151
diff changeset
  1620
"/              ] ifFalse:[
claus
parents: 151
diff changeset
  1621
"/                  outBits := outBits bitOr:p1
claus
parents: 151
diff changeset
  1622
"/              ].
claus
parents: 151
diff changeset
  1623
"/              mask := mask bitShift:-1.
claus
parents: 151
diff changeset
  1624
"/              mask == 16r08 ifTrue:[
claus
parents: 151
diff changeset
  1625
"/                  formBytes at:dstIndex put:outBits.
claus
parents: 151
diff changeset
  1626
"/                  dstIndex := dstIndex + 1.
claus
parents: 151
diff changeset
  1627
"/                  outBits := 0
claus
parents: 151
diff changeset
  1628
"/              ] ifFalse:[
claus
parents: 151
diff changeset
  1629
"/                  mask == 0 ifTrue:[
claus
parents: 151
diff changeset
  1630
"/                      mask := 16r80.
claus
parents: 151
diff changeset
  1631
"/                      formBytes at:dstIndex put:outBits.
claus
parents: 151
diff changeset
  1632
"/                      dstIndex := dstIndex + 1.
claus
parents: 151
diff changeset
  1633
"/                      outBits := 0
claus
parents: 151
diff changeset
  1634
"/                  ]
claus
parents: 151
diff changeset
  1635
"/              ]
claus
parents: 151
diff changeset
  1636
"/          ].
claus
parents: 151
diff changeset
  1637
"/          ((mask == 16r80) or:[mask == 16r08]) ifFalse:[
claus
parents: 151
diff changeset
  1638
"/              formBytes at:dstIndex put:outBits.
claus
parents: 151
diff changeset
  1639
"/              dstIndex := dstIndex + 1.
claus
parents: 151
diff changeset
  1640
"/              mask := 16r80.
claus
parents: 151
diff changeset
  1641
"/              outBits := 0
claus
parents: 151
diff changeset
  1642
"/          ].
claus
parents: 151
diff changeset
  1643
"/          patternOffset := patternOffset + 1.
claus
parents: 151
diff changeset
  1644
"/          patternOffset == 9 ifTrue:[
claus
parents: 151
diff changeset
  1645
"/              patternOffset := 1
claus
parents: 151
diff changeset
  1646
"/          ]
claus
parents: 151
diff changeset
  1647
"/      ].
claus
parents: 151
diff changeset
  1648
"/
claus
parents: 151
diff changeset
  1649
"/      f := Form width:w height:h depth:2.
claus
parents: 151
diff changeset
  1650
"/      f initGC.
claus
parents: 151
diff changeset
  1651
"/      f device drawBits:formBytes depth:2
claus
parents: 151
diff changeset
  1652
"/                  width:w height:h x:0 y:0
claus
parents: 151
diff changeset
  1653
"/                   into:f id x:0 y:0 width:w height:h with:f gcId.
claus
parents: 151
diff changeset
  1654
"/      ^ f
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1655
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1656
304f026e10cd Initial revision
claus
parents:
diff changeset
  1657
    "draw each pixel using dither color (let others do the dithering)
304f026e10cd Initial revision
claus
parents:
diff changeset
  1658
     although the code is simple, its very slow"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1659
304f026e10cd Initial revision
claus
parents:
diff changeset
  1660
    f := Form width:width height:height depth:depth on:aDevice.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1661
    f isNil ifTrue:[^ nil].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1662
    f initGC.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1663
304f026e10cd Initial revision
claus
parents:
diff changeset
  1664
    srcIndex := 1.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1665
    1 to:h do:[:dstY |
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1666
	run := 0.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1667
	last := nil.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1668
	1 to:w do:[:dstX |
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1669
	    |clr v|
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1670
	    v := bytes at:srcIndex.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1671
	    srcIndex := srcIndex + 1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1672
	    clr := map at:(v + 1).
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1673
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1674
	    clr == last ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1675
		run := run + 1
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1676
	    ] ifFalse:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1677
		(run ~~ 0) ifTrue:[
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1678
		    f fillRectangleX:dstX-run-1 y:dstY-1 width:run height:1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1679
		].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1680
		run := 1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1681
		f paint:clr.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1682
		last := clr
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1683
	    ].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1684
	].
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1685
	f fillRectangleX:width-run y:dstY-1 width:run height:1.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1686
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1687
    ^ f
304f026e10cd Initial revision
claus
parents:
diff changeset
  1688
! !
304f026e10cd Initial revision
claus
parents:
diff changeset
  1689
12
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1690
!Depth8Image methodsFor:'image manipulations'!
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1691
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1692
flipHorizontal
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1693
    "inplace horizontal flip"
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1694
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1695
    |index  "{Class: SmallInteger }"
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1696
     h      "{Class: SmallInteger }"
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1697
     w      "{Class: SmallInteger }"
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1698
     buffer |
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1699
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1700
    w := width - 1.
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1701
    h := height - 1.
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1702
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1703
    buffer := ByteArray new:width.
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1704
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1705
    index := 1.
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1706
    0 to:h do:[:row |
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1707
	buffer replaceFrom:1 to:width with:bytes startingAt:index.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1708
	buffer reverse.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1709
	bytes replaceFrom:index to:index+w with:buffer startingAt:1.
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1710
	index := index + w + 1.
12
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1711
    ].
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1712
    "flush device info"
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1713
    self restored
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1714
!
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1715
304f026e10cd Initial revision
claus
parents:
diff changeset
  1716
magnifyRowFrom:srcBytes offset:srcStart  
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1717
	  into:dstBytes offset:dstStart factor:mX
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1718
81
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
  1719
    "magnify a single pixel row - can only magnify by integer factors.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1720
     Specially tuned for factors 2,3 and 4."
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1721
304f026e10cd Initial revision
claus
parents:
diff changeset
  1722
%{
304f026e10cd Initial revision
claus
parents:
diff changeset
  1723
    REGISTER unsigned char *srcP, *dstP;
304f026e10cd Initial revision
claus
parents:
diff changeset
  1724
    REGISTER unsigned char _byte;
304f026e10cd Initial revision
claus
parents:
diff changeset
  1725
    int _mag;
304f026e10cd Initial revision
claus
parents:
diff changeset
  1726
    REGISTER int i;
304f026e10cd Initial revision
claus
parents:
diff changeset
  1727
    int _pixels;
97
dd6116883ac0 *** empty log message ***
claus
parents: 89
diff changeset
  1728
    OBJ w = _INST(width);
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1729
97
dd6116883ac0 *** empty log message ***
claus
parents: 89
diff changeset
  1730
    if (__bothSmallInteger(srcStart, dstStart)
dd6116883ac0 *** empty log message ***
claus
parents: 89
diff changeset
  1731
     && __bothSmallInteger(w, mX)
35
f1a194c18429 *** empty log message ***
claus
parents: 28
diff changeset
  1732
     && __isByteArray(srcBytes) && __isByteArray(dstBytes)) {
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1733
	_mag = _intVal(mX);
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1734
	srcP = _ByteArrayInstPtr(srcBytes)->ba_element - 1 + _intVal(srcStart);
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1735
	dstP = _ByteArrayInstPtr(dstBytes)->ba_element - 1 + _intVal(dstStart);
97
dd6116883ac0 *** empty log message ***
claus
parents: 89
diff changeset
  1736
	_pixels = _intVal(w);
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1737
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1738
	switch (_mag) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1739
	    case 1:
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1740
		break;
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1741
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1742
	    case 2:
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1743
		/* special code for common case */
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1744
		while (_pixels--) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1745
		    _byte = *srcP++;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1746
		    *dstP++ = _byte;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1747
		    *dstP++ = _byte;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1748
		}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1749
		break;
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1750
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1751
	    case 3:
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1752
		/* special code for common case */
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1753
		while (_pixels--) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1754
		    _byte = *srcP++;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1755
		    *dstP++ = _byte;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1756
		    *dstP++ = _byte;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1757
		    *dstP++ = _byte;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1758
		}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1759
		break;
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1760
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1761
	    case 4:
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1762
		/* special code for common case */
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1763
		while (_pixels--) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1764
		    _byte = *srcP++;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1765
		    *dstP++ = _byte;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1766
		    *dstP++ = _byte;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1767
		    *dstP++ = _byte;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1768
		    *dstP++ = _byte;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1769
		}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1770
		break;
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1771
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1772
	    default:
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1773
		while (_pixels--) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1774
		    _byte = *srcP++;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1775
		    for (i=_mag; i>0; i--)
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1776
			*dstP++ = _byte;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1777
		}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1778
		break;
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1779
	}
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1780
	RETURN (self);
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1781
    }
304f026e10cd Initial revision
claus
parents:
diff changeset
  1782
%}
304f026e10cd Initial revision
claus
parents:
diff changeset
  1783
.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1784
    self primitiveFailed
304f026e10cd Initial revision
claus
parents:
diff changeset
  1785
!
304f026e10cd Initial revision
claus
parents:
diff changeset
  1786
134
claus
parents: 118
diff changeset
  1787
hardMagnifiedBy:extent
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1788
    "return a new image magnified by extent, aPoint.
12
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  1789
     This is the general magnification method, handling non-integral values"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1790
304f026e10cd Initial revision
claus
parents:
diff changeset
  1791
    |mX mY
304f026e10cd Initial revision
claus
parents:
diff changeset
  1792
     newWidth  "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1793
     newHeight "{ Class: SmallInteger }"
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1794
     w         "{ Class: SmallInteger }"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1795
     h         "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1796
     newImage newBytes
304f026e10cd Initial revision
claus
parents:
diff changeset
  1797
     value     "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1798
     srcRowIdx "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1799
     srcIndex  "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1800
     dstIndex  "{ Class: SmallInteger }"|
304f026e10cd Initial revision
claus
parents:
diff changeset
  1801
304f026e10cd Initial revision
claus
parents:
diff changeset
  1802
    mX := extent x.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1803
    mY := extent y.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1804
    ((mX < 0) or:[mY < 0]) ifTrue:[^ nil].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1805
    ((mX = 1) and:[mY = 1]) ifTrue:[^ self].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1806
304f026e10cd Initial revision
claus
parents:
diff changeset
  1807
    newWidth := (width * mX) truncated.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1808
    newHeight := (height * mY) truncated.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1809
304f026e10cd Initial revision
claus
parents:
diff changeset
  1810
    newBytes := ByteArray uninitializedNew:(newWidth * newHeight).
304f026e10cd Initial revision
claus
parents:
diff changeset
  1811
304f026e10cd Initial revision
claus
parents:
diff changeset
  1812
    newImage := self species new.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1813
    newImage bits:newBytes.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1814
    newImage width:newWidth.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1815
    newImage height:newHeight.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1816
    newImage photometric:photometric.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1817
    newImage samplesPerPixel:samplesPerPixel.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1818
    newImage bitsPerSample:#(8).
304f026e10cd Initial revision
claus
parents:
diff changeset
  1819
    newImage colorMap:colorMap copy.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1820
304f026e10cd Initial revision
claus
parents:
diff changeset
  1821
    "walk over destination image fetching pixels from source image"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1822
304f026e10cd Initial revision
claus
parents:
diff changeset
  1823
    mY := mY asFloat.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1824
    mX := mX asFloat.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1825
%{
304f026e10cd Initial revision
claus
parents:
diff changeset
  1826
    unsigned char *_dstP = _ByteArrayInstPtr(newBytes)->ba_element;
304f026e10cd Initial revision
claus
parents:
diff changeset
  1827
    unsigned char *_srcP = _ByteArrayInstPtr(_INST(bytes))->ba_element;
304f026e10cd Initial revision
claus
parents:
diff changeset
  1828
    unsigned char *_srcRowP;
304f026e10cd Initial revision
claus
parents:
diff changeset
  1829
    int _width = _intVal(_INST(width));
304f026e10cd Initial revision
claus
parents:
diff changeset
  1830
    int _w = _intVal(newWidth) - 1;
304f026e10cd Initial revision
claus
parents:
diff changeset
  1831
    int _h = _intVal(newHeight) - 1;
304f026e10cd Initial revision
claus
parents:
diff changeset
  1832
    int _row, _col;
304f026e10cd Initial revision
claus
parents:
diff changeset
  1833
    double _mX = _floatVal(mX);
304f026e10cd Initial revision
claus
parents:
diff changeset
  1834
    double _mY = _floatVal(mY);
304f026e10cd Initial revision
claus
parents:
diff changeset
  1835
304f026e10cd Initial revision
claus
parents:
diff changeset
  1836
    for (_row = 0; _row <= _h; _row++) {
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1837
	_srcRowP = _srcP + (_width * (int)((double)_row / _mY));
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1838
	for (_col = 0; _col <= _w; _col++) {
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1839
	    *_dstP++ = _srcRowP[(int)((double)_col / _mX)];
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
  1840
	}
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1841
    }
304f026e10cd Initial revision
claus
parents:
diff changeset
  1842
%}
304f026e10cd Initial revision
claus
parents:
diff changeset
  1843
.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1844
"/   the above C-code is equivalent to:
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1845
"/
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1846
"/    dstIndex := 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1847
"/    w := newWidth - 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1848
"/    h := newHeight - 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1849
"/    0 to:h do:[:row |
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1850
"/        srcRowIdx := (width * (row // mY)) + 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1851
"/        0 to:w do:[:col |
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1852
"/            srcIndex := srcRowIdx + (col // mX).
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1853
"/            value := bytes at:srcIndex.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1854
"/            newBytes at:dstIndex put:value.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1855
"/            dstIndex := dstIndex + 1
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1856
"/        ]
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1857
"/    ].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  1858
"/
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1859
304f026e10cd Initial revision
claus
parents:
diff changeset
  1860
    ^ newImage
304f026e10cd Initial revision
claus
parents:
diff changeset
  1861
! !