diff options
author | Robin Watts <robin.watts@artifex.com> | 2013-04-23 17:56:27 +0100 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2013-04-26 14:42:52 +0100 |
commit | 772524c3776ab6b2dbb677acb84127030b9f49d2 (patch) | |
tree | a56f236dd0c90bbca0e23b3f7bbe75584ab97446 /fitz | |
parent | c06007db0978041d6b60125929d0ca412f36e18e (diff) | |
download | mupdf-772524c3776ab6b2dbb677acb84127030b9f49d2.tar.xz |
Add image output for HTML.
JPEGs and PNGs are left unchanged. Any other image gets stored as a
PNG and sent as a data URL.
Diffstat (limited to 'fitz')
-rw-r--r-- | fitz/dev_text.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/fitz/dev_text.c b/fitz/dev_text.c index 2df5ad38..b1347637 100644 --- a/fitz/dev_text.c +++ b/fitz/dev_text.c @@ -990,6 +990,44 @@ fz_print_text_sheet(fz_context *ctx, fz_output *out, fz_text_sheet *sheet) fz_print_style(out, style); } +static void +send_data_base64(fz_output *out, fz_buffer *buffer) +{ + int i, len; + static const char set[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + len = buffer->len/3; + for (i = 0; i < len; i++) + { + int c = buffer->data[3*i]; + int d = buffer->data[3*i+1]; + int e = buffer->data[3*i+2]; + if ((i & 15) == 0) + fz_printf(out, "\n"); + fz_printf(out, "%c%c%c%c", set[c>>2], set[((c&3)<<4)|(d>>4)], set[((d&15)<<2)|(e>>6)], set[e & 63]); + } + i *= 3; + switch (buffer->len-i) + { + case 2: + { + int c = buffer->data[i]; + int d = buffer->data[i+1]; + fz_printf(out, "%c%c%c=", set[c>>2], set[((c&3)<<4)|(d>>4)], set[((d&15)<<2)]); + break; + } + case 1: + { + int c = buffer->data[i]; + fz_printf(out, "%c%c==", set[c>>2], set[(c&3)<<4]); + break; + } + default: + case 0: + break; + } +} + void fz_print_text_page_html(fz_context *ctx, fz_output *out, fz_text_page *page) { @@ -1123,8 +1161,36 @@ fz_print_text_page_html(fz_context *ctx, fz_output *out, fz_text_page *page) break; } case FZ_PAGE_BLOCK_IMAGE: + { + fz_image_block *image = page->blocks[block_n].u.image; + fz_printf(out, "<img width=%d height=%d src=\"data:", image->image->w, image->image->h); + switch (image->image->buffer == NULL ? FZ_IMAGE_JPX : image->image->buffer->params.type) + { + case FZ_IMAGE_JPEG: + fz_printf(out, "image/jpeg;base64,"); + send_data_base64(out, image->image->buffer->buffer); + break; + case FZ_IMAGE_PNG: + fz_printf(out, "image/png;base64,"); + send_data_base64(out, image->image->buffer->buffer); + break; + default: + { + fz_pixmap *pix = fz_image_get_pixmap(ctx, image->image, image->image->w, image->image->h); + fz_buffer *buf = fz_new_buffer(ctx, 1024); + fz_output *out2 = fz_new_output_buffer(ctx, buf); + fz_output_pixmap_to_png(ctx, pix, out2, 0); + fz_close_output(out2); + fz_printf(out, "image/png;base64,"); + send_data_base64(out, buf); + fz_drop_buffer(ctx, buf); + break; + } + } + fz_printf(out, "\">\n"); break; } + } } fz_printf(out, "</div>\n"); |