[cairo] cairo_show_surface (), bug ?
Ravindra
rkumar at novell.com
Tue Apr 13 05:45:49 PDT 2004
Hi,
There seems to be a bug in cairo_show_surface API of cairo as mentioned
in cairo_gstate.c: line 1836 also.
Below is a testcase to reproduce the possible bug in cairo. This
function draws an image and its reflection along X-axis side by side.
The output gets the unwanted space of 1-2 pixels between the image and
its reflection. Either my approach my wrong or I found a bug in cairo
;-).
Please let me know, if my approach for flipping an image is not correct.
Thanks,
Ravindra
/*======================== CODE ==========================*/
/* NOTE: Please make sure that image background color and window
background color are different. */
/* Provide a surface of the image to be flipped */
void draw_tile_flipX (cairo_t *ct, cairo_surface_t *original, int width,
int height)
{
cairo_surface_t *flip;
cairo_pattern_t *pat;
GpMatrix *matrix = cairo_matrix_create ();
/* clear the repeat flag, if already set */
cairo_surface_set_repeat (original, 0);
/* texture surface to be created */
flip = cairo_surface_create_similar (original,
CAIRO_FORMAT_ARGB32,
2 * width, height);
cairo_save (ct);
{
cairo_identity_matrix (ct);
cairo_set_target_surface (ct, flip);
/* Draw original surface */
cairo_show_surface (ct, original, width, height);
/* Draw reflection */
cairo_matrix_translate (matrix, 2 * width, 0);
/* scale in -X direction to flip along X */
cairo_matrix_scale (matrix, -1.0, 1.0);
cairo_surface_set_matrix (original, matrix);
cairo_show_surface (ct, original, width, height);
}
cairo_restore (ct);
cairo_surface_set_repeat (flip, 1);
pat = cairo_pattern_create_for_surface (flip);
cairo_set_pattern (ct, pat);
cairo_matrix_destroy (matrix);
cairo_pattern_destroy (pat);
cairo_surface_destroy (flip);
}
void fill_window (cairo_t *ct, win_t *win)
{
cairo_save (ct);
cairo_t *surf;
int width, height;
// TODO: create a surface here
draw_tile_flipX (ct, s, width, height);
cairo_rectangle (ct, 0, 0, win->width,win->height);
cairo_fill (ct);
cairo_restore (ct);
}
More information about the cairo
mailing list