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