Make gdk_pixbuf_get_from_surface() accept negative src_x,y coordinates
This commit is contained in:
		@ -118,25 +118,21 @@ gdk_cairo_format_for_content (cairo_content_t content)
 | 
				
			|||||||
static cairo_surface_t *
 | 
					static cairo_surface_t *
 | 
				
			||||||
gdk_cairo_surface_coerce_to_image (cairo_surface_t *surface,
 | 
					gdk_cairo_surface_coerce_to_image (cairo_surface_t *surface,
 | 
				
			||||||
                                   cairo_content_t content,
 | 
					                                   cairo_content_t content,
 | 
				
			||||||
 | 
					                                   int src_x,
 | 
				
			||||||
 | 
					                                   int src_y,
 | 
				
			||||||
                                   int width,
 | 
					                                   int width,
 | 
				
			||||||
                                   int height)
 | 
					                                   int height)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  cairo_surface_t *copy;
 | 
					  cairo_surface_t *copy;
 | 
				
			||||||
  cairo_t *cr;
 | 
					  cairo_t *cr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_IMAGE &&
 | 
					 | 
				
			||||||
      cairo_surface_get_content (surface) == content &&
 | 
					 | 
				
			||||||
      cairo_image_surface_get_width (surface) >= width &&
 | 
					 | 
				
			||||||
      cairo_image_surface_get_height (surface) >= height)
 | 
					 | 
				
			||||||
    return cairo_surface_reference (surface);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  copy = cairo_image_surface_create (gdk_cairo_format_for_content (content),
 | 
					  copy = cairo_image_surface_create (gdk_cairo_format_for_content (content),
 | 
				
			||||||
                                     width,
 | 
					                                     width,
 | 
				
			||||||
                                     height);
 | 
					                                     height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cr = cairo_create (copy);
 | 
					  cr = cairo_create (copy);
 | 
				
			||||||
  cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
 | 
					  cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
 | 
				
			||||||
  cairo_set_source_surface (cr, surface, 0, 0);
 | 
					  cairo_set_source_surface (cr, surface, -src_x, -src_y);
 | 
				
			||||||
  cairo_paint (cr);
 | 
					  cairo_paint (cr);
 | 
				
			||||||
  cairo_destroy (cr);
 | 
					  cairo_destroy (cr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -242,7 +238,6 @@ gdk_pixbuf_get_from_surface  (cairo_surface_t *surface,
 | 
				
			|||||||
  
 | 
					  
 | 
				
			||||||
  /* General sanity checks */
 | 
					  /* General sanity checks */
 | 
				
			||||||
  g_return_val_if_fail (surface != NULL, NULL);
 | 
					  g_return_val_if_fail (surface != NULL, NULL);
 | 
				
			||||||
  g_return_val_if_fail (src_x >= 0 && src_y >= 0, NULL);
 | 
					 | 
				
			||||||
  g_return_val_if_fail (width > 0 && height > 0, NULL);
 | 
					  g_return_val_if_fail (width > 0 && height > 0, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  content = cairo_surface_get_content (surface) | CAIRO_CONTENT_COLOR;
 | 
					  content = cairo_surface_get_content (surface) | CAIRO_CONTENT_COLOR;
 | 
				
			||||||
@ -251,7 +246,8 @@ gdk_pixbuf_get_from_surface  (cairo_surface_t *surface,
 | 
				
			|||||||
                         8,
 | 
					                         8,
 | 
				
			||||||
                         width, height);
 | 
					                         width, height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  surface = gdk_cairo_surface_coerce_to_image (surface, content, src_x + width, src_y + height);
 | 
					  surface = gdk_cairo_surface_coerce_to_image (surface, content, src_x, src_y,
 | 
				
			||||||
 | 
					                                               width, height);
 | 
				
			||||||
  cairo_surface_flush (surface);
 | 
					  cairo_surface_flush (surface);
 | 
				
			||||||
  if (cairo_surface_status (surface) || dest == NULL)
 | 
					  if (cairo_surface_status (surface) || dest == NULL)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -264,14 +260,14 @@ gdk_pixbuf_get_from_surface  (cairo_surface_t *surface,
 | 
				
			|||||||
                   gdk_pixbuf_get_rowstride (dest),
 | 
					                   gdk_pixbuf_get_rowstride (dest),
 | 
				
			||||||
                   cairo_image_surface_get_data (surface),
 | 
					                   cairo_image_surface_get_data (surface),
 | 
				
			||||||
                   cairo_image_surface_get_stride (surface),
 | 
					                   cairo_image_surface_get_stride (surface),
 | 
				
			||||||
                   src_x, src_y,
 | 
					                   0, 0,
 | 
				
			||||||
                   width, height);
 | 
					                   width, height);
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    convert_no_alpha (gdk_pixbuf_get_pixels (dest),
 | 
					    convert_no_alpha (gdk_pixbuf_get_pixels (dest),
 | 
				
			||||||
                      gdk_pixbuf_get_rowstride (dest),
 | 
					                      gdk_pixbuf_get_rowstride (dest),
 | 
				
			||||||
                      cairo_image_surface_get_data (surface),
 | 
					                      cairo_image_surface_get_data (surface),
 | 
				
			||||||
                      cairo_image_surface_get_stride (surface),
 | 
					                      cairo_image_surface_get_stride (surface),
 | 
				
			||||||
                      src_x, src_y,
 | 
					                      0, 0,
 | 
				
			||||||
                      width, height);
 | 
					                      width, height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cairo_surface_destroy (surface);
 | 
					  cairo_surface_destroy (surface);
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user