[poppler] about patterns
Rafael Rodríguez
rafael.rodriguez.tf at gmail.com
Thu Aug 24 12:40:29 PDT 2006
So the bbox is for the whole tiled pattern, or just for the pattern cell?
El Miércoles, 23 de Agosto de 2006 17:56, escribió:
> On Sat, Aug 19, 2006 at 10:54:39AM +0100, Rafael Rodríguez wrote:
> > Hi,
> >
> > for those who don't know, i'm the one with the SoK kpdf/okular project:
> >
> > http://developer.kde.org/seasonofkde/project.php?kpdf_pattern.xml
>
> Here is some uncompiled untested code for the cairo backend that has the
> basic idea of rendering to a temporary surface and then tiling that. It
> might be of some help.
>
> -Jeff
>
>
> Index: poppler/CairoOutputDev.cc
> ===================================================================
> RCS file: /cvs/poppler/poppler/poppler/CairoOutputDev.cc,v
> retrieving revision 1.40
> diff -u -r1.40 CairoOutputDev.cc
> --- poppler/CairoOutputDev.cc 28 Jul 2006 18:17:45 -0000 1.40
> +++ poppler/CairoOutputDev.cc 23 Aug 2006 01:15:13 -0000
> @@ -349,6 +349,55 @@
> cairo_fill (cairo);
> }
>
> +void CairoOutputDev::tilingPatternFill(GfxState *state, Object *str,
> + int paintType, Dict *resDict,
> + double *mat, double *bbox,
> + int x0, int y0, int x1, int y1,
> + double xStep, double yStep) {
> + PDFRectangle box;
> + Gfx *gfx;
> + cairo_surface_t *s;
> + cairo_surface_t *tile;
> + cairo_content_t content;
> + cairo_t *temp;
> + cairo_t *tile_cr;
> + cairo_t *surface_cr;
> +
> + if (paintType == 2)
> + content = CAIRO_CONTENT_COLOR_ALPHA;
> + else
> + content = CAIRO_CONTENT_ALPHA;
> +
> + // should be bounding box
> + tile = cairo_create_surface_similiar(cairo_get_target(cairo), content,
> x1-x0, y1-y0); + tile_cr = cairo_create (tile);
> + temp = cairo;
> + cairo = tile_cr;
> + box.x1 = bbox[0];
> + box.y1 = bbox[1];
> + box.x2 = bbox[2];
> + box.y2 = bbox[3];
> +
> + gfx = new Gfx(xref, this, resDict, &box, NULL);
> + gfx->display(str);
> +
> + cairo = temp;
> + //XXX: need to concat mat[]
> + for (int i = x0; i<x1; i++) {
> + for (int j = y0; j<y1; j++) {
> + if (paintType == 2) {
> + cairo_set_source_surface(tile,i*xStep,j*yStep);
> + cairo_paint(cairo);
> + } else {
> + cairo_mask_surface(tile, i*xStep, j*yStep);
> + }
> + }
> + }
> + cairo_destroy (tile_cr);
> + cairo_surface_destroy(tile);
> +}
> +
> +
> void CairoOutputDev::clip(GfxState *state) {
> doPath (state, state->getPath());
> cairo_set_fill_rule (cairo, CAIRO_FILL_RULE_WINDING);
--
Rafael Rodríguez
http://unrincon.blogspot.com
http://cornerofcode.blogspot.com
More information about the poppler
mailing list