diff options
Diffstat (limited to 'fitz/dev_bbox.c')
-rw-r--r-- | fitz/dev_bbox.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/fitz/dev_bbox.c b/fitz/dev_bbox.c new file mode 100644 index 00000000..27943a98 --- /dev/null +++ b/fitz/dev_bbox.c @@ -0,0 +1,95 @@ +#include "fitz.h" + +/* TODO: add clip stack and use to intersect bboxes */ + +typedef struct fz_bboxdevice_s fz_bboxdevice; + +struct fz_bboxdevice_s +{ + fz_bbox *bbox; +}; + +static void +fz_bboxfillpath(void *user, fz_path *path, int evenodd, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_bboxdevice *bdev = user; + fz_bbox bbox = fz_roundrect(fz_boundpath(path, nil, ctm)); + *bdev->bbox = fz_unionbbox(*bdev->bbox, bbox); +} + +static void +fz_bboxstrokepath(void *user, fz_path *path, fz_strokestate *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_bboxdevice *bdev = user; + fz_bbox bbox = fz_roundrect(fz_boundpath(path, stroke, ctm)); + *bdev->bbox = fz_unionbbox(*bdev->bbox, bbox); +} + +static void +fz_bboxfilltext(void *user, fz_text *text, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_bboxdevice *bdev = user; + fz_bbox bbox = fz_roundrect(fz_boundtext(text, ctm)); + *bdev->bbox = fz_unionbbox(*bdev->bbox, bbox); +} + +static void +fz_bboxstroketext(void *user, fz_text *text, fz_strokestate *stroke, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_bboxdevice *bdev = user; + fz_bbox bbox = fz_roundrect(fz_boundtext(text, ctm)); + *bdev->bbox = fz_unionbbox(*bdev->bbox, bbox); +} + +static void +fz_bboxfillshade(void *user, fz_shade *shade, fz_matrix ctm) +{ + fz_bboxdevice *bdev = user; + fz_bbox bbox = fz_roundrect(fz_boundshade(shade, ctm)); + *bdev->bbox = fz_unionbbox(*bdev->bbox, bbox); +} + +static void +fz_bboxfillimage(void *user, fz_pixmap *image, fz_matrix ctm) +{ + fz_bboxdevice *bdev = user; + fz_bbox bbox = fz_roundrect(fz_transformrect(ctm, fz_unityrect)); + *bdev->bbox = fz_unionbbox(*bdev->bbox, bbox); +} + +static void +fz_bboxfillimagemask(void *user, fz_pixmap *image, fz_matrix ctm, + fz_colorspace *colorspace, float *color, float alpha) +{ + fz_bboxfillimage(user, image, ctm); +} + +static void +fz_bboxfreeuser(void *user) +{ + fz_bboxdevice *bdev = user; + fz_free(bdev); +} + +fz_device * +fz_newbboxdevice(fz_bbox *bboxp) +{ + fz_bboxdevice *bdev = fz_malloc(sizeof(fz_bboxdevice)); + bdev->bbox = bboxp; + *bdev->bbox = fz_emptybbox; + + fz_device *dev = fz_newdevice(bdev); + dev->freeuser = fz_bboxfreeuser; + dev->fillpath = fz_bboxfillpath; + dev->strokepath = fz_bboxstrokepath; + dev->filltext = fz_bboxfilltext; + dev->stroketext = fz_bboxstroketext; + dev->fillshade = fz_bboxfillshade; + dev->fillimage = fz_bboxfillimage; + dev->fillimagemask = fz_bboxfillimagemask; + return dev; +} |