Added a general-purpose function to produce a native-endian ARGB representation of the image. I thought cairo image surfaces would work, but they're not designed for reading in images, the cairo functions for reading image data were introduced in the next version (1.12), and GDK-Pixbuf only does non-alpha-premultiplied... This can be used on Windows though.
This commit is contained in:
parent
5581d41f88
commit
57088b9787
30
area.go
30
area.go
|
@ -6,6 +6,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
"image"
|
"image"
|
||||||
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Area represents a blank canvas upon which programs may draw anything and receive arbitrary events from the user.
|
// Area represents a blank canvas upon which programs may draw anything and receive arbitrary events from the user.
|
||||||
|
@ -335,3 +336,32 @@ func pixelDataPos(img *image.RGBA) int {
|
||||||
func pixelData(img *image.RGBA) *uint8 {
|
func pixelData(img *image.RGBA) *uint8 {
|
||||||
return &img.Pix[pixelDataPos(img)]
|
return &img.Pix[pixelDataPos(img)]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// some platforms require pixels in ARGB order in their native endianness (because they treat the pixel array as an array of uint32s)
|
||||||
|
// this does the conversion
|
||||||
|
// s stores the slice used to avoid frequent memory allocations
|
||||||
|
func toARGB(i *image.RGBA, s *sysData) *byte {
|
||||||
|
// TODO actually store realBits in s
|
||||||
|
realbits := make([]byte, 4 * i.Rect.Dx() * i.Rect.Dy())
|
||||||
|
p := pixelDataPos(i)
|
||||||
|
q := 0
|
||||||
|
for y := i.Rect.Min.Y; y < i.Rect.Max.Y; y++ {
|
||||||
|
nextp := p + i.Stride
|
||||||
|
for x := i.Rect.Min.X; x < i.Rect.Max.X; x++ {
|
||||||
|
argb := uint32(i.Pix[p + 3]) << 24 // A
|
||||||
|
argb |= uint32(i.Pix[p + 0]) << 16 // R
|
||||||
|
argb |= uint32(i.Pix[p + 1]) << 8 // G
|
||||||
|
argb |= uint32(i.Pix[p + 2]) // B
|
||||||
|
// the magic of conversion
|
||||||
|
native := (*[4]byte)(unsafe.Pointer(&argb))
|
||||||
|
realbits[q + 0] = native[0]
|
||||||
|
realbits[q + 1] = native[1]
|
||||||
|
realbits[q + 2] = native[2]
|
||||||
|
realbits[q + 3] = native[3]
|
||||||
|
p += 4
|
||||||
|
q += 4
|
||||||
|
}
|
||||||
|
p = nextp
|
||||||
|
}
|
||||||
|
return &realbits[0]
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue