static cairo_int_status_t _cairo_paginated_surface_show_page (void *abstract_surface) { cairo_status_t status; cairo_paginated_surface_t *surface = abstract_surface; status = _start_page (surface); if (status) return status; status = _paint_page (surface); if (status) return status; status = _cairo_surface_show_page (surface->target); if (status) return status; if (cairo_surface_status (surface->meta)) return cairo_surface_status (surface->meta); cairo_surface_destroy (surface->meta); surface->meta = _cairo_meta_surface_create (surface->content, surface->width, surface->height); if (cairo_surface_status (surface->meta)) return cairo_surface_status (surface->meta); surface->page_num++; surface->page_is_blank = TRUE; return CAIRO_STATUS_SUCCESS; }
static cairo_surface_t * _cairo_meta_surface_create_similar (void *abstract_surface, cairo_content_t content, int width, int height) { return _cairo_meta_surface_create (content, width, height); }
/* XXX The integer width,height here should be doubles and all uses updated */ cairo_surface_t * _cairo_paginated_surface_create (cairo_surface_t *target, cairo_content_t content, int width, int height, const cairo_paginated_surface_backend_t *backend) { cairo_paginated_surface_t *surface; cairo_status_t status; surface = malloc (sizeof (cairo_paginated_surface_t)); if (surface == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL; } _cairo_surface_init (&surface->base, &cairo_paginated_surface_backend, content); /* Override surface->base.type with target's type so we don't leak * evidence of the paginated wrapper out to the user. */ surface->base.type = cairo_surface_get_type (target); surface->target = cairo_surface_reference (target); surface->content = content; surface->width = width; surface->height = height; surface->backend = backend; surface->meta = _cairo_meta_surface_create (content, width, height); status = cairo_surface_status (surface->meta); if (status) goto FAIL_CLEANUP_SURFACE; surface->page_num = 1; surface->page_is_blank = TRUE; return &surface->base; FAIL_CLEANUP_SURFACE: free (surface); FAIL: return _cairo_surface_create_in_error (status); }
static cairo_t * _cairo_user_scaled_font_create_meta_context (cairo_user_scaled_font_t *scaled_font) { cairo_content_t content; cairo_surface_t *meta_surface; cairo_t *cr; content = scaled_font->base.options.antialias == CAIRO_ANTIALIAS_SUBPIXEL ? CAIRO_CONTENT_COLOR_ALPHA : CAIRO_CONTENT_ALPHA; meta_surface = _cairo_meta_surface_create (content, -1, -1); cr = cairo_create (meta_surface); cairo_surface_destroy (meta_surface); cairo_set_matrix (cr, &scaled_font->base.scale); cairo_set_font_size (cr, 1.0); cairo_set_font_options (cr, &scaled_font->base.options); return cr; }
cairo_status_t _cairo_paginated_surface_set_size (cairo_surface_t *surface, int width, int height) { cairo_paginated_surface_t *paginated_surface; cairo_status_t status; assert (_cairo_surface_is_paginated (surface)); paginated_surface = (cairo_paginated_surface_t *) surface; paginated_surface->width = width; paginated_surface->height = height; cairo_surface_destroy (paginated_surface->meta); paginated_surface->meta = _cairo_meta_surface_create (paginated_surface->content, width, height); status = cairo_surface_status (paginated_surface->meta); if (status) return _cairo_surface_set_error (surface, status); return CAIRO_STATUS_SUCCESS; }