[cairo] Bump: ImageSurface from a Pattern

Bill Spitzak spitzak at gmail.com
Fri Dec 12 16:14:04 PST 2014


Try doing the clip before you do cairo_push_group?

On 12/11/2014 11:45 PM, Donn wrote:
> Hello list. It's heading for the weekend, so I'm gonna risk a bump
> before the quiet..
>
> In the C below, my intent is:
> 1. Draw a 100px rectangle.
> 2. Set it as a clip - so that the size will be 100px.
> 3. pop_group into 'pat' var.
> 4. Get the surface of that pattern.
> 5. Get the width of that surface (i.e. 100px)
>
> The code is giving me 400px - the size of the initial cr surface.
>
>
> I am making many patterns and keeping them in my objects. I am drawing
> from the pattern rather than re-drawing by cairo draw commands - for speed.
>
> I'd like to know if those patterns are the size I want them to be, not
> to mention keeping track of how much memory they are taking.
>
> If I draw a 10px by 10px circle, then the pattern *should* be 10px by
> 10px - not the size of the main window, for example.
>
>
> I hope someone can assist.
>
>
>
>
> C code pasted:
> ---------
> //gcc thiscode.c -o test -lm `pkg-config --cflags --libs cairo`
>
> #include <cairo.h>
> #include <stdio.h>
>
> static cairo_t *get_surface(int width, int height)
> {
>      cairo_surface_t *surface = cairo_image_surface_create
> (CAIRO_FORMAT_ARGB32, width, height);
>      cairo_t *cr = cairo_create (surface);
>      cairo_surface_destroy (surface);
>      return cr;
> }
>
> int main(void) {
>
>    cairo_t *cr = get_surface (400, 400);
>      cairo_set_source_rgb (cr, 0, 0, 0);
>      cairo_paint (cr);
>
>
>    cairo_pattern_t *pat;
>
>    cairo_push_group(cr);
>
>      cairo_rectangle (cr, 0,0,100,100);
>
>      cairo_clip_preserve (cr);//try to limit the size to 100 px
>
>      cairo_set_source_rgb (cr,1,1,1);
>      cairo_stroke (cr); //Draw it.
>
>    pat = cairo_pop_group(cr); //record it.
>
>    cairo_set_source(cr,pat); //Just..
>    cairo_paint(cr); //show it anyway.
>
>    cairo_surface_t *surface;
>
>    cairo_pattern_get_surface (pat, &surface); //Get the surface of the
> pattern
>
>    //..and fail to get 100px as the width.
>    printf ("width: %d\n", cairo_image_surface_get_width (surface));
>
>    //Make a png for kicks.
>    cairo_surface_write_to_png (cairo_get_target (cr), "pat.png");
>
>    cairo_pattern_destroy(pat);
>    cairo_destroy(cr);
>
>
>    return 0;
> }
>
> ---------
>
> Thanks,
> \d
>


More information about the cairo mailing list