mirror of
				https://gitlab.freedesktop.org/wayland/wayland.git
				synced 2025-11-03 09:01:42 -05:00 
			
		
		
		
	Use cairo_push_group() for all double buffering, drop window_copy_*()
This commit is contained in:
		
							parent
							
								
									f39a9ccbb3
								
							
						
					
					
						commit
						e164e4ef72
					
				
					 4 changed files with 24 additions and 55 deletions
				
			
		| 
						 | 
				
			
			@ -171,21 +171,20 @@ dnd_draw(struct dnd *dnd)
 | 
			
		|||
{
 | 
			
		||||
	struct rectangle allocation;
 | 
			
		||||
	cairo_t *cr;
 | 
			
		||||
	cairo_surface_t *wsurface, *surface;
 | 
			
		||||
	cairo_surface_t *surface;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	window_draw(dnd->window);
 | 
			
		||||
 | 
			
		||||
	window_get_child_allocation(dnd->window, &allocation);
 | 
			
		||||
 | 
			
		||||
	wsurface = window_get_surface(dnd->window);
 | 
			
		||||
	surface = cairo_surface_create_similar(wsurface,
 | 
			
		||||
					       CAIRO_CONTENT_COLOR_ALPHA,
 | 
			
		||||
					       allocation.width,
 | 
			
		||||
					       allocation.height);
 | 
			
		||||
	cairo_surface_destroy(wsurface);
 | 
			
		||||
 | 
			
		||||
	surface = window_get_surface(dnd->window);
 | 
			
		||||
	cr = cairo_create(surface);
 | 
			
		||||
	window_get_child_allocation(dnd->window, &allocation);
 | 
			
		||||
	cairo_rectangle(cr, allocation.x, allocation.y,
 | 
			
		||||
			allocation.width, allocation.height);
 | 
			
		||||
	cairo_clip(cr);
 | 
			
		||||
	cairo_push_group(cr);
 | 
			
		||||
 | 
			
		||||
	cairo_translate(cr, allocation.x, allocation.y);
 | 
			
		||||
	cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
 | 
			
		||||
	cairo_set_source_rgba(cr, 0, 0, 0, 0.8);
 | 
			
		||||
	cairo_paint(cr);
 | 
			
		||||
| 
						 | 
				
			
			@ -199,9 +198,9 @@ dnd_draw(struct dnd *dnd)
 | 
			
		|||
		cairo_paint(cr);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cairo_pop_group_to_source(cr);
 | 
			
		||||
	cairo_paint(cr);
 | 
			
		||||
	cairo_destroy(cr);
 | 
			
		||||
 | 
			
		||||
	window_copy_surface(dnd->window, &allocation, surface);
 | 
			
		||||
	cairo_surface_destroy(surface);
 | 
			
		||||
	window_flush(dnd->window);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -140,7 +140,7 @@ image_draw(struct image *image)
 | 
			
		|||
	struct rectangle allocation;
 | 
			
		||||
	GdkPixbuf *pb;
 | 
			
		||||
	cairo_t *cr;
 | 
			
		||||
	cairo_surface_t *wsurface, *surface;
 | 
			
		||||
	cairo_surface_t *surface;
 | 
			
		||||
 | 
			
		||||
	window_draw(image->window);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -153,14 +153,15 @@ image_draw(struct image *image)
 | 
			
		|||
	if (pb == NULL)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	wsurface = window_get_surface(image->window);
 | 
			
		||||
	surface = cairo_surface_create_similar(wsurface,
 | 
			
		||||
					       CAIRO_CONTENT_COLOR_ALPHA,
 | 
			
		||||
					       allocation.width,
 | 
			
		||||
					       allocation.height);
 | 
			
		||||
 | 
			
		||||
	cairo_surface_destroy(wsurface);
 | 
			
		||||
	surface = window_get_surface(image->window);
 | 
			
		||||
	cr = cairo_create(surface);
 | 
			
		||||
	window_get_child_allocation(image->window, &allocation);
 | 
			
		||||
	cairo_rectangle(cr, allocation.x, allocation.y,
 | 
			
		||||
			allocation.width, allocation.height);
 | 
			
		||||
	cairo_clip(cr);
 | 
			
		||||
	cairo_push_group(cr);
 | 
			
		||||
	cairo_translate(cr, allocation.x, allocation.y);
 | 
			
		||||
 | 
			
		||||
	cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
 | 
			
		||||
	cairo_set_source_rgba(cr, 0, 0, 0, 1);
 | 
			
		||||
	cairo_paint(cr);
 | 
			
		||||
| 
						 | 
				
			
			@ -169,11 +170,13 @@ image_draw(struct image *image)
 | 
			
		|||
			  allocation.width, allocation.height);
 | 
			
		||||
	cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
 | 
			
		||||
	cairo_paint(cr);
 | 
			
		||||
	cairo_destroy(cr);
 | 
			
		||||
 | 
			
		||||
	g_object_unref(pb);
 | 
			
		||||
 | 
			
		||||
	window_copy_surface(image->window, &allocation, surface);
 | 
			
		||||
	cairo_pop_group_to_source(cr);
 | 
			
		||||
	cairo_paint(cr);
 | 
			
		||||
	cairo_destroy(cr);
 | 
			
		||||
 | 
			
		||||
	window_flush(image->window);
 | 
			
		||||
	cairo_surface_destroy(surface);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1102,30 +1102,6 @@ window_set_child_size(struct window *window, int32_t width, int32_t height)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
window_copy_image(struct window *window,
 | 
			
		||||
		  struct rectangle *rectangle, EGLImageKHR image)
 | 
			
		||||
{
 | 
			
		||||
	/* set image as read buffer, copy pixels or something... */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
window_copy_surface(struct window *window,
 | 
			
		||||
		    struct rectangle *rectangle,
 | 
			
		||||
		    cairo_surface_t *surface)
 | 
			
		||||
{
 | 
			
		||||
	cairo_t *cr;
 | 
			
		||||
 | 
			
		||||
	cr = cairo_create (window->cairo_surface);
 | 
			
		||||
 | 
			
		||||
	cairo_set_source_surface (cr,
 | 
			
		||||
				  surface,
 | 
			
		||||
				  rectangle->x, rectangle->y);
 | 
			
		||||
 | 
			
		||||
	cairo_paint (cr);
 | 
			
		||||
	cairo_destroy (cr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
idle_redraw(void *data)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -141,10 +141,6 @@ window_get_child_allocation(struct window *window,
 | 
			
		|||
void
 | 
			
		||||
window_set_child_size(struct window *window, int32_t width, int32_t height);
 | 
			
		||||
void
 | 
			
		||||
window_copy_image(struct window *window,
 | 
			
		||||
		  struct rectangle *rectangle,
 | 
			
		||||
		  void *image);
 | 
			
		||||
void
 | 
			
		||||
window_schedule_redraw(struct window *window);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
| 
						 | 
				
			
			@ -154,11 +150,6 @@ window_damage(struct window *window, int32_t x, int32_t y,
 | 
			
		|||
cairo_surface_t *
 | 
			
		||||
window_get_surface(struct window *window);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
window_copy_surface(struct window *window,
 | 
			
		||||
		    struct rectangle *rectangle,
 | 
			
		||||
		    cairo_surface_t *surface);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
window_flush(struct window *window);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue