Depth8Image.st
author Patrik Svestka <patrik.svestka@gmail.com>
Wed, 11 Jul 2018 16:58:29 +0200
branchjv
changeset 8426 e2051b1553f0
parent 7823 5a255f3fbbd6
child 8595 7f9b84978a2e
permissions -rw-r--r--
Issue #126: Removing hack, correctly calculating masDisplayBuffer and having fallback maxDisplayBuffer is set to 107 characters. On windows (7 and up) there is undocumented, you can't find this information anywhere, limit for raster size when using TextOutA or TextOutW. Experimentally, I have come to the conclusion that the limit is most likely set to 16384 points of the raster. To correctly calculate the maximum display buffer (maxDisplayBuffer) I have come to a formula: maxDisplayBuffer = 16384 / (maxWidth + tmet.tmOverhang); maxWidth is the maximum selected font width tmet.tmOverhang is the "extra width per string that may be added to some synthesized fonts." -> If you want to get the actual width you have to add it to maxWidth. You will get the whole extent then. (For most fonts tmOverhang will be 0.) The whole definition of tmOverhang from MSND - https://msdn.microsoft.com/en-us/library/windows/desktop/dd145132(v=vs.85).aspx
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
     1
"{ Encoding: utf8 }"
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
     2
5
claus
parents: 1
diff changeset
     3
"
claus
parents: 1
diff changeset
     4
 COPYRIGHT (c) 1993 by Claus Gittinger
8426
e2051b1553f0 Issue #126: Removing hack, correctly calculating masDisplayBuffer and having fallback maxDisplayBuffer is set to 107 characters.
Patrik Svestka <patrik.svestka@gmail.com>
parents: 7823
diff changeset
     5
 COPYRIGHT (c) 2018 Patrik Svestka
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
     6
	      All Rights Reserved
5
claus
parents: 1
diff changeset
     7
claus
parents: 1
diff changeset
     8
 This software is furnished under a license and may be used
claus
parents: 1
diff changeset
     9
 only in accordance with the terms of that license and with the
claus
parents: 1
diff changeset
    10
 inclusion of the above copyright notice.   This software may not
claus
parents: 1
diff changeset
    11
 be provided or otherwise made available to, or used by, any
claus
parents: 1
diff changeset
    12
 other person.  No title to or ownership of the software is
claus
parents: 1
diff changeset
    13
 hereby transferred.
claus
parents: 1
diff changeset
    14
"
3263
bd92a12c9316 category changes
Claus Gittinger <cg@exept.de>
parents: 2864
diff changeset
    15
"{ Package: 'stx:libview' }"
bd92a12c9316 category changes
Claus Gittinger <cg@exept.de>
parents: 2864
diff changeset
    16
6837
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
    17
"{ NameSpace: Smalltalk }"
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
    18
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    19
Image subclass:#Depth8Image
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    20
	instanceVariableNames:''
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    21
	classVariableNames:''
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    22
	poolDictionaries:''
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    23
	category:'Graphics-Images'
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    24
!
304f026e10cd Initial revision
claus
parents:
diff changeset
    25
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 941
diff changeset
    26
!Depth8Image class methodsFor:'documentation'!
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    27
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    28
copyright
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    29
"
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    30
 COPYRIGHT (c) 1993 by Claus Gittinger
71
6a42b2b115f8 *** empty log message ***
claus
parents: 66
diff changeset
    31
	      All Rights Reserved
5
claus
parents: 1
diff changeset
    32
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    33
 This software is furnished under a license and may be used
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    34
 only in accordance with the terms of that license and with the
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    35
 inclusion of the above copyright notice.   This software may not
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    36
 be provided or otherwise made available to, or used by, any
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    37
 other person.  No title to or ownership of the software is
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    38
 hereby transferred.
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    39
"
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    40
!
5
claus
parents: 1
diff changeset
    41
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    42
documentation
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    43
"
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    44
    this class represents 256-color (8 bit / pixel) images (palette, greyscale ...).
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    45
    It mainly consists of methods already implemented in Image,
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    46
    reimplemented here for more performance.
611
e0442439a3c6 documentation
Claus Gittinger <cg@exept.de>
parents: 579
diff changeset
    47
e0442439a3c6 documentation
Claus Gittinger <cg@exept.de>
parents: 579
diff changeset
    48
    [author:]
2786
a6a053ee4c76 oops - image bug fix for hpux (MSB but __MSBFIRST not defined)
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
    49
	Claus Gittinger
611
e0442439a3c6 documentation
Claus Gittinger <cg@exept.de>
parents: 579
diff changeset
    50
e0442439a3c6 documentation
Claus Gittinger <cg@exept.de>
parents: 579
diff changeset
    51
    [see also:]
2786
a6a053ee4c76 oops - image bug fix for hpux (MSB but __MSBFIRST not defined)
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
    52
	Depth1Image Depth2Image Depth4Image Depth16Image Depth24Image
a6a053ee4c76 oops - image bug fix for hpux (MSB but __MSBFIRST not defined)
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
    53
	ImageReader
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    54
"
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    55
! !
5
claus
parents: 1
diff changeset
    56
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 941
diff changeset
    57
!Depth8Image class methodsFor:'queries'!
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    58
4889
91227e415992 photometric
Claus Gittinger <cg@exept.de>
parents: 4783
diff changeset
    59
defaultPhotometric
6310
612c17181395 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6299
diff changeset
    60
    "return the default photometric pixel interpretation.
612c17181395 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6299
diff changeset
    61
     This may be a somewhat old leftover from times, when tiff was the first image file type to be read.
612c17181395 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6299
diff changeset
    62
     Much better would be to always have some (possibly fake and virtual) colormap around, and ask that one.
612c17181395 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6299
diff changeset
    63
     However, in the meantime, many other classes depend on that, so that it should be kept as an API 
612c17181395 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6299
diff changeset
    64
     - even when the internal representation will be replaced by something better in the future."
612c17181395 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6299
diff changeset
    65
4889
91227e415992 photometric
Claus Gittinger <cg@exept.de>
parents: 4783
diff changeset
    66
    ^ #palette
91227e415992 photometric
Claus Gittinger <cg@exept.de>
parents: 4783
diff changeset
    67
!
91227e415992 photometric
Claus Gittinger <cg@exept.de>
parents: 4783
diff changeset
    68
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
    69
imageDepth
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    70
    "return the depth of images represented by instances of
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    71
     this class - here we return 8"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    72
304f026e10cd Initial revision
claus
parents:
diff changeset
    73
    ^ 8
304f026e10cd Initial revision
claus
parents:
diff changeset
    74
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    75
    "Modified: 20.4.1996 / 23:40:22 / cg"
81
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
    76
! !
4ba554473294 *** empty log message ***
claus
parents: 75
diff changeset
    77
3263
bd92a12c9316 category changes
Claus Gittinger <cg@exept.de>
parents: 2864
diff changeset
    78
!Depth8Image methodsFor:'accessing-pixels'!
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    79
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
    80
pixelAtX:x y:y
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
    81
    "retrieve a pixel at x/y; return a pixelValue.
7518
de8364635170 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7496
diff changeset
    82
     The interpretation of the returned value depends on the photometric
de8364635170 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7496
diff changeset
    83
     and the colormap. See also Image>>atX:y:)
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
    84
     Pixels start at x=0 , y=0 for upper left pixel, end at
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
    85
     x = width-1, y=height-1 for lower right pixel"
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
    86
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
    87
    |index "{ Class: SmallInteger }"|
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
    88
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
    89
%{  /* NOCONTEXT */
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
    90
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
    91
    OBJ b = __INST(bytes);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
    92
    OBJ w = __INST(width);
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
    93
5472
5508a0ac6319 __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5453
diff changeset
    94
    if (__isByteArrayLike(b)
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
    95
     && __bothSmallInteger(x, y)
7276
3af688594d98 #QUALITY by cg
Claus Gittinger <cg@exept.de>
parents: 6837
diff changeset
    96
     && __isSmallInteger(w)
3af688594d98 #QUALITY by cg
Claus Gittinger <cg@exept.de>
parents: 6837
diff changeset
    97
     && (__INST(pixelFunction)==nil) ) {
6299
83fea4366ebd pixelfunction support
Claus Gittinger <cg@exept.de>
parents: 6066
diff changeset
    98
        int _idx, _pix;
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
    99
6299
83fea4366ebd pixelfunction support
Claus Gittinger <cg@exept.de>
parents: 6066
diff changeset
   100
        _idx = (__intVal(w) * __intVal(y)) + __intVal(x);
83fea4366ebd pixelfunction support
Claus Gittinger <cg@exept.de>
parents: 6066
diff changeset
   101
        if ((unsigned)_idx < __byteArraySize(b)) {
83fea4366ebd pixelfunction support
Claus Gittinger <cg@exept.de>
parents: 6066
diff changeset
   102
            _pix = __ByteArrayInstPtr(b)->ba_element[_idx];
83fea4366ebd pixelfunction support
Claus Gittinger <cg@exept.de>
parents: 6066
diff changeset
   103
            RETURN( __MKSMALLINT(_pix) );
83fea4366ebd pixelfunction support
Claus Gittinger <cg@exept.de>
parents: 6066
diff changeset
   104
        }
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   105
    }
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   106
%}.
6299
83fea4366ebd pixelfunction support
Claus Gittinger <cg@exept.de>
parents: 6066
diff changeset
   107
    pixelFunction notNil ifTrue:[^ pixelFunction value:x value:y].
83fea4366ebd pixelfunction support
Claus Gittinger <cg@exept.de>
parents: 6066
diff changeset
   108
3842
e97ae6061e75 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
   109
    "/ the code below is only evaluated if the bytes-collection is
e97ae6061e75 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
   110
    "/ not a ByteArray, or the arguments are not integers
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   111
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   112
    index := (width * y) + 1 + x.
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   113
    ^ bytes at:index.
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   114
!
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   115
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   116
pixelAtX:x y:y put:aPixelValue
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   117
    "set the pixel at x/y to aPixelValue.
7518
de8364635170 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7496
diff changeset
   118
     The interpretation of the pixelValue depends on the photometric
de8364635170 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7496
diff changeset
   119
     and the colormap. (see also: Image>>atX:y:put:)
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   120
     Pixels start at x=0 , y=0 for upper left pixel, end at
304f026e10cd Initial revision
claus
parents:
diff changeset
   121
     x = width-1, y=height-1 for lower right pixel"
304f026e10cd Initial revision
claus
parents:
diff changeset
   122
304f026e10cd Initial revision
claus
parents:
diff changeset
   123
    |index "{ Class: SmallInteger }"|
304f026e10cd Initial revision
claus
parents:
diff changeset
   124
1634
72ee64fad9fe tuned #valueAtX:y: and #atX:y:putValue:
Claus Gittinger <cg@exept.de>
parents: 1628
diff changeset
   125
%{  /* NOCONTEXT */
72ee64fad9fe tuned #valueAtX:y: and #atX:y:putValue:
Claus Gittinger <cg@exept.de>
parents: 1628
diff changeset
   126
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
   127
    OBJ b = __INST(bytes);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
   128
    OBJ w = __INST(width);
1634
72ee64fad9fe tuned #valueAtX:y: and #atX:y:putValue:
Claus Gittinger <cg@exept.de>
parents: 1628
diff changeset
   129
5472
5508a0ac6319 __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5453
diff changeset
   130
    if (__isByteArrayLike(b)
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   131
     && __bothSmallInteger(x, y)
1634
72ee64fad9fe tuned #valueAtX:y: and #atX:y:putValue:
Claus Gittinger <cg@exept.de>
parents: 1628
diff changeset
   132
     && __bothSmallInteger(w, aPixelValue) ) {
7518
de8364635170 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7496
diff changeset
   133
        int _idx;
1634
72ee64fad9fe tuned #valueAtX:y: and #atX:y:putValue:
Claus Gittinger <cg@exept.de>
parents: 1628
diff changeset
   134
7518
de8364635170 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7496
diff changeset
   135
        _idx = (__intVal(w) * __intVal(y)) + __intVal(x);
de8364635170 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7496
diff changeset
   136
        if ((unsigned)_idx < __byteArraySize(b)) {
de8364635170 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7496
diff changeset
   137
            __ByteArrayInstPtr(b)->ba_element[_idx] = __intVal(aPixelValue);
de8364635170 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7496
diff changeset
   138
            RETURN( self );
de8364635170 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7496
diff changeset
   139
        }
1634
72ee64fad9fe tuned #valueAtX:y: and #atX:y:putValue:
Claus Gittinger <cg@exept.de>
parents: 1628
diff changeset
   140
    }
72ee64fad9fe tuned #valueAtX:y: and #atX:y:putValue:
Claus Gittinger <cg@exept.de>
parents: 1628
diff changeset
   141
%}.
3842
e97ae6061e75 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
   142
    "fall back code for nonByteArray or nonInteger arguments"
1634
72ee64fad9fe tuned #valueAtX:y: and #atX:y:putValue:
Claus Gittinger <cg@exept.de>
parents: 1628
diff changeset
   143
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   144
    index := (width * y) + 1 + x.
304f026e10cd Initial revision
claus
parents:
diff changeset
   145
    bytes at:index put:aPixelValue.
304f026e10cd Initial revision
claus
parents:
diff changeset
   146
!
304f026e10cd Initial revision
claus
parents:
diff changeset
   147
3872
390fabbc3036 comments and slight cleanup
Claus Gittinger <cg@exept.de>
parents: 3869
diff changeset
   148
rowAt:y into:aPixelBuffer startingAt:startIndex
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   149
    "fill aPixelBuffer with pixel values from a single row.
7524
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   150
     Notice: row/column coordinates start at 0."
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   151
5851
ce6442599a43 changed: #rowAt:into:startingAt:
Claus Gittinger <cg@exept.de>
parents: 5472
diff changeset
   152
    |srcIdx endIndex n|
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   153
3872
390fabbc3036 comments and slight cleanup
Claus Gittinger <cg@exept.de>
parents: 3869
diff changeset
   154
    bytes notNil ifTrue:[
7524
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   155
        srcIdx := (y * width) + 1.
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   156
        n := width.
5851
ce6442599a43 changed: #rowAt:into:startingAt:
Claus Gittinger <cg@exept.de>
parents: 5472
diff changeset
   157
7524
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   158
        endIndex := srcIdx+width-1.
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   159
        endIndex > bytes size ifTrue:[
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   160
            self assert:(bytes size >= endIndex).
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   161
            endIndex := bytes size.
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   162
            n := endIndex - srcIdx + 1.
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   163
        ].
5851
ce6442599a43 changed: #rowAt:into:startingAt:
Claus Gittinger <cg@exept.de>
parents: 5472
diff changeset
   164
7524
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   165
        aPixelBuffer replaceFrom:startIndex to:startIndex+n-1 with:bytes startingAt:srcIdx.
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   166
        ^ self.
3872
390fabbc3036 comments and slight cleanup
Claus Gittinger <cg@exept.de>
parents: 3869
diff changeset
   167
    ].
390fabbc3036 comments and slight cleanup
Claus Gittinger <cg@exept.de>
parents: 3869
diff changeset
   168
    ^ super rowAt:y into:aPixelBuffer startingAt:startIndex
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   169
5851
ce6442599a43 changed: #rowAt:into:startingAt:
Claus Gittinger <cg@exept.de>
parents: 5472
diff changeset
   170
    "Modified: / 16-02-2012 / 15:58:01 / cg"
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   171
!
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   172
3872
390fabbc3036 comments and slight cleanup
Claus Gittinger <cg@exept.de>
parents: 3869
diff changeset
   173
rowAt:y putAll:pixelArray startingAt:startIndex
7524
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   174
    "store a single row's bits from bits in the pixelArray argument;
780f829a2e1f #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7518
diff changeset
   175
     Notice: row/column coordinates start at 0."
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   176
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   177
    |dstIdx|
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   178
3872
390fabbc3036 comments and slight cleanup
Claus Gittinger <cg@exept.de>
parents: 3869
diff changeset
   179
    dstIdx := (y * width) + 1.
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
   180
    self bits replaceFrom:dstIdx to:dstIdx+width-1 with:pixelArray startingAt:startIndex.
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   181
    ^ pixelArray
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   182
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   183
    "Created: 24.4.1997 / 15:49:42 / cg"
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   184
! !
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
   185
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   186
!Depth8Image methodsFor:'converting'!
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1634
diff changeset
   187
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   188
fromImage:anImage
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   189
    "setup the receiver from another image.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   190
     The code here is tuned for depth 1, 2 and 4 source images;
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   191
     other conversions are done in the superclasses fallBack method."
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   192
2773
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   193
    |srcBytesPerRow "{ Class: SmallInteger }"
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   194
     srcIdx "{ Class: SmallInteger }"
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   195
     dstIdx "{ Class: SmallInteger }"
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   196
     w      "{ Class: SmallInteger }"
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   197
     h      "{ Class: SmallInteger }"
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   198
     srcBuffer dstBuffer srcBytes
3900
2ee04532b466 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3897
diff changeset
   199
     srcDepth map bytes|
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   200
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   201
    srcDepth := anImage depth.
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   202
    (#[1 2 4] includes:srcDepth) ifFalse:[
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   203
        ^ super fromImage:anImage
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   204
    ].
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   205
2773
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   206
    width := w := anImage width.
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   207
    height := h := anImage height.
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   208
    bytes := ByteArray uninitializedNew:(w * h).
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   209
    bitsPerSample := self bitsPerSample.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   210
    samplesPerPixel := self samplesPerPixel.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   211
    self colormapFromImage:anImage.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   212
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   213
    colorMap isNil ifTrue:[
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   214
        "/ if source has no colorMap, more work is needed ...
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   215
        map := #(
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   216
                #[0 16rFF]
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   217
                #[0 16r55 16rAA 16rFF]
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   218
                nil
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   219
                #[16r00 16r11 16r22 16r33 16r44 16r55 16r66 16r77
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   220
                  16r88 16r99 16rAA 16rBB 16rCC 16rDD 16rEE 16rFF]
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   221
               ) at:srcDepth.
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   222
    ].
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   223
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   224
    self mask:anImage mask.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   225
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   226
    "/ only expand & translate pixels
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   227
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   228
    srcBytes := anImage bits.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   229
    srcBytesPerRow := anImage bytesPerRow.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   230
    srcBuffer := ByteArray new:srcBytesPerRow.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   231
2773
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   232
    dstBuffer := ByteArray new:w.
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   233
    srcIdx := 1.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   234
    dstIdx := 1.
3900
2ee04532b466 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3897
diff changeset
   235
    bytes := self bits.
2ee04532b466 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3897
diff changeset
   236
    bytes isNil ifTrue:[
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   237
        self bits:(bytes := ByteArray new:(self bytesPerRow * self height)).
3900
2ee04532b466 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3897
diff changeset
   238
    ].
2773
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   239
    1 to:h do:[:hi |
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   240
        srcBuffer replaceFrom:1 to:srcBytesPerRow with:srcBytes startingAt:srcIdx.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   241
        srcBuffer expandPixels:srcDepth width:w height:1 into:dstBuffer mapping:map.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   242
        bytes replaceFrom:dstIdx to:dstIdx+w-1 with:dstBuffer startingAt:1.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   243
        dstIdx := dstIdx + w.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   244
        srcIdx := srcIdx + srcBytesPerRow.
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   245
    ]
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   246
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   247
    "
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   248
     |i1 i2 i4 i8 i16 i24|
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   249
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   250
     i1 := Image fromFile:'bitmaps/SBrowser.xbm'.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   251
     i2 := Depth2Image fromImage:i1.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   252
     i4 := Depth4Image fromImage:i1.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   253
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   254
     i8 := Depth8Image fromImage:i1.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   255
     i8 inspect.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   256
     i8 := Depth8Image fromImage:i2.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   257
     i8 inspect.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   258
     i8 := Depth8Image fromImage:i4.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   259
     i8 inspect.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   260
    "
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   261
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   262
    "Modified: / 24-04-1997 / 14:01:14 / cg"
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   263
    "Modified: / 30-01-2017 / 19:33:25 / stefan"
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   264
! !
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   265
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   266
!Depth8Image methodsFor:'converting images'!
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   267
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   268
anyImageAsPseudoFormOn:aDevice
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   269
    "return a pseudoForm from the palette picture.
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   270
     The main work is in color reduction, when not all colors can be acquired.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   271
     This method works for any photometric."
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   272
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
   273
    |bytes pseudoBits f gcRound has8BitImage deviceDepth
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   274
     imgMap newImage pixelRow dColors
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   275
     usedColors usageCounts maxIndex map
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   276
     fit scale lastOK error
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   277
     div
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   278
     bitsPerRGB "{Class: SmallInteger }"
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   279
     shift      "{Class: SmallInteger }"
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   280
     m          "{Class: SmallInteger }"
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   281
     mapSize    "{Class: SmallInteger }"
2773
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   282
     cube nR nG nB ditherColors clr|
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   283
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   284
    (cube := aDevice fixColors) notNil ifTrue:[
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   285
        nR := aDevice numFixRed.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   286
        nG := aDevice numFixGreen.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   287
        nB := aDevice numFixBlue.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   288
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   289
        DitherAlgorithm == #floydSteinberg ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   290
            f := self
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   291
                   asFloydSteinbergDitheredDepth8FormOn:aDevice
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   292
                   colors:cube
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   293
                   nRed:nR
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   294
                   nGreen:nG
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   295
                   nBlue:nB.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   296
        ] ifFalse:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   297
            f := self
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   298
                   asNearestPaintDepth8FormOn:aDevice
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   299
                   colors:cube
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   300
                   nRed:nR
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   301
                   nGreen:nG
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   302
                   nBlue:nB.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   303
        ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   304
        f notNil ifTrue:[^ f].
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   305
    ].
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   306
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   307
    "find used colors"
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
   308
    bytes := self bits.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   309
    usedColors := bytes usedValues.    "gets us an array filled with used values"
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   310
                                       "(could use bytes asBag)"
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   311
    maxIndex := usedColors max + 1.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   312
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   313
    usedColors size > 20 ifTrue:[
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   314
        ('Depth8Image [info]: allocating ' , usedColors size printString , ' colors ...') infoPrintCR.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   315
    ].
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   316
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   317
    "sort by usage"
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   318
    usageCounts := bytes usageCounts.
6039
6883ca47d798 Don't do collect:[] as:Array and select:[] as:Array
Stefan Vogel <sv@exept.de>
parents: 6036
diff changeset
   319
    usageCounts := (usedColors collect:[:clr | usageCounts at:(clr + 1)]) asArray.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   320
    usageCounts sort:[:a :b | a > b] with:usedColors.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   321
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   322
    "allocate the colors (in order of usage count)"
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   323
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   324
    imgMap := Array new:maxIndex.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   325
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   326
    "
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   327
     first, try to get the exact colors ...
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   328
    "
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   329
    bitsPerRGB := aDevice bitsPerRGB.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   330
    shift := (8 - bitsPerRGB) negated.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   331
    m := (1 bitShift:bitsPerRGB) - 1.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   332
    div := m asFloat.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   333
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   334
    fit := true.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   335
    scale := 100.0 / div.       "to scale 0..255 into 0.0 .. 100.0"
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   336
    lastOK := 0.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   337
    gcRound := 0.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   338
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   339
    usedColors do:[:aColorIndex |
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   340
        |devColor color
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   341
         mapIndex "{Class: SmallInteger }"|
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   342
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   343
        fit ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   344
            mapIndex := aColorIndex + 1.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   345
            "/ color := colorMap at:mapIndex.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   346
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   347
            color := self colorFromValue:aColorIndex.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   348
            (color isOnDevice:aDevice) ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   349
                "wow - an immediate hit"
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   350
                devColor := color
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   351
            ] ifFalse:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   352
                devColor := color exactOn:aDevice.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   353
                devColor isNil ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   354
                    "
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   355
                     could not allocate color - on the first round, do a GC to flush
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   356
                     unused colors - this may help if some colors where locked by
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   357
                     already free images.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   358
                    "
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   359
                    gcRound == 0 ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   360
                        ObjectMemory scavenge; finalize.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   361
                        devColor := color exactOn:aDevice.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   362
                        gcRound := 1
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   363
                    ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   364
                    devColor isNil ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   365
                        gcRound == 1 ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   366
                            CollectGarbageWhenRunningOutOfColors ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   367
                                'Depth8Image [info]: force GC for possible color reclamation.' infoPrintCR.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   368
                                ObjectMemory incrementalGC; finalize.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   369
                                devColor := color exactOn:aDevice.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   370
                            ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   371
                            gcRound := 2
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   372
                        ]
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   373
                    ]
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   374
                ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   375
            ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   376
            (devColor notNil and:[devColor colorId notNil]) ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   377
                imgMap at:mapIndex put:devColor.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   378
                lastOK := lastOK + 1.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   379
            ] ifFalse:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   380
                fit := false
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   381
            ]
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   382
        ]
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   383
    ].
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   384
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   385
    fit ifFalse:[
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   386
        ('Depth8Image [info]: got %1 exact colors (out of %2)' bindWith:lastOK with:usedColors size) infoPrintCR.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   387
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   388
        DitherAlgorithm == #floydSteinberg ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   389
            dColors := imgMap collect:[:clr | clr isNil ifTrue:[clr]
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   390
                                                        ifFalse:[clr nearestOn:aDevice]].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   391
            dColors := dColors select:[:clr | clr notNil] thenCollect:[:clr | clr exactOn:aDevice].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   392
            dColors := dColors asSet.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   393
            dColors addAll:(aDevice colorMap collect:[:c|c onDevice:aDevice] thenSelect:[:c | c colorId notNil]).
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   394
            ditherColors := aDevice availableDitherColors.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   395
            ditherColors notNil ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   396
                dColors addAll:ditherColors.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   397
            ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   398
            dColors := dColors asArray.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   399
            dColors size > 256 ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   400
                dColors := dColors copyTo:256
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   401
            ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   402
            ^ self asFloydSteinbergDitheredPseudoFormUsing:dColors on:aDevice
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   403
        ].
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   404
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   405
        "
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   406
         again, this time allow wrong colors (loop while increasing allowed error)
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   407
        "
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   408
        error := 1.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   409
        [fit] whileFalse:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   410
            fit := true.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   411
            usedColors from:(lastOK+1) to:(usedColors size) do:[:aColorIndex |
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   412
                |devColor color
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   413
                 r        "{Class: SmallInteger }"
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   414
                 g        "{Class: SmallInteger }"
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   415
                 b        "{Class: SmallInteger }"
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   416
                 mapIndex "{Class: SmallInteger }"
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   417
                 rMask    "{Class: SmallInteger }"
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   418
                 gMask    "{Class: SmallInteger }"
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   419
                 bMask    "{Class: SmallInteger }"|
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   420
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   421
                fit ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   422
                    gMask := bMask := rMask := m.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   423
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   424
                    mapIndex := aColorIndex + 1.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   425
                    "/ color := colorMap at:mapIndex.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   426
                    color := self colorFromValue:aColorIndex.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   427
                    r := (color red * 255 / 100.0) rounded.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   428
                    g := (color green * 255 / 100.0) rounded.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   429
                    b := (color blue * 255 / 100.0) rounded.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   430
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   431
                    color := Color red:((r bitShift:shift) bitAnd:rMask) * scale
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   432
                                 green:((g bitShift:shift) bitAnd:gMask) * scale
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   433
                                  blue:((b bitShift:shift) bitAnd:bMask) * scale.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   434
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   435
                    (color isOnDevice:aDevice) ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   436
                        "wow - an immediate hit"
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   437
                        devColor := color.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   438
                    ] ifFalse:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   439
                        devColor := color nearestOn:aDevice.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   440
                        (devColor notNil and:[(devColor deltaFrom:color) > error]) ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   441
                            devColor := nil
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   442
                        ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   443
                        devColor isNil ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   444
                            "
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   445
                             no free color - on the first round, do a GC to flush unused
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   446
                             colors - this may help if some colors where locked by already
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   447
                             free images.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   448
                            "
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   449
                            gcRound == 0 ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   450
                                ObjectMemory scavenge; finalize.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   451
                                devColor := color nearestOn:aDevice.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   452
                                (devColor notNil and:[(devColor deltaFrom:color) > error]) ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   453
                                    devColor := nil
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   454
                                ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   455
                                gcRound := 1
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   456
                            ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   457
                            devColor isNil ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   458
                                gcRound == 1 ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   459
                                    CollectGarbageWhenRunningOutOfColors ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   460
                                        'Depth8Image [info]: force GC for possible color reclamation.' infoPrintCR.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   461
                                        ObjectMemory incrementalGC; finalize.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   462
                                        devColor := color nearestOn:aDevice.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   463
                                        (devColor notNil and:[(devColor deltaFrom:color) > error]) ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   464
                                            devColor := nil
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   465
                                        ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   466
                                    ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   467
                                    gcRound := 2
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   468
                                ]
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   469
                            ]
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   470
                        ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   471
                    ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   472
                    (devColor notNil and:[devColor colorId notNil]) ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   473
                        imgMap at:mapIndex put:devColor.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   474
                        lastOK := lastOK + 1.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   475
                    ] ifFalse:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   476
                        fit := false
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   477
                    ]
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   478
                ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   479
            ].
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   480
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   481
            fit ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   482
                ('Depth8Image [info]: remaining colors with error <= %1' bindWith:error) infoPrintCR.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   483
            ].
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   484
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   485
            error := error * 2.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   486
            error > 100 ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   487
                "
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   488
                 break out, if the error becomes too big.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   489
                "
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   490
                'Depth8Image [info]: hard color allocation problem - revert to b&w for remaining colors' infoPrintCR.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   491
                "
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   492
                 map to b&w as a last fallback.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   493
                 (should really do a dither here)
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   494
                "
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   495
                usedColors from:(lastOK+1) to:(usedColors size) do:[:aColorIndex |
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   496
                    |color
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   497
                     mapIndex "{ Class: SmallInteger }"|
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   498
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   499
                    mapIndex := aColorIndex + 1.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   500
                    "/ color := colorMap at:mapIndex.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   501
                    color := self colorFromValue:aColorIndex.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   502
                    color brightness > 0.4 ifTrue:[
7424
79d2310a0c43 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7407
diff changeset
   503
                        color := aDevice whiteColor.
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   504
                    ] ifFalse:[
7424
79d2310a0c43 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7407
diff changeset
   505
                        color := aDevice blackColor.
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   506
                    ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   507
                    imgMap at:mapIndex put:(color onDevice:aDevice).
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   508
                ].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   509
                fit := true.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   510
            ]
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   511
        ].
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   512
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   513
        error > 10 ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   514
            'Depth8Image [info]: not enough colors for a reasonable image' infoPrintCR
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   515
        ] ifFalse:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   516
            'Depth8Image [info]: not enough colors for exact picture' infoPrintCR.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   517
        ]
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   518
    ].
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   519
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   520
    "
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   521
     create translation map (from image colors to allocated colorIds)
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   522
    "
2773
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   523
    mapSize := imgMap size.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   524
    map := ByteArray new:256.
2773
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
   525
    1 to:mapSize do:[:i |
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   526
        (clr := imgMap at:i) notNil ifTrue:[
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   527
            map at:i put:clr colorId
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   528
        ]
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   529
    ].
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   530
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   531
    "
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   532
     does the device support 8-bit images ?
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   533
    "
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   534
    deviceDepth := aDevice depth.
2529
637a5979a3d0 use new supportedImageFormat query from Device
Claus Gittinger <cg@exept.de>
parents: 2401
diff changeset
   535
    has8BitImage := (deviceDepth == 8)
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   536
                    or:[ (aDevice supportedImageFormatForDepth:8) notNil ].
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   537
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   538
    "
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   539
     finally, create a form on the device and copy (& translate)
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   540
     the pixel values
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   541
    "
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   542
    has8BitImage ifTrue:[
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   543
        pseudoBits := ByteArray uninitializedNew:(width * height).
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   544
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   545
        bytes
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   546
            expandPixels:8         "xlate only"
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   547
            width:width height:height
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   548
            into:pseudoBits
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   549
            mapping:map.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   550
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   551
        map := nil.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   552
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   553
        f := Form imageForm width:width height:height depth:deviceDepth onDevice:aDevice.
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   554
        f isNil ifTrue:[^ nil].
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   555
        f colorMap:imgMap.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   556
        aDevice
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   557
            drawBits:pseudoBits
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   558
            bitsPerPixel:8
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   559
            depth:deviceDepth
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   560
            padding:8
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   561
            width:width height:height
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   562
            x:0 y:0
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   563
            into:(f id) x:0 y:0
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   564
            width:width height:height
7754
2aac86a2c288 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 7597
diff changeset
   565
            with:(f initGC).
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   566
        ^ f
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   567
    ].
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   568
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   569
    "
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   570
     slow fall back: convert into appropriate depth image,
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   571
     by looping over each pixel individually
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   572
    "
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   573
    newImage := (Image implementorForDepth:deviceDepth) new.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   574
    newImage width:width.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   575
    newImage height:height.
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   576
    newImage bits:(ByteArray uninitializedNew:(height * newImage bytesPerRow)).
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   577
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   578
    0 to:height-1 do:[:row |
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   579
        pixelRow := self rowAt:row.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   580
        pixelRow
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   581
            expandPixels:8         "xlate only"
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   582
            width:width
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   583
            height:1
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   584
            into:pixelRow
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   585
            mapping:map.
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   586
        newImage rowAt:row putAll:pixelRow
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   587
    ].
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   588
4783
717a41ef31e4 Change senders of obsolete messages Form>>...on: to ...onDevice:
Stefan Vogel <sv@exept.de>
parents: 4764
diff changeset
   589
    f := Form width:width height:height depth:deviceDepth onDevice:aDevice.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   590
    f isNil ifTrue:[^ nil].
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   591
    f colorMap:imgMap.
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   592
1998
606d0a877d4e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1997
diff changeset
   593
    aDevice
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   594
        drawBits:(newImage bits)
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   595
        depth:deviceDepth
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   596
        padding:8
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   597
        width:width height:height
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   598
        x:0 y:0
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   599
        into:(f id) x:0 y:0
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
   600
        width:width height:height
7754
2aac86a2c288 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 7597
diff changeset
   601
        with:(f initGC).
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   602
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   603
    ^ f
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   604
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   605
    "Modified: / 15-10-1997 / 01:48:20 / cg"
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   606
    "Created: / 19-10-1997 / 04:57:05 / cg"
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
   607
    "Modified (comment): / 30-01-2017 / 21:00:08 / stefan"
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   608
!
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1922
diff changeset
   609
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   610
anyImageAsTrueColorFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   611
    "return a true-color device-form for the receiver.
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   612
     Supports true color devices with depths: 8, 16, 24 and 32"
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   613
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   614
    |depth
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   615
     colorValues
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   616
     form imageBits bestFormat usedDeviceDepth usedDeviceBitsPerPixel
3851
34637f468b2a also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 3842
diff changeset
   617
     usedDevicePadding usedDeviceBytesPerRow padd|
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   618
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   619
    depth := aDevice depth.
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   620
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   621
    "/ gather r/g/b values for all colors in the map ...
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   622
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   623
    colorValues := self rgbColormapFor:aDevice.
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   624
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   625
    bestFormat := self bestSupportedImageFormatFor:aDevice.
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   626
    usedDeviceDepth := bestFormat at:#depth.
2864
dd151bfdff9d care for deep devices which do not support deep bitmaps
Claus Gittinger <cg@exept.de>
parents: 2835
diff changeset
   627
    usedDeviceDepth == 1 ifTrue:[
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   628
        ^ self asMonochromeFormOn:aDevice
2864
dd151bfdff9d care for deep devices which do not support deep bitmaps
Claus Gittinger <cg@exept.de>
parents: 2835
diff changeset
   629
    ].
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   630
    usedDeviceBitsPerPixel := bestFormat at:#bitsPerPixel.
1994
2f12026904e3 oops - care for image padding
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
   631
    usedDevicePadding := bestFormat at:#padding.
2f12026904e3 oops - care for image padding
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
   632
2006
a80384aa337f oops - padding stuff was wrong (16-bit display)
tz
parents: 1998
diff changeset
   633
    usedDeviceBytesPerRow := self class bytesPerRowForWidth:width depth:usedDeviceBitsPerPixel padding:usedDevicePadding.
a80384aa337f oops - padding stuff was wrong (16-bit display)
tz
parents: 1998
diff changeset
   634
    padd := usedDeviceBytesPerRow -( self class bytesPerRowForWidth:width depth:usedDeviceBitsPerPixel padding:8).
1994
2f12026904e3 oops - care for image padding
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
   635
    imageBits := ByteArray uninitializedNew:(usedDeviceBytesPerRow * height).
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   636
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   637
    "/ for now, only support some depths
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   638
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   639
    usedDeviceBitsPerPixel == 16 ifTrue:[
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   640
        "/ 16 bits/pixel
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   641
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   642
        "/ now, walk over the image and replace
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   643
        "/ colorMap indices by color values in the bits array
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   644
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   645
%{
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   646
        unsigned char *srcPtr = 0;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   647
        unsigned char *dstPtr = 0;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   648
        OBJ _bytes = __INST(bytes);
3851
34637f468b2a also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 3842
diff changeset
   649
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   650
        if (__isByteArrayLike(_bytes)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   651
            srcPtr = __ByteArrayInstPtr(_bytes)->ba_element;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   652
        } else {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   653
            if (__isExternalBytesLike(_bytes)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   654
                srcPtr = __externalBytesAddress(_bytes);
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   655
            }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   656
        }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   657
        if (__isByteArray(imageBits)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   658
            dstPtr = __ByteArrayInstPtr(imageBits)->ba_element;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   659
        } else {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   660
            if (__isExternalBytesLike(imageBits)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   661
                dstPtr = __externalBytesAddress(imageBits);
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   662
            }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   663
        }
3851
34637f468b2a also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 3842
diff changeset
   664
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   665
        if (__bothSmallInteger(__INST(height), __INST(width))
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   666
         && __isArrayLike(colorValues)
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   667
         && srcPtr
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   668
         && dstPtr) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   669
            int r,p;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   670
            int x, y, w, h, nPix;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   671
            unsigned short pixels[256];
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   672
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   673
            OBJ *ap = __ArrayInstPtr(colorValues)->a_element;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   674
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   675
            nPix = __arraySize(colorValues);
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   676
            for (p=0; p<nPix; p++) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   677
                pixels[p] = __intVal(ap[p]);
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   678
            }
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   679
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   680
            w = __intVal(__INST(width));
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   681
            h = __intVal(__INST(height));
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   682
            r = w;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   683
            p = __intVal(padd);
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   684
            nPix = w * h;
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   685
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   686
            while (nPix > 0) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   687
                unsigned idx, v;
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   688
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   689
                if (((unsigned INT)srcPtr & 3) == 0) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   690
                    unsigned INT idx4;
2296
bc86cd7968d7 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2295
diff changeset
   691
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   692
                    while (r > 4) {
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   693
#ifdef __MSBFIRST
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   694
                        idx4 = ((unsigned int *)srcPtr)[0];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   695
                        v = pixels[(idx4 >> 24) & 0xFF];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   696
                        ((short *)dstPtr)[0] = v;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   697
                        v = pixels[(idx4 >> 16) & 0xFF];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   698
                        ((short *)dstPtr)[1] = v;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   699
                        v = pixels[(idx4 >> 8) & 0xFF];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   700
                        ((short *)dstPtr)[2] = v;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   701
                        v = pixels[idx4 & 0xFF];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   702
                        ((short *)dstPtr)[3] = v;
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   703
#else
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   704
# ifdef __LSBFIRST
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   705
                        idx4 = ((unsigned int *)srcPtr)[0];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   706
                        v = pixels[idx4 & 0xFF];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   707
                        dstPtr[0] = (v>>8) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   708
                        dstPtr[1] = (v) & 0xFF;
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   709
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   710
                        v = pixels[(idx4 >> 8) & 0xFF];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   711
                        dstPtr[2] = (v>>8) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   712
                        dstPtr[3] = (v) & 0xFF;
2786
a6a053ee4c76 oops - image bug fix for hpux (MSB but __MSBFIRST not defined)
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   713
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   714
                        v = pixels[(idx4 >> 16) & 0xFF];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   715
                        dstPtr[4] = (v>>8) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   716
                        dstPtr[5] = (v) & 0xFF;
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   717
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   718
                        v = pixels[(idx4 >> 24) & 0xFF];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   719
                        dstPtr[6] = (v>>8) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   720
                        dstPtr[7] = (v) & 0xFF;
2786
a6a053ee4c76 oops - image bug fix for hpux (MSB but __MSBFIRST not defined)
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   721
# else /* unknown/unspecified - code below works on any machine */
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   722
                        idx = srcPtr[0];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   723
                        v = pixels[idx];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   724
                        dstPtr[0] = (v>>8) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   725
                        dstPtr[1] = (v) & 0xFF;
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   726
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   727
                        idx = srcPtr[1];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   728
                        v = pixels[idx];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   729
                        dstPtr[2] = (v>>8) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   730
                        dstPtr[3] = (v) & 0xFF;
2786
a6a053ee4c76 oops - image bug fix for hpux (MSB but __MSBFIRST not defined)
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   731
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   732
                        idx = srcPtr[2];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   733
                        v = pixels[idx];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   734
                        dstPtr[4] = (v>>8) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   735
                        dstPtr[5] = (v) & 0xFF;
2786
a6a053ee4c76 oops - image bug fix for hpux (MSB but __MSBFIRST not defined)
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   736
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   737
                        idx = srcPtr[3];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   738
                        v = pixels[idx];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   739
                        dstPtr[6] = (v>>8) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   740
                        dstPtr[7] = (v) & 0xFF;
2786
a6a053ee4c76 oops - image bug fix for hpux (MSB but __MSBFIRST not defined)
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
   741
# endif
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   742
#endif
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   743
                        r -= 4;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   744
                        dstPtr += 8;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   745
                        nPix -= 4;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   746
                        srcPtr +=4;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   747
                    }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   748
                }
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   749
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   750
                nPix--;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   751
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   752
                idx = *srcPtr++;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   753
                v = pixels[idx];
2401
025c115d121a mips (MSBFIRST) fixes
Claus Gittinger <cg@exept.de>
parents: 2296
diff changeset
   754
#ifdef __MSBFIRST
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   755
                ((short *)dstPtr)[0] = v;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   756
#else
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   757
                dstPtr[0] = (v>>8) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   758
                dstPtr[1] = (v) & 0xFF;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   759
#endif
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   760
                dstPtr += 2;
1994
2f12026904e3 oops - care for image padding
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
   761
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   762
                if (--r == 0) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   763
                    dstPtr += p;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   764
                    r = w;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   765
                }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   766
            }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   767
        }
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   768
%}.
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   769
    ] ifFalse:[
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   770
        usedDeviceBitsPerPixel == 32 ifTrue:[
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   771
            "/ 32 bits/pixel
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   772
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   773
            "/ now, walk over the image and replace
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   774
            "/ colorMap indices by color values in the bits array
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   775
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   776
%{
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   777
            unsigned char *srcPtr = 0;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   778
            unsigned char *dstPtr = 0;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   779
            OBJ _bytes = __INST(bytes);
3851
34637f468b2a also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 3842
diff changeset
   780
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   781
            if (__isByteArrayLike(_bytes)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   782
                srcPtr = __ByteArrayInstPtr(_bytes)->ba_element;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   783
            } else {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   784
                if (__isExternalBytesLike(_bytes)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   785
                    srcPtr = __externalBytesAddress(_bytes);
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   786
                }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   787
            }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   788
            if (__isByteArray(imageBits)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   789
                dstPtr = __ByteArrayInstPtr(imageBits)->ba_element;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   790
            } else {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   791
                if (__isExternalBytesLike(imageBits)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   792
                    dstPtr = __externalBytesAddress(imageBits);
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   793
                }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   794
            }
3851
34637f468b2a also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 3842
diff changeset
   795
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   796
            if (__bothSmallInteger(__INST(height), __INST(width))
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   797
             && __isArrayLike(colorValues)
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   798
             && srcPtr
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   799
             && dstPtr) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   800
                int x, y, w, h, nPix;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   801
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   802
                OBJ *ap = __ArrayInstPtr(colorValues)->a_element;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   803
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   804
                w = __intVal(__INST(width));
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   805
                h = __intVal(__INST(height));
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   806
                nPix = w * h;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   807
                while (nPix > 0) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   808
                    unsigned idx, v;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   809
                    OBJ clr;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   810
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   811
                    idx = *srcPtr;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   812
                    clr = ap[idx];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   813
                    v = __intVal(clr);
2401
025c115d121a mips (MSBFIRST) fixes
Claus Gittinger <cg@exept.de>
parents: 2296
diff changeset
   814
#ifdef __MSBFIRST
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   815
                    ((long *)dstPtr)[0] = v;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   816
#else
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   817
                    dstPtr[0] = (v>>24) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   818
                    dstPtr[1] = (v>>16) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   819
                    dstPtr[2] = (v>>8) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   820
                    dstPtr[3] = (v) & 0xFF;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   821
#endif
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   822
                    dstPtr += 4;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   823
                    srcPtr += 1;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   824
                    nPix--;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   825
                }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   826
            }
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   827
%}.
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   828
        ] ifFalse:[
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   829
            usedDeviceBitsPerPixel == 8 ifTrue:[
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   830
                "/ 8 bits/pixel
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   831
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   832
                "/ now, walk over the image and replace
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   833
                "/ colorMap indices by color values in the bits array
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   834
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   835
%{
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   836
                unsigned char *srcPtr = 0;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   837
                unsigned char *dstPtr = 0;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   838
                OBJ _bytes = __INST(bytes);
3851
34637f468b2a also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 3842
diff changeset
   839
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   840
                if (__isByteArrayLike(_bytes)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   841
                    srcPtr = __ByteArrayInstPtr(_bytes)->ba_element;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   842
                } else {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   843
                    if (__isExternalBytesLike(_bytes)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   844
                        srcPtr = __externalBytesAddress(_bytes);
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   845
                    }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   846
                }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   847
                if (__isByteArray(imageBits)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   848
                    dstPtr = __ByteArrayInstPtr(imageBits)->ba_element;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   849
                } else {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   850
                    if (__isExternalBytesLike(imageBits)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   851
                        dstPtr = __externalBytesAddress(imageBits);
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   852
                    }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   853
                }
3851
34637f468b2a also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 3842
diff changeset
   854
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   855
                if (__bothSmallInteger(__INST(height), __INST(width))
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   856
                 && __isArrayLike(colorValues)
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   857
                 && srcPtr
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   858
                 && dstPtr) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   859
                    int x, y, w, h, nPix;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   860
                    int r,p;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   861
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   862
                    OBJ *ap = __ArrayInstPtr(colorValues)->a_element;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   863
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   864
                    w = __intVal(__INST(width));
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   865
                    h = __intVal(__INST(height));
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   866
                    r = w;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   867
                    p = __intVal(padd);
1994
2f12026904e3 oops - care for image padding
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
   868
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   869
                    nPix = w * h;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   870
                    while (nPix > 0) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   871
                        unsigned idx, v;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   872
                        OBJ clr;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   873
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   874
                        idx = *srcPtr;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   875
                        clr = ap[idx];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   876
                        v = __intVal(clr);
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   877
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   878
                        dstPtr[0] = v;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   879
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   880
                        dstPtr += 1;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   881
                        srcPtr += 1;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   882
                        nPix--;
1994
2f12026904e3 oops - care for image padding
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
   883
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   884
                        if (--r == 0) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   885
                          dstPtr += p;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   886
                          r = w;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   887
                        }
1994
2f12026904e3 oops - care for image padding
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
   888
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   889
                    }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   890
                }
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   891
%}.
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   892
            ] ifFalse:[
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   893
                usedDeviceBitsPerPixel == 24 ifTrue:[
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   894
                    "/ 24 bits/pixel
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   895
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   896
                    "/ now, walk over the image and replace
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   897
                    "/ colorMap indices by color values in the bits array
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   898
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   899
%{
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   900
                    unsigned char *srcPtr = 0;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   901
                    unsigned char *dstPtr = 0;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   902
                    OBJ _bytes = __INST(bytes);
3851
34637f468b2a also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 3842
diff changeset
   903
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   904
                    if (__isByteArrayLike(_bytes)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   905
                        srcPtr = __ByteArrayInstPtr(_bytes)->ba_element;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   906
                    } else {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   907
                        if (__isExternalBytesLike(_bytes)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   908
                            srcPtr = __externalBytesAddress(_bytes);
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   909
                        }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   910
                    }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   911
                    if (__isByteArray(imageBits)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   912
                        dstPtr = __ByteArrayInstPtr(imageBits)->ba_element;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   913
                    } else {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   914
                        if (__isExternalBytesLike(imageBits)) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   915
                            dstPtr = __externalBytesAddress(imageBits);
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   916
                        }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   917
                    }
3851
34637f468b2a also handle subclasses of ExternalBytes (Mapped..)
Claus Gittinger <cg@exept.de>
parents: 3842
diff changeset
   918
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   919
                    if (__bothSmallInteger(__INST(height), __INST(width))
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   920
                     && __isArrayLike(colorValues)
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   921
                     && srcPtr
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   922
                     && dstPtr) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   923
                        int x, y, w, h, nPix;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   924
                        int r,p;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   925
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   926
                        OBJ *ap = __ArrayInstPtr(colorValues)->a_element;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   927
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   928
                        w = __intVal(__INST(width));
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   929
                        h = __intVal(__INST(height));
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   930
                        r = w;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   931
                        p = __intVal(padd);
1994
2f12026904e3 oops - care for image padding
Claus Gittinger <cg@exept.de>
parents: 1932
diff changeset
   932
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   933
                        nPix = w * h;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   934
                        while (nPix > 0) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   935
                            unsigned idx, v;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   936
                            OBJ clr;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   937
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   938
                            idx = *srcPtr;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   939
                            clr = ap[idx];
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   940
                            v = __intVal(clr);
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   941
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   942
                            dstPtr[0] = (v>>16) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   943
                            dstPtr[1] = (v>>8) & 0xFF;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   944
                            dstPtr[2] = (v) & 0xFF;
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   945
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   946
                            dstPtr += 3;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   947
                            srcPtr += 1;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   948
                            nPix--;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   949
                            if (--r == 0) {
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   950
                              dstPtr += p;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   951
                              r = w;
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   952
                            }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   953
                        }
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   954
                    }
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   955
%}.
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   956
                ]
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   957
            ]
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   958
        ]
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   959
    ].
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   960
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   961
    imageBits isNil ifTrue:[
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   962
        'Image [warning]: unimplemented trueColor depth in paletteImageAsTrueColorFormOn: ' errorPrint. usedDeviceBitsPerPixel errorPrintCR.
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   963
        ^ self asMonochromeFormOn:aDevice
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   964
    ].
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   965
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   966
    form := Form imageForm width:width height:height depth:usedDeviceDepth onDevice:aDevice.
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   967
    form isNil ifTrue:[^ nil].
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   968
    form initGC.
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   969
1997
9981ce9722f4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1994
diff changeset
   970
    form
7496
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   971
        copyBitsFrom:imageBits
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   972
        bitsPerPixel:usedDeviceBitsPerPixel
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   973
        depth:usedDeviceDepth
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   974
        padding:usedDevicePadding
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   975
        width:width height:height
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   976
        x:0 y:0
b13b7aa23e62 #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7424
diff changeset
   977
        toX:0 y:0.
1603
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   978
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   979
    ^ form
8697ffae0880 moved #paletteImageAsTrueColorForm from Image
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   980
4764
80e412455815 ...:on: -> ...:onDevice:
Claus Gittinger <cg@exept.de>
parents: 4724
diff changeset
   981
    "Created: / 20-10-1995 / 22:05:10 / cg"
80e412455815 ...:on: -> ...:onDevice:
Claus Gittinger <cg@exept.de>
parents: 4724
diff changeset
   982
    "Modified: / 29-05-2007 / 19:22:06 / cg"
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   983
!
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   984
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   985
asGray8FormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   986
    "return an 8-bit greyForm from the 8-bit receiver image.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   987
     Redefined, since only a translation has to be done here."
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   988
2774
fff1f399e362 unused variable removed
Claus Gittinger <cg@exept.de>
parents: 2773
diff changeset
   989
    |greyBits map|
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   990
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   991
    greyBits := ByteArray uninitializedNew:(width * height).
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   992
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   993
    map := ByteArray uninitializedNew:256.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   994
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   995
    1 to:256 do:[:i |
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
   996
	map at:i put:((self colorFromValue:(i-1)) brightness * 255) rounded
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   997
    ].
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
   998
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
   999
    self bits
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1000
	expandPixels:8         "xlate only"
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1001
	width:width
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1002
	height:height
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1003
	into:greyBits
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1004
	mapping:map.
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1005
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1006
    ^ self makeDeviceGrayPixmapOn:aDevice depth:8 fromArray:greyBits
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1007
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1008
    "Modified: 10.6.1996 / 20:10:14 / cg"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1009
    "Created: 14.6.1996 / 15:23:09 / cg"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1010
!
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1011
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1012
asGrayFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1013
    "get a gray device form.
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1014
     Redefined, since we can do it with simple translate,
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1015
     if the depth matches my depth."
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1016
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1017
    (aDevice visualType == #StaticGray) ifTrue:[
2786
a6a053ee4c76 oops - image bug fix for hpux (MSB but __MSBFIRST not defined)
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
  1018
	(aDevice depth == 8) ifTrue:[
a6a053ee4c76 oops - image bug fix for hpux (MSB but __MSBFIRST not defined)
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
  1019
	    ^ self asGray8FormOn:aDevice
a6a053ee4c76 oops - image bug fix for hpux (MSB but __MSBFIRST not defined)
Claus Gittinger <cg@exept.de>
parents: 2774
diff changeset
  1020
	].
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1021
    ].
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1022
    ^ super asGrayFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1023
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1024
    "Created: 10.6.1996 / 18:51:19 / cg"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1025
    "Modified: 10.6.1996 / 18:54:36 / cg"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1026
!
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1027
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1028
greyImageAsPseudoFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1029
    "return a pseudoForm from the gray picture. The main work is
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
  1030
     in color reduction, when not all colors can be acquired."
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1031
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1032
    ^ self anyImageAsPseudoFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1033
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1034
    "Modified: 19.10.1997 / 04:57:39 / cg"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1035
    "Created: 19.10.1997 / 04:58:41 / cg"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1036
!
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1037
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1038
greyImageAsTrueColorFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1039
    "return a true-color device-form for the grey-image receiver.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1040
     Supports true color devices with depths: 8, 16, 24 and 32"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1041
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1042
    |f|
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1043
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1044
    f := self anyImageAsTrueColorFormOn:aDevice.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1045
    f notNil ifTrue:[^ f].
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1046
    ^ super greyImageAsTrueColorFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1047
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1048
    "Created: / 29.7.1998 / 00:19:46 / cg"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1049
!
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1050
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1051
paletteImageAsPseudoFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1052
    "return a pseudoForm from the palette picture. The main work is
7407
42d2b51f3c19 #OTHER by mawalch
mawalch
parents: 7361
diff changeset
  1053
     in color reduction, when not all colors can be acquired."
2202
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1054
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1055
    ^ self anyImageAsPseudoFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1056
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1057
    "Modified: 19.10.1997 / 04:57:39 / cg"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1058
!
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1059
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1060
paletteImageAsTrueColorFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1061
    "return a true-color device-form for the palette-image receiver.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1062
     Supports true color devices with depths: 8, 16, 24 and 32"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1063
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1064
    |f|
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1065
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1066
    f := self anyImageAsTrueColorFormOn:aDevice.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1067
    f notNil ifTrue:[^ f].
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1068
    ^ super paletteImageAsTrueColorFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1069
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1070
    "Created: / 24.7.1998 / 01:20:46 / cg"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1071
    "Modified: / 29.7.1998 / 00:19:27 / cg"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1072
!
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1073
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1074
rgbImageAsTrueColorFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1075
    "return a true-color device-form for the rgb-image receiver.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1076
     Supports true color devices with depths: 8, 16, 24 and 32"
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1077
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1078
    |f|
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1079
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1080
    f := self anyImageAsTrueColorFormOn:aDevice.
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1081
    f notNil ifTrue:[^ f].
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1082
    ^ super rgbImageAsTrueColorFormOn:aDevice
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1083
03d4cf38f4a5 tuned conversion to rgb-device form
Claus Gittinger <cg@exept.de>
parents: 2184
diff changeset
  1084
    "Created: / 29.7.1998 / 00:21:25 / cg"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1085
! !
304f026e10cd Initial revision
claus
parents:
diff changeset
  1086
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1087
!Depth8Image methodsFor:'dither helpers'!
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1088
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1089
floydSteinbergDitheredDepth8BitsColors:colors map:aMapOrNil
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1090
    "return a floyd-steinberg dithered bitmap from the receiver picture,
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1091
     which must be a depth-8 image.
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1092
     This method expects an array of colors to be used for dithering
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1093
     (which need not be a colorCubes colors)."
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1094
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1095
    |pseudoBits
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1096
     rgbBytes
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1097
     ditherRGBBytes ditherColors
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1098
     w       "{Class: SmallInteger }"
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1099
     h       "{Class: SmallInteger }"
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1100
     index   "{Class: SmallInteger }"
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1101
     lookupPos "{Class: SmallInteger }"
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1102
     ditherIds failed lastColor qScramble
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1103
     clrLookup error clr|
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1104
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1105
    "/
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1106
    "/ collect color components as integer values (for integer arithmetic)
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1107
    "/
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1108
    rgbBytes := ByteArray uninitializedNew:256 * 3.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1109
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1110
    photometric == #palette ifTrue:[
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1111
        lastColor := colorMap size - 1
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1112
    ] ifFalse:[
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1113
        lastColor := 255.
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1114
    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1115
    index := 1.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1116
    0 to:lastColor do:[:pix |
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1117
        clr := self colorFromValue:pix.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1118
        rgbBytes at:index put:(clr redByte).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1119
        rgbBytes at:index+1 put:(clr greenByte).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1120
        rgbBytes at:index+2 put:(clr blueByte).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1121
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1122
        index := index + 3.
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1123
    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1124
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1125
    "/ collect valid ditherColors ...
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1126
    aMapOrNil isNil ifTrue:[
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1127
        ditherColors := colors select:[:clr | clr notNil].
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1128
    ] ifFalse:[
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1129
        ditherColors := colors
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1130
    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1131
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1132
    "/ ... and sort by manhatten distance from black
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1133
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1134
    qScramble := #(
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1135
                "/  2rX00X00X00X00
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1136
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1137
                    2r000000000000    "/ 0
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1138
                    2r000000000100    "/ 1
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1139
                    2r000000100000    "/ 2
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1140
                    2r000000100100    "/ 3
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1141
                    2r000100000000    "/ 4
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1142
                    2r000100000100    "/ 5
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1143
                    2r000100100000    "/ 6
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1144
                    2r000100100100    "/ 7
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1145
                    2r100000000000    "/ 8
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1146
                    2r100000000100    "/ 9
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1147
                    2r100000100000    "/ a
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1148
                    2r100000100100    "/ b
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1149
                    2r100100000000    "/ c
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1150
                    2r100100000100    "/ d
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1151
                    2r100100100000    "/ e
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1152
                    2r100100100100    "/ f
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1153
                  ).
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1154
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1155
    ditherColors := ditherColors sort:[:a :b |
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1156
                                |cr "{Class: SmallInteger }"
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1157
                                 cg "{Class: SmallInteger }"
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1158
                                 cb "{Class: SmallInteger }"
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1159
                                 i1 "{Class: SmallInteger }"
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1160
                                 i2 "{Class: SmallInteger }"|
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1161
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1162
                                cr := a redByte.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1163
                                cg := a greenByte.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1164
                                cb := a blueByte.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1165
                                i1 := qScramble at:((cr bitShift:-4) bitAnd:16r0F) + 1.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1166
                                i1 := i1 + ((qScramble at:((cg bitShift:-4) bitAnd:16r0F) + 1) bitShift:-1).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1167
                                i1 := i1 + ((qScramble at:((cb bitShift:-4) bitAnd:16r0F) + 1) bitShift:-2).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1168
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1169
                                cr := b redByte.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1170
                                cg := b greenByte.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1171
                                cb := b blueByte.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1172
                                i2 := qScramble at:((cr bitShift:-4) bitAnd:16r0F) + 1.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1173
                                i2 := i2 + ((qScramble at:((cg bitShift:-4) bitAnd:16r0F) + 1) bitShift:-1).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1174
                                i2 := i2 + ((qScramble at:((cb bitShift:-4) bitAnd:16r0F) + 1) bitShift:-2).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1175
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1176
                                i1 < i2
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1177
                    ].
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1178
    aMapOrNil isNil ifTrue:[
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1179
        ditherIds := (ditherColors asArray collect:[:clr | clr colorId]) asByteArray.
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1180
    ] ifFalse:[
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1181
        ditherIds := aMapOrNil asByteArray
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1182
    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1183
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1184
    "/ build an index table, for fast lookup from manhatten-r-g-b distance
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1185
    "/ to the position in the colorList
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1186
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1187
    clrLookup := ByteArray new:(4096).
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1188
    index := 0.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1189
    ditherColors keysAndValuesDo:[:clrPosition :clr |
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1190
        |r g b i|
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1191
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1192
        r := clr redByte.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1193
        g := clr greenByte.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1194
        b := clr blueByte.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1195
        i := qScramble at:((r bitShift:-4) bitAnd:16r0F) + 1.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1196
        i := i + ((qScramble at:((g bitShift:-4) bitAnd:16r0F) + 1) bitShift:-1).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1197
        i := i + ((qScramble at:((b bitShift:-4) bitAnd:16r0F) + 1) bitShift:-2).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1198
        lookupPos := i.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1199
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1200
        index+1 to:lookupPos do:[:idx|
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1201
            clrLookup at:idx put:(clrPosition-1-1).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1202
        ].
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1203
        index := lookupPos.
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1204
    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1205
    clrLookup from:index+1 to:4096 put:(ditherColors size - 1).
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1206
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1207
"/    [index <= (4095)] whileTrue:[
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1208
"/        clrLookup at:(index+1) put:(ditherColors size - 1).
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1209
"/        index := index + 1.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1210
"/    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1211
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1212
    "/ collect ditherColor components
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1213
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1214
    lastColor := ditherColors size.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1215
    ditherIds := ByteArray uninitializedNew:lastColor.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1216
    ditherRGBBytes := ByteArray uninitializedNew:(lastColor * 3).
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1217
    index := 1.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1218
    1 to:lastColor do:[:pix |
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1219
        clr := ditherColors at:pix.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1220
        ditherRGBBytes at:index put:(clr redByte).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1221
        ditherRGBBytes at:index+1 put:(clr greenByte).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1222
        ditherRGBBytes at:index+2 put:(clr blueByte).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1223
        aMapOrNil isNil ifTrue:[
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1224
            ditherIds at:pix put:clr colorId.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1225
        ] ifFalse:[
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1226
            ditherIds at:pix put:(aMapOrNil at:pix).
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1227
        ].
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1228
        index := index + 3.
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1229
    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1230
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1231
    pseudoBits := ByteArray uninitializedNew:(width * height).
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1232
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1233
    w := width + 2.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1234
    error := ByteArray uninitializedNew:w*(3*2).
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1235
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1236
    w := width.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1237
    h := height.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1238
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1239
    failed := true.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1240
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1241
%{
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1242
    int __x, __y;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1243
    int __eR, __eG, __eB;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1244
    unsigned char *srcP, *dstP;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1245
    unsigned char *rgbP;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1246
    unsigned char *idP;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1247
    unsigned char *dp;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1248
    unsigned char *__clrLookup;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1249
    short *errP, *eP;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1250
    int __fR, __fG, __fB;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1251
    int iR, iG, iB;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1252
    int idx;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1253
    int __w = __intVal(w);
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1254
    int __h = __intVal(h);
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1255
    int __nColors = __intVal(lastColor);
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1256
    int __wR = -1, __wG, __wB;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1257
    static int __qScramble[16] = {
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1258
                    0x000 /* 2r000000000000    0 */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1259
                    0x004 /* 2r000000000100    1 */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1260
                    0x020 /* 2r000000100000    2 */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1261
                    0x024 /* 2r000000100100    3 */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1262
                    0x100 /* 2r000100000000    4 */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1263
                    0x104 /* 2r000100000100    5 */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1264
                    0x120 /* 2r000100100000    6 */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1265
                    0x124 /* 2r000100100100    7 */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1266
                    0x800 /* 2r100000000000    8 */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1267
                    0x804 /* 2r100000000100    9 */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1268
                    0x820 /* 2r100000100000    a */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1269
                    0x824 /* 2r100000100100    b */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1270
                    0x900 /* 2r100100000000    c */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1271
                    0x904 /* 2r100100000100    d */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1272
                    0x920 /* 2r100100100000    e */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1273
                    0x924 /* 2r100100100100    f */,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1274
                  };
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1275
5472
5508a0ac6319 __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5453
diff changeset
  1276
    if (__isByteArrayLike(__INST(bytes))
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1277
     && __isByteArray(pseudoBits)
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1278
     && __isByteArray(rgbBytes)
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1279
     && __isByteArray(ditherRGBBytes)
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1280
     && __isByteArray(ditherIds)
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1281
     && __isByteArray(clrLookup)
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1282
     && __isByteArray(error)) {
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1283
        failed = false;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1284
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1285
        srcP = __ByteArrayInstPtr(__INST(bytes))->ba_element;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1286
        dstP = __ByteArrayInstPtr(pseudoBits)->ba_element;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1287
        rgbP = __ByteArrayInstPtr(rgbBytes)->ba_element;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1288
        idP = __ByteArrayInstPtr(ditherIds)->ba_element;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1289
        __clrLookup = __ByteArrayInstPtr(clrLookup)->ba_element;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1290
        errP = (short *) __ByteArrayInstPtr(error)->ba_element;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1291
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1292
        /*
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1293
         * clear error accumulator
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1294
         */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1295
        eP = errP;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1296
        bzero(eP, (__w+2) * 2 * 3);
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1297
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1298
        for (__y=__h; __y>0; __y--) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1299
            __eR = __eG = __eB = 0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1300
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1301
            eP = &(errP[3]);
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1302
            __eR = eP[0];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1303
            __eG = eP[1];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1304
            __eB = eP[2];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1305
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1306
            for (__x=__w; __x>0; __x--) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1307
                int __want;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1308
                int pix;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1309
                int __wantR, __wantG, __wantB;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1310
                int idx;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1311
                int tR, tG, tB;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1312
                int nR, nG, nB;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1313
                int dR, dG, dB;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1314
                int minDelta, bestIdx;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1315
                int cnt;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1316
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1317
                pix = *srcP++;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1318
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1319
                /*
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1320
                 * wR, wG and wB is the wanted r/g/b value;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1321
                 */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1322
                idx = pix+pix+pix;  /* pix * 3 */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1323
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1324
                __wantR = rgbP[idx] + __eR;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1325
                __wantG = rgbP[idx+1] + __eG;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1326
                __wantB = rgbP[idx+2] + __eB;
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1327
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1328
#define RED_SCALE 30
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1329
#define GREEN_SCALE 59
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1330
#define BLUE_SCALE 11
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1331
#define GOOD_DELTA 30
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1332
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1333
#define xRED_SCALE 1
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1334
#define xGREEN_SCALE 1
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1335
#define xBLUE_SCALE 1
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1336
#define xGOOD_DELTA 3
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1337
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1338
#define FAST_LOOKUP
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1339
/* #define ONE_SHOT */
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1340
#define NPROBE 8
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1341
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1342
#ifndef FAST_LOOKUP
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1343
                if ((__wantR == __wR)
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1344
                 && (__wantG == __wG)
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1345
                 && (__wantB == __wB)) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1346
                    /*
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1347
                     * same color again - reuse last bestMatch
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1348
                     */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1349
                } else
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1350
#endif
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1351
                {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1352
                    __wR = __wantR;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1353
                    __wG = __wantG;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1354
                    __wB = __wantB;
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1355
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1356
#ifdef FAST_LOOKUP
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1357
                    if(__wR > 255) __wR = 255;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1358
                    else if (__wR < 0) __wR = 0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1359
                    if(__wG > 255) __wG = 255;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1360
                    else if (__wG < 0) __wG = 0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1361
                    if(__wB > 255) __wB = 255;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1362
                    else if (__wB < 0) __wB = 0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1363
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1364
                    {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1365
                        int lookupIndex;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1366
                        int idx, idx0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1367
                        int d, delta;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1368
                        unsigned char *dp0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1369
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1370
                        dp = __ByteArrayInstPtr(ditherRGBBytes)->ba_element;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1371
                        lookupIndex =    __qScramble[((__wR & 0xF0)>>4)];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1372
                        lookupIndex |=   __qScramble[((__wG & 0xF0)>>4)] >> 1;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1373
                        lookupIndex |=   __qScramble[((__wB & 0xF0)>>4)] >> 2;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1374
                        idx = bestIdx =__clrLookup[lookupIndex];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1375
                        dp += (idx+idx+idx);
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1376
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1377
                        /* try color at lookupIndex */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1378
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1379
                        d = dp[0];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1380
                        delta = (__wR - d) * RED_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1381
                        if (delta < 0) delta = -delta;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1382
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1383
                        d = dp[1];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1384
                        if (__wG > d)
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1385
                            delta += (__wG - d) * GREEN_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1386
                        else
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1387
                            delta += (d - __wG) * GREEN_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1388
                        d = dp[2];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1389
                        if (__wB > d)
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1390
                            delta += (__wB - d) * BLUE_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1391
                        else
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1392
                            delta += (d - __wB) * BLUE_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1393
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1394
                        if (delta <= GOOD_DELTA) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1395
                            goto foundBest;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1396
                        }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1397
                        minDelta = delta;
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1398
# ifndef ONE_SHOT
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1399
                        idx0 = idx; dp0 = dp;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1400
                        cnt = 0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1401
                        while ((++cnt <= NPROBE) && (idx > 0)) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1402
                            /* try previous color(s) */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1403
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1404
                            idx--; dp -= 3;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1405
                            d = dp[0];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1406
                            delta = (__wR - d) * RED_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1407
                            if (delta < 0) delta = -delta;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1408
                            d = dp[1];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1409
                            if (__wG > d)
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1410
                                delta += (__wG - d) * GREEN_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1411
                            else
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1412
                                delta += (d - __wG) * GREEN_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1413
                            d = dp[2];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1414
                            if (__wB > d)
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1415
                                delta += (__wB - d) * BLUE_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1416
                            else
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1417
                                delta += (d - __wB) * BLUE_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1418
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1419
                            if (delta < minDelta) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1420
                                bestIdx = idx;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1421
                                if (delta <= GOOD_DELTA) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1422
                                    goto foundBest;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1423
                                }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1424
                                minDelta = delta;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1425
                            }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1426
                        }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1427
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1428
                        idx = idx0; dp = dp0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1429
                        cnt = 0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1430
                        while ((++cnt <= NPROBE) && (++idx < __nColors)) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1431
                            /* try next color */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1432
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1433
                            dp += 3;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1434
                            d = dp[0];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1435
                            delta = (__wR - d) * RED_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1436
                            if (delta < 0) delta = -delta;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1437
                            d = dp[1];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1438
                            if (__wG > d)
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1439
                                delta += (__wG - d) * GREEN_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1440
                            else
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1441
                                delta += (d - __wG) * GREEN_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1442
                            d = dp[2];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1443
                            if (__wB > d)
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1444
                                delta += (__wB - d) * BLUE_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1445
                            else
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1446
                                delta += (d - __wB) * BLUE_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1447
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1448
                            if (delta < minDelta) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1449
                                bestIdx = idx;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1450
                                if (delta <= GOOD_DELTA) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1451
                                    goto foundBest;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1452
                                }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1453
                                minDelta = delta;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1454
                            }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1455
                        }
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1456
# endif
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1457
                    }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1458
        foundBest: ;
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1459
#else
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1460
/*
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1461
                    if(__wR > 255) __wR = 255;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1462
                    else if (__wR < 0) __wR = 0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1463
                    if(__wG > 255) __wG = 255;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1464
                    else if (__wG < 0) __wG = 0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1465
                    if(__wB > 255) __wB = 255;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1466
                    else if (__wB < 0) __wB = 0;
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1467
*/
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1468
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1469
                    /* find the best matching color */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1470
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1471
                    minDelta = 99999;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1472
                    bestIdx = -1;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1473
                    dp = __ByteArrayInstPtr(ditherRGBBytes)->ba_element;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1474
                    for (idx = 0; idx<__nColors; idx++) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1475
                        int d, delta;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1476
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1477
                        d = dp[0];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1478
                        delta = (__wR - d) * RED_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1479
                        if (delta < 0) delta = -delta;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1480
                        if (delta < minDelta) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1481
                            d = dp[1];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1482
                            if (__wG > d)
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1483
                                delta += (__wG - d) * GREEN_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1484
                            else
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1485
                                delta += (d - __wG) * GREEN_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1486
                            if (delta < minDelta) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1487
                                d = dp[2];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1488
                                if (__wB > d)
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1489
                                    delta += (__wB - d) * BLUE_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1490
                                else
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1491
                                    delta += (d - __wB) * BLUE_SCALE;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1492
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1493
                                if (delta < minDelta) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1494
                                    bestIdx = idx;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1495
                                    if (delta <= GOOD_DELTA) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1496
                                        break;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1497
                                    }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1498
                                    minDelta = delta;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1499
                                }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1500
                            }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1501
                        }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1502
                        dp += 3;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1503
                    }
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1504
#endif
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1505
                }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1506
                dp = __ByteArrayInstPtr(ditherRGBBytes)->ba_element;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1507
                dp += bestIdx * 3;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1508
                dR = dp[0];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1509
                dG = dp[1];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1510
                dB = dp[2];
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1511
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1512
/*
4724
f7db00bce050 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4718
diff changeset
  1513
console_fprintf(stderr, "want: %d/%d/%d (%d/%d/%d) got: %d/%d/%d\n",
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1514
                __wantR, __wantG, __wantB,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1515
                __wR, __wG, __wB,
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1516
                dR, dG, dB);
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1517
*/
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1518
                /*
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1519
                 * store the corresponding dither colors colorId
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1520
                 */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1521
                *dstP++ = idP[bestIdx];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1522
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1523
                /*
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1524
                 * the new error & distribute the error
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1525
                 */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1526
                __eR = __wantR - dR;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1527
                if (__eR) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1528
                    tR = __eR >> 4;  /* 16th of error */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1529
                    nR = eP[3] + (tR * 7);/* from accu: error for (x+1 / y) */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1530
                    eP[0] = tR*5;         /* 5/16th for (x / y+1) */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1531
                    eP[-3] = tR*3;        /* 3/16th for (x-1 / y+1) */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1532
                    eP[3] = __eR - (tR*15);  /* 1/16th for (x+1 / y+1) */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1533
                    __eR = nR;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1534
                } else {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1535
                    __eR = eP[3];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1536
                    eP[0] = eP[-3] = eP[3] = 0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1537
                }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1538
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1539
                __eG = __wantG - dG;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1540
                if (__eG) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1541
                    tG = __eG >> 4;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1542
                    nG = eP[4] + (tG * 7);/* plus 7/16'th of this error */
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1543
                    eP[1] = tG*5;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1544
                    eP[-2] = tG*3;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1545
                    eP[4] = __eG - (tG*15);
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1546
                    __eG = nG;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1547
                } else {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1548
                    __eG = eP[4];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1549
                    eP[1] = eP[-2] = eP[4] = 0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1550
                }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1551
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1552
                __eB = __wantB - dB;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1553
                if (__eB) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1554
                    tB = __eB >> 4;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1555
                    nB = eP[5] + (tB * 7);
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1556
                    eP[2] = tB*5;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1557
                    eP[-1] = tB*3;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1558
                    eP[5] = __eB - (tB*15);
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1559
                    __eB = nB;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1560
                } else {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1561
                    __eB = eP[5];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1562
                    eP[2] = eP[-1] = eP[5] = 0;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1563
                }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1564
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1565
                eP += 3;
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1566
            }
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1567
        }
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1568
    }
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1569
%}.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1570
    failed ifTrue:[
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1571
        self primitiveFailed.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1572
        ^ nil
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1573
    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1574
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1575
    ^ pseudoBits
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1576
!
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3900
diff changeset
  1577
1782
a1d67a9456ea method rename
Claus Gittinger <cg@exept.de>
parents: 1658
diff changeset
  1578
orderedDitheredGrayBitsWithDitherMatrix:ditherMatrix ditherWidth:dW depth:depth
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1579
    "return the bitmap for a dithered depth-bitmap from the image;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1580
     with a constant ditherMatrix, this can be used for thresholding.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1581
     Redefined to make use of knowing that pixels are 8-bit values."
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1582
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1583
    |dH nDither bytes
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1584
     greyLevels greyMap1 greyMap2
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1585
     bytesPerRow  "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1586
     bytesPerOutRow  "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1587
     pixelsPerByte   "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1588
     outBits
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1589
     w               "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1590
     h               "{Class: SmallInteger }" |
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1591
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1592
    nDither := ditherMatrix size.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1593
    dH := nDither / dW.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1594
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1595
    w := width.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1596
    h := height.
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1597
    bytes := self bits.
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1598
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1599
    greyLevels := 1 bitShift:depth.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1600
    pixelsPerByte := 8 / depth.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1601
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1602
    bytesPerRow := self bytesPerRow.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1603
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1604
    bytesPerOutRow := (w * depth + 7) // 8.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1605
    outBits := ByteArray uninitializedNew:(bytesPerOutRow * h).
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1606
    (outBits isNil or:[bytes isNil]) ifTrue:[
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1607
	^ nil
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1608
    ].
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1609
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1610
    greyMap1 := self greyMapForRange:(greyLevels-1).                    "/ the pixels
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1611
    greyMap1 := (greyMap1 collect:[:b | b isNil ifTrue:[
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1612
					    0
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1613
					] ifFalse:[
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1614
					    b truncated
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1615
					]
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1616
				  ]) asByteArray.
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1617
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1618
    greyMap2 := self greyMapForRange:(greyLevels-1).
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1619
    greyMap2 := (greyMap2 collect:[:el |
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1620
					el isNil ifTrue:[
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1621
					    0
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1622
					] ifFalse:[
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1623
					    ((el - el truncated)  "/ the error (0..1)
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1624
					    * nDither) rounded
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1625
					]]) asByteArray.
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1626
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1627
%{
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1628
    int __dW = __intVal(dW);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1629
    int __dH = __intVal(dH);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1630
    int __byte;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1631
    int __dT, __dO;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1632
    int __depth = __intVal(depth);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1633
    int __dstIdx = 0;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1634
    int __srcIdx = 0;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1635
    int __bitCnt;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1636
    int __grey, __pixel;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1637
    int __w = __intVal(w);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1638
    int __h = __intVal(h);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1639
    int __x;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1640
    int __y;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1641
    int __oX, __oY, __dY;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1642
    int __nextDst;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1643
    int __nextSrc;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1644
    int __bytesPerRow = __intVal(bytesPerRow);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1645
    int __bytesPerOutRow = __intVal(bytesPerOutRow);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1646
1812
beeaf75b245b avoid type warnings (char * vs. unsigned char *)
Claus Gittinger <cg@exept.de>
parents: 1782
diff changeset
  1647
    unsigned char *__outBits = __ByteArrayInstPtr(outBits)->ba_element;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1648
    unsigned char *__ditherMatrix = __ByteArrayInstPtr(ditherMatrix)->ba_element;
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1649
    unsigned char *__bytes = __ByteArrayInstPtr(bytes)->ba_element;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1650
    unsigned char *__greyMap1 = __ByteArrayInstPtr(greyMap1)->ba_element;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1651
    unsigned char *__greyMap2 = __ByteArrayInstPtr(greyMap2)->ba_element;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1652
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1653
    __oY = __dY = 0;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1654
    for (__y=0; __y<__h; __y++) {
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1655
	__nextDst = __dstIdx + __bytesPerOutRow;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1656
	__nextSrc = __srcIdx + __bytesPerRow;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1657
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1658
	__byte = 0;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1659
	__bitCnt = 8;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1660
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1661
	__oX = 0;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1662
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1663
	for (__x=0; __x<__w; __x++) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1664
	    __grey = __bytes[__srcIdx++];            /* 0..255 */
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1665
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1666
	    __pixel = __greyMap1[__grey];            /* 0..(greyLevels-1) */
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1667
	    __dO    = __greyMap2[__grey];            /* 0.. nDither-1) */
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1668
	    __dT = __ditherMatrix[__dY + __oX];
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1669
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1670
	    if (__dO > __dT)                         /* dither says: next pixel */
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1671
		__pixel++;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1672
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1673
	    __oX++;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1674
	    if (__oX == __dW) __oX = 0;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1675
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1676
	    __byte = (__byte << __depth) | __pixel;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1677
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1678
	    __bitCnt = __bitCnt - __depth;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1679
	    if (__bitCnt == 0) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1680
		__outBits[__dstIdx] = __byte;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1681
		__dstIdx++;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1682
		__byte = 0;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1683
		__bitCnt = 8;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1684
	    }
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1685
	}
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1686
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1687
	if (__bitCnt != 8) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1688
	    __byte = __byte << __bitCnt;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1689
	    __outBits[__dstIdx] = __byte;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1690
	}
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1691
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1692
	__oY++; __dY += __dW;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1693
	if (__oY == __dH) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1694
	    __oY = 0;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1695
	    __dY = 0;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1696
	}
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1697
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1698
	__srcIdx = __nextSrc;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1699
	__dstIdx = __nextDst;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1700
    }
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1701
%}.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1702
    ^ outBits
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1703
!
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1704
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1705
orderedDitheredMonochromeBitsWithDitherMatrix:ditherMatrix ditherWidth:dW
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1706
    "return the dithered monochrome bits for the receiver image;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1707
     with a constant ditherMatrix, this can be used for thresholding.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1708
     Redefined to make use of knowing that pixels are 8-bit values."
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1709
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1710
    |dH nDither bytes
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1711
     greyMap monoBits
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1712
     bytesPerMonoRow "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1713
     bytesPerRow     "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1714
     w               "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1715
     h               "{Class: SmallInteger }"|
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1716
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1717
    nDither := ditherMatrix size.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1718
    dH := nDither / dW.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1719
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1720
    w := width.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1721
    h := height.
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1722
    bytes := self bits.
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1723
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1724
    bytesPerRow := self bytesPerRow.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1725
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1726
    bytesPerMonoRow := w + 7 // 8.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1727
    monoBits := ByteArray uninitializedNew:(bytesPerMonoRow * h).
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1728
    (monoBits isNil or:[bytes isNil]) ifTrue:[
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1729
	^ nil
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1730
    ].
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1731
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1732
    greyMap := self greyByteMapForRange:nDither.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1733
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1734
%{
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1735
    int __dW = __intVal(dW);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1736
    int __dH = __intVal(dH);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1737
    int __byte;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1738
    int __dT;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1739
    int __dstIdx = 0;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1740
    int __srcIdx = 0;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1741
    int __bitCnt;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1742
    int __grey;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1743
    int __w = __intVal(w);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1744
    int __h = __intVal(h);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1745
    int __x;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1746
    int __y;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1747
    int __oX, __oY, __dY;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1748
    int __nextDst;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1749
    int __nextSrc;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1750
    int __bytesPerRow = __intVal(bytesPerRow);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1751
    int __bytesPerMonoRow = __intVal(bytesPerMonoRow);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1752
1812
beeaf75b245b avoid type warnings (char * vs. unsigned char *)
Claus Gittinger <cg@exept.de>
parents: 1782
diff changeset
  1753
    unsigned char *__monoBits = __ByteArrayInstPtr(monoBits)->ba_element;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1754
    unsigned char *__ditherMatrix = __ByteArrayInstPtr(ditherMatrix)->ba_element;
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1755
    unsigned char *__bytes = __ByteArrayInstPtr(bytes)->ba_element;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1756
    unsigned char *__greyMap = __ByteArrayInstPtr(greyMap)->ba_element;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1757
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1758
    __oY = __dY = 0;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1759
    for (__y=0; __y<__h; __y++) {
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1760
	__nextDst = __dstIdx + __bytesPerMonoRow;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1761
	__nextSrc = __srcIdx + __bytesPerRow;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1762
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1763
	__byte = 0;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1764
	__bitCnt = 8;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1765
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1766
	__oX = 0;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1767
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1768
	for (__x=__w; __x>0; __x--) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1769
	    __grey = __bytes[__srcIdx];   /* 0..255 */
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1770
	    __srcIdx++;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1771
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1772
	    __grey = __greyMap[__grey];
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1773
	    __dT = __ditherMatrix[__dY + __oX];
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1774
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1775
	    __oX++;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1776
	    if (__oX == __dW) __oX = 0;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1777
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1778
	    __byte = __byte << 1;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1779
	    if (__grey > __dT) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1780
		__byte = __byte | 1;           /* white */
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1781
	    }
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1782
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1783
	    __bitCnt--;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1784
	    if (__bitCnt == 0) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1785
		__monoBits[__dstIdx] = __byte;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1786
		__dstIdx++;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1787
		__byte = 0;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1788
		__bitCnt = 8;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1789
	    }
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1790
	}
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1791
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1792
	if (__bitCnt != 8) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1793
	    __byte = __byte << __bitCnt;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1794
	    __monoBits[__dstIdx] = __byte;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1795
	}
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1796
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1797
	__oY++; __dY += __dW;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1798
	if (__oY == __dH) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1799
	    __oY = 0;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1800
	    __dY = 0;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1801
	}
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1802
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1803
	__srcIdx = __nextSrc;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1804
	__dstIdx = __nextDst;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1805
    }
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1806
%}.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1807
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1808
    ^ monoBits
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1809
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1810
    "
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1811
     |i f|
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1812
1609
42e9d60aaca9 comments
Claus Gittinger <cg@exept.de>
parents: 1604
diff changeset
  1813
     i := Image fromFile:'bitmaps/gifImages/claus.gif'.
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1814
     f := i asOrderedDitheredMonochromeFormOn:Display.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1815
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1816
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1817
     |i f|
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1818
1609
42e9d60aaca9 comments
Claus Gittinger <cg@exept.de>
parents: 1604
diff changeset
  1819
     i := Image fromFile:'bitmaps/gifImages/garfield.gif'.
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1820
     f := i asOrderedDitheredMonochromeFormOn:Display.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1821
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1822
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1823
     |i f|
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1824
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1825
     i := (Image fromFile:'bitmaps/PasteButton.tiff') magnifiedBy:10.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1826
     f := i asOrderedDitheredMonochromeFormOn:Display.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1827
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1828
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1829
     |i f|
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1830
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1831
     i := (Image fromFile:'bitmaps/blue-ball.gif') magnifiedBy:1.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1832
     f := i asOrderedDitheredMonochromeFormOn:Display.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1833
    "
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1834
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1835
    "Created: 7.6.1996 / 10:48:06 / cg"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1836
    "Modified: 7.6.1996 / 11:08:50 / cg"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1837
! !
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1838
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1839
!Depth8Image methodsFor:'enumerating'!
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1840
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1841
colorsAtY:y from:xLow to:xHigh do:aBlock
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1842
    "perform aBlock for each pixel from x1 to x2 in row y.
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1843
     The block is passed the color at each pixel.
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1844
     This method allows slighly faster processing of an
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1845
     image than using atX:y:, since some processing can be
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1846
     avoided when going from pixel to pixel. However, for
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1847
     real image processing, specialized methods should be written."
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1848
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1849
    |srcIndex "{ Class: SmallInteger }"
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1850
     value    "{ Class: SmallInteger }"
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1851
     x1       "{ Class: SmallInteger }"
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1852
     x2       "{ Class: SmallInteger }"
7322
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1853
     color cachedColorArray pixelBytes lastValue lastColor|
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1854
7322
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1855
    pixelBytes := self bits.
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1856
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1857
    x1 := xLow.
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1858
    x2 := xHigh.
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1859
    srcIndex := (width * y) + 1 + x1.
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1860
7322
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1861
    cachedColorArray := Array new:256.
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1862
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1863
    x1 to:x2 do:[:x |
7322
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1864
        value := pixelBytes at:srcIndex.
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1865
        srcIndex := srcIndex + 1.
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1866
        
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1867
        value == lastValue ifTrue:[
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1868
            color := lastColor
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1869
        ] ifFalse:[    
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1870
            color := cachedColorArray at:value+1.
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1871
            color isNil ifTrue:[
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1872
                color := self colorFromValue:value.
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1873
                cachedColorArray at:value+1 put:color
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1874
            ].
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1875
            lastValue := value. lastColor := color.
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1876
        ].
051a91207011 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7276
diff changeset
  1877
        aBlock value:x value:color
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1878
    ]
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1879
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1880
    "Created: 7.6.1996 / 19:12:35 / cg"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1881
    "Modified: 11.7.1996 / 20:22:32 / cg"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1882
!
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1883
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1884
colorsFromX:xStart y:yStart toX:xEnd y:yEnd do:aBlock
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1885
    "perform aBlock for each pixel in the rectangle
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1886
     yStart..yEnd / xStart..xEnd.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1887
     The block is passed the color at each pixel.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1888
     This method allows slighly faster processing of an
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1889
     image than using individual atX:y: accesses,
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1890
     both since some processing can be avoided when going from pixel to pixel,
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1891
     and since the color composition is done outside of the pixel loop.
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1892
     However, for real high performance image processing, specialized methods
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1893
     should be written which know how to deal with specific photometric interpretations."
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1894
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1895
    |srcIndex    "{ Class: SmallInteger }"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1896
     srcNext     "{ Class: SmallInteger }"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1897
     bytesPerRow "{ Class: SmallInteger }"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1898
     value    "{ Class: SmallInteger }"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1899
     x1       "{ Class: SmallInteger }"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1900
     x2       "{ Class: SmallInteger }"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1901
     y1       "{ Class: SmallInteger }"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1902
     y2       "{ Class: SmallInteger }"
2248
20fc22184ef5 care for invalid pixel values in image
Claus Gittinger <cg@exept.de>
parents: 2202
diff changeset
  1903
     colorArray
7323
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1904
     maxColor pixelBytes lastPixel lastColor|
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1905
7323
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1906
    pixelBytes := self bits.
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1907
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1908
    x1 := xStart.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1909
    x2 := xEnd.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1910
    y1 := yStart.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1911
    y2 := yEnd.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1912
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1913
    srcIndex := (width * y1) + x1 + 1 .
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1914
    bytesPerRow := self bytesPerRow.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1915
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1916
    colorArray := self realColorMap.
2248
20fc22184ef5 care for invalid pixel values in image
Claus Gittinger <cg@exept.de>
parents: 2202
diff changeset
  1917
    maxColor := colorArray size.
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1918
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1919
    y1 to:y2 do:[:y |
7323
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1920
        srcNext := srcIndex + bytesPerRow.
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1921
        x1 to:x2 do:[:x |
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1922
            value := pixelBytes at:srcIndex ifAbsent:0.
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1923
            srcIndex := srcIndex + 1.
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1924
7323
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1925
            value ~~ lastPixel ifTrue:[
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1926
                lastPixel := value.
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1927
                value >= maxColor ifTrue:[
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1928
                    value := 0.
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1929
                ].
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1930
                lastColor := colorArray at:value+1.
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1931
            ].
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1932
            aBlock value:x value:y value:lastColor
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1933
        ].
42cd85aec8ea #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7322
diff changeset
  1934
        srcIndex := srcNext.
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1935
    ].
746
f5479d603f64 gray vs. grey
Claus Gittinger <cg@exept.de>
parents: 694
diff changeset
  1936
2248
20fc22184ef5 care for invalid pixel values in image
Claus Gittinger <cg@exept.de>
parents: 2202
diff changeset
  1937
    "Created: / 7.6.1996 / 19:12:35 / cg"
20fc22184ef5 care for invalid pixel values in image
Claus Gittinger <cg@exept.de>
parents: 2202
diff changeset
  1938
    "Modified: / 17.8.1998 / 10:17:45 / cg"
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1939
!
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1940
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1941
valuesAtY:y from:xLow to:xHigh do:aBlock
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1942
    "perform aBlock for each pixelValue from x1 to x2 in row y.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1943
     The block is passed the pixelValue at each pixel.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1944
     This method allows slighly faster processing of an
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1945
     image than using valueAtX:y:, since some processing can be
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1946
     avoided when going from pixel to pixel. However, for
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1947
     real image processing, specialized methods should be written."
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1948
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1949
    |srcIndex   "{ Class: SmallInteger }"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1950
     pixelValue "{ Class: SmallInteger }"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1951
     x1         "{ Class: SmallInteger }"
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1952
     x2         "{ Class: SmallInteger }"
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1953
     bytes|
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1954
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1955
    x1 := xLow.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1956
    x2 := xHigh.
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1957
    srcIndex := (width * y) + 1.
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1958
    bytes := self bits.
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1959
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1960
    x1 to:x2 do:[:x |
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1961
        pixelValue := bytes at:srcIndex+x.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1962
        aBlock value:x value:pixelValue
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  1963
    ]
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  1964
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1965
    "Created: / 07-06-1996 / 19:09:47 / cg"
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1966
    "Modified: / 30-01-2017 / 18:54:15 / stefan"
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1967
!
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1968
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1969
valuesFromX:xStart y:yStart toX:xEnd y:yEnd do:aBlock
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1970
    "perform aBlock for each pixel in the rectangle
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1971
     yStart..yEnd / xStart..xEnd.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1972
     The block is passed the pixelValue at each pixel.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1973
     This method allows slighly faster processing of an
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1974
     image than using individual valueAtX:y: accesses,
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1975
     since some processing can be avoided when going from pixel to pixel..
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  1976
     However, for real high performance image processing, specialized methods
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1977
     should be written which know how to deal with specific photometric interpretations."
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1978
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1979
    |srcIndex    "{ Class: SmallInteger }" 
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1980
     bytesPerRow "{ Class: SmallInteger }"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1981
     value    "{ Class: SmallInteger }"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1982
     x1       "{ Class: SmallInteger }"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1983
     x2       "{ Class: SmallInteger }"
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1984
     y1       "{ Class: SmallInteger }"
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1985
     y2       "{ Class: SmallInteger }"
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1986
     bytes|
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1987
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1988
    x1 := xStart.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1989
    x2 := xEnd.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1990
    y1 := yStart.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1991
    y2 := yEnd.
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1992
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1993
    srcIndex := (width * y1) + 1 .
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1994
    bytesPerRow := self bytesPerRow.
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1995
    bytes := self bits.
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1996
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  1997
    y1 to:y2 do:[:y |
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1998
        x1 to:x2 do:[:x |
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  1999
            value := bytes at:srcIndex+x.
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2000
            aBlock value:x value:y value:value
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2001
        ].
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2002
        srcIndex := srcIndex + bytesPerRow.
941
11fb72fb105c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  2003
    ].
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2004
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2005
    "Created: / 11-07-1996 / 20:08:11 / cg"
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2006
    "Modified: / 30-01-2017 / 19:04:05 / stefan"
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2007
    "Modified (format): / 31-01-2017 / 12:44:04 / stefan"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2008
! !
304f026e10cd Initial revision
claus
parents:
diff changeset
  2009
12
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  2010
!Depth8Image methodsFor:'image manipulations'!
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  2011
7533
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2012
easyRotateBitsInto:destinationImage angle:degrees
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2013
    "tuned helper for rotation - does the actual pixel shuffling, by degrees clockwise. 
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2014
     Here, only 90, 180 and 270 degrees are implemented. 
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2015
     Hard angles are done in #hardRotate:.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2016
     The code here a tuned version of the inherited for more performance"
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2017
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2018
    |srcBytesPerRow dstBytesPerRow
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2019
     srcWidth srcHeight
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2020
     dstWidth dstHeight
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2021
     srcBytes dstBytes|
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2022
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2023
    srcBytesPerRow := self bytesPerRow.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2024
    srcBytes := self bits.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2025
    srcWidth := width.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2026
    srcHeight := height.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2027
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2028
    dstBytesPerRow := destinationImage bytesPerRow.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2029
    dstBytes := destinationImage bits.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2030
    dstWidth := destinationImage width.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2031
    dstHeight := destinationImage height.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2032
%{
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2033
    if (__bothSmallInteger(srcWidth, srcHeight)
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2034
     && __bothSmallInteger(dstWidth, dstHeight)
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2035
     && __bothSmallInteger(dstBytesPerRow, srcBytesPerRow)
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2036
     && __isByteArrayLike(srcBytes)
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2037
     && __isByteArrayLike(dstBytes)
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2038
    ) {
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2039
        int c_srcW = __intVal(srcWidth);
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2040
        int c_srcH = __intVal(srcHeight);
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2041
        int c_dstW = __intVal(dstWidth);
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2042
        int c_dstH = __intVal(dstHeight);
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2043
        int c_srcBytesPerRow = __intVal(srcBytesPerRow);
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2044
        int c_dstBytesPerRow = __intVal(dstBytesPerRow);
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2045
        int c_srcW4 = c_srcW-4;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2046
        
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2047
        {
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2048
            unsigned char *c_srcBytes = (unsigned char*)__ByteArrayInstPtr(srcBytes)->ba_element;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2049
            unsigned char *c_dstBytes = (unsigned char*)__ByteArrayInstPtr(dstBytes)->ba_element;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2050
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2051
            int c_dstNextRowOffset;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2052
            int c_dstNextColOffset;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2053
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2054
            if (degrees == __mkSmallInteger(90)) {
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2055
                // destinationImage pixelAtX:(h-row) y:col put:pixel
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2056
                c_dstNextRowOffset = -1;                                // going to previous column
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2057
                c_dstNextColOffset = c_dstBytesPerRow;                  // going to next row
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2058
                c_dstBytes += (c_dstW-1);                               // start in the upper-right of dest
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2059
            } else if (degrees == __mkSmallInteger(180)) {
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2060
                // destinationImage pixelAtX:(w-col) y:(h-row) put:pixel
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2061
                c_dstNextRowOffset = -c_dstBytesPerRow;                 // going to previous row
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2062
                c_dstNextColOffset = -1;                                // going to prev col
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2063
                c_dstBytes += (c_dstH-1)*c_dstBytesPerRow+(c_dstW-1);   // start in the lower-right of dest
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2064
            } else {
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2065
                // destinationImage pixelAtX:row y:(w-col) put:pixel
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2066
                c_dstNextRowOffset = 1;                                 // going to next col
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2067
                c_dstNextColOffset = -c_dstBytesPerRow;                 // going to prev row
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2068
                c_dstBytes += (c_dstH-1)*c_dstBytesPerRow;              // start in the lower-left of dest
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2069
            }
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2070
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2071
            if ((c_srcBytesPerRow * c_srcH) <= __byteArraySize(srcBytes)) {
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2072
                int c_y;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2073
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2074
                for (c_y=0; c_y<c_srcH; c_y++) {
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2075
                    unsigned char *c_srcNext = c_srcBytes + c_srcBytesPerRow;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2076
                    unsigned char *c_dstNext = c_dstBytes + c_dstNextRowOffset;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2077
                    int c_x;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2078
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2079
                    c_x = 0;    
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2080
#if 1
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2081
                    if (sizeof(int) == 4) {
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2082
                        for (c_x = 0; c_x < c_srcW4; c_x += 4) {
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2083
                            int c_value;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2084
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2085
                            c_value = ((int *)c_srcBytes)[0];
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2086
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2087
                            c_dstBytes[0] = (c_value) & 0xFF;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2088
                            c_dstBytes += c_dstNextColOffset;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2089
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2090
                            c_dstBytes[0] = (c_value>>8) & 0xFF;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2091
                            c_dstBytes += c_dstNextColOffset;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2092
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2093
                            c_dstBytes[0] = (c_value>>16) & 0xFF;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2094
                            c_dstBytes += c_dstNextColOffset;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2095
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2096
                            c_dstBytes[0] = (c_value>>24) & 0xFF;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2097
                            c_dstBytes += c_dstNextColOffset;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2098
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2099
                            c_srcBytes += 4;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2100
                        }
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2101
                    }
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2102
#endif
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2103
                    for (; c_x < c_srcW; c_x++) {
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2104
                        int c_value;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2105
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2106
                        c_value = c_srcBytes[0];
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2107
                        c_dstBytes[0] = c_value;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2108
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2109
                        c_srcBytes++;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2110
                        c_dstBytes += c_dstNextColOffset;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2111
                    }
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2112
                    c_srcBytes = c_srcNext;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2113
                    c_dstBytes = c_dstNext;
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2114
                }
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2115
                RETURN(self);
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2116
            }
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2117
        }
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2118
    }
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2119
%}.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2120
    self breakPoint:#cg.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2121
    super easyRotateBitsInto:destinationImage angle:degrees
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2122
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2123
    "
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2124
     |i|
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2125
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2126
     i := Image fromFile:'../../goodies/bitmaps/gifImages/claus.gif'.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2127
     i inspect.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2128
     (i rotated:45) inspect.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2129
     (i rotated:90) inspect.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2130
     (i rotated:180) inspect.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2131
     (i rotated:270) inspect.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2132
    "
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2133
    "
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2134
     |i|
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2135
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2136
     i := Image fromFile:'../../goodies/bitmaps/gifImages/claus.gif'.
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2137
     Time millisecondsToRun:[
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2138
        1000 timesRepeat:[ (i rotated:90) ].
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2139
     ]
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2140
    "
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2141
!
514d5a9f46af #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7524
diff changeset
  2142
1577
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1569
diff changeset
  2143
hardMagnifiedBy:scalePoint
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1569
diff changeset
  2144
    "return a new image magnified by scalePoint, aPoint.
12
9f0995fac1fa *** empty log message ***
claus
parents: 5
diff changeset
  2145
     This is the general magnification method, handling non-integral values"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2146
304f026e10cd Initial revision
claus
parents:
diff changeset
  2147
    |mX mY
304f026e10cd Initial revision
claus
parents:
diff changeset
  2148
     newWidth  "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  2149
     newHeight "{ Class: SmallInteger }"
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2150
     w         "{ Class: SmallInteger }"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2151
     h         "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  2152
     newImage newBytes
304f026e10cd Initial revision
claus
parents:
diff changeset
  2153
     value     "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  2154
     srcRowIdx "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  2155
     srcIndex  "{ Class: SmallInteger }"
1577
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1569
diff changeset
  2156
     dstIndex  "{ Class: SmallInteger }"
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1569
diff changeset
  2157
     newMask|
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2158
1577
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1569
diff changeset
  2159
    mX := scalePoint x.
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1569
diff changeset
  2160
    mY := scalePoint y.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2161
    ((mX < 0) or:[mY < 0]) ifTrue:[^ nil].
304f026e10cd Initial revision
claus
parents:
diff changeset
  2162
    ((mX = 1) and:[mY = 1]) ifTrue:[^ self].
304f026e10cd Initial revision
claus
parents:
diff changeset
  2163
304f026e10cd Initial revision
claus
parents:
diff changeset
  2164
    newWidth := (width * mX) truncated.
304f026e10cd Initial revision
claus
parents:
diff changeset
  2165
    newHeight := (height * mY) truncated.
304f026e10cd Initial revision
claus
parents:
diff changeset
  2166
304f026e10cd Initial revision
claus
parents:
diff changeset
  2167
    newBytes := ByteArray uninitializedNew:(newWidth * newHeight).
304f026e10cd Initial revision
claus
parents:
diff changeset
  2168
1577
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1569
diff changeset
  2169
    mask notNil ifTrue:[
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2170
        newMask := (mask magnifiedBy:scalePoint)
1577
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1569
diff changeset
  2171
    ].
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1569
diff changeset
  2172
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2173
    newImage := self species new.
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2174
    newImage
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2175
        width:newWidth
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2176
        height:newHeight
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2177
        photometric:photometric
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2178
        samplesPerPixel:samplesPerPixel
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2179
        bitsPerSample:#[8]
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2180
        colorMap:colorMap copy
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2181
        bits:newBytes
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2182
        mask:newMask.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2183
304f026e10cd Initial revision
claus
parents:
diff changeset
  2184
    "walk over destination image fetching pixels from source image"
304f026e10cd Initial revision
claus
parents:
diff changeset
  2185
304f026e10cd Initial revision
claus
parents:
diff changeset
  2186
    mY := mY asFloat.
304f026e10cd Initial revision
claus
parents:
diff changeset
  2187
    mX := mX asFloat.
304f026e10cd Initial revision
claus
parents:
diff changeset
  2188
%{
2042
58c0228331bb single underscore-macros -> double underscores
Claus Gittinger <cg@exept.de>
parents: 2006
diff changeset
  2189
    unsigned char *__dstP = __ByteArrayInstPtr(newBytes)->ba_element;
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2190
    unsigned char *__srcP = __ByteArrayInstPtr(__INST(bytes))->ba_element;
1658
4c81124d0b37 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1657
diff changeset
  2191
    unsigned char *__srcRowP;
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2192
    int __width = __intVal(__INST(width));
1658
4c81124d0b37 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1657
diff changeset
  2193
    int __w = __intVal(newWidth) - 1;
4c81124d0b37 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1657
diff changeset
  2194
    int __h = __intVal(newHeight) - 1;
4c81124d0b37 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1657
diff changeset
  2195
    int __row, __col;
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2196
    double __mX = __floatVal(mX);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2197
    double __mY = __floatVal(mY);
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2198
1658
4c81124d0b37 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1657
diff changeset
  2199
    for (__row = 0; __row <= __h; __row++) {
7823
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2200
        __srcRowP = __srcP + (__width * (int)((double)__row / __mY));
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2201
        for (__col = 0; __col <= __w; __col++) {
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2202
            *__dstP++ = __srcRowP[(int)((double)__col / __mX)];
5a255f3fbbd6 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7754
diff changeset
  2203
        }
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2204
    }
304f026e10cd Initial revision
claus
parents:
diff changeset
  2205
%}
304f026e10cd Initial revision
claus
parents:
diff changeset
  2206
.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2207
"/   the above C-code is equivalent to:
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2208
"/
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2209
"/    dstIndex := 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2210
"/    w := newWidth - 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2211
"/    h := newHeight - 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2212
"/    0 to:h do:[:row |
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2213
"/        srcRowIdx := (width * (row // mY)) + 1.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2214
"/        0 to:w do:[:col |
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2215
"/            srcIndex := srcRowIdx + (col // mX).
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2216
"/            value := bytes at:srcIndex.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2217
"/            newBytes at:dstIndex put:value.
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2218
"/            dstIndex := dstIndex + 1
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2219
"/        ]
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2220
"/    ].
ea2bf46eb669 *** empty log message ***
claus
parents: 86
diff changeset
  2221
"/
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2222
304f026e10cd Initial revision
claus
parents:
diff changeset
  2223
    ^ newImage
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2224
!
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2225
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2226
magnifyRowFrom:srcBytes offset:srcStart
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2227
	  into:dstBytes offset:dstStart factor:mX
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2228
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2229
    "magnify a single pixel row - can only magnify by integer factors.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2230
     Specially tuned for factors 2,3 and 4."
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2231
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2232
%{
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2233
    REGISTER unsigned char *srcP, *dstP;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2234
    REGISTER unsigned char _byte;
2184
b8daa402967f tuned magnification by multiples-of-2
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  2235
    unsigned _word;
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2236
    int _mag;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2237
    REGISTER int i;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2238
    int _pixels;
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2239
    OBJ w = __INST(width);
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2240
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2241
    if (__bothSmallInteger(srcStart, dstStart)
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2242
     && __bothSmallInteger(w, mX)
5472
5508a0ac6319 __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5453
diff changeset
  2243
     && __isByteArrayLike(srcBytes) && __isByteArray(dstBytes)) {
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2244
	_mag = __intVal(mX);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2245
	srcP = __ByteArrayInstPtr(srcBytes)->ba_element - 1 + __intVal(srcStart);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2246
	dstP = __ByteArrayInstPtr(dstBytes)->ba_element - 1 + __intVal(dstStart);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2247
	_pixels = __intVal(w);
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2248
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2249
	switch (_mag) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2250
	    case 1:
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2251
		break;
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2252
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2253
	    case 2:
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2254
		/* special code for common case */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2255
		if (((INT)dstP & 1) == 0) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2256
		    while (_pixels--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2257
			_byte = *srcP++;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2258
			_word = (_byte<<8) | _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2259
			((short *)dstP)[0] = _word;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2260
			dstP += 2;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2261
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2262
		} else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2263
		    while (_pixels--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2264
			_byte = *srcP++;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2265
			*dstP++ = _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2266
			*dstP++ = _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2267
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2268
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2269
		break;
2184
b8daa402967f tuned magnification by multiples-of-2
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  2270
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2271
	    case 3:
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2272
		/* special code for common case */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2273
		while (_pixels--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2274
		    _byte = *srcP++;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2275
		    *dstP++ = _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2276
		    *dstP++ = _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2277
		    *dstP++ = _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2278
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2279
		break;
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2280
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2281
	    case 4:
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2282
		/* special code for common case */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2283
		if (((INT)dstP & 3) == 0) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2284
		    while (_pixels--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2285
			_byte = *srcP++;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2286
			_word = (_byte<<8) | _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2287
			_word = (_word<<16) | _word;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2288
			((int *)dstP)[0] = _word;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2289
			dstP += 4;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2290
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2291
		} else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2292
		    while (_pixels--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2293
			_byte = *srcP++;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2294
			*dstP++ = _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2295
			*dstP++ = _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2296
			*dstP++ = _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2297
			*dstP++ = _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2298
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2299
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2300
		break;
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2301
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2302
	    default:
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2303
		if ((((INT)dstP & 1) == 0)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2304
		 && ((_mag & 1) == 0)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2305
		    while (_pixels--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2306
			_byte = *srcP++;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2307
			_word = (_byte<<8) | _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2308
			for (i=_mag; i>0; i-=2) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2309
			    ((short *)dstP)[0] = _word;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2310
			    dstP += 2;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2311
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2312
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2313
		} else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2314
		    while (_pixels--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2315
			_byte = *srcP++;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2316
			for (i=_mag; i>0; i--)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2317
			    *dstP++ = _byte;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2318
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2319
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2320
		break;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2321
	}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2322
	RETURN (self);
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2323
    }
3842
e97ae6061e75 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3600
diff changeset
  2324
%}.
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2325
    super
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2326
	magnifyRowFrom:srcBytes offset:srcStart
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2327
	into:dstBytes offset:dstStart factor:mX
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2328
! !
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2329
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2330
!Depth8Image methodsFor:'private'!
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2331
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2332
dither1PlaneUsingMap:map on:aDevice
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2333
    "a helper for dithering palette and greyscale images"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2334
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2335
    |f
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2336
     patterns formBytes
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2337
     pixel0bytes pixel1bytes
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2338
     clr ditherPattern
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2339
     nColors       "{Class: SmallInteger }"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2340
     w             "{Class: SmallInteger }"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2341
     h             "{Class: SmallInteger }"|
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2342
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2343
    nColors := map size.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2344
    w := width.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2345
    h := height.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2346
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2347
    formBytes := ByteArray uninitializedNew:(w + 7 // 8) * h.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2348
    patterns := Array new:nColors.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2349
    pixel0bytes := ByteArray uninitializedNew:nColors.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2350
    pixel1bytes := ByteArray uninitializedNew:nColors.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2351
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2352
    "
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2353
     extract dither patterns and values to use for 1/0 bits
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2354
     in those from the dithercolors
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2355
    "
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2356
    1 to:nColors do:[:i |
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2357
	clr := (map at:i) onDevice:aDevice.
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2358
	ditherPattern := clr ditherForm.
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2359
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2360
	ditherPattern isNil ifTrue:[
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2361
	    patterns at:i put:#[2r11111111
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2362
				2r11111111
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2363
				2r11111111
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2364
				2r11111111
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2365
				2r11111111
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2366
				2r11111111
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2367
				2r11111111
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2368
				2r11111111].
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2369
	    pixel0bytes at:i put:clr colorId.
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2370
	    pixel1bytes at:i put:clr colorId
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2371
	] ifFalse:[
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2372
	    patterns at:i put:(ditherPattern bits).
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2373
	    pixel0bytes at:i put:(ditherPattern colorMap at:1) colorId.
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2374
	    pixel1bytes at:i put:(ditherPattern colorMap at:2) colorId.
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2375
	].
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2376
    ].
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2377
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2378
%{
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2379
    unsigned char *_srcP, *_dstP;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2380
    OBJ _patternBytes;
1658
4c81124d0b37 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1657
diff changeset
  2381
    unsigned char __mask = 0x80;
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2382
    unsigned char _outBits = 0;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2383
    unsigned char _last, _v, _patternBits, _p0, _p1;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2384
    int _h, _w;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2385
    int _patternOffset = 0;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2386
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2387
    _srcP = __ByteArrayInstPtr(__INST(bytes))->ba_element;
2042
58c0228331bb single underscore-macros -> double underscores
Claus Gittinger <cg@exept.de>
parents: 2006
diff changeset
  2388
    _dstP = __ByteArrayInstPtr(formBytes)->ba_element;
2044
9ea84b4ba249 more single-underline macros
Claus Gittinger <cg@exept.de>
parents: 2042
diff changeset
  2389
    for (_h = __intVal(h); _h; _h--) {
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2390
	_last = -1;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2391
	for (_w = __intVal(w); _w; _w--) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2392
	    _v = *_srcP++;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2393
	    if (_v != _last) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2394
		_patternBytes = __ArrayInstPtr(patterns)->a_element[_v];
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2395
		if (__isByteArray(_patternBytes)) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2396
		    _patternBits = __ByteArrayInstPtr(_patternBytes)->ba_element[_patternOffset];
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2397
		} else if (__isArrayLike(_patternBytes)) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2398
		    _patternBits = __intVal(__ArrayInstPtr(_patternBytes)->a_element[_patternOffset]);
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2399
		}
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2400
		_p0 = __ByteArrayInstPtr(pixel0bytes)->ba_element[_v];
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2401
		_p1 = __ByteArrayInstPtr(pixel1bytes)->ba_element[_v];
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2402
		_last = _v;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2403
	    }
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2404
	    _outBits <<= 1;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2405
	    if (_patternBits & __mask)
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2406
		_outBits |= _p1;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2407
	    else
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2408
		_outBits |= _p0;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2409
	    __mask >>= 1;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2410
	    if (__mask == 0) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2411
		__mask = 0x80;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2412
		*_dstP++ = _outBits;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2413
		_outBits = 0;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2414
	    }
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2415
	}
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2416
	if (__mask != 0x80) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2417
	    while (__mask != 0) {
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2418
		_outBits <<= 1;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2419
		__mask >>= 1;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2420
	    }
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2421
	    *_dstP++ = _outBits;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2422
	    __mask = 0x80;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2423
	    _outBits = 0;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2424
	}
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2425
	_patternOffset++;
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2426
	if (_patternOffset == 8)
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2427
	    _patternOffset = 0;
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2428
    }
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2429
%}
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2430
.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2431
    f := Form width:w height:h fromArray:formBytes.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2432
    ^ f
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2433
!
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2434
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2435
dither2PlaneUsingMap:map on:aDevice
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2436
    "a helper for dithering palette and greyscale images"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2437
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2438
    |f
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2439
     patterns formBytes
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2440
     pixel0bytes pixel1bytes
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2441
     clr ditherPattern
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2442
     nColors       "{Class: SmallInteger }"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2443
     w             "{Class: SmallInteger }"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2444
     h             "{Class: SmallInteger }"|
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2445
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2446
    nColors := map size.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2447
    w := width.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2448
    h := height.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2449
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2450
    formBytes := ByteArray uninitializedNew:(w * 2 + 7 // 8) * h.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2451
    patterns := Array new:nColors.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2452
    pixel0bytes := ByteArray uninitializedNew:nColors.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2453
    pixel1bytes := ByteArray uninitializedNew:nColors.
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2454
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2455
    "extract dither patterns and values to use for 1/0 bits
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2456
     in those from the dithercolors"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2457
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2458
    1 to:nColors do:[:i |
6837
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2459
        clr := (map at:i) onDevice:aDevice.
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2460
        ditherPattern := clr ditherForm.
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2461
6837
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2462
        ditherPattern isNil ifTrue:[
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2463
            patterns at:i put:#[2r11111111
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2464
                                2r11111111
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2465
                                2r11111111
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2466
                                2r11111111
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2467
                                2r11111111
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2468
                                2r11111111
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2469
                                2r11111111
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2470
                                2r11111111].
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2471
            pixel0bytes at:i put:clr colorId.
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2472
            pixel1bytes at:i put:clr colorId
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2473
        ] ifFalse:[
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2474
            patterns at:i put:(ditherPattern bits).
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2475
            pixel0bytes at:i put:(ditherPattern colorMap at:1) colorId.
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2476
            pixel1bytes at:i put:(ditherPattern colorMap at:2) colorId.
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2477
        ].
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2478
    ].
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2479
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2480
%{
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2481
    unsigned char *_srcP, *_dstP;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2482
    OBJ _patternBytes;
1658
4c81124d0b37 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1657
diff changeset
  2483
    unsigned char __mask = 0x80;
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2484
    unsigned char _outBits = 0;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2485
    unsigned char _last, _v, _patternBits, _p0, _p1;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2486
    int _h, _w;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2487
    int _patternOffset = 0;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2488
    int _outCount;
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2489
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6039
diff changeset
  2490
    _srcP = __ByteArrayInstPtr(__INST(bytes))->ba_element;
2042
58c0228331bb single underscore-macros -> double underscores
Claus Gittinger <cg@exept.de>
parents: 2006
diff changeset
  2491
    _dstP = __ByteArrayInstPtr(formBytes)->ba_element;
2044
9ea84b4ba249 more single-underline macros
Claus Gittinger <cg@exept.de>
parents: 2042
diff changeset
  2492
    for (_h = __intVal(h); _h; _h--) {
6837
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2493
        _last = -1;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2494
        _outCount = 0;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2495
        for (_w = __intVal(w); _w; _w--) {
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2496
            _v = *_srcP++;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2497
            if (_v != _last) {
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2498
                _patternBytes = __ArrayInstPtr(patterns)->a_element[_v];
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2499
                if (__isByteArray(_patternBytes)) {
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2500
                    _patternBits = __ByteArrayInstPtr(_patternBytes)->ba_element[_patternOffset];
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2501
                } else if (__isArrayLike(_patternBytes)) {
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2502
                    _patternBits = __intVal(__ArrayInstPtr(_patternBytes)->a_element[_patternOffset]);
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2503
                }
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2504
                _p0 = __ByteArrayInstPtr(pixel0bytes)->ba_element[_v];
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2505
                _p1 = __ByteArrayInstPtr(pixel1bytes)->ba_element[_v];
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2506
                _last = _v;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2507
            }
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2508
            _outBits <<= 2;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2509
            if (_patternBits & __mask)
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2510
                _outBits |= _p1;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2511
            else
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2512
                _outBits |= _p0;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2513
            __mask >>= 1;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2514
            _outCount++;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2515
            if (_outCount == 4) {
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2516
                *_dstP++ = _outBits;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2517
                _outCount = 0;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2518
                if (__mask == 0) {
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2519
                    __mask = 0x80;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2520
                }
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2521
            }
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2522
        }
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2523
        if (_outCount) {
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2524
            do {
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2525
                _outBits <<= 2;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2526
            } while (++_outCount != 4);
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2527
            *_dstP++ = _outBits;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2528
        }
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2529
        __mask = 0x80;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2530
        _outBits = 0;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2531
        _patternOffset++;
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2532
        if (_patternOffset == 8)
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2533
            _patternOffset = 0;
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2534
    }
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2535
%}
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2536
.
6837
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2537
    f := Form width:w height:h depth:2 onDevice:aDevice.
7361
ebd5415005b8 #QUALITY by sr
sr
parents: 7323
diff changeset
  2538
    f isNil ifTrue:[^ nil].
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2539
    f graphicsDevice
6837
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2540
        drawBits:formBytes
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2541
        depth:2
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2542
        padding:8
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2543
        width:w height:h
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2544
        x:0 y:0
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2545
        into:f id
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2546
        x:0 y:0
e511316c0ed9 class: Depth8Image
Claus Gittinger <cg@exept.de>
parents: 6310
diff changeset
  2547
        width:w height:h
7754
2aac86a2c288 #TUNING by stefan
Stefan Vogel <sv@exept.de>
parents: 7597
diff changeset
  2548
        with:f initGC.
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2549
    ^ f
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2550
! !
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2551
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2552
!Depth8Image methodsFor:'queries'!
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2553
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2554
bitsPerPixel
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2555
    "return the number of bits per pixel"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2556
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2557
    ^ 8
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2558
!
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2559
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2560
bitsPerRow
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2561
    "return the number of bits in one scanline of the image"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2562
3868
e47cf114c824 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3866
diff changeset
  2563
    ^ width * 8
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2564
!
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2565
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2566
bytesPerRow
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2567
    "return the number of bytes in one scanline of the image"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2568
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2569
    ^ width
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2570
!
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2571
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2572
colorFromValue:pixelValue
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2573
    "given a pixel value, return the corresponding color.
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2574
     Pixel values start with 0."
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2575
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2576
    photometric == #whiteIs0 ifTrue:[
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2577
	^ Color gray:100 - (100 / 255 * pixelValue)
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2578
    ].
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2579
    photometric == #blackIs0 ifTrue:[
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2580
	^ Color gray:(100 / 255 * pixelValue)
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2581
    ].
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2582
    photometric == #palette ifTrue:[
4718
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2583
	pixelValue < colorMap size ifTrue:[
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2584
	    ^ colorMap at:(pixelValue + 1)
11e89d5330e7 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4405
diff changeset
  2585
	]
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2586
    ].
3869
cd40d1912c03 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3868
diff changeset
  2587
    ^ super colorFromValue:pixelValue
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2588
!
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2589
8426
e2051b1553f0 Issue #126: Removing hack, correctly calculating masDisplayBuffer and having fallback maxDisplayBuffer is set to 107 characters.
Patrik Svestka <patrik.svestka@gmail.com>
parents: 7823
diff changeset
  2590
isDepth8Image
e2051b1553f0 Issue #126: Removing hack, correctly calculating masDisplayBuffer and having fallback maxDisplayBuffer is set to 107 characters.
Patrik Svestka <patrik.svestka@gmail.com>
parents: 7823
diff changeset
  2591
    "return true if the image is instance of Depth8Image"
e2051b1553f0 Issue #126: Removing hack, correctly calculating masDisplayBuffer and having fallback maxDisplayBuffer is set to 107 characters.
Patrik Svestka <patrik.svestka@gmail.com>
parents: 7823
diff changeset
  2592
   (self bitsPerPixel == 8) ifTrue:[^ true].  
e2051b1553f0 Issue #126: Removing hack, correctly calculating masDisplayBuffer and having fallback maxDisplayBuffer is set to 107 characters.
Patrik Svestka <patrik.svestka@gmail.com>
parents: 7823
diff changeset
  2593
    ^ false
e2051b1553f0 Issue #126: Removing hack, correctly calculating masDisplayBuffer and having fallback maxDisplayBuffer is set to 107 characters.
Patrik Svestka <patrik.svestka@gmail.com>
parents: 7823
diff changeset
  2594
e2051b1553f0 Issue #126: Removing hack, correctly calculating masDisplayBuffer and having fallback maxDisplayBuffer is set to 107 characters.
Patrik Svestka <patrik.svestka@gmail.com>
parents: 7823
diff changeset
  2595
    "Created: / 16-04-2018 / 17:01:10 / svestkap"
e2051b1553f0 Issue #126: Removing hack, correctly calculating masDisplayBuffer and having fallback maxDisplayBuffer is set to 107 characters.
Patrik Svestka <patrik.svestka@gmail.com>
parents: 7823
diff changeset
  2596
!
e2051b1553f0 Issue #126: Removing hack, correctly calculating masDisplayBuffer and having fallback maxDisplayBuffer is set to 107 characters.
Patrik Svestka <patrik.svestka@gmail.com>
parents: 7823
diff changeset
  2597
7597
5abdbcd771e5 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7533
diff changeset
  2598
nColorsUsed
5abdbcd771e5 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7533
diff changeset
  2599
    ^ colorMap size
5abdbcd771e5 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7533
diff changeset
  2600
!
5abdbcd771e5 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 7533
diff changeset
  2601
3273
f4cb380e0ae9 usedValues vs. realUsedValues
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  2602
realUsedValues
f4cb380e0ae9 usedValues vs. realUsedValues
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  2603
    "return a collection of color values used in the receiver."
f4cb380e0ae9 usedValues vs. realUsedValues
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  2604
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2605
    ^ self bits usedValues
3273
f4cb380e0ae9 usedValues vs. realUsedValues
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  2606
!
f4cb380e0ae9 usedValues vs. realUsedValues
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  2607
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2608
usedValues
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2609
    "return a collection of color values used in the receiver."
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2610
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2611
    ^ self bits usedValues
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2612
! !
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2613
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 941
diff changeset
  2614
!Depth8Image class methodsFor:'documentation'!
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2615
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2616
version
7276
3af688594d98 #QUALITY by cg
Claus Gittinger <cg@exept.de>
parents: 6837
diff changeset
  2617
    ^ '$Header$'
5371
8825c8866613 changed: #colorsFromX:y:toX:y:do:
Claus Gittinger <cg@exept.de>
parents: 5331
diff changeset
  2618
!
8825c8866613 changed: #colorsFromX:y:toX:y:do:
Claus Gittinger <cg@exept.de>
parents: 5331
diff changeset
  2619
8825c8866613 changed: #colorsFromX:y:toX:y:do:
Claus Gittinger <cg@exept.de>
parents: 5331
diff changeset
  2620
version_CVS
7276
3af688594d98 #QUALITY by cg
Claus Gittinger <cg@exept.de>
parents: 6837
diff changeset
  2621
    ^ '$Header$'
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
  2622
! !
6036
d1969789036e Refactoring:
Stefan Vogel <sv@exept.de>
parents: 5851
diff changeset
  2623