[cairo] "data" in cairo_image_surface_get_data ()
Nguyen Vu Hung
vuhung16plus at gmail.com
Tue Nov 27 05:39:05 PST 2007
2007/11/26, Baz <brian.ewins at gmail.com>:
> The code in cairo-png.c accesses the image surface parameters
> directly, eg cairo_image_surface_get_data (surf) is replaced by
> surf->data, but otherwise its almost exactly what you're asking for. I
> don't think an example using png would be that helpful though, it
> would introduce too many complications from showing how libpng works.
> Iterating over the samples retrieved from get_data is pretty easy
> though:
>
> int i, j;
> unsigned char *data = cairo_image_surface_get_data (surf);
> int width = cairo_image_get_width(surf);
> int height = cairo_image_get_height(surf);
> int stride = cairo_image_get_stride(surf);
> for (i = 0; i < height; i++) {
> unsigned char *row = data + i * stride;
> for (int j = 0; j < width; j++) {
> // do something with the pixel at (i, j), which lies at row +
> j * (pixel size),
> // based on the result of cairo_image_get_format and platform
> endian-ness
> }
> }
Thanks Baz,
I didn't think I could go that far. My code requires me to process
each bytes :D. Yes, it seems tough to me but it is fun to do/research.
The problem I have now is the endian-ness thingy.
With an Intel CPU, how to swap RED, GREEN, BLUE and alpha in the following code?
# I am sorry it this is a FAQ.
unsigned char *data_cairo = cairo_image_surface_get_data (m_pSurface);
U32 width = cairo_image_surface_get_width(m_pSurface);
U32 height = cairo_image_surface_get_height(m_pSurface);
U32 stride = cairo_image_surface_get_stride(m_pSurface);
int pixel_size = 4;
U32 i,j,k; // unsigned long
row_pointers = (png_byte **) malloc (height * sizeof(char *));
if ( row_pointers == NULL ){
return IMAGE_RESULT_NOERR;
}
for (i = 0; i < height; i++)
row_pointers[i] = &data_cairo[i * width * pixel_size];
// h = height , w = width
for (i = 0; i < h; i++) {
// data is of U32 *
ppixel = (U32 *)( data + i * wpl);
rowptr = row_pointers[i];
for (j = k = 0; j < w; j++) {
U8 alpha = rowptr[k++];
if ( alpha == 0 ) {
SET_DATA_BYTE(ppixel, COLOR_RED, 0);
SET_DATA_BYTE(ppixel, COLOR_GREEN, 0);
SET_DATA_BYTE(ppixel, COLOR_BLUE, 0);
} else {
SET_DATA_BYTE(ppixel, COLOR_RED,
multiply_alpha(alpha, rowptr[k++]));
SET_DATA_BYTE(ppixel, COLOR_GREEN,
multiply_alpha(alpha, rowptr[k++]));
SET_DATA_BYTE(ppixel, COLOR_BLUE,
multiply_alpha(alpha, rowptr[k++]));
}
ppixel++;
}
}
--
Best Regards,
Nguyen Hung Vu
vuhung16plus{remove}@gmail.dot.com
An inquisitive look at Harajuku
http://www.flickr.com/photos/vuhung/sets/72157600109218238/
More information about the cairo
mailing list