[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