color reduction algorithm fixed
authorClaus Gittinger <cg@exept.de>
Sat, 21 Jun 2003 12:00:37 +0200
changeset 2528 7bb08a9c04b1
parent 2527 a07a74ff7e3e
child 2529 ce78ec72df65
color reduction algorithm fixed
ImageEditView.st
--- a/ImageEditView.st	Fri Jun 20 16:25:06 2003 +0200
+++ b/ImageEditView.st	Sat Jun 21 12:00:37 2003 +0200
@@ -1323,14 +1323,16 @@
 !
 
 reduceColorResolutionBy:numBits
-    |xMax yMax r g b n_r n_g n_b clr pix map revMap n_clr n_pix mask anyChange
-     newColors newColorArray newImage|
+    |xMax yMax r g b nR nG nB clr pix map revMap n_clr n_pix mask anyChange
+     newColors newColorArray newImage extMask extBits newPixelValue|
 
     numBits > 7 ifTrue:[
         self warn:'Max. number of bits to strip off is 7.'.
         ^ false
     ].
     mask := (16rFF bitShift:numBits) bitAnd:16rFF.
+    extMask := (1 bitShift:numBits).
+    extBits := extMask - 1.
 
     anyChange := false.
 
@@ -1348,18 +1350,26 @@
     xMax := image width - 1.
     yMax := image height - 1.
 
+    newPixelValue := 
+        [:image :pixelValue |
+            |r g b nR nG nB|
+
+            r := image redBitsOf:pixelValue.
+            g := image greenBitsOf:pixelValue.
+            b := image blueBitsOf:pixelValue.
+            nR := r bitAnd:mask. (nR bitAnd:extMask)~~0 ifTrue:[nR := nR bitOr:extBits].
+            nG := g bitAnd:mask. (nG bitAnd:extMask)~~0 ifTrue:[nG := nG bitOr:extBits].
+            nB := b bitAnd:mask. (nB bitAnd:extMask)~~0 ifTrue:[nB := nB bitOr:extBits].
+            image valueFromRedBits:nR greenBits:nG blueBits:nB.
+        ].
+
+
     image photometric == #palette ifFalse:[
         "/ direct manipulation of the pixels
         0 to:yMax do:[:y |
             0 to:xMax do:[:x |
                 pix := image pixelAtX:x y:y.
-                r := image redBitsOf:pix.
-                g := image greenBitsOf:pix.
-                b := image blueBitsOf:pix.
-                n_r := r bitAnd:mask.
-                n_g := g bitAnd:mask.
-                n_b := b bitAnd:mask.
-                n_pix := image valueFromRedBits:n_r greenBits:n_g blueBits:n_b.
+                n_pix := newPixelValue value:image value:pix.
                 n_pix ~= pix ifTrue:[
                     newImage pixelAtX:x y:y put:n_pix.
                     anyChange := true.
@@ -1376,13 +1386,14 @@
                 pix := image pixelAtX:x y:y.
                 (n_pix := map at:pix+1) isNil ifTrue:[
                     clr := image colorAtX:x y:y.
+
                     r := clr redByte.
                     g := clr greenByte.
                     b := clr blueByte.
-                    n_r := r bitAnd:mask.
-                    n_g := g bitAnd:mask.
-                    n_b := b bitAnd:mask.
-                    n_clr := Color redByte:n_r greenByte:n_g blueByte:n_b.
+                    nR := r bitAnd:mask. (nR bitAnd:extMask)~~0 ifTrue:[nR := nR bitOr:extBits].
+                    nG := g bitAnd:mask. (nR bitAnd:extMask)~~0 ifTrue:[nR := nR bitOr:extBits].
+                    nB := b bitAnd:mask. (nR bitAnd:extMask)~~0 ifTrue:[nR := nR bitOr:extBits].
+                    n_clr := Color redByte:nR greenByte:nG blueByte:nB.
                     (newColors includes:n_clr) ifFalse:[
                         newColors add:n_clr.
                         newColorArray add:n_clr.
@@ -2322,7 +2333,7 @@
 !ImageEditView class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libwidg2/ImageEditView.st,v 1.182 2003-05-19 09:03:37 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg2/ImageEditView.st,v 1.183 2003-06-21 10:00:37 cg Exp $'
 ! !
 
 ImageEditView initialize!