void sp_canvas_arena_render_surface (SPCanvasArena *ca, cairo_surface_t *surface, Geom::IntRect const &r) { g_return_if_fail (ca != NULL); g_return_if_fail (SP_IS_CANVAS_ARENA (ca)); Inkscape::DrawingContext dc(surface, r.min()); ca->drawing.update(Geom::IntRect::infinite(), ca->ctx); ca->drawing.render(dc, r); }
static int sp_export_get_rows(guchar const **rows, void **to_free, int row, int num_rows, void *data) { struct SPEBP *ebp = (struct SPEBP *) data; if (ebp->status) { if (!ebp->status((float) row / ebp->height, ebp->data)) return 0; } num_rows = MIN(num_rows, static_cast<int>(ebp->sheight)); num_rows = MIN(num_rows, static_cast<int>(ebp->height - row)); /* Set area of interest */ // bbox is now set to the entire image to prevent discontinuities // in the image when blur is used (the borders may still be a bit // off, but that's less noticeable). Geom::IntRect bbox = Geom::IntRect::from_xywh(0, row, ebp->width, num_rows); /* Update to renderable state */ ebp->drawing->update(bbox); int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, ebp->width); unsigned char *px = g_new(guchar, num_rows * stride); cairo_surface_t *s = cairo_image_surface_create_for_data( px, CAIRO_FORMAT_ARGB32, ebp->width, num_rows, stride); Inkscape::DrawingContext ct(s, bbox.min()); ct.setSource(ebp->background); ct.setOperator(CAIRO_OPERATOR_SOURCE); ct.paint(); ct.setOperator(CAIRO_OPERATOR_OVER); /* Render */ ebp->drawing->render(ct, bbox); cairo_surface_destroy(s); *to_free = px; // PNG stores data as unpremultiplied big-endian RGBA, which means // it's identical to the GdkPixbuf format. convert_pixels_argb32_to_pixbuf(px, ebp->width, num_rows, stride); for (int r = 0; r < num_rows; r++) { rows[r] = px + r * stride; } return num_rows; }
/** * Creates a surface with the given physical extents. * When a drawing context is created for this surface, its pixels * will cover the area under the given rectangle. */ DrawingSurface::DrawingSurface(Geom::IntRect const &area) : _surface(NULL) , _origin(area.min()) , _scale(1, 1) , _pixels(area.dimensions()) {}