summaryrefslogtreecommitdiff
path: root/fitz/dev_bbox.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2010-05-11 05:35:12 +0200
committerTor Andersson <tor@ghostscript.com>2010-05-11 05:35:12 +0200
commit40fbb05a738dfe1161b46f3fb15614327833cd34 (patch)
treecc7eb092204c55aab7d546e00e19efd3eb00ce05 /fitz/dev_bbox.c
parente43e0c7a92fdff506ad846ad1769606549dc1b2b (diff)
downloadmupdf-40fbb05a738dfe1161b46f3fb15614327833cd34.tar.xz
Add a bbox extraction device.
Diffstat (limited to 'fitz/dev_bbox.c')
-rw-r--r--fitz/dev_bbox.c95
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;
+}