Depth24Image.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sat, 26 Nov 2016 21:09:32 +0000
branchjv
changeset 7719 c2f802dd340a
parent 7550 b38f65fc5d21
child 7753 c025b6129ba7
permissions -rw-r--r--
XFT: Forbid XFT rendering on bitmaps (depth-1 pixmaps) In theory it could work if XFT would just turn gray into either black or white. But XFT doesn't do it and simply draw nothing without failing in any way. To prevent this silent failures, forbid drawing XFT onto bitmaps (depth-1 pixmaps). After all, the while point of XFT is to use anti-aliased fonts.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
     1
"
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
     2
 COPYRIGHT (c) 1993 by Claus Gittinger
81
4ba554473294 *** empty log message ***
claus
parents: 66
diff changeset
     3
	      All Rights Reserved
3
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
     4
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
     5
 This software is furnished under a license and may be used
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
     6
 only in accordance with the terms of that license and with the
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
     8
 be provided or otherwise made available to, or used by, any
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
     9
 other person.  No title to or ownership of the software is
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
    10
 hereby transferred.
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
    11
"
3263
bd92a12c9316 category changes
Claus Gittinger <cg@exept.de>
parents: 2835
diff changeset
    12
"{ Package: 'stx:libview' }"
bd92a12c9316 category changes
Claus Gittinger <cg@exept.de>
parents: 2835
diff changeset
    13
6795
f945a03cf2ac class: Depth24Image
Claus Gittinger <cg@exept.de>
parents: 6301
diff changeset
    14
"{ NameSpace: Smalltalk }"
f945a03cf2ac class: Depth24Image
Claus Gittinger <cg@exept.de>
parents: 6301
diff changeset
    15
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    16
Image subclass:#Depth24Image
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    17
	instanceVariableNames:''
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    18
	classVariableNames:''
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    19
	poolDictionaries:''
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    20
	category:'Graphics-Images'
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    21
!
304f026e10cd Initial revision
claus
parents:
diff changeset
    22
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
    23
!Depth24Image class methodsFor:'documentation'!
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    24
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    25
copyright
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    26
"
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    27
 COPYRIGHT (c) 1993 by Claus Gittinger
81
4ba554473294 *** empty log message ***
claus
parents: 66
diff changeset
    28
	      All Rights Reserved
3
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
    29
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    30
 This software is furnished under a license and may be used
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    31
 only in accordance with the terms of that license and with the
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    32
 inclusion of the above copyright notice.   This software may not
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    33
 be provided or otherwise made available to, or used by, any
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    34
 other person.  No title to or ownership of the software is
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    35
 hereby transferred.
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    36
"
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    37
!
3
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
    38
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    39
documentation
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    40
"
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    41
    this class represents true-color (24 bit / pixel) images.
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    42
    It mainly consists of methods already implemented in Image,
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    43
    reimplemented here for more performance.
611
e0442439a3c6 documentation
Claus Gittinger <cg@exept.de>
parents: 579
diff changeset
    44
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
    45
    Only the #rgb format is supported here.
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
    46
611
e0442439a3c6 documentation
Claus Gittinger <cg@exept.de>
parents: 579
diff changeset
    47
    [author:]
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
    48
	Claus Gittinger
611
e0442439a3c6 documentation
Claus Gittinger <cg@exept.de>
parents: 579
diff changeset
    49
e0442439a3c6 documentation
Claus Gittinger <cg@exept.de>
parents: 579
diff changeset
    50
    [see also:]
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
    51
	Depth1Image Depth2Image Depth4Image Depth8Image Depth16Image
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
    52
	ImageReader
46
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    53
"
7b331e9012fd *** empty log message ***
claus
parents: 38
diff changeset
    54
! !
3
c0aaded4ef28 *** empty log message ***
claus
parents: 1
diff changeset
    55
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
    56
!Depth24Image class methodsFor:'queries'!
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
    57
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
    58
defaultPhotometric
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
    59
    "return the default photometric pixel interpretation"
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
    60
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
    61
    ^ #rgb
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
    62
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
    63
    "Created: 10.6.1996 / 18:08:25 / cg"
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
    64
!
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
    65
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
    66
imageDepth
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    67
    "return the depth of images represented by instances of
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    68
     this class - here we return 24"
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    69
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
    70
    ^ 24
579
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    71
e381761190c4 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 345
diff changeset
    72
    "Modified: 20.4.1996 / 23:39:50 / cg"
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
    73
! !
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
    74
3263
bd92a12c9316 category changes
Claus Gittinger <cg@exept.de>
parents: 2835
diff changeset
    75
!Depth24Image methodsFor:'accessing-pixels'!
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    76
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
    77
colorAtX:x y:y
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    78
    "retrieve a pixel at x/y; return a color.
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
    79
     Pixels start at x=0 , y=0 for upper left pixel,
7125
f37b7e5d26df #FEATURE
Claus Gittinger <cg@exept.de>
parents: 6795
diff changeset
    80
     end at x = width-1, y=height-1 for lower right pixel"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    81
7550
b38f65fc5d21 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7549
diff changeset
    82
    |rgbVal|
b38f65fc5d21 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7549
diff changeset
    83
7125
f37b7e5d26df #FEATURE
Claus Gittinger <cg@exept.de>
parents: 6795
diff changeset
    84
    photometric == #rgb ifTrue:[
7550
b38f65fc5d21 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7549
diff changeset
    85
        rgbVal := self pixelAtX:x y:y.
b38f65fc5d21 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7549
diff changeset
    86
        ^ Color rgbValue:rgbVal.
7125
f37b7e5d26df #FEATURE
Claus Gittinger <cg@exept.de>
parents: 6795
diff changeset
    87
    ].
f37b7e5d26df #FEATURE
Claus Gittinger <cg@exept.de>
parents: 6795
diff changeset
    88
    "/ the inherited method should handle all cases.
f37b7e5d26df #FEATURE
Claus Gittinger <cg@exept.de>
parents: 6795
diff changeset
    89
    ^ super colorAtX:x y:y.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
    90
!
304f026e10cd Initial revision
claus
parents:
diff changeset
    91
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
    92
colorAtX:x y:y put:aColor
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
    93
    "set the pixel at x/y to aColor.
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
    94
     Pixels start at x=0 , y=0 for upper left pixel, end at
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
    95
     x = width-1, y=height-1 for lower right pixel."
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
    96
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
    97
    photometric ~~ #rgb ifTrue:[^ super colorAtX:x y:y put:aColor].
7550
b38f65fc5d21 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7549
diff changeset
    98
    self pixelAtX:x y:y put:aColor rgbValue.
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
    99
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   100
    "Created: 24.4.1997 / 17:32:59 / cg"
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
   101
!
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
   102
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   103
pixelAtX:x y:y
7512
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   104
    "retrieve a pixel at x/y; return a pixel value.
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   105
     Pixels start at x=0 , y=0 for upper left pixel, end at
7278
52a81602e12c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7273
diff changeset
   106
     x = width-1, y=height-1 for lower right pixel.
52a81602e12c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7273
diff changeset
   107
     The pixel value contains r/g/b in msb order (i.e. r at high, b at low bits)"
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   108
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   109
    |index "{ Class: SmallInteger }"
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   110
     rVal  "{ Class: SmallInteger }"
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   111
     gVal  "{ Class: SmallInteger }"
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   112
     bVal  "{ Class: SmallInteger }"|
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   113
7273
894274c8169d #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7125
diff changeset
   114
%{  /* NOCONTEXT */
894274c8169d #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7125
diff changeset
   115
    OBJ b = __INST(bytes);
894274c8169d #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7125
diff changeset
   116
    OBJ w = __INST(width);
894274c8169d #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7125
diff changeset
   117
894274c8169d #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7125
diff changeset
   118
    if (__isByteArrayLike(b)
894274c8169d #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7125
diff changeset
   119
     && __bothSmallInteger(x, y)
894274c8169d #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7125
diff changeset
   120
     && __isSmallInteger(w)
894274c8169d #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7125
diff changeset
   121
     && (__INST(pixelFunction)==nil) ) {
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   122
	int _idx;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   123
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   124
	_idx = ((__intVal(w) * __intVal(y)) + __intVal(x))*3;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   125
	if (((unsigned)(_idx+2)) < __byteArraySize(b)) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   126
	    unsigned char *pPix = &(__ByteArrayInstPtr(b)->ba_element[_idx]);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   127
	    unsigned int _pix;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   128
	    _pix = (((pPix[0]<<8)+pPix[1])<<8)+pPix[2];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   129
	    RETURN( __MKSMALLINT(_pix) );
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   130
	}
7273
894274c8169d #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7125
diff changeset
   131
    }
894274c8169d #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7125
diff changeset
   132
%}.
6301
6eae8309c982 pixelfunction support
Claus Gittinger <cg@exept.de>
parents: 6066
diff changeset
   133
    pixelFunction notNil ifTrue:[^ pixelFunction value:x value:y].
6eae8309c982 pixelfunction support
Claus Gittinger <cg@exept.de>
parents: 6066
diff changeset
   134
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   135
    index := 1 + (((width * y) + x) * 3).
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   136
    rVal := bytes at:(index).
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   137
    gVal := bytes at:(index + 1).
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   138
    bVal := bytes at:(index + 2).
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   139
    ^ (((rVal bitShift:8) bitOr:gVal) bitShift:8) bitOr:bVal
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   140
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   141
    "Created: 24.4.1997 / 16:06:34 / cg"
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   142
!
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   143
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   144
pixelAtX:x y:y put:aPixelValue
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   145
    "set a pixel at x/y to aPixelValue, which is 24 bits RGB.
7512
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   146
     The interpretation of the pixelValue depends on the photometric
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   147
     and the colormap. (see also: Image>>atX:y:put:)
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   148
     Pixels start at x=0 , y=0 for upper left pixel, end at
304f026e10cd Initial revision
claus
parents:
diff changeset
   149
     x = width-1, y=height-1 for lower right pixel"
304f026e10cd Initial revision
claus
parents:
diff changeset
   150
304f026e10cd Initial revision
claus
parents:
diff changeset
   151
    |index "{ Class: SmallInteger }"
7512
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   152
     val   "{ Class: SmallInteger }"|
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   153
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   154
%{  /* NOCONTEXT */
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   155
    OBJ b = __INST(bytes);
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   156
    OBJ w = __INST(width);
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   157
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   158
    if (__isByteArrayLike(b)
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   159
     && __bothSmallInteger(x, y)
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   160
     && __bothSmallInteger(w, aPixelValue)
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   161
     && (__INST(pixelFunction)==nil) ) {
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   162
	int _idx;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   163
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   164
	_idx = ((__intVal(w) * __intVal(y)) + __intVal(x))*3;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   165
	if (((unsigned)(_idx+2)) < __byteArraySize(b)) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   166
	    unsigned char *pPix = &(__ByteArrayInstPtr(b)->ba_element[_idx]);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   167
	    unsigned int _pix = __intVal(aPixelValue);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   168
	    pPix[0] = (_pix>>16) & 0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   169
	    pPix[1] = (_pix>>8) & 0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   170
	    pPix[2] = (_pix) & 0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   171
	    RETURN( self );
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   172
	}
7512
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   173
    }
f094e73e5bf8 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7495
diff changeset
   174
%}.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   175
    index := 1 + (((width * y) + x) * 3).
304f026e10cd Initial revision
claus
parents:
diff changeset
   176
    val := aPixelValue.
304f026e10cd Initial revision
claus
parents:
diff changeset
   177
    bytes at:(index + 2) put:(val bitAnd:16rFF).
304f026e10cd Initial revision
claus
parents:
diff changeset
   178
    val := val bitShift:-8.
304f026e10cd Initial revision
claus
parents:
diff changeset
   179
    bytes at:(index + 1) put:(val bitAnd:16rFF).
304f026e10cd Initial revision
claus
parents:
diff changeset
   180
    val := val bitShift:-8.
304f026e10cd Initial revision
claus
parents:
diff changeset
   181
    bytes at:(index) put:val.
304f026e10cd Initial revision
claus
parents:
diff changeset
   182
!
304f026e10cd Initial revision
claus
parents:
diff changeset
   183
4118
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
   184
rgbValueAtX:x y:y
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
   185
    "retrieve a pixels rgb value at x/y; return a 24bit rgbValue (rrggbb, red is MSB).
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
   186
     Pixels start at 0@0 for upper left pixel, end at (width-1)@(height-1) for lower right pixel."
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
   187
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
   188
    ^ self pixelAtX:x y:y.
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
   189
!
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
   190
3872
390fabbc3036 comments and slight cleanup
Claus Gittinger <cg@exept.de>
parents: 3868
diff changeset
   191
rowAt:y putAll:pixelArray startingAt:startIndex
390fabbc3036 comments and slight cleanup
Claus Gittinger <cg@exept.de>
parents: 3868
diff changeset
   192
    "store a single rows bits from bits in the pixelArray argument;
390fabbc3036 comments and slight cleanup
Claus Gittinger <cg@exept.de>
parents: 3868
diff changeset
   193
     Return the pixelArray.
390fabbc3036 comments and slight cleanup
Claus Gittinger <cg@exept.de>
parents: 3868
diff changeset
   194
     Notice: row coordinate starts at 0."
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   195
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
   196
    |bytes dstIdx pixel|
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
   197
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
   198
    bytes := self bits.
3872
390fabbc3036 comments and slight cleanup
Claus Gittinger <cg@exept.de>
parents: 3868
diff changeset
   199
    dstIdx := (y * self bytesPerRow) + 1.
390fabbc3036 comments and slight cleanup
Claus Gittinger <cg@exept.de>
parents: 3868
diff changeset
   200
    0 to:width-1 do:[:col |
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   201
	pixel := pixelArray at:(startIndex + col).
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   202
	bytes at:dstIdx put:((pixel bitShift:-16) bitAnd:16rFF).
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   203
	bytes at:dstIdx+1 put:((pixel bitShift:-8) bitAnd:16rFF).
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   204
	bytes at:dstIdx+2 put:(pixel bitAnd:16rFF).
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   205
	dstIdx := dstIdx + 3.
1657
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   206
    ].
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   207
    ^ pixelArray
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   208
f3d8ceac748a pixel accessing methods cleaned up
Claus Gittinger <cg@exept.de>
parents: 1629
diff changeset
   209
    "Created: 24.4.1997 / 15:50:27 / cg"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   210
! !
304f026e10cd Initial revision
claus
parents:
diff changeset
   211
304f026e10cd Initial revision
claus
parents:
diff changeset
   212
!Depth24Image methodsFor:'converting rgb images'!
304f026e10cd Initial revision
claus
parents:
diff changeset
   213
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   214
asGrayFormOn:aDevice
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   215
    "return a grey form from the receiver.
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   216
     Redefined to use special code when converting to 8-bit
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   217
     greyScale displays."
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   218
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   219
    (aDevice visualType == #StaticGray) ifTrue:[
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   220
	aDevice depth == 8 ifTrue:[
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   221
	    ^ self makeDeviceGrayPixmapOn:aDevice depth:aDevice depth fromArray:(self threshold8BitGrayBits)
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   222
	].
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   223
    ].
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   224
    ^ super asGrayFormOn:aDevice
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   225
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   226
    "Created: 10.6.1996 / 19:00:45 / cg"
816
6576c8242e5d checkin from browser
Claus Gittinger <cg@exept.de>
parents: 813
diff changeset
   227
    "Modified: 10.6.1996 / 20:10:19 / cg"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   228
!
304f026e10cd Initial revision
claus
parents:
diff changeset
   229
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   230
asThresholdGrayImageDepth:depth
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   231
    "return an 8-bit grey image from the rgb picture.
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   232
     Pixel values are reduced to a 0..255 grey level."
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   233
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   234
    depth == 8 ifTrue:[
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   235
	photometric == #rgb ifTrue:[
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   236
	    ^ Depth8Image
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   237
		width:width
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   238
		height:height
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   239
		fromArray:(self threshold8BitGrayBits)
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   240
	]
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   241
    ].
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   242
    ^ super asThresholdGrayImageDepth:depth
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   243
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   244
    "
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   245
     |i|
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   246
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   247
     i := Image fromFile:'bitmaps/granite.tiff'.
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   248
     (i asThresholdGrayImageDepth:8) inspect.
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   249
     (i asThresholdGrayImageDepth:4) inspect.
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   250
     (i asThresholdGrayImageDepth:2) inspect.
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   251
     (i asThresholdGrayImageDepth:1) inspect.
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   252
    "
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   253
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   254
    "
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   255
     |i|
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   256
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   257
     i := Image fromFile:'bitmaps/granite.tiff'.
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   258
     ((i asThresholdGrayImageDepth:8) asOrderedDitheredGrayImageDepth:2) inspect
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   259
    "
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   260
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   261
    "
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   262
     |i|
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   263
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   264
     i := Image fromFile:'bitmaps/granite.tiff'.
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   265
     ((i asThresholdGrayImageDepth:8) asOrderedDitheredGrayImageDepth:4) inspect
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   266
    "
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   267
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   268
    "
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   269
     |i|
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   270
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   271
     i := Image fromFile:'bitmaps/granite.tiff'.
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   272
     (i asThresholdGrayImageDepth:8) asOrderedDitheredMonochromeImage inspect
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   273
    "
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   274
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
   275
    "Created: 8.6.1996 / 13:58:46 / cg"
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
   276
    "Modified: 10.6.1996 / 19:11:18 / cg"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   277
!
304f026e10cd Initial revision
claus
parents:
diff changeset
   278
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   279
rgbImageAsDitheredPseudoFormOn:aDevice
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   280
    "return a dithered pseudocolor form from the rgb-picture.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   281
     This method depends on fixColors being allocated (see Color>>getColors*)"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   282
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   283
    |ditherColors|
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   284
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   285
    (ditherColors := aDevice fixColors) notNil ifTrue:[
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   286
	^ self
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   287
		rgbImageAsDitheredPseudoFormOn:aDevice
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   288
		colors:ditherColors
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   289
		nRed:aDevice numFixRed
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   290
		nGreen:aDevice numFixGreen
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   291
		nBlue:aDevice numFixBlue
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   292
    ].
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   293
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   294
    ditherColors := Set new.
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   295
    ditherColors addAll:(aDevice ditherColors).
1629
7735e52e84f0 earlier break out of color allocation loop
Claus Gittinger <cg@exept.de>
parents: 1607
diff changeset
   296
    ditherColors addAll:(aDevice deviceColors).
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   297
    ditherColors := ditherColors asArray.
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   298
    ^ self
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   299
	rgbImageAsDitheredPseudoFormOn:aDevice
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
   300
	colors:ditherColors.
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   301
1629
7735e52e84f0 earlier break out of color allocation loop
Claus Gittinger <cg@exept.de>
parents: 1607
diff changeset
   302
    "Modified: 22.4.1997 / 11:59:44 / cg"
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   303
!
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   304
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   305
rgbImageAsDitheredPseudoFormOn:aDevice colors:fixColors
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   306
    "return a dithered 8-bit pseudocolor form from the rgb-picture, using
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   307
     arbitrary fix colors in fixColors."
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   308
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   309
    |pseudoBits f
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   310
     h        "{ Class: SmallInteger }"
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   311
     w        "{ Class: SmallInteger }"
4778
799620f24088 Change senders of obsolete messages Form>>...on: to ...onDevice:
Stefan Vogel <sv@exept.de>
parents: 4760
diff changeset
   312
     numFix   "{Class: SmallInteger }" deviceDepth
2773
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2535
diff changeset
   313
     fixIds fixRed fixGreen fixBlue failed cache idsUsed usedColors
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2535
diff changeset
   314
     fixColorArray|
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   315
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   316
    numFix := fixColors size.
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   317
    numFix == 256 ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   318
	"/ algorithm below only handles 255 colors.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   319
	numFix := 255.
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   320
    ].
2773
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2535
diff changeset
   321
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2535
diff changeset
   322
    fixColorArray := fixColors asArray.
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2535
diff changeset
   323
    fixIds := (fixColorArray collect:[:clr | clr colorId]) asByteArray.
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   324
2773
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2535
diff changeset
   325
    fixRed := (fixColorArray collect:[:clr | clr redByte]) asByteArray.
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2535
diff changeset
   326
    fixGreen := (fixColorArray collect:[:clr | clr greenByte]) asByteArray.
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2535
diff changeset
   327
    fixBlue := (fixColorArray collect:[:clr | clr blueByte]) asByteArray.
8aefa2576a50 a few more smallInteger type hints
Claus Gittinger <cg@exept.de>
parents: 2535
diff changeset
   328
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   329
    cache := ByteArray new:(1 bitShift:14).
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   330
    cache atAllPut:16rFF.
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   331
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   332
    deviceDepth := aDevice depth.
2529
637a5979a3d0 use new supportedImageFormat query from Device
Claus Gittinger <cg@exept.de>
parents: 2401
diff changeset
   333
    deviceDepth == 8 ifFalse:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   334
	(aDevice supportedImageFormatForDepth:8) isNil ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   335
	    ^ nil
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   336
	]
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   337
    ].
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   338
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   339
    idsUsed := ByteArray new:(fixIds size).
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   340
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   341
    'Depth24Image [info]: dithering ...' infoPrintCR.
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   342
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   343
    pseudoBits := ByteArray uninitializedNew:(width * height).
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   344
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   345
    h := height.
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   346
    w := width.
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   347
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   348
%{
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   349
    int __x, __y, __numFix;
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   350
    int __eR, __eG, __eB;
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   351
    unsigned char *srcP, *dstP;
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   352
    int pix;
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   353
    unsigned char *idP, *usedIdP, *redP, *greenP, *blueP, *cacheP;
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   354
    int __w = __intVal(w);
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   355
5480
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
   356
    if (__isByteArrayLike(__INST(bytes))
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   357
     && __isSmallInteger(numFix)
5480
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
   358
     && __isByteArrayLike(pseudoBits)
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
   359
     && __isByteArrayLike(cache)
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
   360
     && __isByteArrayLike(fixIds)
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
   361
     && __isByteArrayLike(idsUsed)
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
   362
     && __isByteArrayLike(fixRed)
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
   363
     && __isByteArrayLike(fixGreen)
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
   364
     && __isByteArrayLike(fixBlue) ) {
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   365
	failed = false;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   366
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   367
	srcP = __ByteArrayInstPtr(__INST(bytes))->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   368
	dstP = __ByteArrayInstPtr(pseudoBits)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   369
	idP = __ByteArrayInstPtr(fixIds)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   370
	usedIdP = __ByteArrayInstPtr(idsUsed)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   371
	redP = __ByteArrayInstPtr(fixRed)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   372
	greenP = __ByteArrayInstPtr(fixGreen)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   373
	blueP = __ByteArrayInstPtr(fixBlue)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   374
	cacheP = __ByteArrayInstPtr(cache)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   375
	__numFix = __intVal(numFix);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   376
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   377
	for (__y=__intVal(h); __y>0; __y--) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   378
	    __eR = __eG = __eB = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   379
	    for (__x=__w; __x>0; __x--) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   380
		int cacheIdx, clrIdx;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   381
		int __wantR, __wantG, __wantB;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   382
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   383
		__wantR = srcP[0] + __eR;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   384
		if (__wantR > 255) __wantR = 255;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   385
		else if (__wantR < 0) __wantR = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   386
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   387
		__wantG = srcP[1] + __eG;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   388
		if (__wantG > 255) __wantG = 255;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   389
		else if (__wantG < 0) __wantG = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   390
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   391
		__wantB = srcP[2] + __eB;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   392
		if (__wantB > 255) __wantB = 255;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   393
		else if (__wantB < 0) __wantB = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   394
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   395
		/*
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   396
		 * compute cache index
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   397
		 */
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   398
		cacheIdx = ((__wantR & 0xF8) >> 3);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   399
		cacheIdx = (cacheIdx << 5) | ((__wantG & 0xF8) >> 3);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   400
		cacheIdx = (cacheIdx << 4) | ((__wantB & 0xF0) >> 4);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   401
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   402
		clrIdx = cacheP[cacheIdx];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   403
		if (clrIdx == 0xFF) {   /* invalid slot */
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   404
		    unsigned minErr, minIdx;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   405
		    int i;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   406
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   407
		    /*
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   408
		     * must search ...
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   409
		     */
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   410
		    minErr = 0x7FFFFFF; minIdx = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   411
		    for (i=0; i<__numFix; i++) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   412
			unsigned cR, cG, cB, e;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   413
			int eR, eG, eB;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   414
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   415
			cR = redP[i]; cG = greenP[i]; cB = blueP[i];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   416
			eR = cR - __wantR;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   417
			if (eR < 0) eR = -eR;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   418
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   419
			eG = cG - __wantG;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   420
			if (eG < 0) eG = -eG;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   421
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   422
			eB = cB - __wantB;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   423
			if (eB < 0) eB = -eB;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   424
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   425
			e = eR + eG + eB;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   426
			if (e < minErr) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   427
			    minErr = e;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   428
			    minIdx = i;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   429
			    if (e < 7) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   430
				break;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   431
			    }
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   432
			}
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   433
		    }
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   434
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   435
		    /*
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   436
		     * minIdx is now index into fixColors
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   437
		     */
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   438
		    cacheP[cacheIdx] = clrIdx = minIdx;
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   439
/*
4721
ece6b3ce6b99 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4719
diff changeset
   440
console_fprintf(stderr, "want %d/%d/%d best: %d [%d/%d/%d]\n", __wantR, __wantG, __wantB, clrIdx, redP[clrIdx], greenP[clrIdx], blueP[clrIdx]);
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   441
*/
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   442
		}
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   443
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   444
		/*
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   445
		 * store the corresponding dither colorId
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   446
		 */
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   447
		*dstP++ = idP[clrIdx];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   448
		usedIdP[clrIdx] = 1;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   449
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   450
		srcP += 3;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   451
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   452
		/*
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   453
		 * the new error:
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   454
		 */
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   455
		__eR = __wantR - redP[clrIdx];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   456
		__eG = __wantG - greenP[clrIdx];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   457
		__eB = __wantB - blueP[clrIdx];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   458
	    }
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   459
	}
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   460
    }
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   461
%}.
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   462
    failed ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   463
	self primitiveFailed.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   464
	^ nil
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   465
    ].
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   466
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   467
    "/ not all colors may be really in use ...
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   468
    usedColors := fixColors copy.
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   469
    idsUsed keysAndValuesDo:[:idx :flag |
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   470
	flag == 0 ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   471
	    usedColors at:idx put:nil
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   472
	]
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   473
    ].
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   474
7495
c62bd4c05a4d #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7278
diff changeset
   475
    f := Form imageForm width:width height:height depth:aDevice depth onDevice:aDevice.
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   476
    f isNil ifTrue:[^ nil].
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   477
    f colorMap:usedColors.
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   478
    f initGC.
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   479
    aDevice
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   480
	drawBits:pseudoBits
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   481
	bitsPerPixel:8
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   482
	depth:aDevice depth
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   483
	padding:8
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   484
	width:width height:height
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   485
	x:0 y:0
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   486
	into:(f id)
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   487
	x:0 y:0
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   488
	width:width height:height
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   489
	with:(f gcId).
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   490
    ^ f
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   491
!
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   492
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   493
rgbImageAsDitheredPseudoFormOn:aDevice colors:fixColors nRed:nRed nGreen:nGreen nBlue:nBlue
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   494
    "return a dithered pseudocolor form from the rgb-picture,
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   495
     using colors from a colorCube for dithering."
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   496
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   497
    |pseudoBits f
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   498
     h        "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   499
     w        "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   500
"/     eR    "{Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   501
"/     eG    "{Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   502
"/     eB    "{Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   503
"/     wantR "{Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   504
"/     wantG "{Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   505
"/     wantB "{Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   506
     fixR  "{Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   507
     fixG  "{Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   508
     fixB  "{Class: SmallInteger }"
2529
637a5979a3d0 use new supportedImageFormat query from Device
Claus Gittinger <cg@exept.de>
parents: 2401
diff changeset
   509
     deviceDepth
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   510
     fixIds idsUsed failed usedColors|
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   511
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   512
    fixR := nRed.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   513
    fixR == 0 ifTrue:[ ^ nil].
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   514
    fixG := nGreen.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   515
    fixG == 0 ifTrue:[ ^ nil].
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   516
    fixB := nBlue.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   517
    fixB == 0 ifTrue:[ ^ nil].
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   518
    "/ simple check
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   519
    (fixR * fixG * fixB) ~~ fixColors size ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   520
	self error:'invalid color array passed'.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   521
	^ nil
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   522
    ].
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   523
    fixIds := (fixColors asArray collect:[:clr | clr colorId]) asByteArray.
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   524
    idsUsed := ByteArray new:(fixIds size).
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   525
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   526
    deviceDepth := aDevice depth.
2529
637a5979a3d0 use new supportedImageFormat query from Device
Claus Gittinger <cg@exept.de>
parents: 2401
diff changeset
   527
    deviceDepth == 8 ifFalse:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   528
	(aDevice supportedImageFormatForDepth:8) isNil ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   529
	    ^ nil
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   530
	]
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   531
    ].
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   532
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
   533
    'Depth24Image [info]: dithering ...' infoPrintCR.
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   534
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   535
    pseudoBits := ByteArray uninitializedNew:(width * height).
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   536
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   537
    h := height.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   538
    w := width.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   539
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   540
%{
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   541
    int __x, __y;
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   542
    int __eR, __eG, __eB;
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   543
    int __wantR, __wantG, __wantB;
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   544
    unsigned char *srcP, *dstP;
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   545
    unsigned char *redP, *greenP, *blueP;
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   546
    int pix;
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   547
    unsigned char *idP;
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   548
    unsigned char *usedIdP;
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   549
    int __fR, __fG, __fB;
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   550
    int iR, iG, iB;
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   551
    int idx;
858
5eb598185858 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 856
diff changeset
   552
    int __w = __intVal(w);
1817
2f71142cb24d checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1812
diff changeset
   553
    int leftToRight;
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   554
5480
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
   555
    if (__isByteArrayLike(__INST(bytes))
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   556
     && __isByteArray(pseudoBits)
5480
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
   557
     && __isByteArrayLike(fixIds)
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
   558
     && __isByteArrayLike(idsUsed)
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   559
     && __bothSmallInteger(fixR, fixG)
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   560
     && __isSmallInteger(fixB)) {
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   561
	failed = false;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   562
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   563
	srcP = __ByteArrayInstPtr(__INST(bytes))->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   564
	dstP = __ByteArrayInstPtr(pseudoBits)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   565
	idP = __ByteArrayInstPtr(fixIds)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   566
	usedIdP = __ByteArrayInstPtr(idsUsed)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   567
	__fR = __intVal(fixR)-1;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   568
	__fG = __intVal(fixG)-1;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   569
	__fB = __intVal(fixB)-1;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   570
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   571
	__eR = __eG = __eB = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   572
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   573
	leftToRight = 1;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   574
	for (__y=__intVal(h); __y>0; __y--) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   575
	    if (leftToRight) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   576
		for (__x=__w; __x>0; __x--) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   577
		    int __want;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   578
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   579
		    /*
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   580
		     * wR, wG and wB is the wanted r/g/b value;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   581
		     * compute the index into the dId table ..
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   582
		     * values: 0..255; scale to 0..fR-1, 0..fG-1, 0..fB-1
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   583
		     *
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   584
		     * bad kludge: knows how to index into FixColor table
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   585
		     */
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   586
		    __wantR = __want = srcP[0] + __eR;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   587
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   588
		    if (__want > 255) __want = 255;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   589
		    else if (__want < 0) __want = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   590
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   591
		    iR = __want * __fR / 128;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   592
		    iR = (iR / 2) + (iR & 1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   593
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   594
		    __wantG = __want = srcP[1] + __eG;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   595
		    if (__want > 255) __want = 255;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   596
		    else if (__want < 0) __want = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   597
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   598
		    iG = __want * __fG / 128;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   599
		    iG = (iG / 2) + (iG & 1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   600
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   601
		    __wantB = __want = srcP[2] + __eB;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   602
		    if (__want > 255) __want = 255;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   603
		    else if (__want < 0) __want = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   604
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   605
		    iB = __want * __fB / 128;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   606
		    iB = (iB / 2) + (iB & 1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   607
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   608
		    idx = iR * (__fG+1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   609
		    idx = (idx + iG) * (__fB+1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   610
		    idx = idx + iB;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   611
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   612
		    /*
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   613
		     * store the corresponding dither colorId
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   614
		     */
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   615
		    *dstP++ = idP[idx];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   616
		    usedIdP[idx] = 1;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   617
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   618
		    srcP += 3;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   619
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   620
		    /*
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   621
		     * the new error:
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   622
		     */
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   623
		    __eR = __wantR - (iR * 256 / __fR);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   624
		    __eG = __wantG - (iG * 256 / __fG);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   625
		    __eB = __wantB - (iB * 256 / __fB);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   626
		}
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   627
		leftToRight = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   628
	    } else {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   629
		srcP += (__w*3);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   630
		dstP += __w;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   631
		for (__x=__w; __x>0; __x--) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   632
		    int __want;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   633
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   634
		    /*
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   635
		     * wR, wG and wB is the wanted r/g/b value;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   636
		     * compute the index into the dId table ..
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   637
		     * values: 0..255; scale to 0..fR-1, 0..fG-1, 0..fB-1
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   638
		     *
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   639
		     * bad kludge: knows how to index into FixColor table
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   640
		     */
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   641
		    srcP -= 3;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   642
		    __wantR = __want = srcP[0] + __eR;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   643
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   644
		    if (__want > 255) __want = 255;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   645
		    else if (__want < 0) __want = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   646
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   647
		    iR = __want * __fR / 128;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   648
		    iR = (iR / 2) + (iR & 1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   649
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   650
		    __wantG = __want = srcP[1] + __eG;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   651
		    if (__want > 255) __want = 255;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   652
		    else if (__want < 0) __want = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   653
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   654
		    iG = __want * __fG / 128;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   655
		    iG = (iG / 2) + (iG & 1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   656
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   657
		    __wantB = __want = srcP[2] + __eB;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   658
		    if (__want > 255) __want = 255;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   659
		    else if (__want < 0) __want = 0;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   660
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   661
		    iB = __want * __fB / 128;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   662
		    iB = (iB / 2) + (iB & 1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   663
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   664
		    idx = iR * (__fG+1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   665
		    idx = (idx + iG) * (__fB+1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   666
		    idx = idx + iB;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   667
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   668
		    /*
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   669
		     * store the corresponding dither colorId
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   670
		     */
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   671
		    *--dstP = idP[idx];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   672
		    usedIdP[idx] = 1;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   673
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   674
		    /*
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   675
		     * the new error:
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   676
		     */
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   677
		    __eR = __wantR - (iR * 256 / __fR);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   678
		    __eG = __wantG - (iG * 256 / __fG);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   679
		    __eB = __wantB - (iB * 256 / __fB);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   680
		}
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   681
		srcP += (__w*3);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   682
		dstP += __w;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   683
		leftToRight = 1;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   684
	    }
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   685
	}
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   686
    }
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   687
%}.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   688
    failed ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   689
	self primitiveFailed.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   690
	^ nil
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   691
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   692
"/ for non-C programmers:
1218
2d7c79e5965f oops - dont limit myself on Display
Claus Gittinger <cg@exept.de>
parents: 1177
diff changeset
   693
"/     the above code is (roughly) equivalent to:
2d7c79e5965f oops - dont limit myself on Display
Claus Gittinger <cg@exept.de>
parents: 1177
diff changeset
   694
"/     (but it is just as ugly looking as the above ;-)
2d7c79e5965f oops - dont limit myself on Display
Claus Gittinger <cg@exept.de>
parents: 1177
diff changeset
   695
"/
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   696
"/    srcIndex := 1.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   697
"/    dstIndex := 1.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   698
"/    1 to:h do:[:y |
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   699
"/        eR := eG := eB := 0.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   700
"/        1 to:w do:[:x |
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   701
"/            |pixel "{ Class: SmallInteger }"
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   702
"/             clr
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   703
"/             idx   "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   704
"/             iR    "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   705
"/             iG    "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   706
"/             iB    "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   707
"/             wR    "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   708
"/             wG    "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   709
"/             wB    "{ Class: SmallInteger }" |
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   710
"/
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   711
"/            wantR := ((bytes at:srcIndex) + eR). srcIndex := srcIndex + 1.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   712
"/            wantG := ((bytes at:srcIndex) + eG). srcIndex := srcIndex + 1.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   713
"/            wantB := ((bytes at:srcIndex) + eB). srcIndex := srcIndex + 1.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   714
"/            wR := wantR.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   715
"/            wR > 255 ifTrue:[wR := 255] ifFalse:[wR < 0 ifTrue:[wR := 0]].
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   716
"/            wG := wantG.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   717
"/            wG > 255 ifTrue:[wG := 255] ifFalse:[wG < 0 ifTrue:[wG := 0]].
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   718
"/            wB := wantB.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   719
"/            wB > 255 ifTrue:[wB := 255] ifFalse:[wB < 0 ifTrue:[wB := 0]].
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   720
"/
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   721
"/            iR := wR * (fixR-1) // 128.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   722
"/            iR := (iR // 2) + (iR bitAnd:1).
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   723
"/            iG := wG * (fixG-1) // 128.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   724
"/            iG := (iG // 2) + (iG bitAnd:1).
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   725
"/            iB := wB * (fixB-1) // 128.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   726
"/            iB := (iB // 2) + (iB bitAnd:1).
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   727
"/            idx := (iR * fixR + iG) * fixB + iB + 1.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   728
"/
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   729
"/            clr := fixColors at:idx.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   730
"/
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   731
"/            eR := wantR - (clr red * 2) asInteger.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   732
"/            eG := wantG - (clr green * 2) asInteger.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   733
"/            eB := wantB - (clr blue * 2) asInteger.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   734
"/
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   735
"/            pixel := clr colorId.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   736
"/            pseudoBits at:dstIndex put:pixel.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   737
"/
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   738
"/            dstIndex := dstIndex + 1
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   739
"/        ].
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   740
    ].
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   741
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   742
    "/ not all colors may be really in use ...
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   743
    usedColors := fixColors copy.
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   744
    idsUsed keysAndValuesDo:[:idx :flag |
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   745
	flag == 0 ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   746
	    usedColors at:idx put:nil
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   747
	]
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   748
    ].
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   749
7495
c62bd4c05a4d #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7278
diff changeset
   750
    f := Form imageForm width:width height:height depth:aDevice depth onDevice:aDevice.
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   751
    f isNil ifTrue:[^ nil].
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   752
    f colorMap:usedColors.
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   753
    f initGC.
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   754
    aDevice
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   755
	drawBits:pseudoBits
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   756
	bitsPerPixel:8
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   757
	depth:aDevice depth
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   758
	padding:8
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   759
	width:width height:height
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   760
	x:0 y:0
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   761
	into:(f id)
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   762
	x:0 y:0
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   763
	width:width height:height
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   764
	with:(f gcId).
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   765
    ^ f
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   766
!
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
   767
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   768
rgbImageAsPseudoFormOn:aDevice
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   769
    "return a pseudocolor form from the rgb-picture.
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   770
     If a colorCube is used, pass the work on to the cube-dither
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   771
     code. Otherwise, allocate as many colors as possible, then
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   772
     use those for dithering.
1607
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   773
     Could be improved, by searching for (& allocating)
4eb60ce558db when dithering rgb images:
Claus Gittinger <cg@exept.de>
parents: 1598
diff changeset
   774
     heavily used colors and/or min-max colors first."
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   775
304f026e10cd Initial revision
claus
parents:
diff changeset
   776
    |pseudoBits f
304f026e10cd Initial revision
claus
parents:
diff changeset
   777
     r        "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   778
     g        "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   779
     b        "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   780
     srcIndex "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   781
     dstIndex "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   782
     rMask    "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   783
     gMask    "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   784
     bMask    "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   785
     redArray greenArray blueArray
304f026e10cd Initial revision
claus
parents:
diff changeset
   786
     dataSize "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
   787
     nColors  "{ Class: SmallInteger }"
4778
799620f24088 Change senders of obsolete messages Form>>...on: to ...onDevice:
Stefan Vogel <sv@exept.de>
parents: 4760
diff changeset
   788
     fit fitMap colors color fast
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   789
     colorIndex "{ Class: SmallInteger }"
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
   790
     depth nColorCells deep nColorsNeeded bytes|
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
   791
938
1926ecac24b5 fixColor and ditherColor stuff moved from Color
Claus Gittinger <cg@exept.de>
parents: 886
diff changeset
   792
    aDevice fixColors notNil ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   793
	"/ no need to look for used colors - dithering anyway ...
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   794
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   795
	f := self rgbImageAsDitheredPseudoFormOn:aDevice.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   796
	f notNil ifTrue:[^ f].
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
   797
    ].
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   798
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
   799
    bytes := self bits.
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
   800
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   801
    "find used colors; build color-tree"
304f026e10cd Initial revision
claus
parents:
diff changeset
   802
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
   803
    fit := false.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   804
    fitMap := false.
304f026e10cd Initial revision
claus
parents:
diff changeset
   805
    depth := aDevice depth.
304f026e10cd Initial revision
claus
parents:
diff changeset
   806
    nColorCells := aDevice ncells.
304f026e10cd Initial revision
claus
parents:
diff changeset
   807
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
   808
    deep := (depth > 8).
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
   809
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   810
    rMask := 2r11111111.
304f026e10cd Initial revision
claus
parents:
diff changeset
   811
    gMask := 2r11111111.
304f026e10cd Initial revision
claus
parents:
diff changeset
   812
    bMask := 2r11111111.
304f026e10cd Initial revision
claus
parents:
diff changeset
   813
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
   814
    'Depth24Image [info]: allocating colors ...' infoPrintCR.
66
398cf6bfb241 *** empty log message ***
claus
parents: 54
diff changeset
   815
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   816
    [fit] whileFalse:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   817
	[fitMap] whileFalse:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   818
	    srcIndex := 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   819
	    redArray := Array new:256.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   820
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   821
	    "
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   822
	     find used colors, build [r][g][b] 3-dimensional array
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   823
	     containing true for used colors
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   824
	    "
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   825
	    nColors := 0.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   826
	    srcIndex := 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   827
	    dataSize := bytes size.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   828
	    [(srcIndex < dataSize)
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   829
	     and:[nColors <= nColorCells]] whileTrue:[
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   830
%{
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   831
		if (__isByteArrayLike(bytes)) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   832
		    int sI = __intVal(srcIndex);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   833
		    unsigned char *cp = __ByteArrayInstPtr(bytes)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   834
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   835
		    r = __MKSMALLINT((cp[sI - 1] & __intVal(rMask)) + 1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   836
		    g = __MKSMALLINT((cp[sI]     & __intVal(gMask)) + 1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   837
		    b = __MKSMALLINT((cp[sI + 1] & __intVal(bMask)) + 1);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   838
		    srcIndex = __MKSMALLINT(sI + 3);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   839
		    fast = true;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   840
		} else {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   841
		    fast = false;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   842
		}
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   843
%}
304f026e10cd Initial revision
claus
parents:
diff changeset
   844
.
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   845
		fast ifFalse:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   846
		    r := bytes at:srcIndex.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   847
		    r := (r bitAnd:rMask) + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   848
		    srcIndex := srcIndex + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   849
		    g := bytes at:srcIndex.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   850
		    g := (g bitAnd:gMask) + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   851
		    srcIndex := srcIndex + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   852
		    b := bytes at:srcIndex.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   853
		    b := (b bitAnd:bMask) + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   854
		    srcIndex := srcIndex + 1
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   855
		].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   856
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   857
		greenArray := redArray at:r.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   858
		greenArray isNil ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   859
		    greenArray := Array new:256.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   860
		    redArray at:r put:greenArray
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   861
		].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   862
		blueArray := greenArray at:g.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   863
		blueArray isNil ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   864
		    deep ifTrue:[blueArray := Array new:256]
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   865
		    ifFalse:[blueArray := ByteArray new:256].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   866
		    greenArray at:g put:blueArray
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   867
		].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   868
		(blueArray at:b) == 0 ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   869
		    blueArray at:b put:1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   870
		    nColors := nColors + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   871
		    (nColors > nColorCells) ifTrue:[
1923
cdd2c4e199df if device is running out of allocatable colors,
Claus Gittinger <cg@exept.de>
parents: 1818
diff changeset
   872
"/                        'Depth24Image [info]: more than ' infoPrint. nColorCells infoPrint. ' colors' infoPrintCR.
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   873
			srcIndex := dataSize + 1
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   874
		    ]
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   875
		]
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   876
	    ].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   877
	    nColorsNeeded isNil ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   878
		nColorsNeeded := nColors
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   879
	    ].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   880
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   881
	    "again with less color bits if it does not fit colormap"
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   882
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   883
	    (nColors <= nColorCells) ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   884
		fitMap := true
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   885
	    ] ifFalse:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   886
		"/ must try again - cutting off some bits
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   887
		"/ blue bits are snipped off faster.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   888
		(bMask == 2r11111111) ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   889
		    bMask := 2r11111100
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   890
		] ifFalse:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   891
		    (bMask == 2r11111100) ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   892
			bMask := 2r11110000
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   893
		    ] ifFalse:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   894
			(rMask == 2r11111111) ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   895
			    rMask := 2r11111100.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   896
			    gMask := 2r11111100.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   897
			] ifFalse:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   898
			    rMask := (rMask bitShift:1) bitAnd:2r11111111.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   899
			    gMask := (gMask bitShift:1) bitAnd:2r11111111.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   900
			    bMask := (bMask bitShift:1) bitAnd:2r11111111
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   901
			]
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   902
		    ]
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   903
		].
1923
cdd2c4e199df if device is running out of allocatable colors,
Claus Gittinger <cg@exept.de>
parents: 1818
diff changeset
   904
"/                'Depth24Image [info]: too many colors; retry with less color resolution' infoPrintCR.
38
2652fc96e660 *** empty log message ***
claus
parents: 35
diff changeset
   905
"
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   906
    'masks:' print. rMask print. ' ' print. gMask print. ' ' print.
304f026e10cd Initial revision
claus
parents:
diff changeset
   907
    bMask printNewline
38
2652fc96e660 *** empty log message ***
claus
parents: 35
diff changeset
   908
"
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   909
	    ]
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   910
	].
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   911
1923
cdd2c4e199df if device is running out of allocatable colors,
Claus Gittinger <cg@exept.de>
parents: 1818
diff changeset
   912
"/        'Depth24Image [info]: ' infoPrint. nColors infoPrint. ' colors used' infoPrintCR.
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
   913
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   914
	colors := Array new:nColors.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   915
	colorIndex := 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   916
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   917
	"
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   918
	 now, we have reduced things to the number of colors
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   919
	 which are theoretically supported by the devices colormap.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   920
	 allocate all used colors in walking over true entries in
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   921
	 the [r][g][b] table - this may still fail,
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   922
	 if we run out of device colors.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   923
	"
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   924
	fit := true.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   925
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   926
	r := 0.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   927
	redArray do:[:greenArray |
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   928
	    (fit and:[greenArray notNil]) ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   929
		g := 0.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   930
		greenArray do:[:blueArray |
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   931
		    (fit and:[blueArray notNil]) ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   932
			b := 0.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   933
			blueArray do:[:present |
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   934
			    |id|
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   935
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   936
			    (fit and:[present ~~ 0]) ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   937
				color := Color redByte:r
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   938
					     greenByte:g
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   939
					      blueByte:b.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   940
				color := color onDevice:aDevice.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   941
				(id := color colorId) isNil ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   942
				    fit := false
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   943
				] ifFalse:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   944
				    colors at:colorIndex put:color.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   945
				    colorIndex := colorIndex + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   946
				    blueArray at:(b + 1) put:id
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   947
				]
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   948
			    ].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   949
			    b := b + 1
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   950
			]
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   951
		    ].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   952
		    g := g + 1
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   953
		]
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   954
	    ].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   955
	    r := r + 1
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   956
	].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   957
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   958
	"again with less color bits if we did not get all colors"
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   959
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   960
	fit ifFalse:[
1923
cdd2c4e199df if device is running out of allocatable colors,
Claus Gittinger <cg@exept.de>
parents: 1818
diff changeset
   961
"/            'Depth24Image [info]: could not allocate color(s)' infoPrintCR.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   962
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   963
	    "free the allocated colors"
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   964
	    colors atAllPut:nil.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   965
	    "a kludge - force immediate freeing of colors"
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   966
	    ObjectMemory scavenge; finalize.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   967
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   968
	    "cut off one more color-bit - cut off blue first"
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   969
	    (bMask == 2r11111111) ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   970
		bMask := 2r11111100
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   971
	    ] ifFalse:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   972
		(bMask == 2r11111100) ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   973
		    bMask := 2r11110000
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   974
		] ifFalse:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   975
		    (rMask == 2r11111111) ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   976
			rMask := 2r11111100.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   977
			gMask := 2r11111100.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   978
		    ] ifFalse:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   979
			rMask := (rMask bitShift:1) bitAnd:2r11111111.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   980
			gMask := (gMask bitShift:1) bitAnd:2r11111111.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   981
			bMask := (bMask bitShift:1) bitAnd:2r11111111
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   982
		    ]
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   983
		]
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   984
	    ].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   985
	    fitMap := false.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   986
	    redArray := nil
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   987
	]
1
304f026e10cd Initial revision
claus
parents:
diff changeset
   988
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
   989
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
   990
    (nColors ~~ nColorsNeeded) ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   991
	"/ mhmh - did not get all colors ...
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   992
	"/ add existing colors and dither.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   993
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   994
	'Depth24Image [info]: only got ' infoPrint. nColors infoPrint. ' out of ' infoPrint.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   995
	nColorsNeeded infoPrint. ' image colors.' infoPrintCR.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   996
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   997
	"/
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   998
	"/ dither using those we got ...
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
   999
	"/
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1000
	DitherAlgorithm == #floydSteinberg ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1001
	    colors := colors asNewSet.
1629
7735e52e84f0 earlier break out of color allocation loop
Claus Gittinger <cg@exept.de>
parents: 1607
diff changeset
  1002
"/            ditherColors := aDevice availableDitherColors.
7735e52e84f0 earlier break out of color allocation loop
Claus Gittinger <cg@exept.de>
parents: 1607
diff changeset
  1003
"/            ditherColors notNil ifTrue:[
7735e52e84f0 earlier break out of color allocation loop
Claus Gittinger <cg@exept.de>
parents: 1607
diff changeset
  1004
"/                colors addAll:ditherColors.
7735e52e84f0 earlier break out of color allocation loop
Claus Gittinger <cg@exept.de>
parents: 1607
diff changeset
  1005
"/            ].
1923
cdd2c4e199df if device is running out of allocatable colors,
Claus Gittinger <cg@exept.de>
parents: 1818
diff changeset
  1006
"/            colors addAll:aDevice deviceColors.
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1007
	    colors addAll:(aDevice colorMap collect:[:c|c onDevice:aDevice]).
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1008
	    colors := (colors select:[:c | c colorId notNil]) asOrderedCollection.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1009
	    colors size > 256 ifTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1010
		colors := colors copyTo:256
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1011
	    ].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1012
	    f := self rgbImageAsDitheredPseudoFormOn:aDevice colors:colors.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1013
	    f notNil ifTrue:[^ f].
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1014
	].
2535
c4a408209eda checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
  1015
    ].
c4a408209eda checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
  1016
c4a408209eda checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
  1017
    "/ the device ought to support 8-bit images ...
c4a408209eda checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2529
diff changeset
  1018
    (aDevice supportedImageFormatForDepth:8) isNil ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1019
	"/ cannot draw directly
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1020
	^ nil
1597
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
  1021
    ].
019f40ecbe64 added dither code for no-colorCube case.
Claus Gittinger <cg@exept.de>
parents: 1577
diff changeset
  1022
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1023
    "create pseudocolor bits and translate"
304f026e10cd Initial revision
claus
parents:
diff changeset
  1024
304f026e10cd Initial revision
claus
parents:
diff changeset
  1025
    pseudoBits := ByteArray uninitializedNew:(width * height).
304f026e10cd Initial revision
claus
parents:
diff changeset
  1026
304f026e10cd Initial revision
claus
parents:
diff changeset
  1027
    srcIndex := 1.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1028
    dstIndex := 1.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1029
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
  1030
    (rMask == 2r11111111
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
  1031
     and:[gMask == 2r11111111
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
  1032
     and:[bMask == 2r11111111]]) ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1033
	[srcIndex < dataSize] whileTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1034
	    r := bytes at:srcIndex.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1035
	    srcIndex := srcIndex + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1036
	    g := bytes at:srcIndex.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1037
	    srcIndex := srcIndex + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1038
	    b := bytes at:srcIndex.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1039
	    srcIndex := srcIndex + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1040
	    greenArray := redArray at:(r + 1).
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1041
	    blueArray := greenArray at:(g + 1).
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1042
	    pseudoBits at:dstIndex put:(blueArray at:(b + 1)).
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1043
	    dstIndex := dstIndex + 1
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1044
	]
89
ea2bf46eb669 *** empty log message ***
claus
parents: 81
diff changeset
  1045
    ] ifFalse:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1046
	[srcIndex < dataSize] whileTrue:[
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1047
	    r := bytes at:srcIndex.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1048
	    r := r bitAnd:rMask.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1049
	    srcIndex := srcIndex + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1050
	    g := bytes at:srcIndex.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1051
	    g := g bitAnd:gMask.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1052
	    srcIndex := srcIndex + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1053
	    b := bytes at:srcIndex.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1054
	    b := b bitAnd:bMask.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1055
	    srcIndex := srcIndex + 1.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1056
	    greenArray := redArray at:(r + 1).
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1057
	    blueArray := greenArray at:(g + 1).
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1058
	    pseudoBits at:dstIndex put:(blueArray at:(b + 1)).
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1059
	    dstIndex := dstIndex + 1
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1060
	]
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1061
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1062
7495
c62bd4c05a4d #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7278
diff changeset
  1063
    f := Form imageForm width:width height:height depth:depth onDevice:aDevice.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1064
    f isNil ifTrue:[^ nil].
304f026e10cd Initial revision
claus
parents:
diff changeset
  1065
    f colorMap:colors.
304f026e10cd Initial revision
claus
parents:
diff changeset
  1066
    f initGC.
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  1067
    aDevice
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1068
	drawBits:pseudoBits
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1069
	bitsPerPixel:8
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1070
	depth:depth
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1071
	padding:8
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1072
	width:width height:height
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1073
	x:0 y:0
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1074
	into:(f id)
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1075
	x:0 y:0
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1076
	width:width height:height
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1077
	with:(f gcId).
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  1078
    ^ f
194
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1079
!
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1080
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1081
rgbImageAsTrueColorFormOn:aDevice
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1082
    "return a truecolor form from the rgb-picture."
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1083
4805
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1084
    | bestFormat usedDeviceDepth usedDeviceBitsPerPixel usedDevicePadding form imageBits|
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1085
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1086
    bestFormat := self bestSupportedImageFormatFor:aDevice.
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1087
    usedDeviceDepth := bestFormat at:#depth.
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1088
    usedDeviceBitsPerPixel := bestFormat at:#bitsPerPixel.
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1089
    usedDevicePadding := bestFormat at:#padding.
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1090
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1091
    imageBits := self
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1092
		    rgbImageBitsOn:aDevice
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1093
		    bestFormat: bestFormat
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1094
		    returnUsedDevicePattingIn:[:arg | usedDevicePadding := arg].
4813
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1095
4805
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1096
    imageBits isNil ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1097
	^ self asMonochromeFormOn:aDevice
4805
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1098
    ].
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1099
7495
c62bd4c05a4d #OTHER by stefan
Stefan Vogel <sv@exept.de>
parents: 7278
diff changeset
  1100
    form := Form imageForm width:width height:height depth:usedDeviceDepth onDevice:aDevice.
4805
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1101
    form isNil ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1102
	'Depth24Image [warning]: display bitmap creation failed' errorPrintCR.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1103
	^ nil
4805
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1104
    ].
5836
877ff039d6f6 changed: #rgbImageAsTrueColorFormOn:
Claus Gittinger <cg@exept.de>
parents: 5480
diff changeset
  1105
    form id isNil ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1106
	"/ usually happens if the image is too big (out of memory)
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1107
	'Depth24Image [warning]: display bitmap creation failed' errorPrintCR.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1108
	^ nil
5836
877ff039d6f6 changed: #rgbImageAsTrueColorFormOn:
Claus Gittinger <cg@exept.de>
parents: 5480
diff changeset
  1109
    ].
877ff039d6f6 changed: #rgbImageAsTrueColorFormOn:
Claus Gittinger <cg@exept.de>
parents: 5480
diff changeset
  1110
4805
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1111
    form initGC.
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1112
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1113
    form
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1114
	copyBitsFrom:imageBits
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1115
	bitsPerPixel:usedDeviceBitsPerPixel
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1116
	depth:usedDeviceDepth
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1117
	padding:usedDevicePadding
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1118
	width:width height:height
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  1119
	x:0 y:0 toX:0 y:0.
4805
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1120
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1121
    ^ form
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1122
5836
877ff039d6f6 changed: #rgbImageAsTrueColorFormOn:
Claus Gittinger <cg@exept.de>
parents: 5480
diff changeset
  1123
    "Modified (format): / 30-12-2011 / 12:54:26 / cg"
4805
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1124
!
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1125
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1126
rgbImageBitsOn:aDevice bestFormat: bestFormat
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1127
    "return rgb bits from the rgb-picture."
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1128
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1129
    ^ self
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1130
	rgbImageBitsOn:aDevice
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1131
	bestFormat:bestFormat
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1132
	returnUsedDevicePattingIn:[:usedPadding | ]
4813
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1133
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1134
    "Modified: / 30-10-2007 / 20:56:45 / cg"
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1135
!
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1136
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1137
rgbImageBitsOn:aDevice bestFormat:bestFormat returnUsedDevicePattingIn:aValueHolder
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1138
    "return rgb bits from the rgb-picture.
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1139
     Sorry (sigh) - this might decide to use a different padding;
4813
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1140
     this information is returned in aValueHolder"
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1141
4805
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1142
    |bytes usedDeviceDepth usedDeviceBitsPerPixel usedDevicePadding
c67a676c439b #rgbImageAsTrueColorFormOn: refactoring
fm
parents: 4778
diff changeset
  1143
     myDepth imageBits padd
856
9f802d4d0c1a support 8-bit rgb displays
Claus Gittinger <cg@exept.de>
parents: 842
diff changeset
  1144
     rightShiftR rightShiftG rightShiftB shiftRed shiftGreen shiftBlue|
194
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1145
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1146
    bytes := self bits.
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  1147
236
Claus Gittinger <cg@exept.de>
parents: 235
diff changeset
  1148
    usedDeviceDepth := bestFormat at:#depth.
Claus Gittinger <cg@exept.de>
parents: 235
diff changeset
  1149
    usedDeviceBitsPerPixel := bestFormat at:#bitsPerPixel.
2064
eece7560f78f md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  1150
    usedDevicePadding := bestFormat at:#padding.
194
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1151
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1152
    rightShiftR := (8 - aDevice bitsRed).
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1153
    rightShiftG := (8 - aDevice bitsGreen).
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1154
    rightShiftB := (8 - aDevice bitsBlue).
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1155
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1156
    shiftRed := aDevice shiftRed.
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1157
    shiftGreen := aDevice shiftGreen.
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1158
    shiftBlue := aDevice shiftBlue.
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1159
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1160
    "/
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1161
    "/ for now, only a few formats are supported
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1162
    "/
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1163
    myDepth := self bitsPerPixel.
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1164
    myDepth == usedDeviceBitsPerPixel ifTrue:[
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1165
	"/
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1166
	"/ first, the trivial case, where the depths match
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1167
	"/ 24 bit/pixel
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1168
	"/
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1169
	imageBits := bytes.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1170
	"/
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1171
	"/ however, the rgb-order could still be different
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1172
	"/
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1173
	((shiftBlue == 0) and:[(shiftGreen == 8) and:[shiftRed == 16]]) ifFalse:[
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1174
	    imageBits := ByteArray uninitializedNew:(width * height * 3).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1175
	    usedDevicePadding := 8.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1176
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1177
	    "/ now, walk over the image and compose 24bit values from the r/g/b triples
2064
eece7560f78f md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  1178
%{
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1179
	    unsigned char *srcPtr = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1180
	    unsigned char *dstPtr = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1181
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1182
	    if (__isByteArrayLike(bytes)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1183
		srcPtr = __ByteArrayInstPtr(bytes)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1184
	    } else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1185
		if (__isExternalBytesLike(bytes)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1186
		    srcPtr = __externalBytesAddress(bytes);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1187
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1188
	    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1189
	    if (__isByteArray(imageBits)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1190
		dstPtr = __ByteArrayInstPtr(imageBits)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1191
	    } else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1192
		if (__isExternalBytesLike(imageBits)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1193
		    dstPtr = __externalBytesAddress(imageBits);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1194
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1195
	    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1196
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1197
	    if (__bothSmallInteger(__INST(height), __INST(width))
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1198
	     && __bothSmallInteger(rightShiftR, shiftRed)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1199
	     && __bothSmallInteger(rightShiftG, shiftGreen)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1200
	     && __bothSmallInteger(rightShiftB, shiftBlue)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1201
	     && srcPtr
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1202
	     && dstPtr) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1203
		int rShRed = __intVal(rightShiftR),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1204
		    rShGreen = __intVal(rightShiftG),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1205
		    rShBlue = __intVal(rightShiftB),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1206
		    lShRed = __intVal(shiftRed),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1207
		    lShGreen = __intVal(shiftGreen),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1208
		    lShBlue = __intVal(shiftBlue);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1209
		int x, y, w;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1210
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1211
		w = __intVal(__INST(width));
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1212
		if ((rShRed == 0) && (rShGreen == 0) && (rShBlue == 0)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1213
		    for (y=__intVal(__INST(height)); y > 0; y--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1214
			for (x=w; x > 0; x--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1215
			    unsigned v;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1216
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1217
			    v = srcPtr[0] << lShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1218
			    v |= (srcPtr[1] << lShGreen);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1219
			    v |= (srcPtr[2] << lShBlue);
2401
025c115d121a mips (MSBFIRST) fixes
Claus Gittinger <cg@exept.de>
parents: 2346
diff changeset
  1220
# ifdef __MSBFIRST
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1221
			    dstPtr[0] = (v) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1222
			    dstPtr[1] = (v>>8) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1223
			    dstPtr[2] = (v>>16) & 0xFF;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1224
# else /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1225
			    dstPtr[0] = (v>>16) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1226
			    dstPtr[1] = (v>>8) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1227
			    dstPtr[2] = (v) & 0xFF;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1228
# endif /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1229
			    dstPtr += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1230
			    srcPtr += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1231
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1232
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1233
		} else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1234
		    for (y=__intVal(__INST(height)); y > 0; y--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1235
			for (x=w; x > 0; x--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1236
			    unsigned r, g, b, v;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1237
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1238
			    r = srcPtr[0] >> rShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1239
			    g = srcPtr[1] >> rShGreen;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1240
			    b = srcPtr[2] >> rShBlue;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1241
			    v = r << lShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1242
			    v |= (g << lShGreen);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1243
			    v |= (b << lShBlue);
2401
025c115d121a mips (MSBFIRST) fixes
Claus Gittinger <cg@exept.de>
parents: 2346
diff changeset
  1244
# ifdef __MSBFIRST
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1245
			    dstPtr[0] = (v) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1246
			    dstPtr[1] = (v>>8) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1247
			    dstPtr[2] = (v>>16) & 0xFF;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1248
# else /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1249
			    dstPtr[0] = (v>>16) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1250
			    dstPtr[1] = (v>>8) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1251
			    dstPtr[2] = (v) & 0xFF;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1252
# endif /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1253
			    dstPtr += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1254
			    srcPtr += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1255
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1256
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1257
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1258
	    }
2064
eece7560f78f md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  1259
%}.
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1260
	]
194
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1261
    ] ifFalse:[
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1262
	"/
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1263
	"/ 16 bit/pixel ...
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1264
	"/
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1265
	(usedDeviceBitsPerPixel == 16) ifTrue:[
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1266
	    padd := width \\ (usedDevicePadding // 16).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1267
	    imageBits := ByteArray uninitializedNew:((width + padd) * height * 2).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1268
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1269
	    "/ now, walk over the image and compose 16bit values from the r/g/b triples
194
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1270
856
9f802d4d0c1a support 8-bit rgb displays
Claus Gittinger <cg@exept.de>
parents: 842
diff changeset
  1271
%{
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1272
	    unsigned char *srcPtr = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1273
	    unsigned char *dstPtr = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1274
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1275
	    if (__isByteArrayLike(bytes)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1276
		srcPtr = __ByteArrayInstPtr(bytes)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1277
	    } else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1278
		if (__isExternalBytesLike(bytes)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1279
		    srcPtr = __externalBytesAddress(bytes);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1280
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1281
	    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1282
	    if (__isByteArray(imageBits)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1283
		dstPtr = __ByteArrayInstPtr(imageBits)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1284
	    } else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1285
		if (__isExternalBytesLike(imageBits)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1286
		    dstPtr = __externalBytesAddress(imageBits);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1287
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1288
	    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1289
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1290
	    if (__bothSmallInteger(__INST(height),__INST(width))
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1291
	     && __bothSmallInteger(rightShiftR, shiftRed)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1292
	     && __bothSmallInteger(rightShiftG, shiftGreen)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1293
	     && __bothSmallInteger(rightShiftB, shiftBlue)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1294
	     && srcPtr
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1295
	     && dstPtr) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1296
		int rShRed = __intVal(rightShiftR),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1297
		    rShGreen = __intVal(rightShiftG),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1298
		    rShBlue = __intVal(rightShiftB),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1299
		    lShRed = __intVal(shiftRed),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1300
		    lShGreen = __intVal(shiftGreen),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1301
		    lShBlue = __intVal(shiftBlue);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1302
		int x, y, w;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1303
		int p;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1304
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1305
		w = __intVal(__INST(width));
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1306
		p = __intVal(padd) * 2;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1307
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1308
		if ((rShRed == 0) && (rShGreen == 0) && (rShBlue == 0)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1309
		    for (y=__intVal(__INST(height)); y > 0; y--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1310
			for (x=w; x > 0; x--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1311
			    unsigned v;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1312
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1313
			    v = srcPtr[0] << lShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1314
			    v |= (srcPtr[1] << lShGreen);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1315
			    v |= (srcPtr[2] << lShBlue);
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1316
# ifdef __MSBFIRST
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1317
			    ((short *)dstPtr)[0] = v;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1318
# else /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1319
			    dstPtr[0] = (v>>8) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1320
			    dstPtr[1] = (v) & 0xFF;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1321
# endif /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1322
			    dstPtr += 2;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1323
			    srcPtr += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1324
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1325
			dstPtr += p;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1326
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1327
		} else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1328
		    if (p == 0) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1329
			int n = __intVal(__INST(height)) * w;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1330
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1331
			while (n >= 2) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1332
			    unsigned w, r, g, b, v;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1333
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1334
			    n -= 2;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1335
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1336
			    r = srcPtr[0];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1337
			    g = srcPtr[1];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1338
			    b = srcPtr[2];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1339
			    v = (r >> rShRed) << lShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1340
			    v |= ((g >> rShGreen) << lShGreen);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1341
			    v |= ((b >> rShBlue) << lShBlue);
2401
025c115d121a mips (MSBFIRST) fixes
Claus Gittinger <cg@exept.de>
parents: 2346
diff changeset
  1342
# ifdef __MSBFIRST
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1343
			    ((short *)dstPtr)[0] = v;
194
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1344
# else
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1345
			    dstPtr[0] = (v>>8) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1346
			    dstPtr[1] = (v) & 0xFF;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1347
# endif /* not MSB */
194
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1348
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1349
			    r = srcPtr[3];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1350
			    g = srcPtr[4];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1351
			    b = srcPtr[5];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1352
			    v = (r >> rShRed) << lShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1353
			    v |= ((g >> rShGreen) << lShGreen);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1354
			    v |= ((b >> rShBlue) << lShBlue);
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1355
# ifdef __MSBFIRST
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1356
			    ((short *)dstPtr)[1] = v;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1357
# else
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1358
			    dstPtr[2] = (v>>8) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1359
			    dstPtr[3] = (v) & 0xFF;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1360
# endif /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1361
			    dstPtr += 4;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1362
			    srcPtr += 6;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1363
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1364
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1365
			while (n--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1366
			    unsigned r, g, b, v;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1367
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1368
			    r = srcPtr[0] >> rShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1369
			    g = srcPtr[1] >> rShGreen;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1370
			    b = srcPtr[2] >> rShBlue;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1371
			    v = r << lShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1372
			    v |= (g << lShGreen);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1373
			    v |= (b << lShBlue);
2401
025c115d121a mips (MSBFIRST) fixes
Claus Gittinger <cg@exept.de>
parents: 2346
diff changeset
  1374
# ifdef __MSBFIRST
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1375
			    ((short *)dstPtr)[0] = v;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1376
# else /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1377
			    dstPtr[0] = (v>>8) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1378
			    dstPtr[1] = (v) & 0xFF;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1379
# endif /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1380
			    dstPtr += 2;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1381
			    srcPtr += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1382
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1383
		    } else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1384
			for (y=__intVal(__INST(height)); y > 0; y--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1385
			    for (x=w; x > 0; x--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1386
				unsigned r, g, b, v;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1387
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1388
				r = srcPtr[0] >> rShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1389
				g = srcPtr[1] >> rShGreen;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1390
				b = srcPtr[2] >> rShBlue;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1391
				v = r << lShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1392
				v |= (g << lShGreen);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1393
				v |= (b << lShBlue);
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1394
# ifdef __MSBFIRST
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1395
				((short *)dstPtr)[0] = v;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1396
# else /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1397
				dstPtr[0] = (v>>8) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1398
				dstPtr[1] = (v) & 0xFF;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1399
# endif /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1400
				dstPtr += 2;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1401
				srcPtr += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1402
			    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1403
			    dstPtr += p;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1404
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1405
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1406
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1407
	    }
194
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1408
%}.
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1409
	] ifFalse:[
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1410
	    "/
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1411
	    "/ 32 bits/pixel ...
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1412
	    "/
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1413
	    (usedDeviceBitsPerPixel == 32) ifTrue:[
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1414
		usedDevicePadding := 8.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1415
		imageBits := ByteArray uninitializedNew:(width * height * 4).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1416
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1417
		"/ now, walk over the image and compose 32bit values from the r/g/b triples
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  1418
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  1419
%{
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1420
		unsigned char *srcPtr = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1421
		unsigned char *dstPtr = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1422
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1423
		if (__isByteArrayLike(bytes)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1424
		    srcPtr = __ByteArrayInstPtr(bytes)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1425
		} else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1426
		    if (__isExternalBytesLike(bytes)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1427
			srcPtr = __externalBytesAddress(bytes);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1428
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1429
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1430
		if (__isByteArray(imageBits)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1431
		    dstPtr = __ByteArrayInstPtr(imageBits)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1432
		} else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1433
		    if (__isExternalBytesLike(imageBits)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1434
			dstPtr = __externalBytesAddress(imageBits);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1435
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1436
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1437
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1438
		if (__bothSmallInteger(__INST(height), __INST(width))
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1439
		 && __bothSmallInteger(rightShiftR, shiftRed)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1440
		 && __bothSmallInteger(rightShiftG, shiftGreen)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1441
		 && __bothSmallInteger(rightShiftB, shiftBlue)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1442
		 && srcPtr
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1443
		 && dstPtr) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1444
		    int rShRed = __intVal(rightShiftR),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1445
			rShGreen = __intVal(rightShiftG),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1446
			rShBlue = __intVal(rightShiftB),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1447
			lShRed = __intVal(shiftRed),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1448
			lShGreen = __intVal(shiftGreen),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1449
			lShBlue = __intVal(shiftBlue);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1450
		    int x, y, w;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1451
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1452
		    w = __intVal(__INST(width));
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1453
		    if ((rShRed == 0) && (rShGreen == 0) && (rShBlue == 0)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1454
			for (y=__intVal(__INST(height)); y > 0; y--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1455
			    for (x=w; x > 0; x--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1456
				unsigned v;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1457
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1458
				v = srcPtr[0] << lShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1459
				v |= (srcPtr[1] << lShGreen);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1460
				v |= (srcPtr[2] << lShBlue);
2401
025c115d121a mips (MSBFIRST) fixes
Claus Gittinger <cg@exept.de>
parents: 2346
diff changeset
  1461
# ifdef __MSBFIRST
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1462
				((int *)dstPtr)[0] = v;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1463
# else /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1464
				dstPtr[0] = (v>>24) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1465
				dstPtr[1] = (v>>16) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1466
				dstPtr[2] = (v>>8) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1467
				dstPtr[3] = (v) & 0xFF;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1468
# endif /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1469
				dstPtr += 4;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1470
				srcPtr += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1471
			    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1472
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1473
		    } else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1474
			for (y=__intVal(__INST(height)); y > 0; y--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1475
			    for (x=w; x > 0; x--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1476
				unsigned r, g, b, v;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1477
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1478
				r = srcPtr[0] >> rShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1479
				g = srcPtr[1] >> rShGreen;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1480
				b = srcPtr[2] >> rShBlue;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1481
				v = r << lShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1482
				v |= (g << lShGreen);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1483
				v |= (b << lShBlue);
2401
025c115d121a mips (MSBFIRST) fixes
Claus Gittinger <cg@exept.de>
parents: 2346
diff changeset
  1484
# ifdef __MSBFIRST
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1485
				((int *)dstPtr)[0] = v;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1486
# else /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1487
				dstPtr[0] = (v>>24) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1488
				dstPtr[1] = (v>>16) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1489
				dstPtr[2] = (v>>8) & 0xFF;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1490
				dstPtr[3] = (v) & 0xFF;
3357
9234d6f55d5a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3263
diff changeset
  1491
# endif /* not MSB */
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1492
				dstPtr += 4;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1493
				srcPtr += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1494
			    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1495
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1496
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1497
		}
194
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1498
%}.
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1499
	    ] ifFalse:[
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1500
		"/
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1501
		"/ 8 bits/pixel ...
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1502
		"/
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1503
		(usedDeviceBitsPerPixel == 8) ifTrue:[
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1504
		    usedDevicePadding := 8.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1505
		    imageBits := ByteArray uninitializedNew:(width * height).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1506
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1507
		    "/ now, walk over the image and compose 8bit values from the r/g/b triples
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  1508
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  1509
%{
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1510
		    unsigned char *srcPtr = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1511
		    unsigned char *dstPtr = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1512
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1513
		    if (__isByteArrayLike(bytes)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1514
			srcPtr = __ByteArrayInstPtr(bytes)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1515
		    } else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1516
			if (__isExternalBytesLike(bytes)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1517
			    srcPtr = __externalBytesAddress(bytes);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1518
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1519
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1520
		    if (__isByteArray(imageBits)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1521
			dstPtr = __ByteArrayInstPtr(imageBits)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1522
		    } else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1523
			if (__isExternalBytesLike(imageBits)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1524
			    dstPtr = __externalBytesAddress(imageBits);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1525
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1526
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1527
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1528
		    if (__bothSmallInteger(__INST(height), __INST(width))
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1529
		     && __bothSmallInteger(rightShiftR, shiftRed)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1530
		     && __bothSmallInteger(rightShiftG, shiftGreen)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1531
		     && __bothSmallInteger(rightShiftB, shiftBlue)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1532
		     && srcPtr
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1533
		     && dstPtr) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1534
			int rShRed = __intVal(rightShiftR),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1535
			    rShGreen = __intVal(rightShiftG),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1536
			    rShBlue = __intVal(rightShiftB),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1537
			    lShRed = __intVal(shiftRed),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1538
			    lShGreen = __intVal(shiftGreen),
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1539
			    lShBlue = __intVal(shiftBlue);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1540
			int x, y, w;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1541
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1542
			w = __intVal(__INST(width));
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1543
			if ((rShRed == 0) && (rShGreen == 0) && (rShBlue == 0)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1544
			    for (y=__intVal(__INST(height)); y > 0; y--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1545
				for (x=w; x > 0; x--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1546
				    unsigned v;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1547
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1548
				    v = srcPtr[0] << lShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1549
				    v |= (srcPtr[1] << lShGreen);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1550
				    v |= (srcPtr[2] << lShBlue);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1551
				    dstPtr[0] = v;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1552
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1553
				    dstPtr += 1;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1554
				    srcPtr += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1555
				}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1556
			    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1557
			} else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1558
			    for (y=__intVal(__INST(height)); y > 0; y--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1559
				for (x=w; x > 0; x--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1560
				    unsigned r, g, b, v;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1561
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1562
				    r = srcPtr[0] >> rShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1563
				    g = srcPtr[1] >> rShGreen;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1564
				    b = srcPtr[2] >> rShBlue;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1565
				    v = r << lShRed;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1566
				    v |= (g << lShGreen);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1567
				    v |= (b << lShBlue);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1568
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1569
				    dstPtr[0] = v;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1570
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1571
				    dstPtr += 1;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1572
				    srcPtr += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1573
				}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1574
			    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1575
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1576
		    }
856
9f802d4d0c1a support 8-bit rgb displays
Claus Gittinger <cg@exept.de>
parents: 842
diff changeset
  1577
%}.
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1578
		]
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1579
	    ].
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1580
	]
194
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1581
    ].
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1582
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  1583
    imageBits isNil ifTrue:[
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1584
	'IMAGE: unimplemented trueColor depth in #rgbImageBitsOn: ' errorPrint.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1585
	usedDeviceBitsPerPixel errorPrintCR.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1586
	^ nil
194
Claus Gittinger <cg@exept.de>
parents: 151
diff changeset
  1587
    ].
4813
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1588
    aValueHolder value:usedDevicePadding.
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1589
    ^ imageBits
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1590
f03cd0880bd9 oops - rgbImageBits did not update the real padding used
Claus Gittinger <cg@exept.de>
parents: 4805
diff changeset
  1591
    "Created: / 30-10-2007 / 20:54:53 / cg"
3490
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  1592
! !
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1593
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1594
!Depth24Image methodsFor:'dither helpers'!
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  1595
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1596
floydSteinbergDitheredDepth8BitsColors:colors map:aMapOrNil
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1597
    "return a floyd-steinberg dithered bitmap from the receiver picture,
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  1598
     which must be a depth-24 image.
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1599
     This method expects an array of colors to be used for dithering
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1600
     (which need not be a colorCubes colors)."
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1601
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  1602
    |pseudoBits
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1603
     ditherRGBBytes ditherColors
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1604
     w       "{Class: SmallInteger }"
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1605
     h       "{Class: SmallInteger }"
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1606
     index   "{Class: SmallInteger }"
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1607
     ditherIds failed lastColor qScramble
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1608
     clrLookup lookupPos
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1609
     error clr|
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1610
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1611
    self depth ~~ 24 ifTrue:[^ nil].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1612
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1613
    "/ collect valid ditherColors ...
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1614
    aMapOrNil isNil ifTrue:[
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1615
	ditherColors := colors select:[:clr | clr notNil].
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1616
    ] ifFalse:[
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1617
	ditherColors := colors
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1618
    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1619
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1620
    "/ ... and sort by manhatten distance from black
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1621
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1622
    qScramble := #(
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1623
		"/  2rX00X00X00X00
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1624
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1625
		    2r000000000000    "/ 0
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1626
		    2r000000000100    "/ 1
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1627
		    2r000000100000    "/ 2
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1628
		    2r000000100100    "/ 3
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1629
		    2r000100000000    "/ 4
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1630
		    2r000100000100    "/ 5
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1631
		    2r000100100000    "/ 6
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1632
		    2r000100100100    "/ 7
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1633
		    2r100000000000    "/ 8
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1634
		    2r100000000100    "/ 9
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1635
		    2r100000100000    "/ a
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1636
		    2r100000100100    "/ b
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1637
		    2r100100000000    "/ c
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1638
		    2r100100000100    "/ d
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1639
		    2r100100100000    "/ e
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1640
		    2r100100100100    "/ f
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1641
		  ).
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1642
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1643
    ditherColors := ditherColors sort:[:a :b |
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1644
				|cr "{Class: SmallInteger }"
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1645
				 cg "{Class: SmallInteger }"
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1646
				 cb "{Class: SmallInteger }"
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1647
				 i1 "{Class: SmallInteger }"
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1648
				 i2 "{Class: SmallInteger }"|
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1649
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1650
				cr := a redByte.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1651
				cg := a greenByte.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1652
				cb := a blueByte.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1653
				i1 := qScramble at:((cr bitShift:-4) bitAnd:16r0F) + 1.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1654
				i1 := i1 + ((qScramble at:((cg bitShift:-4) bitAnd:16r0F) + 1) bitShift:-1).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1655
				i1 := i1 + ((qScramble at:((cb bitShift:-4) bitAnd:16r0F) + 1) bitShift:-2).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1656
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1657
				cr := b redByte.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1658
				cg := b greenByte.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1659
				cb := b blueByte.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1660
				i2 := qScramble at:((cr bitShift:-4) bitAnd:16r0F) + 1.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1661
				i2 := i2 + ((qScramble at:((cg bitShift:-4) bitAnd:16r0F) + 1) bitShift:-1).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1662
				i2 := i2 + ((qScramble at:((cb bitShift:-4) bitAnd:16r0F) + 1) bitShift:-2).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1663
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1664
				i1 < i2
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1665
		    ].
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1666
    aMapOrNil isNil ifTrue:[
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1667
	ditherIds := (ditherColors asArray collect:[:clr | clr colorId]) asByteArray.
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1668
    ] ifFalse:[
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1669
	ditherIds := aMapOrNil asByteArray
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1670
    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1671
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1672
    "/ 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: 3872
diff changeset
  1673
    "/ to the position in the colorList
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1674
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1675
    clrLookup := ByteArray new:(4096).
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1676
    index := 0.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1677
    ditherColors keysAndValuesDo:[:clrPosition :clr |
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1678
	|r g b i|
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1679
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1680
	r := clr redByte.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1681
	g := clr greenByte.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1682
	b := clr blueByte.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1683
	i := qScramble at:((r bitShift:-4) bitAnd:16r0F) + 1.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1684
	i := i + ((qScramble at:((g bitShift:-4) bitAnd:16r0F) + 1) bitShift:-1).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1685
	i := i + ((qScramble at:((b bitShift:-4) bitAnd:16r0F) + 1) bitShift:-2).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1686
	lookupPos := i.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1687
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1688
	[index < lookupPos] whileTrue:[
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1689
	    clrLookup at:(index+1) put:(clrPosition-1-1).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1690
	    index := index + 1
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1691
	]
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1692
    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1693
    clrLookup from:index+1 to:4096 put:(ditherColors size - 1).
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1694
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1695
"/    [index <= (4095)] whileTrue:[
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1696
"/        clrLookup at:(index+1) put:(ditherColors size - 1).
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1697
"/        index := index + 1.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1698
"/    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1699
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1700
    "/ collect ditherColor components
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1701
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1702
    lastColor := ditherColors size.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1703
    ditherIds := ByteArray uninitializedNew:lastColor.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1704
    ditherRGBBytes := ByteArray uninitializedNew:(lastColor * 3).
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1705
    index := 1.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1706
    1 to:lastColor do:[:pix |
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1707
	clr := ditherColors at:pix.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1708
	ditherRGBBytes at:index put:(clr redByte).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1709
	ditherRGBBytes at:index+1 put:(clr greenByte).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1710
	ditherRGBBytes at:index+2 put:(clr blueByte).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1711
	aMapOrNil isNil ifTrue:[
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1712
	    ditherIds at:pix put:clr colorId.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1713
	] ifFalse:[
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1714
	    ditherIds at:pix put:(aMapOrNil at:pix).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1715
	].
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1716
	index := index + 3.
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1717
    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1718
    pseudoBits := ByteArray uninitializedNew:(width * height).
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1719
3907
31dd3278b835 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3906
diff changeset
  1720
    error := ByteArray uninitializedNew:(width + 2) * (3*2).
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1721
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1722
    w := width.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1723
    h := height.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1724
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1725
    failed := true.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1726
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1727
%{
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1728
    int __x, __y;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1729
    unsigned char *srcP, *dstP;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1730
    unsigned char *idP;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1731
    unsigned char *__clrLookup;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1732
    short *errP, *eP;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1733
    int __w = __intVal(w);
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1734
    int __h = __intVal(h);
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1735
    int __nColors = __intVal(lastColor);
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1736
    int __wR = -1, __wG, __wB;
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1737
    static int __qScramble[16] = {
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1738
		    0x000 /* 2r000000000000    0 */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1739
		    0x004 /* 2r000000000100    1 */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1740
		    0x020 /* 2r000000100000    2 */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1741
		    0x024 /* 2r000000100100    3 */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1742
		    0x100 /* 2r000100000000    4 */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1743
		    0x104 /* 2r000100000100    5 */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1744
		    0x120 /* 2r000100100000    6 */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1745
		    0x124 /* 2r000100100100    7 */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1746
		    0x800 /* 2r100000000000    8 */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1747
		    0x804 /* 2r100000000100    9 */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1748
		    0x820 /* 2r100000100000    a */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1749
		    0x824 /* 2r100000100100    b */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1750
		    0x900 /* 2r100100000000    c */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1751
		    0x904 /* 2r100100000100    d */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1752
		    0x920 /* 2r100100100000    e */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1753
		    0x924 /* 2r100100100100    f */,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1754
		  };
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1755
5480
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
  1756
    if (__isByteArrayLike(__INST(bytes))
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1757
     && __isByteArray(pseudoBits)
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1758
     && __isByteArray(ditherRGBBytes)
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1759
     && __isByteArray(ditherIds)
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1760
     && __isByteArray(clrLookup)
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1761
     && __isByteArray(error)) {
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1762
	failed = false;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1763
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1764
	srcP = __ByteArrayInstPtr(__INST(bytes))->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1765
	dstP = __ByteArrayInstPtr(pseudoBits)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1766
	idP = __ByteArrayInstPtr(ditherIds)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1767
	__clrLookup = __ByteArrayInstPtr(clrLookup)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1768
	errP = (short *) __ByteArrayInstPtr(error)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1769
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1770
	/*
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1771
	 * clear error accumulator
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1772
	 */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1773
	eP = errP;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1774
	bzero(eP, (__w+2) * 2 * 3);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1775
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1776
	for (__y=__h; __y>0; __y--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1777
	    unsigned char *dp;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1778
	    int __eR, __eG, __eB;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1779
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1780
	    __eR = __eG = __eB = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1781
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1782
	    eP = &(errP[3]);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1783
	    __eR = eP[0];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1784
	    __eG = eP[1];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1785
	    __eB = eP[2];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1786
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1787
	    for (__x=__w; __x>0; __x--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1788
		int __want;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1789
		int pix;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1790
		int __wantR, __wantG, __wantB;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1791
		int idx;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1792
		int tR, tG, tB;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1793
		int nR, nG, nB;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1794
		int dR, dG, dB;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1795
		int minDelta, bestIdx;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1796
		int cnt;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1797
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1798
		__wantR = srcP[0];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1799
		__wantG = srcP[1];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1800
		__wantB = srcP[2];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1801
		srcP += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1802
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1803
		/*
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1804
		 * wI are the wanted r/g/b values;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1805
		 * eI are the error values;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1806
		 */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1807
		__wantR = __wantR + __eR;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1808
		__wantG = __wantG + __eG;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1809
		__wantB = __wantB + __eB;
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1810
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1811
#define RED_SCALE 30
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1812
#define GREEN_SCALE 59
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1813
#define BLUE_SCALE 11
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1814
#define GOOD_DELTA 30
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1815
3907
31dd3278b835 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3906
diff changeset
  1816
#define FAST_LOOKUP  /* */
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1817
/* #define ONE_SHOT */
5343
d62fcca557b8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5142
diff changeset
  1818
#define NPROBE 16
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1819
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1820
#ifndef FAST_LOOKUP
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1821
		if ((__wantR == __wR)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1822
		 && (__wantG == __wG)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1823
		 && (__wantB == __wB)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1824
		    /*
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1825
		     * same color again - reuse last bestMatch
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1826
		     */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1827
		} else
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1828
#endif
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1829
		{
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1830
		    __wR = __wantR;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1831
		    __wG = __wantG;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1832
		    __wB = __wantB;
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1833
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1834
#ifdef FAST_LOOKUP
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1835
		    if(__wR > 255) __wR = 255;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1836
		    else if (__wR < 0) __wR = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1837
		    if(__wG > 255) __wG = 255;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1838
		    else if (__wG < 0) __wG = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1839
		    if(__wB > 255) __wB = 255;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1840
		    else if (__wB < 0) __wB = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1841
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1842
		    {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1843
			int lookupIndex;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1844
			int idx, idx0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1845
			int d, delta;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1846
			unsigned char *dp0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1847
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1848
			dp = __ByteArrayInstPtr(ditherRGBBytes)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1849
			lookupIndex =    __qScramble[((__wR & 0xF0)>>4)];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1850
			lookupIndex |=   __qScramble[((__wG & 0xF0)>>4)] >> 1;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1851
			lookupIndex |=   __qScramble[((__wB & 0xF0)>>4)] >> 2;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1852
			idx = bestIdx =__clrLookup[lookupIndex];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1853
			dp += (idx+idx+idx);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1854
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1855
			/* try color at lookupIndex */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1856
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1857
			d = dp[0];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1858
			delta = (__wR - d) * RED_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1859
			if (delta < 0) delta = -delta;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1860
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1861
			d = dp[1];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1862
			if (__wG > d)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1863
			    delta += (__wG - d) * GREEN_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1864
			else
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1865
			    delta += (d - __wG) * GREEN_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1866
			d = dp[2];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1867
			if (__wB > d)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1868
			    delta += (__wB - d) * BLUE_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1869
			else
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1870
			    delta += (d - __wB) * BLUE_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1871
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1872
			if (delta <= GOOD_DELTA) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1873
			    goto foundBest;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1874
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1875
			minDelta = delta;
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1876
# ifndef ONE_SHOT
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1877
			idx0 = idx; dp0 = dp;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1878
			cnt = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1879
			while ((++cnt <= NPROBE) && (idx > 0)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1880
			    /* try previous color(s) */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1881
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1882
			    idx--; dp -= 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1883
			    d = dp[0];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1884
			    delta = (__wR - d) * RED_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1885
			    if (delta < 0) delta = -delta;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1886
			    d = dp[1];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1887
			    if (__wG > d)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1888
				delta += (__wG - d) * GREEN_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1889
			    else
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1890
				delta += (d - __wG) * GREEN_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1891
			    d = dp[2];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1892
			    if (__wB > d)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1893
				delta += (__wB - d) * BLUE_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1894
			    else
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1895
				delta += (d - __wB) * BLUE_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1896
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1897
			    if (delta < minDelta) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1898
				bestIdx = idx;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1899
				if (delta <= GOOD_DELTA) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1900
				    goto foundBest;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1901
				}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1902
				minDelta = delta;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1903
			    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1904
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1905
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1906
			idx = idx0; dp = dp0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1907
			cnt = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1908
			while ((++cnt <= NPROBE) && (++idx < __nColors)) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1909
			    /* try next color */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1910
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1911
			    dp += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1912
			    d = dp[0];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1913
			    delta = (__wR - d) * RED_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1914
			    if (delta < 0) delta = -delta;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1915
			    d = dp[1];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1916
			    if (__wG > d)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1917
				delta += (__wG - d) * GREEN_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1918
			    else
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1919
				delta += (d - __wG) * GREEN_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1920
			    d = dp[2];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1921
			    if (__wB > d)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1922
				delta += (__wB - d) * BLUE_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1923
			    else
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1924
				delta += (d - __wB) * BLUE_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1925
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1926
			    if (delta < minDelta) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1927
				bestIdx = idx;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1928
				if (delta <= GOOD_DELTA) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1929
				    goto foundBest;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1930
				}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1931
				minDelta = delta;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1932
			    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1933
			}
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1934
# endif
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1935
		    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1936
	foundBest: ;
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1937
#else
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1938
/*
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1939
		    if(__wR > 255) __wR = 255;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1940
		    else if (__wR < 0) __wR = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1941
		    if(__wG > 255) __wG = 255;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1942
		    else if (__wG < 0) __wG = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1943
		    if(__wB > 255) __wB = 255;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1944
		    else if (__wB < 0) __wB = 0;
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1945
*/
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1946
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1947
		    /* find the best matching color */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1948
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1949
		    minDelta = 99999;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1950
		    bestIdx = -1;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1951
		    dp = __ByteArrayInstPtr(ditherRGBBytes)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1952
		    for (idx = 0; idx<__nColors; idx++) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1953
			int d, delta;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1954
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1955
			d = dp[0];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1956
			delta = (__wR - d) * RED_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1957
			if (delta < 0) delta = -delta;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1958
			if (delta < minDelta) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1959
			    d = dp[1];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1960
			    if (__wG > d)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1961
				delta += (__wG - d) * GREEN_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1962
			    else
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1963
				delta += (d - __wG) * GREEN_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1964
			    if (delta < minDelta) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1965
				d = dp[2];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1966
				if (__wB > d)
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1967
				    delta += (__wB - d) * BLUE_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1968
				else
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1969
				    delta += (d - __wB) * BLUE_SCALE;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1970
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1971
				if (delta < minDelta) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1972
				    bestIdx = idx;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1973
				    if (delta <= GOOD_DELTA) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1974
					break;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1975
				    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1976
				    minDelta = delta;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1977
				}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1978
			    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1979
			}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1980
			dp += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1981
		    }
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1982
#endif
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1983
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1984
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1985
		dp = __ByteArrayInstPtr(ditherRGBBytes)->ba_element;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1986
		dp += bestIdx * 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1987
		dR = dp[0];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1988
		dG = dp[1];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1989
		dB = dp[2];
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1990
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1991
/*
4721
ece6b3ce6b99 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4719
diff changeset
  1992
console_fprintf(stderr, "want: %d/%d/%d (%d/%d/%d) got: %d/%d/%d\n",
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1993
		__wantR, __wantG, __wantB,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1994
		__wR, __wG, __wB,
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1995
		dR, dG, dB);
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  1996
*/
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1997
		/*
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1998
		 * store the corresponding dither colors colorId
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  1999
		 */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2000
		*dstP++ = idP[bestIdx];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2001
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2002
		/*
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2003
		 * the new error & distribute the error
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2004
		 */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2005
		__eR = __wantR - dR;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2006
		if (__eR) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2007
		    tR = __eR >> 4;  /* 16th of error */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2008
		    nR = eP[3] + (tR * 7);/* from accu: error for (x+1 / y) */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2009
		    eP[0] = tR*5;         /* 5/16th for (x / y+1) */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2010
		    eP[-3] = tR*3;        /* 3/16th for (x-1 / y+1) */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2011
		    eP[3] = __eR - (tR*15);  /* 1/16th for (x+1 / y+1) */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2012
		    __eR = nR;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2013
		} else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2014
		    __eR = eP[3];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2015
		    eP[0] = eP[-3] = eP[3] = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2016
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2017
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2018
		__eG = __wantG - dG;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2019
		if (__eG) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2020
		    tG = __eG >> 4;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2021
		    nG = eP[4] + (tG * 7);/* plus 7/16'th of this error */
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2022
		    eP[1] = tG*5;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2023
		    eP[-2] = tG*3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2024
		    eP[4] = __eG - (tG*15);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2025
		    __eG = nG;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2026
		} else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2027
		    __eG = eP[4];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2028
		    eP[1] = eP[-2] = eP[4] = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2029
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2030
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2031
		__eB = __wantB - dB;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2032
		if (__eB) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2033
		    tB = __eB >> 4;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2034
		    nB = eP[5] + (tB * 7);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2035
		    eP[2] = tB*5;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2036
		    eP[-1] = tB*3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2037
		    eP[5] = __eB - (tB*15);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2038
		    __eB = nB;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2039
		} else {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2040
		    __eB = eP[5];
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2041
		    eP[2] = eP[-1] = eP[5] = 0;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2042
		}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2043
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2044
		eP += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2045
	    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2046
	}
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  2047
    }
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  2048
%}.
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  2049
    failed ifTrue:[
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2050
	self primitiveFailed.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2051
	^ nil
3906
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  2052
    ].
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  2053
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  2054
    ^ pseudoBits
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  2055
!
f77d3b42614a dither support 24->8bit image
Claus Gittinger <cg@exept.de>
parents: 3872
diff changeset
  2056
1779
34f9e24f330e method rename
Claus Gittinger <cg@exept.de>
parents: 1767
diff changeset
  2057
floydSteinbergDitheredGrayBitsDepth:depth
34f9e24f330e method rename
Claus Gittinger <cg@exept.de>
parents: 1767
diff changeset
  2058
    "return the bits for dithering a depth gray bitmap from the image.
842
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2059
     Redefined to make use of knowing that pixels are 24 bit r/g/b"
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2060
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2061
    |dstIndex        "{Class: SmallInteger }"
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2062
     nextDst         "{Class: SmallInteger }"
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2063
     bytesPerRow     "{Class: SmallInteger }"
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2064
     bytesPerOutRow  "{Class: SmallInteger }"
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2065
     outBits greyMap1 greyMap2 greyLevels
842
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2066
     errorArray
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2067
     errorArray1
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2068
     e t v
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2069
     w               "{Class: SmallInteger }"
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2070
     h               "{Class: SmallInteger }"
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2071
     bitCnt          "{Class: SmallInteger }"
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2072
     byte            "{Class: SmallInteger }"
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2073
     grey dT
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2074
     eR eRB eB eLB bytes|
842
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2075
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2076
    (samplesPerPixel ~~ 3
1923
cdd2c4e199df if device is running out of allocatable colors,
Claus Gittinger <cg@exept.de>
parents: 1818
diff changeset
  2077
    or:[bitsPerSample ~= #(8 8 8)
cdd2c4e199df if device is running out of allocatable colors,
Claus Gittinger <cg@exept.de>
parents: 1818
diff changeset
  2078
    or:[depth > 8]]) ifTrue:[
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2079
	^ super floydSteinbergDitheredGrayBitsDepth:depth
842
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2080
    ].
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2081
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2082
    bytes := self bits.
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2083
    bytes isNil ifTrue:[ self error. ^ nil].
842
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2084
    w := width.
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2085
    h := height.
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2086
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2087
    bytesPerRow := self bytesPerRow.
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2088
    bytesPerOutRow := ((w * depth) + 7) // 8.
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2089
    outBits := ByteArray uninitializedNew:(bytesPerOutRow * h).
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2090
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1923
diff changeset
  2091
    depth ~~ 8 ifTrue:[
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2092
	greyLevels := (1 bitShift:depth) - 1.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2093
	greyMap1 := Array new:256.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2094
	greyMap2 := Array new:256.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2095
	1 to:256 do:[:i |
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2096
	    v := (greyLevels / 255 * (i-1)).
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2097
	    greyMap1 at:i put:v.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2098
	    greyMap2 at:i put:v.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2099
	].
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2100
	greyMap1 := (greyMap1 collect:[:b | b truncated]) asByteArray.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2101
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2102
	greyMap2 := (greyMap2 collect:[:el |
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2103
					    ((el - el truncated)  "/ the error (0..1)
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2104
						* 255) rounded]) asByteArray.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2105
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2106
	errorArray := ByteArray new:(w + 2) * 2.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2107
	errorArray1 := ByteArray new:(w + 2) * 2.
842
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2108
    ].
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2109
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2110
%{
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2111
    int __byte;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2112
    int __dT, __err, __e16, __eR, __eB, __eRB, __eLB;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2113
    int __depth = __intVal(depth);
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2114
    int __dstIdx = 0;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2115
    int __srcIdx = 0;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2116
    int __bitCnt;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2117
    int __grey;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2118
    int __w = __intVal(w);
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2119
    int __h = __intVal(h);
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2120
    int __x;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2121
    int __y;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2122
    int __nextDst;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2123
    int __nextSrc;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2124
    int __bytesPerRow = __intVal(bytesPerRow);
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2125
    int __bytesPerOutRow = __intVal(bytesPerOutRow);
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2126
    int __pixel;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2127
    int __greyLevels = __intVal(greyLevels);
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2128
1812
beeaf75b245b avoid type warnings (char * vs. unsigned char *)
Claus Gittinger <cg@exept.de>
parents: 1782
diff changeset
  2129
    unsigned char *__outBits = __ByteArrayInstPtr(outBits)->ba_element;
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2130
    unsigned char *__bytes = __ByteArrayInstPtr(bytes)->ba_element;
842
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2131
    unsigned char *__greyMap1 = __ByteArrayInstPtr(greyMap1)->ba_element;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2132
    unsigned char *__greyMap2 = __ByteArrayInstPtr(greyMap2)->ba_element;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2133
    short *__errorArray = (short *)(__ByteArrayInstPtr(errorArray)->ba_element);
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2134
    short *__errorArray1 = (short *)(__ByteArrayInstPtr(errorArray1)->ba_element);
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2135
    short *__t;
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2136
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1923
diff changeset
  2137
    if (__depth == 8) {
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2138
	/*
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2139
	 * special code for destination depth 8
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2140
	 */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2141
	for (__y=0; __y<__h; __y++) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2142
	    __nextDst = __dstIdx + __bytesPerOutRow;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2143
	    __nextSrc = __srcIdx + __bytesPerRow;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2144
	    for (__x=0; __x<__w; __x++) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2145
		__grey = (__bytes[__srcIdx] * 3)           /* 0.3*r + 0.6*g + b -> 0..2550 */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2146
			 + (__bytes[__srcIdx+1] * 6)
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2147
			 + __bytes[__srcIdx+2];
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2148
		__pixel = __grey / 10;                      /* 0 .. 255 */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2149
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2150
		__srcIdx += 3;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2151
		__outBits[__dstIdx] = __pixel;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2152
	       __dstIdx++;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2153
	    }
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2154
	    __srcIdx = __nextSrc;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2155
	    __dstIdx = __nextDst;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2156
	}
1932
6afe07d9c88c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1923
diff changeset
  2157
    } else {
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2158
	bzero(errorArray1, (__w+2) * 2);
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2159
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2160
	__bitCnt = 8;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2161
	for (__y=0; __y<__h; __y++) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2162
	    __nextDst = __dstIdx + __bytesPerOutRow;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2163
	    __nextSrc = __srcIdx + __bytesPerRow;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2164
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2165
	    __byte = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2166
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2167
	    __t = __errorArray;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2168
	    __errorArray = __errorArray1;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2169
	    __errorArray1 = __t;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2170
	    bzero(errorArray1, (__w+2) * 2);
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2171
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2172
	    for (__x=0; __x<__w; __x++) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2173
		__grey = (__bytes[__srcIdx] * 3)           /* 0.3*r + 0.6*g + b -> 0..2550 */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2174
			 + (__bytes[__srcIdx+1] * 6)
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2175
			 + __bytes[__srcIdx+2];
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2176
		__grey = __grey / 10;                      /* 0 .. 255 */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2177
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2178
		__pixel = __greyMap1[__grey];            /* 0..(greyLevels-1) */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2179
		__err = __greyMap2[__grey];              /* 0.. 255 - error) */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2180
		__err += __errorArray[__x+1];
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2181
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2182
		if (__err > 127) {                        /* dither says: next pixel */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2183
		   if ( __pixel != __greyLevels)
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2184
			__pixel++;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2185
		    __err = __err - 255;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2186
		} else {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2187
		}
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2188
		if (__err) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2189
		    __e16 = __err >> 4;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2190
		    __eR = __e16 * 7;                    /* 7/16 -> right pixel */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2191
		    __eRB = __e16 * 1;                   /* 1/16 -> right below */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2192
		    __eB = __e16 * 5;                    /* 5/16 -> below */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2193
		    __eLB = __err - __eR - __eRB - __eB; /* 3/16 -> left below */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2194
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2195
		    __errorArray [__x+1+1] += __eR;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2196
		    __errorArray1[__x+1+1] += __eRB;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2197
		    __errorArray1[__x+1  ] += __eB;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2198
		    __errorArray1[__x+1-1] += __eLB;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2199
		}
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2200
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2201
		__srcIdx += 3;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2202
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2203
		__byte = (__byte << __depth) | __pixel;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2204
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2205
		__bitCnt = __bitCnt - __depth;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2206
		if (__bitCnt == 0) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2207
		    __outBits[__dstIdx] = __byte;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2208
		    __dstIdx++;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2209
		    __byte = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2210
		    __bitCnt = 8;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2211
		}
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2212
	    }
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2213
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2214
	    if (__bitCnt != 8) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2215
		__byte = __byte << __bitCnt;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2216
		__outBits[__dstIdx] = __byte;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2217
		__bitCnt = 8;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2218
	    }
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2219
	    __srcIdx = __nextSrc;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2220
	    __dstIdx = __nextDst;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2221
	}
842
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2222
    }
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2223
%}.
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2224
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2225
    ^ outBits
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2226
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2227
    "Created: 10.6.1996 / 13:28:22 / cg"
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2228
    "Modified: 10.6.1996 / 15:09:07 / cg"
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2229
!
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2230
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2231
floydSteinbergDitheredMonochromeBits
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2232
    "return the bitmap for a dithered monochrome bitmap from the image.
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2233
     Redefined to make use of knowing that pixels are 24 bit r/g/b"
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2234
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2235
1779
34f9e24f330e method rename
Claus Gittinger <cg@exept.de>
parents: 1767
diff changeset
  2236
    ^ self floydSteinbergDitheredGrayBitsDepth:1
842
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2237
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2238
    "Created: 10.6.1996 / 22:55:59 / cg"
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2239
!
dc8aa9127b49 added conversion for rgb -> greyScale using floyd-steinberg dither
Claus Gittinger <cg@exept.de>
parents: 816
diff changeset
  2240
1782
a1d67a9456ea method rename
Claus Gittinger <cg@exept.de>
parents: 1779
diff changeset
  2241
orderedDitheredGrayBitsWithDitherMatrix:ditherMatrix ditherWidth:dW depth:depth
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2242
    "return the bitmap for a dithered depth-bitmap from the image;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2243
     with a constant ditherMatrix, this can be used for thresholding.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2244
     Redefined to make use of knowing that pixels are 24-bit values."
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2245
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2246
    |dH nDither v range bytes
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2247
     greyMap1 greyMap2 greyLevels outBits
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2248
     bytesPerOutRow  "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2249
     bytesPerRow     "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2250
     w               "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2251
     h               "{Class: SmallInteger }"|
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2252
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2253
    photometric ~~ #rgb ifTrue:[
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2254
	self error:'invalid format'.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2255
	^ nil
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2256
    ].
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2257
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2258
    nDither := ditherMatrix size.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2259
    dH := nDither / dW.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2260
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2261
    bytes := self bits.
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2262
    w := width.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2263
    h := height.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2264
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2265
    greyLevels := 1 bitShift:depth.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2266
    bytesPerRow := self bytesPerRow.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2267
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2268
    bytesPerOutRow := (w * depth + 7) // 8.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2269
    outBits := ByteArray uninitializedNew:(bytesPerOutRow * h).
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2270
    (outBits isNil or:[bytes isNil]) ifTrue:[ self error. ^ nil].
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2271
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2272
    greyMap1 := Array new:256.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2273
    greyMap2 := Array new:256.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2274
    range := greyLevels-1.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2275
    1 to:256 do:[:i |
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2276
	v := (range / 255 * (i-1)).
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2277
	greyMap1 at:i put:v.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2278
	greyMap2 at:i put:v.
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2279
    ].
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2280
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2281
    greyMap1 := (greyMap1 collect:[:b | b isNil ifTrue:[
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2282
					    0
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2283
					] ifFalse:[
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2284
					    b truncated
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2285
					]
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2286
				  ]) asByteArray.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2287
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2288
    greyMap2 := (greyMap2 collect:[:el |
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2289
					el isNil ifTrue:[
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2290
					    0
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2291
					] ifFalse:[
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2292
					    ((el - el truncated)  "/ the error (0..1)
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2293
					    * nDither) rounded
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2294
					]]) asByteArray.
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2295
%{
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2296
    int __dW = __intVal(dW);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2297
    int __dH = __intVal(dH);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2298
    int __byte;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2299
    int __nDither = __intVal(nDither);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2300
    int __dT, __dO;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2301
    int __depth = __intVal(depth);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2302
    int __dstIdx = 0;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2303
    int __srcIdx = 0;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2304
    int __bitCnt;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2305
    int __grey;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2306
    int __w = __intVal(w);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2307
    int __h = __intVal(h);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2308
    int __x;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2309
    int __y;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2310
    int __oX, __oY, __dY;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2311
    int __nextDst;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2312
    int __nextSrc;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2313
    int __bytesPerRow = __intVal(bytesPerRow);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2314
    int __bytesPerOutRow = __intVal(bytesPerOutRow);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2315
    int __pixel;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2316
1812
beeaf75b245b avoid type warnings (char * vs. unsigned char *)
Claus Gittinger <cg@exept.de>
parents: 1782
diff changeset
  2317
    unsigned char *__outBits = __ByteArrayInstPtr(outBits)->ba_element;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2318
    unsigned char *__ditherMatrix = __ByteArrayInstPtr(ditherMatrix)->ba_element;
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2319
    unsigned char *__bytes = __ByteArrayInstPtr(bytes)->ba_element;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2320
    unsigned char *__greyMap1 = __ByteArrayInstPtr(greyMap1)->ba_element;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2321
    unsigned char *__greyMap2 = __ByteArrayInstPtr(greyMap2)->ba_element;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2322
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2323
    __oY = __dY = 0;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2324
    for (__y=0; __y<__h; __y++) {
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2325
	__nextDst = __dstIdx + __bytesPerOutRow;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2326
	__nextSrc = __srcIdx + __bytesPerRow;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2327
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2328
	__byte = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2329
	__bitCnt = 8;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2330
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2331
	__oX = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2332
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2333
	for (__x=0; __x<__w; __x++) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2334
	    __grey = (__bytes[__srcIdx] * 3)           /* 0.3*r + 0.6*g + b -> 0..2550 */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2335
		     + (__bytes[__srcIdx+1] * 6)
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2336
		     + __bytes[__srcIdx+2];
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2337
	    __grey = __grey / 10;                      /* 0 .. 255 */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2338
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2339
	    __pixel = __greyMap1[__grey];            /* 0..(greyLevels-1) */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2340
	    __dO    = __greyMap2[__grey];            /* 0.. nDither-1) */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2341
	    __dT = __ditherMatrix[__dY + __oX];
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2342
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2343
	    if (__dO > __dT)                         /* dither says: next pixel */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2344
		__pixel++;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2345
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2346
	    __srcIdx += 3;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2347
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2348
	    __oX++;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2349
	    if (__oX == __dW) __oX = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2350
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2351
	    __byte = (__byte << __depth) | __pixel;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2352
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2353
	    __bitCnt = __bitCnt - __depth;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2354
	    if (__bitCnt == 0) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2355
		__outBits[__dstIdx] = __byte;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2356
		__dstIdx++;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2357
		__byte = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2358
		__bitCnt = 8;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2359
	    }
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2360
	}
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2361
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2362
	if (__bitCnt != 8) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2363
	    __byte = __byte << __bitCnt;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2364
	    __outBits[__dstIdx] = __byte;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2365
	}
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2366
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2367
	__oY++; __dY += __dW;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2368
	if (__oY == __dH) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2369
	    __oY = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2370
	    __dY = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2371
	}
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2372
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2373
	__srcIdx = __nextSrc;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2374
	__dstIdx = __nextDst;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2375
    }
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2376
%}.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2377
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2378
    ^ outBits
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2379
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2380
    "
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2381
     |i|
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2382
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2383
     i := Image fromFile:'bitmaps/granite.tiff'.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2384
     i asOrderedDitheredMonochromeImage inspect.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2385
     i asOrderedDitheredDepth2GrayImage inspect.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2386
     i asOrderedDitheredDepth4GrayImage inspect.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2387
     i asOrderedDitheredDepth8GrayImage inspect.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2388
    "
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2389
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2390
    "Created: 7.6.1996 / 10:48:06 / cg"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2391
    "Modified: 7.6.1996 / 11:08:50 / cg"
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2392
!
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2393
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2394
orderedDitheredMonochromeBitsWithDitherMatrix:ditherMatrix ditherWidth:dW
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2395
    "return the dithered monochrome bits for the receiver image;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2396
     with a constant ditherMatrix, this can be used for thresholding.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2397
     Redefined to make use of knowing that pixels are 24-bit values."
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2398
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2399
    |dH nDither bytes
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2400
     monoBits
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2401
     bytesPerMonoRow "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2402
     bytesPerRow     "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2403
     w               "{Class: SmallInteger }"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2404
     h               "{Class: SmallInteger }"|
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2405
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2406
    photometric ~~ #rgb ifTrue:[
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2407
	self error:'invalid format'.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2408
	^ nil
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2409
    ].
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2410
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2411
    nDither := ditherMatrix size.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2412
    dH := nDither / dW.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2413
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2414
    bytes := self bits.
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2415
    w := width.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2416
    h := height.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2417
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2418
    bytesPerRow := self bytesPerRow.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2419
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2420
    bytesPerMonoRow := w + 7 // 8.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2421
    monoBits := ByteArray uninitializedNew:(bytesPerMonoRow * h).
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2422
    (monoBits isNil or:[bytes isNil]) ifTrue:[ self error. ^ nil].
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2423
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2424
%{
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2425
    int __dW = __intVal(dW);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2426
    int __dH = __intVal(dH);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2427
    int __byte;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2428
    int __nDither = __intVal(nDither);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2429
    int __dT;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2430
    int __dstIdx = 0;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2431
    int __srcIdx = 0;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2432
    int __bitCnt;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2433
    int __grey;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2434
    int __w = __intVal(w);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2435
    int __h = __intVal(h);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2436
    int __x;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2437
    int __y;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2438
    int __oX, __oY, __dY;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2439
    int __nextDst;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2440
    int __nextSrc;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2441
    int __bytesPerRow = __intVal(bytesPerRow);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2442
    int __bytesPerMonoRow = __intVal(bytesPerMonoRow);
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2443
1812
beeaf75b245b avoid type warnings (char * vs. unsigned char *)
Claus Gittinger <cg@exept.de>
parents: 1782
diff changeset
  2444
    unsigned char *__monoBits = __ByteArrayInstPtr(monoBits)->ba_element;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2445
    unsigned char *__ditherMatrix = __ByteArrayInstPtr(ditherMatrix)->ba_element;
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2446
    unsigned char *__bytes = __ByteArrayInstPtr(bytes)->ba_element;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2447
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2448
    __oY = __dY = 0;
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2449
    for (__y=0; __y<__h; __y++) {
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2450
	__nextDst = __dstIdx + __bytesPerMonoRow;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2451
	__nextSrc = __srcIdx + __bytesPerRow;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2452
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2453
	__byte = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2454
	__bitCnt = 8;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2455
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2456
	__oX = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2457
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2458
	for (__x=0; __x<__w; __x++) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2459
	    __grey = (__bytes[__srcIdx] * 3)           /* 0.3*r + 0.6*g + b -> 0..2550 */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2460
		     + (__bytes[__srcIdx+1] * 6)
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2461
		     + __bytes[__srcIdx+2];
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2462
	    __grey = __grey * (__nDither+1) / 2550;    /* 0 .. nDither+1 */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2463
	    __srcIdx += 3;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2464
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2465
	    __dT = __ditherMatrix[__dY + __oX];
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2466
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2467
	    __oX++;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2468
	    if (__oX == __dW) __oX = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2469
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2470
	    __byte = __byte << 1;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2471
	    if (__grey > __dT) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2472
		__byte = __byte | 1;                   /* white */
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2473
	    }
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2474
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2475
	    __bitCnt--;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2476
	    if (__bitCnt == 0) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2477
		__monoBits[__dstIdx] = __byte;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2478
		__dstIdx++;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2479
		__byte = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2480
		__bitCnt = 8;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2481
	    }
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2482
	}
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2483
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2484
	if (__bitCnt != 8) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2485
	    __byte = __byte << __bitCnt;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2486
	    __monoBits[__dstIdx] = __byte;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2487
	}
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2488
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2489
	__oY++; __dY += __dW;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2490
	if (__oY == __dH) {
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2491
	    __oY = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2492
	    __dY = 0;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2493
	}
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2494
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2495
	__srcIdx = __nextSrc;
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2496
	__dstIdx = __nextDst;
810
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2497
    }
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2498
%}.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2499
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2500
    ^ monoBits
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2501
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2502
    "
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2503
     |i f|
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2504
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2505
     i := Image fromFile:'bitmaps/granite.tiff'.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2506
     f := i asOrderedDitheredMonochromeFormOn:Display.
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2507
    "
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2508
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2509
    "Created: 7.6.1996 / 10:48:06 / cg"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2510
    "Modified: 7.6.1996 / 11:08:50 / cg"
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2511
!
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2512
9789d836dbc4 more dithering
Claus Gittinger <cg@exept.de>
parents: 808
diff changeset
  2513
threshold8BitGrayBits
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2514
    "return the bits for an 8-bit grey image from the receiver.
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2515
     Special code, since this is a common case."
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2516
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2517
    |greyBits
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2518
     srcIndex "{ Class: SmallInteger }"
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2519
     dstIndex "{ Class: SmallInteger }"|
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2520
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2521
    greyBits := ByteArray uninitializedNew:(width * height).
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2522
%{
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2523
    if ((__Class(__INST(bytes)) == ByteArray)
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2524
     && (__Class(greyBits) == ByteArray)) {
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2525
	unsigned char *srcPtr, *dstPtr;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2526
	int i;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2527
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  2528
	srcPtr = __ByteArrayInstPtr(__INST(bytes))->ba_element;
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  2529
	dstPtr = __ByteArrayInstPtr(greyBits)->ba_element;
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2530
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  2531
	i = __intVal(__INST(height)) * __intVal(__INST(width));
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2532
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  2533
	for (; i > 0; i--) {
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2534
	    int __v;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2535
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  2536
	    __v = (srcPtr[0] * 3);     /* 3*r + 6*g + b ; 0 .. 2550 */
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  2537
	    __v += (srcPtr[1] * 6);
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  2538
	    __v += srcPtr[2];
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  2539
	    srcPtr += 3;
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  2540
	    __v /= 10;                 /* 0..255 */
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  2541
	    *dstPtr++ = __v ;
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  2542
	}
808
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2543
    }
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2544
%}.
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2545
    ^ greyBits
f548a3c6ca8c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 807
diff changeset
  2546
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2547
! !
304f026e10cd Initial revision
claus
parents:
diff changeset
  2548
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2549
!Depth24Image methodsFor:'enumerating'!
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2550
5142
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2551
colorsAtX:x from:yLow to:yHigh do:aBlock
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2552
    "perform aBlock for each pixel from y1 to y2 in col x.
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2553
     The block is passed the color at each pixel.
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2554
     This method allows slighly faster processing of an
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2555
     image than using atX:y:, since some processing can be
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2556
     avoided when going from pixel to pixel. However, for
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2557
     real image processing, specialized methods should be written."
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2558
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2559
    |srcIndex "{ Class: SmallInteger }"
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2560
     y1       "{ Class: SmallInteger }"
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2561
     y2       "{ Class: SmallInteger }"
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2562
     rVal     "{ Class: SmallInteger }"
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2563
     gVal     "{ Class: SmallInteger }"
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2564
     bVal     "{ Class: SmallInteger }"
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2565
     lastR lastG lastB lastColor bytes|
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2566
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2567
    photometric ~~ #rgb ifTrue:[
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2568
	^ super colorsAtX:x from:yLow to:yHigh do:aBlock.
5142
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2569
    ].
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2570
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2571
    bytes := self bits.
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2572
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2573
    y1 := yLow.
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2574
    y2 := yHigh.
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2575
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2576
    srcIndex := 1 + (((width * yLow) + x) * 3).
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2577
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2578
    y1 to:y2 do:[:y |
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2579
	rVal := bytes at:(srcIndex).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2580
	gVal := bytes at:(srcIndex + 1).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2581
	bVal := bytes at:(srcIndex + 2).
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2582
	srcIndex := srcIndex + width.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2583
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2584
	(rVal == lastR and:[gVal == lastG and:[bVal == lastB]]) ifFalse:[
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2585
	    lastColor := Color redByte:rVal greenByte:gVal blueByte:bVal.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2586
	    lastR := rVal.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2587
	    lastG := gVal.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2588
	    lastB := bVal.
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2589
	].
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2590
	aBlock value:y value:lastColor
5142
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2591
    ]
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2592
!
f6804072871f +colorsAtX:from:to:do:
Claus Gittinger <cg@exept.de>
parents: 4813
diff changeset
  2593
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  2594
colorsAtY:y from:xLow to:xHigh do:aBlock
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2595
    "perform aBlock for each pixel from x1 to x2 in row y.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2596
     The block is passed the color at each pixel.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2597
     This method allows slighly faster processing of an
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2598
     image than using atX:y:, since some processing can be
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2599
     avoided when going from pixel to pixel. However, for
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2600
     real image processing, specialized methods should be written."
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2601
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2602
    |srcIndex "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2603
     x1       "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2604
     x2       "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2605
     rVal     "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2606
     gVal     "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2607
     bVal     "{ Class: SmallInteger }"
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2608
     lastR lastG lastB lastColor bytes|
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2609
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2610
    photometric ~~ #rgb ifTrue:[
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2611
	^ super colorsAtY:y from:xLow to:xHigh do:aBlock.
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2612
    ].
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2613
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2614
    bytes := self bits.
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2615
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2616
    x1 := xLow.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2617
    x2 := xHigh.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2618
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2619
    srcIndex := 1 + (((width * y) + x1) * 3).
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2620
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2621
    x1 to:x2 do:[:x |
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2622
	rVal := bytes at:(srcIndex).
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2623
	gVal := bytes at:(srcIndex + 1).
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2624
	bVal := bytes at:(srcIndex + 2).
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2625
	srcIndex := srcIndex + 3.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2626
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2627
	(rVal == lastR and:[gVal == lastG and:[bVal == lastB]]) ifFalse:[
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2628
	    lastColor := Color redByte:rVal greenByte:gVal blueByte:bVal.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2629
	    lastR := rVal.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2630
	    lastG := gVal.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2631
	    lastB := bVal.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2632
	].
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2633
	aBlock value:x value:lastColor
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2634
    ]
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  2635
2190
ac8e972bb813 oops - bad color used in enumerator.
Claus Gittinger <cg@exept.de>
parents: 2067
diff changeset
  2636
    "Created: / 7.6.1996 / 19:12:28 / cg"
ac8e972bb813 oops - bad color used in enumerator.
Claus Gittinger <cg@exept.de>
parents: 2067
diff changeset
  2637
    "Modified: / 27.7.1998 / 20:03:02 / cg"
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2638
!
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2639
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  2640
valuesAtY:y from:xLow to:xHigh do:aBlock
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2641
    "perform aBlock for each pixelValue from x1 to x2 in row y.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2642
     The block is passed the pixelValue at each pixel.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2643
     This method allows slighly faster processing of an
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2644
     image than using valueAtX:y:, since some processing can be
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2645
     avoided when going from pixel to pixel. However, for
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2646
     real image processing, specialized methods should be written.
7278
52a81602e12c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7273
diff changeset
  2647
     Notice that the pixelValue is the r/g/b value packed into an MSB integer
52a81602e12c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7273
diff changeset
  2648
     (r bitShift:16) bitOr:(g bitSHift:8) bitOr:b
52a81602e12c #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 7273
diff changeset
  2649
     i.e. r is the first byte, but high in the passed pixel value."
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2650
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2651
    |srcIndex "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2652
     x1       "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2653
     x2       "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2654
     r        "{ Class: SmallInteger }"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2655
     g        "{ Class: SmallInteger }"
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2656
     b        "{ Class: SmallInteger }"
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2657
     bytes|
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2658
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2659
    bytes := self bits.
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2660
    x1 := xLow.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2661
    x2 := xHigh.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2662
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2663
    srcIndex := 1 + (((width * y) + x1) * 3).
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2664
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2665
    x1 to:x2 do:[:x |
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2666
	r := bytes at:(srcIndex).
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2667
	g := bytes at:(srcIndex + 1).
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2668
	b := bytes at:(srcIndex + 2).
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2669
	srcIndex := srcIndex + 3.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2670
	aBlock value:x value:(((r bitShift:16) bitOr:(g bitShift:8)) bitOr:b)
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2671
    ]
798
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  2672
31ed4a1d4b4a better dither
Claus Gittinger <cg@exept.de>
parents: 746
diff changeset
  2673
    "Created: 7.6.1996 / 19:09:40 / cg"
7527
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2674
!
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2675
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2676
valuesFromX:xStart y:yStart toX:xEnd y:yEnd do:aBlock
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2677
    "perform aBlock for each pixel in the rectangle
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2678
     yStart..yEnd / xStart..xEnd.
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2679
     The block is passed the pixelValue at each pixel.
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2680
     This method allows slighly faster processing of an
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2681
     image than using individual valueAtX:y: accesses,
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2682
     since some processing can be avoided when going from pixel to pixel..
7530
5c500f48ef49 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7528
diff changeset
  2683
     However, for real high performance image  processing, specialized methods
7527
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2684
     should be written which know how to deal with specific photometric interpretations."
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2685
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2686
    |srcIndex    "{ Class: SmallInteger }"
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2687
     srcNext     "{ Class: SmallInteger }"
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2688
     bytesPerRow "{ Class: SmallInteger }"
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2689
     value    "{ Class: SmallInteger }"
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2690
     x1       "{ Class: SmallInteger }"
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2691
     x2       "{ Class: SmallInteger }"
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2692
     y1       "{ Class: SmallInteger }"
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2693
     y2       "{ Class: SmallInteger }"
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2694
     bytes|
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2695
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2696
    x1 := xStart.
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2697
    x2 := xEnd.
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2698
    y1 := yStart.
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2699
    y2 := yEnd.
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2700
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2701
    srcIndex := (width * 3 * y1) + (x1 * 3) + 1 .
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2702
    bytesPerRow := self bytesPerRow.
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2703
    bytes := self bits.
7528
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2704
%{
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2705
    OBJFUNC codeVal;
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2706
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2707
    if (__bothSmallInteger(x1, x2)
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2708
     && __bothSmallInteger(y1, y2)
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2709
     && __bothSmallInteger(srcIndex, bytesPerRow)
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2710
     && __isByteArrayLike(bytes)
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2711
     && __isBlockLike(aBlock)
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2712
     && (__BlockInstPtr(aBlock)->b_nargs == __mkSmallInteger(3))
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2713
     && ((codeVal = __BlockInstPtr(aBlock)->b_code) != (OBJFUNC)nil)
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2714
    ) {
7549
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2715
        int c_x1 = __intVal(x1);
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2716
        int c_x2 = __intVal(x2);
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2717
        int c_y1 = __intVal(y1);
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2718
        int c_y2 = __intVal(y2);
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2719
        int c_w = __intVal(__INST(width));
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2720
        int c_h = __intVal(__INST(height));
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2721
        int c_srcIndex = __intVal(srcIndex)-1;
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2722
        int c_bytesPerRow = __intVal(bytesPerRow);
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2723
        int c_y, c_x;
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2724
        OBJ c_rHome;
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2725
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2726
        c_rHome = __BlockInstPtr(aBlock)->b_home;
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2727
        if ((c_rHome == nil) || (__qSpace(c_rHome) >= STACKSPACE)) {
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2728
            if ((((unsigned)c_y1) < c_h)
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2729
             && (((unsigned)c_y2) < c_h)
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2730
             && (((unsigned)c_x1) < c_w)
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2731
             && (((unsigned)c_x2) < c_w)) {
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2732
                unsigned char *c_bytes = (unsigned char*)__ByteArrayInstPtr(bytes)->ba_element;
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2733
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2734
                if ((c_srcIndex + (c_bytesPerRow * (c_y2-c_y1))) < __byteArraySize(bytes)) {
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2735
                    c_bytes += c_srcIndex;
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2736
                    for (c_y=c_y1; c_y<=c_y2; c_y++) {
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2737
                        unsigned char *c_next = c_bytes + c_bytesPerRow;
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2738
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2739
                        for (c_x=c_x1; c_x<=c_x2; c_x++) {
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2740
                            int c_value;
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2741
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2742
                            c_value = c_bytes[0];
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2743
                            c_value = (c_value<<8) | c_bytes[1];
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2744
                            c_value = (c_value<<8) | c_bytes[2];
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2745
                            (*(__BlockInstPtr(aBlock)->b_code))(c_rHome, __mkSmallInteger(c_x), __mkSmallInteger(c_y), __mkSmallInteger(c_value));
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2746
                            c_bytes += 3;
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2747
                        }
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2748
                        c_bytes = c_next;
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2749
                    }
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2750
                    RETURN(self);
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2751
                }
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2752
            }
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2753
        }
7528
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2754
    }
c48cbbe547e6 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7527
diff changeset
  2755
%}.
7527
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2756
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2757
    y1 to:y2 do:[:y |
7549
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2758
        srcNext := srcIndex + bytesPerRow.
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2759
        x1 to:x2 do:[:x |
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2760
            value := bytes at:srcIndex.
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2761
            value := (value bitShift:8) + (bytes at:srcIndex+1).
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2762
            value := (value bitShift:8) + (bytes at:srcIndex+2).
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2763
            srcIndex := srcIndex + 3.
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2764
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2765
            aBlock value:x value:y value:value
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2766
        ].
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  2767
        srcIndex := srcNext.
7527
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2768
    ].
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2769
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2770
    "Modified: 11.7.1996 / 20:06:47 / cg"
388a8f3f5c84 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 7512
diff changeset
  2771
    "Created: 11.7.1996 / 20:08:11 / cg"
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2772
! !
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2773
1767
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2774
!Depth24Image methodsFor:'image manipulations'!
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2775
7535
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2776
easyRotateBitsInto:destinationImage angle:degrees
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2777
    "tuned helper for rotation - does the actual pixel shuffling, by degrees clockwise.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2778
     Here, only 90, 180 and 270 degrees are implemented.
7535
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2779
     Hard angles are done in #hardRotate:.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2780
     The code here a tuned version of the inherited for more performance"
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2781
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2782
    |srcBytesPerRow dstBytesPerRow
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2783
     srcWidth srcHeight
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2784
     dstWidth dstHeight
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2785
     srcBytes dstBytes|
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2786
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2787
    srcBytesPerRow := self bytesPerRow.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2788
    srcBytes := self bits.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2789
    srcWidth := width.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2790
    srcHeight := height.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2791
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2792
    dstBytesPerRow := destinationImage bytesPerRow.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2793
    dstBytes := destinationImage bits.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2794
    dstWidth := destinationImage width.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2795
    dstHeight := destinationImage height.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2796
%{
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2797
    if (__bothSmallInteger(srcWidth, srcHeight)
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2798
     && __bothSmallInteger(dstWidth, dstHeight)
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2799
     && __bothSmallInteger(dstBytesPerRow, srcBytesPerRow)
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2800
     && __isByteArrayLike(srcBytes)
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2801
     && __isByteArrayLike(dstBytes)
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2802
    ) {
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2803
	int c_srcW = __intVal(srcWidth);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2804
	int c_srcH = __intVal(srcHeight);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2805
	int c_dstW = __intVal(dstWidth);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2806
	int c_dstH = __intVal(dstHeight);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2807
	int c_srcBytesPerRow = __intVal(srcBytesPerRow);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2808
	int c_dstBytesPerRow = __intVal(dstBytesPerRow);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2809
	int c_srcW4 = c_srcW-4;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2810
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2811
	// I tried three versions here;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2812
	//   a) compute dstX/y inside the loop,
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2813
	//   b) precompute a transformation matrix and compute inside the loop w.o conditional branches
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2814
	//      (i.e. x*Mx + y*My...)
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2815
	//   c) precompute ptr-delta and use those to step to next destination pixel.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2816
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2817
	// the funny result:
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2818
	//   all show roughly the same speed on a modern CPU.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2819
	// So the whole thing is mostly limited by memory-bandwidth,
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2820
	// and there is not much to do, unless we move to a better memory fetch/store
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2821
	// (eg. mmx or similar vector stuff)
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2822
	// However, on slower cpus, algo c shpuld perform better, as it does not need multiplications in the loop.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2823
	// The version below orecomputes the delta, so it should run fast on older CPUs as well.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2824
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2825
	{
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2826
	    unsigned char *c_srcBytes = (unsigned char*)__ByteArrayInstPtr(srcBytes)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2827
	    unsigned char *c_dstBytes = (unsigned char*)__ByteArrayInstPtr(dstBytes)->ba_element;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2828
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2829
	    int c_dstNextRowOffset;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2830
	    int c_dstNextColOffset;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2831
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2832
	    if (degrees == __mkSmallInteger(90)) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2833
		// destinationImage pixelAtX:(h-row) y:col put:pixel
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2834
		c_dstNextRowOffset = -3;                                // going to previous column
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2835
		c_dstNextColOffset = c_dstBytesPerRow;                  // going to next row
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2836
		c_dstBytes += (c_dstW-1)*3;                             // start in the upper-right of dest
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2837
	    } else if (degrees == __mkSmallInteger(180)) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2838
		// destinationImage pixelAtX:(w-col) y:(h-row) put:pixel
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2839
		c_dstNextRowOffset = -c_dstBytesPerRow;                 // going to previous row
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2840
		c_dstNextColOffset = -3;                                // going to prev col
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2841
		c_dstBytes += (c_dstH-1)*c_dstBytesPerRow+(c_dstW-1)*3; // start in the lower-right of dest
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2842
	    } else {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2843
		// destinationImage pixelAtX:row y:(w-col) put:pixel
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2844
		c_dstNextRowOffset = 3;                                 // going to next col
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2845
		c_dstNextColOffset = -c_dstBytesPerRow;                 // going to prev row
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2846
		c_dstBytes += (c_dstH-1)*c_dstBytesPerRow;              // start in the lower-left of dest
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2847
	    }
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2848
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2849
	    if ((c_srcBytesPerRow * c_srcH) <= __byteArraySize(srcBytes)) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2850
		int c_y;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2851
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2852
		for (c_y=0; c_y<c_srcH; c_y++) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2853
		    unsigned char *c_srcNext = c_srcBytes + c_srcBytesPerRow;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2854
		    unsigned char *c_dstNext = c_dstBytes + c_dstNextRowOffset;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2855
		    int c_x;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2856
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2857
		    c_x = 0;
7535
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2858
#if 1
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2859
		    if (sizeof(int) == 4) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2860
			for (c_x = 0; c_x < c_srcW4; c_x += 4) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2861
			    int c_value1, c_value2, c_value3;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2862
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2863
			    c_value1 = ((int *)c_srcBytes)[0];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2864
			    c_value2 = ((int *)c_srcBytes)[1];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2865
			    c_value3 = ((int *)c_srcBytes)[2];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2866
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2867
			    c_dstBytes[0] = (c_value1) & 0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2868
			    c_dstBytes[1] = (c_value1>>8) & 0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2869
			    c_dstBytes[2] = (c_value1>>16) &0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2870
			    c_dstBytes += c_dstNextColOffset;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2871
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2872
			    c_dstBytes[0] = (c_value1>>24) & 0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2873
			    c_dstBytes[1] = (c_value2) & 0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2874
			    c_dstBytes[2] = (c_value2>>8) &0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2875
			    c_dstBytes += c_dstNextColOffset;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2876
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2877
			    c_dstBytes[0] = (c_value2>>16) & 0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2878
			    c_dstBytes[1] = (c_value2>>24) & 0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2879
			    c_dstBytes[2] = (c_value3) &0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2880
			    c_dstBytes += c_dstNextColOffset;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2881
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2882
			    c_dstBytes[0] = (c_value3>>8) & 0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2883
			    c_dstBytes[1] = (c_value3>>16) & 0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2884
			    c_dstBytes[2] = (c_value3>>24) &0xFF;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2885
			    c_dstBytes += c_dstNextColOffset;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2886
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2887
			    c_srcBytes += (3*4);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2888
			}
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2889
		    }
7535
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2890
#endif
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2891
		    for (; c_x < c_srcW; c_x++) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2892
			int c_rValue, c_gValue, c_bValue;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2893
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2894
			c_rValue = c_srcBytes[0];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2895
			c_gValue = c_srcBytes[1];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2896
			c_bValue = c_srcBytes[2];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2897
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2898
			c_dstBytes[0] = c_rValue;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2899
			c_dstBytes[1] = c_gValue;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2900
			c_dstBytes[2] = c_bValue;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2901
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2902
			c_srcBytes += 3;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2903
			c_dstBytes += c_dstNextColOffset;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2904
		    }
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2905
		    c_srcBytes = c_srcNext;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2906
		    c_dstBytes = c_dstNext;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2907
		}
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2908
		RETURN(self);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2909
	    }
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2910
	}
7535
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2911
    }
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2912
%}.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2913
    self breakPoint:#cg.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2914
    super easyRotateBitsInto:destinationImage angle:degrees
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2915
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2916
    "
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2917
     |i|
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2918
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2919
     i := Image fromFile:'../../goodies/bitmaps/gifImages/claus.gif'.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2920
     i := Depth24Image fromImage:i.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2921
     i inspect.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2922
     (i rotated:45) inspect.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2923
     (i rotated:90) inspect.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2924
     (i rotated:180) inspect.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2925
     (i rotated:270) inspect.
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2926
    "
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2927
!
d8d9480fdec2 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 7531
diff changeset
  2928
1767
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2929
negative
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2930
    |bytes index newImage newBytes nBytes r g b|
1767
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2931
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2932
    photometric ~~ #rgb ifTrue:[
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2933
	^ super negative.
1767
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2934
    ].
3866
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2935
    bytes := self bits.
c01473a90934 eliminated most references to bytes
Claus Gittinger <cg@exept.de>
parents: 3851
diff changeset
  2936
1767
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2937
    newImage := self copy.
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2938
    nBytes := bytes size.
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2939
    newImage bits:(newBytes := ByteArray new:nBytes).
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2940
    index := 1.
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2941
    [index < nBytes] whileTrue:[
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2942
	r := bytes at:index.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2943
	newBytes at:index put:(255-r).
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2944
	index := index + 1.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2945
	g := bytes at:index.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2946
	newBytes at:index put:(255-g).
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2947
	index := index + 1.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2948
	b := bytes at:index.
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2949
	newBytes at:index put:(255-b).
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2950
	index := index + 1.
1767
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2951
    ].
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2952
    ^ newImage
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2953
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2954
    "Modified: 23.6.1997 / 09:57:19 / cg"
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2955
! !
a043a8417e73 #negative
Claus Gittinger <cg@exept.de>
parents: 1738
diff changeset
  2956
4760
075322ae4864 defaultPhotometric
Claus Gittinger <cg@exept.de>
parents: 4721
diff changeset
  2957
!Depth24Image methodsFor:'initialization'!
075322ae4864 defaultPhotometric
Claus Gittinger <cg@exept.de>
parents: 4721
diff changeset
  2958
075322ae4864 defaultPhotometric
Claus Gittinger <cg@exept.de>
parents: 4721
diff changeset
  2959
initialize
075322ae4864 defaultPhotometric
Claus Gittinger <cg@exept.de>
parents: 4721
diff changeset
  2960
    super initialize.
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  2961
    samplesPerPixel := 3.
4760
075322ae4864 defaultPhotometric
Claus Gittinger <cg@exept.de>
parents: 4721
diff changeset
  2962
    bitsPerSample := #(8 8 8).
075322ae4864 defaultPhotometric
Claus Gittinger <cg@exept.de>
parents: 4721
diff changeset
  2963
075322ae4864 defaultPhotometric
Claus Gittinger <cg@exept.de>
parents: 4721
diff changeset
  2964
    "Created: / 27-05-2007 / 14:09:34 / cg"
075322ae4864 defaultPhotometric
Claus Gittinger <cg@exept.de>
parents: 4721
diff changeset
  2965
! !
075322ae4864 defaultPhotometric
Claus Gittinger <cg@exept.de>
parents: 4721
diff changeset
  2966
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  2967
!Depth24Image methodsFor:'magnification'!
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  2968
1738
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2969
hardAntiAliasedMagnifiedBy:scalePoint
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2970
    "return a new image magnified by scalePoint, aPoint.
6795
f945a03cf2ac class: Depth24Image
Claus Gittinger <cg@exept.de>
parents: 6301
diff changeset
  2971
     This interpolates pixels and is therefore much slower,
f945a03cf2ac class: Depth24Image
Claus Gittinger <cg@exept.de>
parents: 6301
diff changeset
  2972
     but generates nicer looking magnifications."
1738
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2973
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2974
    |mX
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2975
     mY
1738
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2976
     newWidth  "{ Class: SmallInteger }"
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2977
     newHeight "{ Class: SmallInteger }"
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2978
     w         "{ Class: SmallInteger }"
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2979
     h         "{ Class: SmallInteger }"
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2980
     newImage newBits bitsPerPixel newBytesPerRow newMask
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  2981
     value
1738
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2982
     srcRow pixelArray|
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2983
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2984
    mX := scalePoint x.
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2985
    mY := scalePoint y.
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2986
    ((mX < 0) or:[mY < 0]) ifTrue:[^ nil].
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2987
    ((mX = 1) and:[mY = 1]) ifTrue:[^ self].
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2988
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2989
    newWidth := (width * mX) truncated.
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2990
    newHeight := (height * mY) truncated.
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2991
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2992
    bitsPerPixel := self depth.
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2993
    newBytesPerRow := ((newWidth * bitsPerPixel) + 7) // 8.
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2994
    newBits := ByteArray new: "uninitializedNew:" (newBytesPerRow * newHeight).
2064
eece7560f78f md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  2995
    newBits isNil ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2996
	'Depth24Image [warning]: failed to allocate byteArray for image bits' errorPrintCR.
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  2997
	^ nil
2064
eece7560f78f md's WIN32 changes
Claus Gittinger <cg@exept.de>
parents: 2044
diff changeset
  2998
    ].
1738
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  2999
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3000
    mask notNil ifTrue:[
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3001
	newMask := (mask magnifiedBy:scalePoint)
1738
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3002
    ].
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3003
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3004
    newImage := self species new.
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  3005
    newImage
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3006
	width:newWidth
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3007
	height:newHeight
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3008
	photometric:photometric
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3009
	samplesPerPixel:samplesPerPixel
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3010
	bitsPerSample:bitsPerSample
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3011
	colorMap:nil
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3012
	bits:newBits
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3013
	mask:newMask.
1738
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3014
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3015
    mY := mY asFloat.
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3016
    mX := mX asFloat.
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3017
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3018
%{
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3019
    REGISTER unsigned char *_dstP = __ByteArrayInstPtr(newBits)->ba_element;
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3020
    unsigned char *_srcP = __ByteArrayInstPtr(__INST(bytes))->ba_element;
1738
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3021
    unsigned char *_srcRowP, *sP;
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3022
    int _width3 = __intVal(__INST(width)) * 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3023
    int _oldW = __intVal(__INST(width)) - 1;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3024
    int _oldH = __intVal(__INST(height)) - 1;
1738
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3025
    int _w = __intVal(newWidth) - 1;
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3026
    int _h = __intVal(newHeight) - 1;
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3027
    int _row, _col;
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3028
    double _mX = __floatVal(mX);
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3029
    double _mY = __floatVal(mY);
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3030
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3031
    for (_row = 0; _row <= _h; _row++) {
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3032
	double _srcY;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3033
	double _dY;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3034
	int _sR;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3035
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3036
	_srcY = ((double)_row / _mY);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3037
	_sR = (int)_srcY;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3038
	_dY = _srcY - ((double)_sR);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3039
	_srcRowP = _srcP + (_width3 * _sR);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3040
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3041
	for (_col = 0; _col <= _w; _col++) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3042
	    unsigned int rHere, gHere, bHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3043
	    unsigned int rRight, gRight, bRight;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3044
	    unsigned int rRightBelow, gRightBelow, bRightBelow;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3045
	    unsigned int rBelow, gBelow, bBelow;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3046
	    unsigned int _r, _g, _b;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3047
	    double wHere, wRight, wRightBelow, wBelow, sumW;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3048
	    double _srcX;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3049
	    double _dX;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3050
	    int _sC;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3051
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3052
	    _srcX = ((double)_col / _mX);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3053
	    _sC = (int)_srcX;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3054
	    _dX = _srcX - ((double)_sC);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3055
	    sP = _srcRowP + (_sC * 3);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3056
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3057
	    rHere = sP[0];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3058
	    gHere = sP[1];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3059
	    bHere = sP[2];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3060
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3061
	    if (_sC < _oldW) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3062
		rRight = sP[3];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3063
		gRight = sP[4];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3064
		bRight = sP[5];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3065
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3066
		if (_sR < _oldH) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3067
		    rBelow = sP[0+_width3];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3068
		    gBelow = sP[1+_width3];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3069
		    bBelow = sP[2+_width3];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3070
		    rRightBelow = sP[3+_width3];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3071
		    gRightBelow = sP[4+_width3];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3072
		    bRightBelow = sP[5+_width3];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3073
		} else {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3074
		    rRightBelow = rHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3075
		    gRightBelow = gHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3076
		    bRightBelow = bHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3077
		    rBelow = rHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3078
		    gBelow = gHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3079
		    bBelow = bHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3080
		}
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3081
	    } else {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3082
		rRight = rRightBelow = rHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3083
		gRight = gRightBelow = gHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3084
		bRight = bRightBelow = bHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3085
		if (_sR < _oldH) {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3086
		    rBelow = sP[0+_width3];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3087
		    gBelow = sP[1+_width3];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3088
		    bBelow = sP[2+_width3];
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3089
		} else {
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3090
		    rBelow = rHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3091
		    gBelow = gHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3092
		    bBelow = bHere;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3093
		}
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3094
	    }
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3095
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3096
	    wHere = (1.0 - _dX) * (1.0 - _dY);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3097
	    wRight = _dX * (1.0 - _dY);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3098
	    wBelow = _dY * (1.0 - _dX);
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3099
	    wRightBelow = _dX * _dY;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3100
	    sumW = wHere + wRight + wBelow + wRightBelow;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3101
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3102
	    _r = ((rHere * wHere) + (rRight * wRight) + (rBelow * wBelow) + (rRightBelow * wRightBelow)) / sumW;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3103
	    _g = ((gHere * wHere) + (gRight * wRight) + (gBelow * wBelow) + (gRightBelow * wRightBelow)) / sumW;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3104
	    _b = ((bHere * wHere) + (bRight * wRight) + (bBelow * wBelow) + (bRightBelow * wRightBelow)) / sumW;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3105
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3106
	    _dstP[0] = _r;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3107
	    _dstP[1] = _g;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3108
	    _dstP[2] = _b;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3109
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3110
	    _dstP += 3;
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3111
	}
1738
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3112
    }
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3113
%}.
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3114
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3115
    ^ newImage
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3116
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3117
    "
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3118
     |i|
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3119
     i := Image fromFile:'bitmaps/gifImages/garfield.gif'.
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3120
     i hardAntiAliasedMagnifiedBy:2@2
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3121
    "
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3122
    "
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3123
     |i|
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3124
     i := Depth24Image width:3 height:3 fromArray:#[ 0 0 0  0 0 0  0 0 0
7538
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3125
						     0 0 0  255 255 255  0 0 0
3dfe4653bbd0 warning
Claus Gittinger <cg@exept.de>
parents: 7535
diff changeset
  3126
						     0 0 0  0 0 0  0 0 0].
1738
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3127
     i hardAntiAliasedMagnifiedBy:8@8
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3128
    "
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3129
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3130
    "Modified: 2.6.1997 / 12:28:18 / cg"
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3131
    "Created: 2.6.1997 / 13:18:53 / cg"
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3132
!
4f1466e0d379 antiAliasing
Claus Gittinger <cg@exept.de>
parents: 1666
diff changeset
  3133
1577
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1350
diff changeset
  3134
hardMagnifiedBy:scalePoint
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1350
diff changeset
  3135
    "return a new image magnified by scalePoint, aPoint.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  3136
     This is  the general magnification method, handling non-integral values"
304f026e10cd Initial revision
claus
parents:
diff changeset
  3137
304f026e10cd Initial revision
claus
parents:
diff changeset
  3138
    |mX mY
304f026e10cd Initial revision
claus
parents:
diff changeset
  3139
     newWidth  "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  3140
     newHeight "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  3141
     w         "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  3142
     h         "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  3143
     newImage newBytes
304f026e10cd Initial revision
claus
parents:
diff changeset
  3144
     value     "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  3145
     srcRowIdx "{ Class: SmallInteger }"
304f026e10cd Initial revision
claus
parents:
diff changeset
  3146
     srcIndex  "{ Class: SmallInteger }"
1577
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1350
diff changeset
  3147
     dstIndex  "{ Class: SmallInteger }"
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1350
diff changeset
  3148
     newMask|
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  3149
1577
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1350
diff changeset
  3150
    mX := scalePoint x.
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1350
diff changeset
  3151
    mY := scalePoint y.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  3152
    ((mX < 0) or:[mY < 0]) ifTrue:[^ nil].
304f026e10cd Initial revision
claus
parents:
diff changeset
  3153
    ((mX = 1) and:[mY = 1]) ifTrue:[^ self].
304f026e10cd Initial revision
claus
parents:
diff changeset
  3154
304f026e10cd Initial revision
claus
parents:
diff changeset
  3155
    newWidth := (width * mX) truncated.
304f026e10cd Initial revision
claus
parents:
diff changeset
  3156
    newHeight := (height * mY) truncated.
304f026e10cd Initial revision
claus
parents:
diff changeset
  3157
    newBytes := ByteArray uninitializedNew:(newWidth * 3 * newHeight).
304f026e10cd Initial revision
claus
parents:
diff changeset
  3158
1577
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1350
diff changeset
  3159
    mask notNil ifTrue:[
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3160
	newMask := (mask magnifiedBy:scalePoint)
1577
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1350
diff changeset
  3161
    ].
3d8eedcc0ad8 magnify mask as well.
Claus Gittinger <cg@exept.de>
parents: 1350
diff changeset
  3162
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  3163
    newImage := self species new.
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  3164
    newImage
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  3165
	width:newWidth
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  3166
	height:newHeight
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  3167
	photometric:photometric
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  3168
	samplesPerPixel:samplesPerPixel
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  3169
	bitsPerSample:#(8 8 8)
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3170
	colorMap:nil
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3171
	bits:newBytes
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3172
	mask:newMask.
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  3173
304f026e10cd Initial revision
claus
parents:
diff changeset
  3174
    "walk over destination image fetching pixels from source image"
304f026e10cd Initial revision
claus
parents:
diff changeset
  3175
304f026e10cd Initial revision
claus
parents:
diff changeset
  3176
    mY := mY asFloat.
304f026e10cd Initial revision
claus
parents:
diff changeset
  3177
    mX := mX asFloat.
304f026e10cd Initial revision
claus
parents:
diff changeset
  3178
%{
2042
58c0228331bb single underscore-macros -> double underscores
Claus Gittinger <cg@exept.de>
parents: 1999
diff changeset
  3179
    REGISTER unsigned char *_dstP = __ByteArrayInstPtr(newBytes)->ba_element;
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3180
    unsigned char *_srcP = __ByteArrayInstPtr(__INST(bytes))->ba_element;
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  3181
    unsigned char *_srcRowP, *sP;
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3182
    int _width3 = __intVal(__INST(width)) * 3;
2044
9ea84b4ba249 more single-underline macros
Claus Gittinger <cg@exept.de>
parents: 2042
diff changeset
  3183
    int _w = __intVal(newWidth) - 1;
9ea84b4ba249 more single-underline macros
Claus Gittinger <cg@exept.de>
parents: 2042
diff changeset
  3184
    int _h = __intVal(newHeight) - 1;
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  3185
    int _row, _col;
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3186
    double _mX = __floatVal(mX);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3187
    double _mY = __floatVal(mY);
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  3188
304f026e10cd Initial revision
claus
parents:
diff changeset
  3189
    for (_row = 0; _row <= _h; _row++) {
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3190
	_srcRowP = _srcP + (_width3 * (int)((double)_row / _mY));
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3191
	for (_col = 0; _col <= _w; _col++) {
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3192
	    sP = _srcRowP + (((int)((double)_col / _mX)) * 3);
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3193
	    _dstP[0] = sP[0];
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3194
	    _dstP[1] = sP[1];
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3195
	    _dstP[2] = sP[2];
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3196
	    _dstP += 3;
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3197
	}
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  3198
    }
304f026e10cd Initial revision
claus
parents:
diff changeset
  3199
%}
304f026e10cd Initial revision
claus
parents:
diff changeset
  3200
.
81
4ba554473294 *** empty log message ***
claus
parents: 66
diff changeset
  3201
"   the above C-code is equivalent to:
4ba554473294 *** empty log message ***
claus
parents: 66
diff changeset
  3202
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  3203
    dstIndex := 1.
304f026e10cd Initial revision
claus
parents:
diff changeset
  3204
    w := newWidth - 1.
304f026e10cd Initial revision
claus
parents:
diff changeset
  3205
    h := newHeight - 1.
304f026e10cd Initial revision
claus
parents:
diff changeset
  3206
    0 to:h do:[:row |
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3207
	srcRowIdx := (width * 3 * (row // mY)) + 1.
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3208
	0 to:w do:[:col |
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3209
	    srcIndex := srcRowIdx + ((col // mX) * 3).
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3210
	    value := bytes at:srcIndex.
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3211
	    newBytes at:dstIndex put:value.
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3212
	    value := bytes at:(srcIndex + 1).
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3213
	    newBytes at:(dstIndex + 1) put:value.
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3214
	    value := bytes at:(srcIndex + 2).
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3215
	    newBytes at:(dstIndex + 2) put:value.
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3216
	    dstIndex := dstIndex + 3
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3217
	]
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  3218
    ].
304f026e10cd Initial revision
claus
parents:
diff changeset
  3219
"
304f026e10cd Initial revision
claus
parents:
diff changeset
  3220
    ^ newImage
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3221
!
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3222
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3223
magnifyRowFrom:srcBytes offset:srcStart
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3224
	  into:dstBytes offset:dstStart factor:mX
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3225
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3226
    "magnify a single pixel row - can only magnify by integer factors"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3227
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3228
%{
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3229
    unsigned char *srcP, *dstP;
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3230
    int _mag;
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3231
    REGISTER int i;
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3232
    REGISTER unsigned char byte1, byte2, byte3;
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3233
    int _pixels;
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3234
    OBJ w = __INST(width);
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3235
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3236
    if (__bothSmallInteger(srcStart, dstStart)
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3237
     && __bothSmallInteger(w, mX)
5480
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
  3238
     && __isByteArrayLike(srcBytes) && __isByteArray(dstBytes)) {
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3239
	_mag = __intVal(mX);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3240
	srcP = __ByteArrayInstPtr(srcBytes)->ba_element - 1 + __intVal(srcStart);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3241
	dstP = __ByteArrayInstPtr(dstBytes)->ba_element - 1 + __intVal(dstStart);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3242
	_pixels = __intVal(w);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3243
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3244
	while (_pixels--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3245
	    byte1 = *srcP;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3246
	    byte2 = *(srcP+1);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3247
	    byte3 = *(srcP+2);
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3248
	    srcP += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3249
	    for (i=_mag; i>0; i--) {
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3250
		*dstP = byte1;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3251
		*(dstP+1) = byte2;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3252
		*(dstP+2) = byte3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3253
		dstP += 3;
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3254
	    }
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3255
	}
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3256
	RETURN (self);
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3257
    }
3842
e97ae6061e75 code cleanup
Claus Gittinger <cg@exept.de>
parents: 3490
diff changeset
  3258
%}.
4719
b645e2f1a76a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4118
diff changeset
  3259
    super
6066
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3260
	magnifyRowFrom:srcBytes offset:srcStart
62426e8110ae stx macros with 2 underlines
Claus Gittinger <cg@exept.de>
parents: 6038
diff changeset
  3261
	into:dstBytes offset:dstStart factor:mX
1
304f026e10cd Initial revision
claus
parents:
diff changeset
  3262
! !
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3263
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3264
!Depth24Image methodsFor:'queries'!
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3265
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3266
bitsPerPixel
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3267
    "return the number of bits per pixel"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3268
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3269
    ^ 24
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3270
!
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3271
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3272
bitsPerRow
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3273
    "return the number of bits in one scanline of the image"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3274
3868
e47cf114c824 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3866
diff changeset
  3275
    ^ width * 24
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3276
!
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3277
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3278
bitsPerSample
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3279
    "return the number of bits per sample.
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3280
     The return value is an array of bits-per-plane."
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3281
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
  3282
    bitsPerSample notNil ifTrue:[^ bitsPerSample].
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3283
    ^ #(8 8 8)
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
  3284
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
  3285
    "Modified: 10.6.1996 / 18:02:33 / cg"
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3286
!
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3287
805
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3288
blueBitsOf:pixel
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3289
    "given a pixel-value, return the blue component as byteValue (0..255)"
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3290
805
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3291
    ^ pixel bitAnd:16rFF.
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3292
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3293
    "Created: 8.6.1996 / 09:56:20 / cg"
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3294
!
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3295
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3296
blueComponentOf:pixel
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3297
    "given a pixel-value, return the blue component in percent (0..100)"
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3298
805
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3299
    ^ (100.0 / 255.0) * (pixel bitAnd:16rFF)
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3300
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3301
    "Created: 8.6.1996 / 08:42:44 / cg"
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3302
    "Modified: 8.6.1996 / 09:57:41 / cg"
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3303
!
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3304
3490
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3305
blueMaskForPixelValue
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3306
    "return the mask used with translation from pixelValues to blueBits"
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3307
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3308
    ^ 16rFF
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3309
!
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3310
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3311
blueShiftForPixelValue
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3312
    "return the shift amount used with translation from pixelValues to blueBits"
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3313
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3314
    ^ 0
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3315
!
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3316
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3317
bytesPerRow
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3318
    "return the number of bytes in one scanline of the image"
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3319
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3320
    ^ width * 3
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3321
!
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3322
805
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3323
greenBitsOf:pixel
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3324
    "given a pixel-value, return the green component as byteValue (0..255)"
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3325
805
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3326
    ^ (pixel bitShift:-8) bitAnd:16rFF.
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3327
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3328
    "Modified: 8.6.1996 / 08:56:28 / cg"
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3329
    "Created: 8.6.1996 / 09:56:30 / cg"
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3330
!
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3331
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3332
greenComponentOf:pixel
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3333
    "given a pixel-value, return the green component in percent (0..100)"
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3334
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3335
    ^ (100.0 / 255.0) * ((pixel bitShift:-8) bitAnd:16rFF).
805
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3336
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3337
    "Created: 8.6.1996 / 08:42:37 / cg"
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3338
    "Modified: 8.6.1996 / 09:57:32 / cg"
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3339
!
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3340
3490
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3341
greenMaskForPixelValue
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3342
    "return the mask used with translation from pixelValues to redBits"
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3343
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3344
    ^ 16rFF
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3345
!
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3346
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3347
greenShiftForPixelValue
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3348
    "return the shift amount used with translation from pixelValues to greenBits"
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3349
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3350
    ^ -8
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3351
!
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3352
805
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3353
redBitsOf:pixel
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3354
    "given a pixel-value, return the red component as byteValue (0..255)"
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3355
805
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3356
    ^ (pixel bitShift:-16) bitAnd:16rFF.
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3357
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3358
    "Modified: 8.6.1996 / 08:56:31 / cg"
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3359
    "Created: 8.6.1996 / 09:56:39 / cg"
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3360
!
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3361
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3362
redComponentOf:pixel
2301
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3363
    "given a pixel-value, return the red component in percent (0..100)"
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3364
60f9cf7dd066 comments; fixed #red/green/blueComponentOfPixel.
Claus Gittinger <cg@exept.de>
parents: 2190
diff changeset
  3365
    ^ (100.0 / 255.0) * ((pixel bitShift:-16) bitAnd:16rFF).
805
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3366
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3367
    "Created: 8.6.1996 / 08:42:25 / cg"
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3368
    "Modified: 8.6.1996 / 09:57:23 / cg"
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3369
!
5573c2078b73 specialized code relaxed
Claus Gittinger <cg@exept.de>
parents: 798
diff changeset
  3370
3490
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3371
redMaskForPixelValue
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3372
    "return the mask used with translation from pixelValues to redBits"
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3373
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3374
    ^ 16rFF
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3375
!
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3376
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3377
redShiftForPixelValue
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3378
    "return the shift amount used with translation from pixelValues to redBits"
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3379
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3380
    ^ -16
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3381
!
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3382
4118
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
  3383
rgbFromValue:pixelValue
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
  3384
    "given a pixel value, return the corresponding 24bit rgbValue (rrggbb, red is MSB)."
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
  3385
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
  3386
    ^ pixelValue
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
  3387
!
Claus Gittinger <cg@exept.de>
parents: 3907
diff changeset
  3388
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3389
samplesPerPixel
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3390
    "return the number of samples per pixel in the image."
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3391
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
  3392
    samplesPerPixel notNil ifTrue:[^ samplesPerPixel].
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3393
    ^ 3
813
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
  3394
8bc17dba7a02 removed obsolete comversion stuff
Claus Gittinger <cg@exept.de>
parents: 810
diff changeset
  3395
    "Modified: 10.6.1996 / 18:03:09 / cg"
3490
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3396
!
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3397
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3398
valueFromRedBits:redBits greenBits:greenBits blueBits:blueBits
7a560c566b72 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3357
diff changeset
  3399
    ^ (((redBits bitShift:8) bitOr:greenBits) bitShift:8) bitOr:blueBits
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3400
! !
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3401
1167
4998857f7a9a new infoMessage scheme
Claus Gittinger <cg@exept.de>
parents: 938
diff changeset
  3402
!Depth24Image class methodsFor:'documentation'!
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3403
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3404
version
7125
f37b7e5d26df #FEATURE
Claus Gittinger <cg@exept.de>
parents: 6795
diff changeset
  3405
    ^ '$Header$'
5480
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
  3406
!
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
  3407
08d2c4b656bc __isByteArray() to __isByteArrayLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 5343
diff changeset
  3408
version_CVS
7125
f37b7e5d26df #FEATURE
Claus Gittinger <cg@exept.de>
parents: 6795
diff changeset
  3409
    ^ '$Header$'
282
fe2d82f516f1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 236
diff changeset
  3410
! !
7549
feafeb92feda #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 7538
diff changeset
  3411