[quartz] ensure that the copy region is fully enclosed by the drawn surface.
This commit is contained in:
		| @ -351,20 +351,22 @@ cairo_rect_from_nsrect (cairo_rectangle_int_t *rect, NSRect *nsrect) | ||||
|  | ||||
| static cairo_status_t | ||||
| copy_rectangle_argb32 (cairo_surface_t *dest, cairo_surface_t *source, | ||||
|                        cairo_rectangle_int_t *rect) | ||||
|                        cairo_region_t *region) | ||||
| { | ||||
|   cairo_surface_t *source_img, *dest_img; | ||||
|   cairo_status_t status; | ||||
|   cairo_format_t format; | ||||
|   int height, width, stride; | ||||
|   cairo_rectangle_int_t extents; | ||||
|  | ||||
|   source_img = cairo_surface_map_to_image (source, rect); | ||||
|   cairo_region_get_extents (region, &extents); | ||||
|   source_img = cairo_surface_map_to_image (source, &extents); | ||||
|   status = cairo_surface_status (source_img); | ||||
|  | ||||
|   if (status) | ||||
|     { | ||||
|       g_warning ("Failed to map source image surface, %d %d %d %d on %d %d: %s\n", | ||||
|                  rect->x, rect->y, rect->width, rect->height, | ||||
|                  extents.x, extents.y, extents.width, extents.height, | ||||
|                  cairo_image_surface_get_width (source), | ||||
|                  cairo_image_surface_get_height (source), | ||||
|                  cairo_status_to_string (status)); | ||||
| @ -372,13 +374,13 @@ copy_rectangle_argb32 (cairo_surface_t *dest, cairo_surface_t *source, | ||||
|     } | ||||
|  | ||||
|   format = cairo_image_surface_get_format (source_img); | ||||
|   dest_img = cairo_surface_map_to_image (dest, rect); | ||||
|   dest_img = cairo_surface_map_to_image (dest, &extents); | ||||
|   status = cairo_surface_status (dest_img); | ||||
|  | ||||
|   if (status) | ||||
|     { | ||||
|       g_warning ("Failed to map destination image surface, %d %d %d %d on %d %d: %s\n", | ||||
|                  rect->x, rect->y, rect->width, rect->height, | ||||
|                  extents.x, extents.y, extents.width, extents.height, | ||||
|                  cairo_image_surface_get_width (dest), | ||||
|                  cairo_image_surface_get_height (dest), | ||||
|                  cairo_status_to_string (status)); | ||||
| @ -401,17 +403,19 @@ copy_rectangle_argb32 (cairo_surface_t *dest, cairo_surface_t *source, | ||||
| -(void)updateLayer | ||||
| { | ||||
|   GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (gdk_window->impl); | ||||
|   cairo_rectangle_int_t impl_rect = {0, 0, 0, 0}; | ||||
|   CGRect layer_bounds = [self.layer bounds]; | ||||
|   CGRect backing_bounds = [self convertRectToBacking: layer_bounds]; | ||||
|   cairo_rectangle_int_t extents; | ||||
|   cairo_rectangle_int_t bounds_rect; | ||||
|   cairo_region_t *bounds_region; | ||||
|   cairo_surface_t *cvpb_surface; | ||||
|  | ||||
|   if (GDK_WINDOW_DESTROYED (gdk_window)) | ||||
|     return; | ||||
|  | ||||
|  | ||||
|   ++impl->in_paint_rect_count; | ||||
|   cairo_rect_from_nsrect (&extents, &backing_bounds); | ||||
|   cairo_rect_from_nsrect (&bounds_rect, &backing_bounds); | ||||
|   bounds_region = cairo_region_create_rectangle (&bounds_rect); | ||||
|   if (impl->needs_display_region) | ||||
|     { | ||||
|       cairo_region_t *region = impl->needs_display_region; | ||||
| @ -433,6 +437,8 @@ copy_rectangle_argb32 (cairo_surface_t *dest, cairo_surface_t *source, | ||||
|   if (!impl || !impl->cairo_surface) | ||||
|     return; | ||||
|  | ||||
|   impl_rect.width = cairo_image_surface_get_width (impl->cairo_surface); | ||||
|   impl_rect.height = cairo_image_surface_get_height (impl->cairo_surface); | ||||
|   CVPixelBufferLockBaseAddress (pixels, 0); | ||||
|   cvpb_surface = | ||||
|     cairo_image_surface_create_for_data (CVPixelBufferGetBaseAddress (pixels), | ||||
| @ -441,9 +447,12 @@ copy_rectangle_argb32 (cairo_surface_t *dest, cairo_surface_t *source, | ||||
|                                          (int)CVPixelBufferGetHeight (pixels), | ||||
|                                          (int)CVPixelBufferGetBytesPerRow (pixels)); | ||||
|  | ||||
|   copy_rectangle_argb32 (cvpb_surface, impl->cairo_surface, &extents); | ||||
|  | ||||
|   cairo_region_intersect_rectangle (bounds_region, &impl_rect); | ||||
|   copy_rectangle_argb32 (cvpb_surface, impl->cairo_surface, bounds_region); | ||||
|  | ||||
|   cairo_surface_destroy (cvpb_surface); | ||||
|   cairo_region_destroy (bounds_region); | ||||
|   _gdk_quartz_unref_cairo_surface (gdk_window); | ||||
|   CVPixelBufferUnlockBaseAddress (pixels, 0); | ||||
|   --impl->in_paint_rect_count; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 John Ralls
					John Ralls