Added support for converting images to raw ARGB32 bits. jv
authorJan Vrany <jan.vrany@fit.cvut.cz>
Tue, 01 Sep 2015 18:09:33 +0100
branchjv
changeset 6912 feaaf525e0d4
parent 6905 ebeee068a422
child 6913 12bc34f97b84
Added support for converting images to raw ARGB32 bits. This may be used with Cairo and also to set window icon undex X / Wayland
Image.st
--- a/Image.st	Sat Aug 15 06:40:00 2015 +0200
+++ b/Image.st	Tue Sep 01 18:09:33 2015 +0100
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
 "
  COPYRIGHT (c) 1991 by Claus Gittinger
 	      All Rights Reserved
@@ -2540,6 +2538,106 @@
 
 !Image methodsFor:'accessing'!
 
+bitsARGB32
+    | bitsARGB32 |
+
+    bitsARGB32 := ByteArray new: width * height * 4.
+    self bitsARGB32Into: bitsARGB32.
+    ^ bitsARGB32
+
+    "Created: / 01-09-2015 / 18:02:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+bitsARGB32Into: buffer
+    self bitsARGB32Into: buffer startingAt: 1
+
+    "Created: / 01-09-2015 / 17:18:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+bitsARGB32Into: buffer startingAt: first
+    self bitsARGB32Into: buffer startingAt: first stride: width
+
+    "Created: / 01-09-2015 / 17:18:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+bitsARGB32Into: buffer startingAt: first stride: stride
+    | aOffset rOffset gOffset bOffset |
+
+    UninterpretedBytes isBigEndian ifTrue:[
+        aOffset := 1.
+        rOffset := 2.
+        gOffset := 3.
+        bOffset := 4.
+    ] ifFalse:[ 
+        aOffset := 4.
+        rOffset := 3.
+        gOffset := 2.
+        bOffset := 1.
+    ].
+    mask isNil ifTrue:[ 
+        0 to: height - 1 do:[:y |  
+            | base |
+            base := (first - 1) + (y * stride).
+            0 to: width - 1 do:[:x |  
+                | pixel color offset |
+
+                offset := base + (x * 4).    
+                pixel := self pixelAtX: x y: y.
+                color := self colorFromValue: pixel.
+                buffer at: (offset + rOffset) put: color redByte.  
+                buffer at: (offset + gOffset) put: color greenByte.  
+                buffer at: (offset + bOffset) put: color blueByte.  
+                buffer at: (offset + aOffset) put: 16rFF.   
+            ]
+        ]
+    ] ifFalse:[ 
+    mask depth == 1 ifTrue:[ 
+        0 to: height - 1 do:[:y |  
+            | base |
+
+            base := (first - 1) + (y * stride).
+            0 to: width - 1 do:[:x |  
+                | pixel color offset |
+
+                offset := base + (x * 4).
+                (mask pixelAtX: x y:y) ifTrue:[ 
+                    pixel := self pixelAtX: x y: y.
+                    color := self colorFromValue: pixel.
+                    buffer at: (offset + rOffset) put: color redByte.  
+                    buffer at: (offset + gOffset) put: color greenByte.  
+                    buffer at: (offset + bOffset) put: color blueByte.  
+                    buffer at: (offset + aOffset) put: 16rFF.
+                ] ifFalse:[ 
+                    buffer at: (offset + rOffset) put: 0.  
+                    buffer at: (offset + gOffset) put: 0.  
+                    buffer at: (offset + bOffset) put: 0.  
+                    buffer at: (offset + aOffset) put: 0.
+                ].
+            ]
+        ]
+    ] ifFalse:[ 
+    mask depth == 8 ifTrue:[ 
+        0 to: height - 1 do:[:y |  
+            | base |
+
+            base := (first - 1) + (y * stride).
+            0 to: width - 1 do:[:x |  
+                | pixel color offset |
+
+                offset := base + (x * 4).
+                pixel := self pixelAtX: x y: y.
+                color := self colorFromValue: pixel.
+                buffer at: (offset + rOffset) put: color redByte.  
+                buffer at: (offset + gOffset) put: color greenByte.  
+                buffer at: (offset + bOffset) put: color blueByte.  
+                buffer at: (offset + aOffset) put: (mask pixelAtX: x y:y)
+            ]
+        ]
+    ]]].
+
+    "Created: / 01-09-2015 / 17:16:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 bitsPerSample
     "return the number of bits per sample.
      The return value is an array of bits-per-plane."
@@ -12486,7 +12584,7 @@
     photometric ~= self class defaultPhotometric ifTrue:[
         (colorMap isNil or:[photometric ~~ #palette]) ifTrue:[
             aStream nextPutAll:' photometric:('. photometric storeOn:aStream. aStream nextPutAll:')'.
-            needSemi := true.
+            needSemi := false.
         ].
     ].
     aStream nextPutAll:')'.
@@ -12546,7 +12644,8 @@
     ].
     aStream nextPutAll:'; yourself'
 
-    "Modified: / 22.8.1998 / 12:55:21 / cg"
+    "Modified: / 22-08-1998 / 12:55:21 / cg"
+    "Modified: / 01-09-2015 / 17:24:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !Image methodsFor:'private'!
@@ -14718,6 +14817,11 @@
 
 version_CVS
     ^ '$Header$'
+!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
 ! !