[cairo] Questions about map and unmap image surface

Carlos López González genetita at gmail.com
Sun Jul 1 04:35:11 PDT 2012


Hi!
I'm learning to use Cairo libraries and I have a doubt related to
cairo_surface_map_to_image() and cairo_surface_unmap_image().
Say I have a generic cairo_surface_t created by one custom function.
Also I have another cairo_surface_t* to hold the image surface type.
I make initially cs_image NULL to don't use it if not initialized.
Then as I want to make direct operations on the surface I've created
two custom functions map_cairo_image() and unmap_cairo_image():

////CODE

cairo_surface_t* cs(get_cairo_surface());
cairo_surface_t* cs_image(NULL);
bool
map_cairo_image()
{
	if(cs==NULL) return false;
	cairo_surface_flush(cs);
	cs_image=cairo_surface_map_to_image (cs, NULL);
	if(cs_image_!=NULL)
	{
		cairo_format_t t=cairo_image_surface_get_format(cs_image_);
		// I only can modify two types of image formats
		if(t==CAIRO_FORMAT_ARGB32 || t==CAIRO_FORMAT_RGB24)
		{
			//cairo_surface_flush(cs_image); // (**)
			unsigned char* data(cairo_image_surface_get_data(cs_image));
			int w(cairo_image_surface_get_width(cs_image));
			int h(cairo_image_surface_get_height(cs_image));
			int stride(cairo_image_surface_get_stride(cs_image));
			// this function passes the data, w, h and stride to a custom surface that
			// allows to directly manipulate the data values.
			set_wh(w, h, data, stride);
			return true;
		}
		return false;	
	}
	return false;
}

void
unmap_cairo_image()
{
	assert(cs_image);
	assert(cs);
	cairo_surface_mark_dirty(cs_image);
	cairo_surface_unmap_image(cs, cs_image);
	cairo_surface_mark_dirty(cs); // (*)
}
//////// END CODE

My questions are:

(*) Is it needed to mark dirty cs too? Doesn't the unmap operation
mark dirty the receiving surface?
(**) Also I think that I don't need to call
cairo_surface_flush(cs_image);
before
unsigned char* data(cairo_image_surface_get_data(cs_image));
Is that right?

At this moment I can't test the code because the code change is quite
complex and I cannot make it work without finish it completely. But I
need to know if I'm doing things well.
Thanks!

-- 
Carlos
http://synfig.org


More information about the cairo mailing list