[cairo] _cairo_win32_display_surface_map_to_image issue

Fred Beca fredbca21 at gmail.com
Thu Nov 15 05:16:43 PST 2012


Hi Uli,

Thanks for the reply, it's very helpful. I' ll double check the bits
you are talking about asap. Just for the record, a simple code snippet
is available in this post to easily reproduce the problem on windows:
http://lists.cairographics.org/archives/cairo/2012-November/023728.html

The function may indeed be fed by bogus data, and that's exaclty what
I am trying to find out, with my little knowledge of the library:
where and how is the data somehow corrupted?

Regards,

Fred.

On Wed, Nov 14, 2012 at 3:47 PM, Uli Schlachter <psychon at znc.in> wrote:
> Hi,
>
>
> On 13.11.2012 17:27, Fred bca21 wrote:
>>
>> while trying to fix a cairo crash on win32 (already posted on this
>> list), I am trying to understand the function below, and I can't
>> figure out how it works regarding coordinates (it looks inconsistent
>> to me):
>
>
> First: We are in _cairo_win32_display_surface_map_to_image(). That wasn't
> enirely clear to me from your mail.
>
>
>> - The first call to  _cairo_win32_display_surface_create_for_dc
>> creates a surface with the appropriate with and height regarding the
>> extent rectangle.
>
>
> The extent rectangle of the win32 surface that we are looking at. So this
> creates a surface of the same size as the already-existing surface that we
> are working with.
>
>
>> - then why does the BitBlt call uses 0.0 as the origin for the source
>> surface and not the origin of the extent since the newly created
>> surface is supposed to represent the extent rectangle?
>
>
> A surface doesn't really have any origin which would matter here. This code
> looks like it wants to copy the whole win32 surface to the newly created
> surface created above. Thus, source and destination offset are both 0, 0.
>
> Nothing touched the 'extents' argument of
> _cairo_win32_display_surface_map_to_image() yet.
>
>
>> - Also, why does the _cairo_image_surface_map_to_image using our newly
>> created image does not use (0,0) as the origin, since our newly
>> created image's origin corresponds to (extents.x,extents.y) in the
>> original surface?
>
>
> No, see above. The newly creates surface is as large as the original
> surface. Nothing touched the "extents" argument yet.
>
>
>> There is probaby something that I am missing, but this seems to be the
>> origin of the crash that I am chasing (this functions returns a
>> pointer outside of the image boundaries due to a wrong offset).
>
>
> Could you give us some examples of the width, height, rowstrides, formats
> and arguments for map_to_image used?
>
> I am fairly sure that the image surface's map_to_image() works correctly. So
> if this returns bogous pointers, then the image surface must have been fed
> with bogous data.
>
>> Thanks for your help.
>
>
> One last idea: Do any of the involved surfaces have offsets applied? What is
> their surface->device_transform? Is it all zero.
>
> Cheers,
> Uli
> --
> cairo mailing list
> cairo at cairographics.org
> http://lists.cairographics.org/mailman/listinfo/cairo


More information about the cairo mailing list