summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-device.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2013-03-25 16:42:46 +0000
committerRobin Watts <robin.watts@artifex.com>2013-06-21 17:39:41 +0100
commit0afe72e5fc386aa0ebceec9618f2b681f9bfdc3d (patch)
tree1e294cef2b4b01e1311b90286c7675a87ca3a9f4 /source/pdf/pdf-device.c
parent82131246a46ed4547c978b0081d4e0db9d6f3942 (diff)
downloadmupdf-0afe72e5fc386aa0ebceec9618f2b681f9bfdc3d.tar.xz
Initial PDF editing/page creation commit
Diffstat (limited to 'source/pdf/pdf-device.c')
-rw-r--r--source/pdf/pdf-device.c67
1 files changed, 47 insertions, 20 deletions
diff --git a/source/pdf/pdf-device.c b/source/pdf/pdf-device.c
index 602a778f..29d2556d 100644
--- a/source/pdf/pdf-device.c
+++ b/source/pdf/pdf-device.c
@@ -118,6 +118,9 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
int bpc = 8;
fz_colorspace *colorspace = image->colorspace;
+ /* If we can maintain compression, do so */
+ cbuffer = image->buffer;
+
fz_var(pixmap);
fz_var(buffer);
fz_var(imobj);
@@ -125,7 +128,12 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
fz_try(ctx)
{
- if (cbuffer == NULL)
+ if (cbuffer != NULL && cbuffer->params.type != FZ_IMAGE_PNG && cbuffer->params.type != FZ_IMAGE_TIFF)
+ {
+ buffer = fz_keep_buffer(ctx, cbuffer->buffer);
+ cp = &cbuffer->params;
+ }
+ else
{
unsigned int size;
int n;
@@ -156,11 +164,6 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
}
}
}
- else
- {
- buffer = fz_keep_buffer(ctx, cbuffer->buffer);
- cp = &cbuffer->params;
- }
fz_md5_init(&state);
fz_md5_update(&state, buffer->data, buffer->len);
@@ -202,9 +205,11 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
pdf_dict_puts_drop(imobj, "ColorSpace", pdf_new_name(ctx, "DeviceRGB"));
else if (colorspace->n == 4)
pdf_dict_puts_drop(imobj, "ColorSpace", pdf_new_name(ctx, "DeviceCMYK"));
+ if (!mask)
+ pdf_dict_puts_drop(imobj, "BitsPerComponent", pdf_new_int(ctx, image->bpc));
switch (cp ? cp->type : FZ_IMAGE_UNKNOWN)
{
- case FZ_IMAGE_UNKNOWN:
+ case FZ_IMAGE_UNKNOWN: /* Unknown also means raw */
default:
break;
case FZ_IMAGE_JPEG:
@@ -251,6 +256,7 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
if (cp->u.flate.bpc)
bpc = cp->u.flate.bpc;
pdf_dict_puts(imobj, "Filter", pdf_new_name(ctx, "FlateDecode"));
+ pdf_dict_puts_drop(imobj, "BitsPerComponent", pdf_new_int(ctx, image->bpc));
break;
case FZ_IMAGE_LZW:
if (cp->u.lzw.columns)
@@ -279,8 +285,6 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
int smasknum = send_image(pdev, image->mask, 0, 1);
pdf_dict_puts(imobj, "SMask", pdev->images[smasknum].ref);
}
- if (bpc)
- pdf_dict_puts_drop(imobj, "BitsPerComponent", pdf_new_int(ctx, bpc));
imref = pdf_new_ref(pdev->xref, imobj);
pdf_update_stream(pdev->xref, pdf_to_num(imref), buffer);
@@ -371,23 +375,23 @@ pdf_dev_path(pdf_device *pdev, fz_path *path)
case FZ_MOVETO:
x = path->items[i++].v;
y = path->items[i++].v;
- fz_buffer_printf(ctx, gs->buf, "%g %g m\n", x, y);
+ fz_buffer_printf(ctx, gs->buf, "%f %f m\n", x, y);
break;
case FZ_LINETO:
x = path->items[i++].v;
y = path->items[i++].v;
- fz_buffer_printf(ctx, gs->buf, "%g %g l\n", x, y);
+ fz_buffer_printf(ctx, gs->buf, "%f %f l\n", x, y);
break;
case FZ_CURVETO:
x = path->items[i++].v;
y = path->items[i++].v;
- fz_buffer_printf(ctx, gs->buf, "%g %g ", x, y);
+ fz_buffer_printf(ctx, gs->buf, "%f %f ", x, y);
x = path->items[i++].v;
y = path->items[i++].v;
- fz_buffer_printf(ctx, gs->buf, "%g %g ", x, y);
+ fz_buffer_printf(ctx, gs->buf, "%f %f ", x, y);
x = path->items[i++].v;
y = path->items[i++].v;
- fz_buffer_printf(ctx, gs->buf, "%g %g c\n", x, y);
+ fz_buffer_printf(ctx, gs->buf, "%f %f c\n", x, y);
break;
case FZ_CLOSE_PATH:
fz_buffer_printf(ctx, gs->buf, "h\n");
@@ -589,7 +593,7 @@ pdf_dev_font(pdf_device *pdev, fz_font *font, float size)
}
pdev->num_fonts++;
}
- fz_buffer_printf(ctx, gs->buf, "/F%d %g Tf\n", i, size);
+ fz_buffer_printf(ctx, gs->buf, "/F%d %f Tf\n", i, size);
}
static void
@@ -677,7 +681,7 @@ pdf_dev_text(pdf_device *pdev, fz_text *text)
fz_transform_point(&delta, &inverse);
if (delta.x != 0 || delta.y != 0)
{
- fz_buffer_printf(pdev->ctx, gs->buf, "%g %g Td ", delta.x, delta.y);
+ fz_buffer_printf(pdev->ctx, gs->buf, "%f %f Td ", delta.x, delta.y);
trm.e = it->x;
trm.f = it->y;
}
@@ -901,6 +905,9 @@ pdf_dev_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm,
pdf_dev_begin_text(pdev, &text->trm, 0);
pdf_dev_font(pdev, text->font, 1);
+ pdf_dev_ctm(pdev, ctm);
+ pdf_dev_alpha(pdev, alpha, 0);
+ pdf_dev_color(pdev, colorspace, color, 0);
pdf_dev_text(pdev, text);
}
@@ -912,6 +919,9 @@ pdf_dev_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, cons
pdf_dev_begin_text(pdev, &text->trm, 1);
pdf_dev_font(pdev, text->font, 1);
+ pdf_dev_ctm(pdev, ctm);
+ pdf_dev_alpha(pdev, alpha, 1);
+ pdf_dev_color(pdev, colorspace, color, 1);
pdf_dev_text(pdev, text);
}
@@ -921,6 +931,7 @@ pdf_dev_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accum
pdf_device *pdev = dev->user;
pdf_dev_begin_text(pdev, &text->trm, 0);
+ pdf_dev_ctm(pdev, ctm);
pdf_dev_font(pdev, text->font, 7);
pdf_dev_text(pdev, text);
}
@@ -932,6 +943,7 @@ pdf_dev_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke,
pdf_dev_begin_text(pdev, &text->trm, 0);
pdf_dev_font(pdev, text->font, 5);
+ pdf_dev_ctm(pdev, ctm);
pdf_dev_text(pdev, text);
}
@@ -941,6 +953,7 @@ pdf_dev_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm)
pdf_device *pdev = dev->user;
pdf_dev_begin_text(pdev, &text->trm, 0);
+ pdf_dev_ctm(pdev, ctm);
pdf_dev_font(pdev, text->font, 3);
pdf_dev_text(pdev, text);
}
@@ -955,13 +968,12 @@ pdf_dev_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float
pdf_dev_end_text(pdev);
num = send_image(pdev, image, 0, 0);
- fz_buffer_printf(dev->ctx, gs->buf, "q\n");
pdf_dev_alpha(pdev, alpha, 0);
/* PDF images are upside down, so fiddle the ctm */
fz_pre_scale(&local_ctm, 1, -1);
fz_pre_translate(&local_ctm, 0, -1);
pdf_dev_ctm(pdev, &local_ctm);
- fz_buffer_printf(dev->ctx, gs->buf, "/Img%d Do Q\n", num);
+ fz_buffer_printf(dev->ctx, gs->buf, "/Img%d Do\n", num);
}
static void
@@ -1169,8 +1181,6 @@ pdf_dev_free_user(fz_device *dev)
pdf_dict_puts_drop(pdev->contents, "Length", pdf_new_int(ctx, gs->buf->len));
- pdf_update_stream(pdev->xref, pdf_to_num(pdev->contents), gs->buf);
-
for (i = pdev->num_gstates-1; i >= 0; i--)
{
fz_drop_stroke_state(ctx, pdev->gstates[i].stroke_state);
@@ -1186,6 +1196,9 @@ pdf_dev_free_user(fz_device *dev)
pdf_drop_obj(pdev->images[i].ref);
}
+ pdf_update_stream(pdev->xref, pdf_to_num(pdev->contents), pdev->gstates[0].buf);
+ fz_drop_buffer(ctx, pdev->gstates[0].buf);
+
pdf_drop_obj(pdev->contents);
pdf_drop_obj(pdev->resources);
@@ -1261,3 +1274,17 @@ fz_device *pdf_new_pdf_device(pdf_document *doc, pdf_obj *contents, pdf_obj *res
return dev;
}
+
+fz_device *pdf_page_write(pdf_document *doc, pdf_page *page)
+{
+ pdf_obj *resources = pdf_dict_gets(page->me, "Resources");
+ fz_matrix ctm;
+ fz_pre_translate(fz_scale(&ctm, 1, -1), 0, page->mediabox.y0-page->mediabox.y1);
+ if (resources == NULL)
+ {
+ resources = pdf_new_dict(doc->ctx, 0);
+ pdf_dict_puts_drop(page->me, "Resources", resources);
+ }
+
+ return pdf_new_pdf_device(doc, page->contents, resources, &ctm);
+}