mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/spice
synced 2025-12-26 22:48:19 +00:00
Convert draw_blackness/whiteness/invers to using pixman
This commit is contained in:
parent
974c662ae4
commit
3b2f1fcb22
@ -2053,30 +2053,75 @@ static inline void canvas_fill_common(CairoCanvas *canvas, SpiceRect *bbox, Spic
|
||||
|
||||
void canvas_draw_blackness(CairoCanvas *canvas, SpiceRect *bbox, SpiceClip *clip, SpiceBlackness *blackness)
|
||||
{
|
||||
cairo_t *cairo = canvas->cairo;
|
||||
cairo_save(cairo);
|
||||
cairo_set_source_rgb(cairo, 0, 0, 0);
|
||||
canvas_fill_common(canvas, bbox, clip, &blackness->mask);
|
||||
cairo_restore(cairo);
|
||||
pixman_region32_t dest_region;
|
||||
|
||||
pixman_region32_init_rect(&dest_region,
|
||||
bbox->left, bbox->top,
|
||||
bbox->right - bbox->left,
|
||||
bbox->bottom - bbox->top);
|
||||
|
||||
|
||||
canvas_clip_pixman(canvas, &dest_region, clip);
|
||||
canvas_mask_pixman(canvas, &dest_region, &blackness->mask,
|
||||
bbox->left, bbox->top);
|
||||
|
||||
if (pixman_region32_n_rects(&dest_region) == 0) {
|
||||
pixman_region32_fini (&dest_region);
|
||||
return;
|
||||
}
|
||||
|
||||
fill_solid_rects(canvas, &dest_region, 0x000000);
|
||||
|
||||
pixman_region32_fini(&dest_region);
|
||||
}
|
||||
|
||||
void canvas_draw_whiteness(CairoCanvas *canvas, SpiceRect *bbox, SpiceClip *clip, SpiceWhiteness *whiteness)
|
||||
{
|
||||
cairo_t *cairo = canvas->cairo;
|
||||
cairo_save(cairo);
|
||||
cairo_set_source_rgb(cairo, 1, 1, 1);
|
||||
canvas_fill_common(canvas, bbox, clip, &whiteness->mask);
|
||||
cairo_restore(cairo);
|
||||
pixman_region32_t dest_region;
|
||||
|
||||
pixman_region32_init_rect(&dest_region,
|
||||
bbox->left, bbox->top,
|
||||
bbox->right - bbox->left,
|
||||
bbox->bottom - bbox->top);
|
||||
|
||||
|
||||
canvas_clip_pixman(canvas, &dest_region, clip);
|
||||
canvas_mask_pixman(canvas, &dest_region, &whiteness->mask,
|
||||
bbox->left, bbox->top);
|
||||
|
||||
if (pixman_region32_n_rects(&dest_region) == 0) {
|
||||
pixman_region32_fini(&dest_region);
|
||||
return;
|
||||
}
|
||||
|
||||
fill_solid_rects(canvas, &dest_region, 0xffffffff);
|
||||
|
||||
pixman_region32_fini(&dest_region);
|
||||
}
|
||||
|
||||
void canvas_draw_invers(CairoCanvas *canvas, SpiceRect *bbox, SpiceClip *clip, SpiceInvers *invers)
|
||||
{
|
||||
cairo_t *cairo = canvas->cairo;
|
||||
cairo_save(cairo);
|
||||
cairo_set_source_rgb(cairo, 1, 1, 1);
|
||||
cairo_set_operator(cairo, CAIRO_OPERATOR_RASTER_XOR);
|
||||
canvas_fill_common(canvas, bbox, clip, &invers->mask);
|
||||
cairo_restore(cairo);
|
||||
pixman_region32_t dest_region;
|
||||
|
||||
pixman_region32_init_rect(&dest_region,
|
||||
bbox->left, bbox->top,
|
||||
bbox->right - bbox->left,
|
||||
bbox->bottom - bbox->top);
|
||||
|
||||
|
||||
canvas_clip_pixman(canvas, &dest_region, clip);
|
||||
canvas_mask_pixman(canvas, &dest_region, &invers->mask,
|
||||
bbox->left, bbox->top);
|
||||
|
||||
if (pixman_region32_n_rects(&dest_region) == 0) {
|
||||
pixman_region32_fini(&dest_region);
|
||||
return;
|
||||
}
|
||||
|
||||
fill_solid_rects_rop(canvas, &dest_region, 0x00000000,
|
||||
SPICE_ROP_INVERT);
|
||||
|
||||
pixman_region32_fini(&dest_region);
|
||||
}
|
||||
|
||||
void canvas_draw_rop3(CairoCanvas *canvas, SpiceRect *bbox, SpiceClip *clip, SpiceRop3 *rop3)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user