summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/mudraw.c6
-rw-r--r--apps/mupdfclean.c2
-rw-r--r--apps/mupdfextract.c27
-rw-r--r--apps/mupdfinfo.c2
-rw-r--r--apps/mupdfshow.c2
-rw-r--r--apps/pdfapp.c18
-rw-r--r--apps/win_main.c27
-rw-r--r--cbz/mucbz.c2
-rw-r--r--draw/draw_affine.c2
-rw-r--r--draw/draw_blend.c2
-rw-r--r--draw/draw_device.c2
-rw-r--r--draw/draw_edge.c2
-rw-r--r--draw/draw_glyph.c2
-rw-r--r--draw/draw_mesh.c2
-rw-r--r--draw/draw_paint.c2
-rw-r--r--draw/draw_path.c2
-rw-r--r--draw/draw_scale.c2
-rw-r--r--draw/draw_simple_scale.c2
-rw-r--r--draw/draw_unpack.c2
-rw-r--r--fitz/base_context.c2
-rw-r--r--fitz/base_error.c2
-rw-r--r--fitz/base_geometry.c2
-rw-r--r--fitz/base_hash.c2
-rw-r--r--fitz/base_memory.c2
-rw-r--r--fitz/base_string.c2
-rw-r--r--fitz/crypt_aes.c2
-rw-r--r--fitz/crypt_arc4.c2
-rw-r--r--fitz/crypt_md5.c2
-rw-r--r--fitz/crypt_sha2.c2
-rw-r--r--fitz/dev_bbox.c2
-rw-r--r--fitz/dev_list.c2
-rw-r--r--fitz/dev_null.c2
-rw-r--r--fitz/dev_text.c2
-rw-r--r--fitz/dev_trace.c2
-rw-r--r--fitz/doc_document.c2
-rw-r--r--fitz/doc_link.c2
-rw-r--r--fitz/doc_outline.c2
-rw-r--r--fitz/filt_basic.c2
-rw-r--r--fitz/filt_dctd.c2
-rw-r--r--fitz/filt_faxd.c2
-rw-r--r--fitz/filt_flate.c2
-rw-r--r--fitz/filt_jbig2d.c2
-rw-r--r--fitz/filt_lzwd.c2
-rw-r--r--fitz/filt_predict.c2
-rw-r--r--fitz/fitz-internal.h1088
-rw-r--r--fitz/fitz.h1276
-rw-r--r--fitz/image_jpeg.c2
-rw-r--r--fitz/image_jpx.c2
-rw-r--r--fitz/image_md5.c11
-rw-r--r--fitz/image_png.c2
-rw-r--r--fitz/image_save.c32
-rw-r--r--fitz/image_tiff.c2
-rw-r--r--fitz/res_bitmap.c23
-rw-r--r--fitz/res_colorspace.c2
-rw-r--r--fitz/res_font.c2
-rw-r--r--fitz/res_halftone.c2
-rw-r--r--fitz/res_path.c2
-rw-r--r--fitz/res_pixmap.c23
-rw-r--r--fitz/res_shade.c2
-rw-r--r--fitz/res_store.c2
-rw-r--r--fitz/res_text.c2
-rw-r--r--fitz/stm_buffer.c2
-rw-r--r--fitz/stm_open.c2
-rw-r--r--fitz/stm_read.c2
-rw-r--r--pdf/base_object.c4
-rw-r--r--pdf/mupdf-internal.h600
-rw-r--r--pdf/mupdf.h602
-rw-r--r--pdf/pdf_annot.c4
-rw-r--r--pdf/pdf_cmap.c4
-rw-r--r--pdf/pdf_cmap_load.c4
-rw-r--r--pdf/pdf_cmap_parse.c4
-rw-r--r--pdf/pdf_cmap_table.c4
-rw-r--r--pdf/pdf_colorspace.c4
-rw-r--r--pdf/pdf_crypt.c4
-rw-r--r--pdf/pdf_encoding.c4
-rw-r--r--pdf/pdf_font.c4
-rw-r--r--pdf/pdf_fontfile.c4
-rw-r--r--pdf/pdf_function.c4
-rw-r--r--pdf/pdf_image.c4
-rw-r--r--pdf/pdf_interpret.c4
-rw-r--r--pdf/pdf_lex.c4
-rw-r--r--pdf/pdf_metrics.c4
-rw-r--r--pdf/pdf_nametree.c4
-rw-r--r--pdf/pdf_outline.c4
-rw-r--r--pdf/pdf_page.c4
-rw-r--r--pdf/pdf_parse.c4
-rw-r--r--pdf/pdf_pattern.c4
-rw-r--r--pdf/pdf_repair.c4
-rw-r--r--pdf/pdf_shade.c4
-rw-r--r--pdf/pdf_store.c4
-rw-r--r--pdf/pdf_stream.c4
-rw-r--r--pdf/pdf_type3.c4
-rw-r--r--pdf/pdf_unicode.c4
-rw-r--r--pdf/pdf_xobject.c4
-rw-r--r--pdf/pdf_xref.c4
-rw-r--r--scripts/cmapdump.c4
-rw-r--r--win32/libmupdf.vcproj16
-rw-r--r--xps/muxps.h4
-rw-r--r--xps/xps_common.c2
-rw-r--r--xps/xps_doc.c2
-rw-r--r--xps/xps_glyphs.c2
-rw-r--r--xps/xps_gradient.c2
-rw-r--r--xps/xps_image.c2
-rw-r--r--xps/xps_outline.c2
-rw-r--r--xps/xps_path.c2
-rw-r--r--xps/xps_resource.c2
-rw-r--r--xps/xps_tile.c2
-rw-r--r--xps/xps_util.c2
-rw-r--r--xps/xps_xml.c2
-rw-r--r--xps/xps_zip.c2
110 files changed, 2040 insertions, 1965 deletions
diff --git a/apps/mudraw.c b/apps/mudraw.c
index ce59a4e3..46da1949 100644
--- a/apps/mudraw.c
+++ b/apps/mudraw.c
@@ -251,14 +251,10 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
if (showmd5)
{
- fz_md5 md5;
unsigned char digest[16];
int i;
- fz_md5_init(&md5);
- fz_md5_update(&md5, pix->samples, pix->w * pix->h * pix->n);
- fz_md5_final(&md5, digest);
-
+ fz_md5_pixmap(digest, pix);
printf(" ");
for (i = 0; i < 16; i++)
printf("%02x", digest[i]);
diff --git a/apps/mupdfclean.c b/apps/mupdfclean.c
index c8a81274..caee8d5b 100644
--- a/apps/mupdfclean.c
+++ b/apps/mupdfclean.c
@@ -10,7 +10,7 @@
*/
#include "fitz.h"
-#include "mupdf.h"
+#include "mupdf-internal.h"
static FILE *out = NULL;
diff --git a/apps/mupdfextract.c b/apps/mupdfextract.c
index 88a3630d..069f7233 100644
--- a/apps/mupdfextract.c
+++ b/apps/mupdfextract.c
@@ -3,7 +3,7 @@
*/
#include "fitz.h"
-#include "mupdf.h"
+#include "mupdf-internal.h"
static pdf_document *doc = NULL;
static fz_context *ctx = NULL;
@@ -34,7 +34,7 @@ static void saveimage(int num)
fz_image *image;
fz_pixmap *img;
pdf_obj *ref;
- char name[1024];
+ char name[32];
ref = pdf_new_indirect(ctx, num, 0, doc);
@@ -44,27 +44,8 @@ static void saveimage(int num)
img = fz_image_to_pixmap(ctx, image, 0, 0);
fz_drop_image(ctx, image);
- if (dorgb && img->colorspace && img->colorspace != fz_device_rgb)
- {
- fz_pixmap *temp;
- temp = fz_new_pixmap_with_rect(ctx, fz_device_rgb, fz_bound_pixmap(img));
- fz_convert_pixmap(ctx, img, temp);
- fz_drop_pixmap(ctx, img);
- img = temp;
- }
-
- if (img->n <= 4)
- {
- sprintf(name, "img-%04d.png", num);
- printf("extracting image %s\n", name);
- fz_write_png(ctx, img, name, 0);
- }
- else
- {
- sprintf(name, "img-%04d.pam", num);
- printf("extracting image %s\n", name);
- fz_write_pam(ctx, img, name, 0);
- }
+ sprintf(name, "img-%04d", num);
+ fz_save_pixmap(ctx, img, name, dorgb);
fz_drop_pixmap(ctx, img);
pdf_drop_obj(ref);
diff --git a/apps/mupdfinfo.c b/apps/mupdfinfo.c
index 161a80f1..d567bf8e 100644
--- a/apps/mupdfinfo.c
+++ b/apps/mupdfinfo.c
@@ -4,7 +4,7 @@
*/
#include "fitz.h"
-#include "mupdf.h"
+#include "mupdf-internal.h"
pdf_document *xref;
fz_context *ctx;
diff --git a/apps/mupdfshow.c b/apps/mupdfshow.c
index 92fcac2d..475dc5a9 100644
--- a/apps/mupdfshow.c
+++ b/apps/mupdfshow.c
@@ -3,7 +3,7 @@
*/
#include "fitz.h"
-#include "mupdf.h"
+#include "mupdf-internal.h"
static pdf_document *doc = NULL;
static fz_context *ctx = NULL;
diff --git a/apps/pdfapp.c b/apps/pdfapp.c
index 6f2d766d..68b4b945 100644
--- a/apps/pdfapp.c
+++ b/apps/pdfapp.c
@@ -80,23 +80,7 @@ void pdfapp_init(fz_context *ctx, pdfapp_t *app)
void pdfapp_invert(pdfapp_t *app, fz_bbox rect)
{
- unsigned char *p;
- int x, y, n;
-
- int x0 = CLAMP(rect.x0 - app->image->x, 0, app->image->w - 1);
- int x1 = CLAMP(rect.x1 - app->image->x, 0, app->image->w - 1);
- int y0 = CLAMP(rect.y0 - app->image->y, 0, app->image->h - 1);
- int y1 = CLAMP(rect.y1 - app->image->y, 0, app->image->h - 1);
-
- for (y = y0; y < y1; y++)
- {
- p = app->image->samples + (y * app->image->w + x0) * app->image->n;
- for (x = x0; x < x1; x++)
- {
- for (n = app->image->n; n > 0; n--, p++)
- *p = 255 - *p;
- }
- }
+ fz_invert_pixmap_rect(app->image, rect);
}
void pdfapp_open(pdfapp_t *app, char *filename, int fd, int reload)
diff --git a/apps/win_main.c b/apps/win_main.c
index c87faa97..1052ccdd 100644
--- a/apps/win_main.c
+++ b/apps/win_main.c
@@ -355,10 +355,15 @@ void winblitsearch()
void winblit()
{
+ fz_bbox bb = fz_bound_pixmap(gapp.image);
+ int image_w = bb.x1-bb.x0;
+ int image_h = bb.y1-bb.y0;
+ int image_n = fz_pixmap_components(context, gapp.image);
+ unsigned char *samples = fz_pixmap_pixels(context, gapp.image);
int x0 = gapp.panx;
int y0 = gapp.pany;
- int x1 = gapp.panx + gapp.image->w;
- int y1 = gapp.pany + gapp.image->h;
+ int x1 = gapp.panx + image_w;
+ int y1 = gapp.pany + image_h;
RECT r;
if (gapp.image)
@@ -371,15 +376,15 @@ void winblit()
pdfapp_inverthit(&gapp);
- dibinf->bmiHeader.biWidth = gapp.image->w;
- dibinf->bmiHeader.biHeight = -gapp.image->h;
- dibinf->bmiHeader.biSizeImage = gapp.image->h * 4;
+ dibinf->bmiHeader.biWidth = image_w;
+ dibinf->bmiHeader.biHeight = -image_h;
+ dibinf->bmiHeader.biSizeImage = image_h * 4;
if (gapp.image->n == 2)
{
- int i = gapp.image->w * gapp.image->h;
+ int i = image_w * image_h;
unsigned char *color = malloc(i*4);
- unsigned char *s = gapp.image->samples;
+ unsigned char *s = samples;
unsigned char *d = color;
for (; i > 0 ; i--)
{
@@ -388,16 +393,16 @@ void winblit()
d += 4;
}
SetDIBitsToDevice(hdc,
- gapp.panx, gapp.pany, gapp.image->w, gapp.image->h,
- 0, 0, 0, gapp.image->h, color,
+ gapp.panx, gapp.pany, image_w, image_h,
+ 0, 0, 0, image_h, color,
dibinf, DIB_RGB_COLORS);
free(color);
}
if (gapp.image->n == 4)
{
SetDIBitsToDevice(hdc,
- gapp.panx, gapp.pany, gapp.image->w, gapp.image->h,
- 0, 0, 0, gapp.image->h, gapp.image->samples,
+ gapp.panx, gapp.pany, image_w, image_h,
+ 0, 0, 0, image_h, samples,
dibinf, DIB_RGB_COLORS);
}
diff --git a/cbz/mucbz.c b/cbz/mucbz.c
index 89c9d4dd..08f21bb6 100644
--- a/cbz/mucbz.c
+++ b/cbz/mucbz.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "mucbz.h"
#include <zlib.h>
diff --git a/draw/draw_affine.c b/draw/draw_affine.c
index dc15eaf5..67361faf 100644
--- a/draw/draw_affine.c
+++ b/draw/draw_affine.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
typedef unsigned char byte;
diff --git a/draw/draw_blend.c b/draw/draw_blend.c
index e60c09c5..3e81568f 100644
--- a/draw/draw_blend.c
+++ b/draw/draw_blend.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/* PDF 1.4 blend modes. These are slow. */
diff --git a/draw/draw_device.c b/draw/draw_device.c
index 65ee5a39..ab9d18e1 100644
--- a/draw/draw_device.c
+++ b/draw/draw_device.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#define QUANT(x,a) (((int)((x) * (a))) / (a))
#define HSUBPIX 5.0
diff --git a/draw/draw_edge.c b/draw/draw_edge.c
index adb460ac..74cd3aec 100644
--- a/draw/draw_edge.c
+++ b/draw/draw_edge.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#define BBOX_MIN -(1<<20)
#define BBOX_MAX (1<<20)
diff --git a/draw/draw_glyph.c b/draw/draw_glyph.c
index 110a7a25..338c076e 100644
--- a/draw/draw_glyph.c
+++ b/draw/draw_glyph.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#define MAX_FONT_SIZE 1000
#define MAX_GLYPH_SIZE 256
diff --git a/draw/draw_mesh.c b/draw/draw_mesh.c
index 79bac732..e6812d77 100644
--- a/draw/draw_mesh.c
+++ b/draw/draw_mesh.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/*
* polygon clipping
diff --git a/draw/draw_paint.c b/draw/draw_paint.c
index 3b02b870..6a73783b 100644
--- a/draw/draw_paint.c
+++ b/draw/draw_paint.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/*
diff --git a/draw/draw_path.c b/draw/draw_path.c
index eca7dc08..2ef8cf3a 100644
--- a/draw/draw_path.c
+++ b/draw/draw_path.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#define MAX_DEPTH 8
diff --git a/draw/draw_scale.c b/draw/draw_scale.c
index 489a2eb9..fb7caffd 100644
--- a/draw/draw_scale.c
+++ b/draw/draw_scale.c
@@ -6,7 +6,7 @@ given by taking the source pixmap src, scaling it to width w, and height h,
and then positioning it at (frac(x),frac(y)).
*/
-#include "fitz.h"
+#include "fitz-internal.h"
/* Do we special case handling of single pixel high/wide images? The
* 'purest' handling is given by not special casing them, but certain
diff --git a/draw/draw_simple_scale.c b/draw/draw_simple_scale.c
index 6d0ad481..8143b6fd 100644
--- a/draw/draw_simple_scale.c
+++ b/draw/draw_simple_scale.c
@@ -10,7 +10,7 @@ that return values strictly in the 0..1 range, and uses bytes for
intermediate results rather than ints.
*/
-#include "fitz.h"
+#include "fitz-internal.h"
/* Do we special case handling of single pixel high/wide images? The
* 'purest' handling is given by not special casing them, but certain
diff --git a/draw/draw_unpack.c b/draw/draw_unpack.c
index 6da5e8a3..f988dcf9 100644
--- a/draw/draw_unpack.c
+++ b/draw/draw_unpack.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/* Unpack image samples and optionally pad pixels with opaque alpha */
diff --git a/fitz/base_context.c b/fitz/base_context.c
index 2eeb6683..7e3c0bdd 100644
--- a/fitz/base_context.c
+++ b/fitz/base_context.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
void
fz_free_context(fz_context *ctx)
diff --git a/fitz/base_error.c b/fitz/base_error.c
index f3ca4efa..71a32a2e 100644
--- a/fitz/base_error.c
+++ b/fitz/base_error.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/* Warning context */
diff --git a/fitz/base_geometry.c b/fitz/base_geometry.c
index fc5ce517..84134179 100644
--- a/fitz/base_geometry.c
+++ b/fitz/base_geometry.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#define MAX4(a,b,c,d) MAX(MAX(a,b), MAX(c,d))
#define MIN4(a,b,c,d) MIN(MIN(a,b), MIN(c,d))
diff --git a/fitz/base_hash.c b/fitz/base_hash.c
index 76c95304..59ed8872 100644
--- a/fitz/base_hash.c
+++ b/fitz/base_hash.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/*
Simple hashtable with open addressing linear probe.
diff --git a/fitz/base_memory.c b/fitz/base_memory.c
index c9ec2628..32c7ff84 100644
--- a/fitz/base_memory.c
+++ b/fitz/base_memory.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
static void *
do_scavenging_malloc(fz_context *ctx, unsigned int size)
diff --git a/fitz/base_string.c b/fitz/base_string.c
index dd9f8ea2..6fdfef62 100644
--- a/fitz/base_string.c
+++ b/fitz/base_string.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
int
fz_is_big_endian(void)
diff --git a/fitz/crypt_aes.c b/fitz/crypt_aes.c
index afdff0fe..4d8c4498 100644
--- a/fitz/crypt_aes.c
+++ b/fitz/crypt_aes.c
@@ -36,7 +36,7 @@
* http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
*/
-#include "fitz.h"
+#include "fitz-internal.h"
#define aes_context fz_aes
diff --git a/fitz/crypt_arc4.c b/fitz/crypt_arc4.c
index 272891ce..596bf652 100644
--- a/fitz/crypt_arc4.c
+++ b/fitz/crypt_arc4.c
@@ -21,7 +21,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#include "fitz.h"
+#include "fitz-internal.h"
void
fz_arc4_init(fz_arc4 *arc4, const unsigned char *key, unsigned keylen)
diff --git a/fitz/crypt_md5.c b/fitz/crypt_md5.c
index b6e06845..87c0909d 100644
--- a/fitz/crypt_md5.c
+++ b/fitz/crypt_md5.c
@@ -23,7 +23,7 @@ These notices must be retained in any copies of any part of this
documentation and/or software.
*/
-#include "fitz.h"
+#include "fitz-internal.h"
/* Constants for MD5Transform routine */
enum
diff --git a/fitz/crypt_sha2.c b/fitz/crypt_sha2.c
index f17146c6..64284cfa 100644
--- a/fitz/crypt_sha2.c
+++ b/fitz/crypt_sha2.c
@@ -7,7 +7,7 @@ This file has been put into the public domain.
You can do whatever you want with this file.
*/
-#include "fitz.h"
+#include "fitz-internal.h"
static inline int isbigendian(void)
{
diff --git a/fitz/dev_bbox.c b/fitz/dev_bbox.c
index b015c585..163780d0 100644
--- a/fitz/dev_bbox.c
+++ b/fitz/dev_bbox.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/* TODO: add clip stack and use to intersect bboxes */
diff --git a/fitz/dev_list.c b/fitz/dev_list.c
index 1d82421e..d0dfabc5 100644
--- a/fitz/dev_list.c
+++ b/fitz/dev_list.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
typedef struct fz_display_node_s fz_display_node;
diff --git a/fitz/dev_null.c b/fitz/dev_null.c
index d817932d..886cebe1 100644
--- a/fitz/dev_null.c
+++ b/fitz/dev_null.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
fz_device *
fz_new_device(fz_context *ctx, void *user)
diff --git a/fitz/dev_text.c b/fitz/dev_text.c
index d38fab21..618a2e6e 100644
--- a/fitz/dev_text.c
+++ b/fitz/dev_text.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#define LINE_DIST 0.9f
#define SPACE_DIST 0.2f
diff --git a/fitz/dev_trace.c b/fitz/dev_trace.c
index 9faffc35..f75f19d5 100644
--- a/fitz/dev_trace.c
+++ b/fitz/dev_trace.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
static void
fz_trace_matrix(fz_matrix ctm)
diff --git a/fitz/doc_document.c b/fitz/doc_document.c
index ca13af72..2da7a110 100644
--- a/fitz/doc_document.c
+++ b/fitz/doc_document.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/* Yuck! Promiscuous we are. */
extern struct pdf_document *pdf_open_document(fz_context *ctx, char *filename);
diff --git a/fitz/doc_link.c b/fitz/doc_link.c
index 71f5dfbf..d558d18a 100644
--- a/fitz/doc_link.c
+++ b/fitz/doc_link.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
void
fz_free_link_dest(fz_context *ctx, fz_link_dest *dest)
diff --git a/fitz/doc_outline.c b/fitz/doc_outline.c
index b69debaf..a00c56f1 100644
--- a/fitz/doc_outline.c
+++ b/fitz/doc_outline.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
void
fz_free_outline(fz_context *ctx, fz_outline *outline)
diff --git a/fitz/filt_basic.c b/fitz/filt_basic.c
index ae239fed..09d63402 100644
--- a/fitz/filt_basic.c
+++ b/fitz/filt_basic.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/* Pretend we have a filter that just copies data forever */
diff --git a/fitz/filt_dctd.c b/fitz/filt_dctd.c
index 3abe0468..23744f01 100644
--- a/fitz/filt_dctd.c
+++ b/fitz/filt_dctd.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include <jpeglib.h>
#include <setjmp.h>
diff --git a/fitz/filt_faxd.c b/fitz/filt_faxd.c
index 4e522eb5..ada7e87b 100644
--- a/fitz/filt_faxd.c
+++ b/fitz/filt_faxd.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/* Fax G3/G4 decoder */
diff --git a/fitz/filt_flate.c b/fitz/filt_flate.c
index 2eb0c563..24b6c081 100644
--- a/fitz/filt_flate.c
+++ b/fitz/filt_flate.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include <zlib.h>
diff --git a/fitz/filt_jbig2d.c b/fitz/filt_jbig2d.c
index 3afcbcb0..415534c0 100644
--- a/fitz/filt_jbig2d.c
+++ b/fitz/filt_jbig2d.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#ifdef _WIN32 /* Microsoft Visual C++ */
diff --git a/fitz/filt_lzwd.c b/fitz/filt_lzwd.c
index ac952ccf..3ee4d34c 100644
--- a/fitz/filt_lzwd.c
+++ b/fitz/filt_lzwd.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/* TODO: error checking */
diff --git a/fitz/filt_predict.c b/fitz/filt_predict.c
index 8221c251..e68743d3 100644
--- a/fitz/filt_predict.c
+++ b/fitz/filt_predict.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/* TODO: check if this works with 16bpp images */
diff --git a/fitz/fitz-internal.h b/fitz/fitz-internal.h
new file mode 100644
index 00000000..4ede601d
--- /dev/null
+++ b/fitz/fitz-internal.h
@@ -0,0 +1,1088 @@
+#ifndef _FITZ_INTERNAL_H_
+#define _FITZ_INTERNAL_H_
+
+#include "fitz.h"
+
+struct fz_warn_context_s
+{
+ char message[256];
+ int count;
+};
+
+
+fz_context *fz_clone_context_internal(fz_context *ctx);
+
+void fz_new_aa_context(fz_context *ctx);
+void fz_free_aa_context(fz_context *ctx);
+
+#if defined(MEMENTO) || defined(DEBUG)
+#define FITZ_DEBUG_LOCKING
+#endif
+
+#ifdef FITZ_DEBUG_LOCKING
+
+void fz_assert_lock_held(fz_context *ctx, int lock);
+void fz_assert_lock_not_held(fz_context *ctx, int lock);
+void fz_lock_debug_lock(fz_context *ctx, int lock);
+void fz_lock_debug_unlock(fz_context *ctx, int lock);
+
+#else
+
+#define fz_assert_lock_held(A,B) do { } while (0)
+#define fz_assert_lock_not_held(A,B) do { } while (0)
+#define fz_lock_debug_lock(A,B) do { } while (0)
+#define fz_lock_debug_unlock(A,B) do { } while (0)
+
+#endif /* !FITZ_DEBUG_LOCKING */
+
+static inline void
+fz_lock(fz_context *ctx, int lock)
+{
+ fz_lock_debug_lock(ctx, lock);
+ ctx->locks->lock(ctx->locks->user, lock);
+}
+
+static inline void
+fz_unlock(fz_context *ctx, int lock)
+{
+ fz_lock_debug_unlock(ctx, lock);
+ ctx->locks->unlock(ctx->locks->user, lock);
+}
+
+
+/*
+ * Basic runtime and utility functions
+ */
+
+/* Range checking atof */
+float fz_atof(const char *s);
+
+/* utf-8 encoding and decoding */
+int chartorune(int *rune, char *str);
+int runetochar(char *str, int *rune);
+int runelen(int c);
+
+/*
+ * Generic hash-table with fixed-length keys.
+ */
+
+typedef struct fz_hash_table_s fz_hash_table;
+
+fz_hash_table *fz_new_hash_table(fz_context *ctx, int initialsize, int keylen, int lock);
+void fz_debug_hash(fz_context *ctx, fz_hash_table *table);
+void fz_empty_hash(fz_context *ctx, fz_hash_table *table);
+void fz_free_hash(fz_context *ctx, fz_hash_table *table);
+
+void *fz_hash_find(fz_context *ctx, fz_hash_table *table, void *key);
+void *fz_hash_insert(fz_context *ctx, fz_hash_table *table, void *key, void *val);
+void fz_hash_remove(fz_context *ctx, fz_hash_table *table, void *key);
+
+int fz_hash_len(fz_context *ctx, fz_hash_table *table);
+void *fz_hash_get_key(fz_context *ctx, fz_hash_table *table, int idx);
+void *fz_hash_get_val(fz_context *ctx, fz_hash_table *table, int idx);
+
+/*
+ * Math and geometry
+ */
+
+/* Multiply scaled two integers in the 0..255 range */
+static inline int fz_mul255(int a, int b)
+{
+ /* see Jim Blinn's book "Dirty Pixels" for how this works */
+ int x = a * b + 128;
+ x += x >> 8;
+ return x >> 8;
+}
+
+/* Expand a value A from the 0...255 range to the 0..256 range */
+#define FZ_EXPAND(A) ((A)+((A)>>7))
+
+/* Combine values A (in any range) and B (in the 0..256 range),
+ * to give a single value in the same range as A was. */
+#define FZ_COMBINE(A,B) (((A)*(B))>>8)
+
+/* Combine values A and C (in the same (any) range) and B and D (in the
+ * 0..256 range), to give a single value in the same range as A and C were. */
+#define FZ_COMBINE2(A,B,C,D) (FZ_COMBINE((A), (B)) + FZ_COMBINE((C), (D)))
+
+/* Blend SRC and DST (in the same range) together according to
+ * AMOUNT (in the 0...256 range). */
+#define FZ_BLEND(SRC, DST, AMOUNT) ((((SRC)-(DST))*(AMOUNT) + ((DST)<<8))>>8)
+
+
+float fz_matrix_expansion(fz_matrix m);
+float fz_matrix_max_expansion(fz_matrix m);
+
+
+void fz_gridfit_matrix(fz_matrix *m);
+
+/*
+ * Basic crypto functions.
+ * Independent of the rest of fitz.
+ * For further encapsulation in filters, or not.
+ */
+
+/* md5 digests */
+
+typedef struct fz_md5_s fz_md5;
+
+struct fz_md5_s
+{
+ unsigned int state[4];
+ unsigned int count[2];
+ unsigned char buffer[64];
+};
+
+void fz_md5_init(fz_md5 *state);
+void fz_md5_update(fz_md5 *state, const unsigned char *input, unsigned inlen);
+void fz_md5_final(fz_md5 *state, unsigned char digest[16]);
+
+/* sha-256 digests */
+
+typedef struct fz_sha256_s fz_sha256;
+
+struct fz_sha256_s
+{
+ unsigned int state[8];
+ unsigned int count[2];
+ union {
+ unsigned char u8[64];
+ unsigned int u32[16];
+ } buffer;
+};
+
+void fz_sha256_init(fz_sha256 *state);
+void fz_sha256_update(fz_sha256 *state, const unsigned char *input, unsigned int inlen);
+void fz_sha256_final(fz_sha256 *state, unsigned char digest[32]);
+
+/* arc4 crypto */
+
+typedef struct fz_arc4_s fz_arc4;
+
+struct fz_arc4_s
+{
+ unsigned x;
+ unsigned y;
+ unsigned char state[256];
+};
+
+void fz_arc4_init(fz_arc4 *state, const unsigned char *key, unsigned len);
+void fz_arc4_encrypt(fz_arc4 *state, unsigned char *dest, const unsigned char *src, unsigned len);
+
+/* AES block cipher implementation from XYSSL */
+
+typedef struct fz_aes_s fz_aes;
+
+#define AES_DECRYPT 0
+#define AES_ENCRYPT 1
+
+struct fz_aes_s
+{
+ int nr; /* number of rounds */
+ unsigned long *rk; /* AES round keys */
+ unsigned long buf[68]; /* unaligned data */
+};
+
+void aes_setkey_enc( fz_aes *ctx, const unsigned char *key, int keysize );
+void aes_setkey_dec( fz_aes *ctx, const unsigned char *key, int keysize );
+void aes_crypt_cbc( fz_aes *ctx, int mode, int length,
+ unsigned char iv[16],
+ const unsigned char *input,
+ unsigned char *output );
+
+struct fz_buffer_s
+{
+ int refs;
+ unsigned char *data;
+ int cap, len;
+};
+
+fz_buffer *fz_new_buffer(fz_context *ctx, int size);
+
+void fz_resize_buffer(fz_context *ctx, fz_buffer *buf, int size);
+void fz_grow_buffer(fz_context *ctx, fz_buffer *buf);
+void fz_trim_buffer(fz_context *ctx, fz_buffer *buf);
+
+/*
+ Resource store
+
+ MuPDF stores decoded "objects" into a store for potential reuse.
+ If the size of the store gets too big, objects stored within it can
+ be evicted and freed to recover space. When MuPDF comes to decode
+ such an object, it will check to see if a version of this object is
+ already in the store - if it is, it will simply reuse it. If not, it
+ will decode it and place it into the store.
+
+ All objects that can be placed into the store are derived from the
+ fz_storable type (i.e. this should be the first component of the
+ objects structure). This allows for consistent (thread safe)
+ reference counting, and includes a function that will be called to
+ free the object as soon as the reference count reaches zero.
+
+ Most objects offer fz_keep_XXXX/fz_drop_XXXX functions derived
+ from fz_keep_storable/fz_drop_storable. Creation of such objects
+ includes a call to FZ_INIT_STORABLE to set up the fz_storable header.
+ */
+
+typedef struct fz_storable_s fz_storable;
+
+typedef void (fz_store_free_fn)(fz_context *, fz_storable *);
+
+struct fz_storable_s {
+ int refs;
+ fz_store_free_fn *free;
+};
+
+#define FZ_INIT_STORABLE(S_,RC,FREE) \
+ do { fz_storable *S = &(S_)->storable; S->refs = (RC); \
+ S->free = (FREE); \
+ } while (0)
+
+void *fz_keep_storable(fz_context *, fz_storable *);
+void fz_drop_storable(fz_context *, fz_storable *);
+
+/*
+ The store can be seen as a dictionary that maps keys to fz_storable
+ values. In order to allow keys of different types to be stored, we
+ have a structure full of functions for each key 'type'; this
+ fz_store_type pointer is stored with each key, and tells the store
+ how to perform certain operations (like taking/dropping a reference,
+ comparing two keys, outputting details for debugging etc).
+
+ The store uses a hash table internally for speed where possible. In
+ order for this to work, we need a mechanism for turning a generic
+ 'key' into 'a hashable string'. For this purpose the type structure
+ contains a make_hash_key function pointer that maps from a void *
+ to an fz_store_hash structure. If make_hash_key function returns 0,
+ then the key is determined not to be hashable, and the value is
+ not stored in the hash table.
+*/
+typedef struct fz_store_hash_s fz_store_hash;
+
+struct fz_store_hash_s
+{
+ fz_store_free_fn *free;
+ union
+ {
+ struct
+ {
+ int i0;
+ int i1;
+ } i;
+ struct
+ {
+ void *ptr;
+ int i;
+ } pi;
+ } u;
+};
+
+typedef struct fz_store_type_s fz_store_type;
+
+struct fz_store_type_s
+{
+ int (*make_hash_key)(fz_store_hash *, void *);
+ void *(*keep_key)(fz_context *,void *);
+ void (*drop_key)(fz_context *,void *);
+ int (*cmp_key)(void *, void *);
+ void (*debug)(void *);
+};
+
+/*
+ fz_store_new_context: Create a new store inside the context
+
+ max: The maximum size (in bytes) that the store is allowed to grow
+ to. FZ_STORE_UNLIMITED means no limit.
+*/
+void fz_new_store_context(fz_context *ctx, unsigned int max);
+
+/*
+ fz_drop_store_context: Drop a reference to the store.
+*/
+void fz_drop_store_context(fz_context *ctx);
+
+/*
+ fz_keep_store_context: Take a reference to the store.
+*/
+fz_store *fz_keep_store_context(fz_context *ctx);
+
+/*
+ fz_debug_store: Dump the contents of the store for debugging.
+*/
+void fz_debug_store(fz_context *ctx);
+
+/*
+ fz_store_item: Add an item to the store.
+
+ Add an item into the store, returning NULL for success. If an item
+ with the same key is found in the store, then our item will not be
+ inserted, and the function will return a pointer to that value
+ instead. This function takes its own reference to val, as required
+ (i.e. the caller maintains ownership of its own reference).
+
+ key: The key to use to index the item.
+
+ val: The value to store.
+
+ itemsize: The size in bytes of the value (as counted towards the
+ store size).
+
+ type: Functions used to manipulate the key.
+*/
+void *fz_store_item(fz_context *ctx, void *key, void *val, unsigned int itemsize, fz_store_type *type);
+
+/*
+ fz_find_item: Find an item within the store.
+
+ free: The function used to free the value (to ensure we get a value
+ of the correct type).
+
+ key: The key to use to index the item.
+
+ type: Functions used to manipulate the key.
+
+ Returns NULL for not found, otherwise returns a pointer to the value
+ indexed by key to which a reference has been taken.
+*/
+void *fz_find_item(fz_context *ctx, fz_store_free_fn *free, void *key, fz_store_type *type);
+
+/*
+ fz_remove_item: Remove an item from the store.
+
+ If an item indexed by the given key exists in the store, remove it.
+
+ free: The function used to free the value (to ensure we get a value
+ of the correct type).
+
+ key: The key to use to find the item to remove.
+
+ type: Functions used to manipulate the key.
+*/
+void fz_remove_item(fz_context *ctx, fz_store_free_fn *free, void *key, fz_store_type *type);
+
+/*
+ fz_empty_store: Evict everything from the store.
+*/
+void fz_empty_store(fz_context *ctx);
+
+/*
+ fz_store_scavenge: Internal function used as part of the scavenging
+ allocator; when we fail to allocate memory, before returning a
+ failure to the caller, we try to scavenge space within the store by
+ evicting at least 'size' bytes. The allocator then retries.
+
+ size: The number of bytes we are trying to have free.
+
+ phase: What phase of the scavenge we are in. Updated on exit.
+
+ Returns non zero if we managed to free any memory.
+*/
+int fz_store_scavenge(fz_context *ctx, unsigned int size, int *phase);
+
+struct fz_stream_s
+{
+ fz_context *ctx;
+ int refs;
+ int error;
+ int eof;
+ int pos;
+ int avail;
+ int bits;
+ int locked;
+ unsigned char *bp, *rp, *wp, *ep;
+ void *state;
+ int (*read)(fz_stream *stm, unsigned char *buf, int len);
+ void (*close)(fz_context *ctx, void *state);
+ void (*seek)(fz_stream *stm, int offset, int whence);
+ unsigned char buf[4096];
+};
+
+/*
+ fz_open_file: Open the named file and wrap it in a stream.
+
+ filename: Path to a file as it would be given to open(2).
+*/
+fz_stream *fz_open_file(fz_context *ctx, const char *filename);
+
+/*
+ fz_open_file_w: Open the named file and wrap it in a stream.
+
+ This function is only available when compiling for Win32.
+
+ filename: Wide character path to the file as it would be given
+ to _wopen().
+*/
+fz_stream *fz_open_file_w(fz_context *ctx, const wchar_t *filename);
+
+
+/*
+ fz_open_buffer: XXX
+*/
+fz_stream *fz_open_buffer(fz_context *ctx, fz_buffer *buf);
+
+/*
+ fz_open_memory: XXX
+*/
+fz_stream *fz_open_memory(fz_context *ctx, unsigned char *data, int len);
+
+void fz_lock_stream(fz_stream *stm);
+
+fz_stream *fz_new_stream(fz_context *ctx, void*, int(*)(fz_stream*, unsigned char*, int), void(*)(fz_context *, void *));
+fz_stream *fz_keep_stream(fz_stream *stm);
+void fz_fill_buffer(fz_stream *stm);
+
+int fz_tell(fz_stream *stm);
+void fz_seek(fz_stream *stm, int offset, int whence);
+
+int fz_read(fz_stream *stm, unsigned char *buf, int len);
+void fz_read_line(fz_stream *stm, char *buf, int max);
+fz_buffer *fz_read_all(fz_stream *stm, int initial);
+
+static inline int fz_read_byte(fz_stream *stm)
+{
+ if (stm->rp == stm->wp)
+ {
+ fz_fill_buffer(stm);
+ return stm->rp < stm->wp ? *stm->rp++ : EOF;
+ }
+ return *stm->rp++;
+}
+
+static inline int fz_peek_byte(fz_stream *stm)
+{
+ if (stm->rp == stm->wp)
+ {
+ fz_fill_buffer(stm);
+ return stm->rp < stm->wp ? *stm->rp : EOF;
+ }
+ return *stm->rp;
+}
+
+static inline void fz_unread_byte(fz_stream *stm)
+{
+ if (stm->rp > stm->bp)
+ stm->rp--;
+}
+
+static inline int fz_is_eof(fz_stream *stm)
+{
+ if (stm->rp == stm->wp)
+ {
+ if (stm->eof)
+ return 1;
+ return fz_peek_byte(stm) == EOF;
+ }
+ return 0;
+}
+
+static inline unsigned int fz_read_bits(fz_stream *stm, int n)
+{
+ unsigned int x;
+
+ if (n <= stm->avail)
+ {
+ stm->avail -= n;
+ x = (stm->bits >> stm->avail) & ((1 << n) - 1);
+ }
+ else
+ {
+ x = stm->bits & ((1 << stm->avail) - 1);
+ n -= stm->avail;
+ stm->avail = 0;
+
+ while (n > 8)
+ {
+ x = (x << 8) | fz_read_byte(stm);
+ n -= 8;
+ }
+
+ if (n > 0)
+ {
+ stm->bits = fz_read_byte(stm);
+ stm->avail = 8 - n;
+ x = (x << n) | (stm->bits >> stm->avail);
+ }
+ }
+
+ return x;
+}
+
+static inline void fz_sync_bits(fz_stream *stm)
+{
+ stm->avail = 0;
+}
+
+static inline int fz_is_eof_bits(fz_stream *stm)
+{
+ return fz_is_eof(stm) && (stm->avail == 0 || stm->bits == EOF);
+}
+
+/*
+ * Data filters.
+ */
+
+fz_stream *fz_open_copy(fz_stream *chain);
+fz_stream *fz_open_null(fz_stream *chain, int len);
+fz_stream *fz_open_arc4(fz_stream *chain, unsigned char *key, unsigned keylen);
+fz_stream *fz_open_aesd(fz_stream *chain, unsigned char *key, unsigned keylen);
+fz_stream *fz_open_a85d(fz_stream *chain);
+fz_stream *fz_open_ahxd(fz_stream *chain);
+fz_stream *fz_open_rld(fz_stream *chain);
+fz_stream *fz_open_dctd(fz_stream *chain, int color_transform);
+fz_stream *fz_open_resized_dctd(fz_stream *chain, int color_transform, int factor);
+fz_stream *fz_open_faxd(fz_stream *chain,
+ int k, int end_of_line, int encoded_byte_align,
+ int columns, int rows, int end_of_block, int black_is_1);
+fz_stream *fz_open_flated(fz_stream *chain);
+fz_stream *fz_open_lzwd(fz_stream *chain, int early_change);
+fz_stream *fz_open_predict(fz_stream *chain, int predictor, int columns, int colors, int bpc);
+fz_stream *fz_open_jbig2d(fz_stream *chain, fz_buffer *global);
+
+/*
+ * Resources and other graphics related objects.
+ */
+
+enum { FZ_MAX_COLORS = 32 };
+
+int fz_find_blendmode(char *name);
+char *fz_blendmode_name(int blendmode);
+
+/*
+ fz_pixmap is an image XXX
+
+ x, y: XXX
+
+ w, h: The width and height of the image in pixels.
+
+ n: The number of color components in the image. Always
+ includes a separate alpha channel. XXX RGBA=4
+
+ interpolate: A boolean flag set to non-zero if the image
+ will be drawn using linear interpolation, or set to zero if
+ image will be using nearest neighbour sampling.
+
+ xres, yres: Image resolution in dpi. Default is 96 dpi.
+
+ colorspace: XXX
+
+ samples:
+
+ free_samples: Is zero when an application has provided its own
+ buffer for pixel data through fz_new_pixmap_with_rect_and_data.
+ If not zero the buffer will be freed when fz_drop_pixmap is
+ called for the pixmap.
+*/
+struct fz_pixmap_s
+{
+ fz_storable storable;
+ int x, y, w, h, n;
+ int interpolate;
+ int xres, yres;
+ fz_colorspace *colorspace;
+ unsigned char *samples;
+ int free_samples;
+};
+
+
+fz_pixmap *fz_new_pixmap_with_data(fz_context *ctx, fz_colorspace *colorspace, int w, int h, unsigned char *samples);
+
+/*
+ fz_new_pixmap_with_rect_and_data: Create a pixmap using the
+ provided buffer for pixel data.
+
+ While fz_new_pixmap_with_rect allocates its own buffer for
+ pixel data, fz_new_pixmap_with_rect_and_data lets the caller
+ allocate and provide a buffer to be used. Otherwise the two
+ functions are identical.
+
+ samples: An array of pixel samples. The created pixmap will
+ keep a pointer to the array so it must not be modified or
+ freed until the created pixmap is dropped and freed by
+ fz_drop_pixmap.
+*/
+fz_pixmap *fz_new_pixmap_with_rect_and_data(fz_context *ctx,
+fz_colorspace *colorspace, fz_bbox bbox, unsigned char *samples);
+fz_pixmap *fz_new_pixmap(fz_context *ctx, fz_colorspace *, int w, int h);
+
+void fz_free_pixmap_imp(fz_context *ctx, fz_storable *pix);
+
+void fz_clear_pixmap_rect_with_value(fz_context *ctx, fz_pixmap *pix, int value, fz_bbox r);
+void fz_copy_pixmap_rect(fz_context *ctx, fz_pixmap *dest, fz_pixmap *src, fz_bbox r);
+void fz_premultiply_pixmap(fz_context *ctx, fz_pixmap *pix);
+fz_pixmap *fz_alpha_from_gray(fz_context *ctx, fz_pixmap *gray, int luminosity);
+unsigned int fz_pixmap_size(fz_context *ctx, fz_pixmap *pix);
+
+fz_pixmap *fz_scale_pixmap(fz_context *ctx, fz_pixmap *src, float x, float y, float w, float h, fz_bbox *clip);
+
+struct fz_image_s
+{
+ fz_storable storable;
+ int w, h;
+ fz_image *mask;
+ fz_colorspace *colorspace;
+ fz_pixmap *(*get_pixmap)(fz_context *, fz_image *, int w, int h);
+};
+
+fz_pixmap *fz_load_jpx(fz_context *ctx, unsigned char *data, int size, fz_colorspace *cs);
+fz_pixmap *fz_load_jpeg(fz_context *doc, unsigned char *data, int size);
+fz_pixmap *fz_load_png(fz_context *doc, unsigned char *data, int size);
+fz_pixmap *fz_load_tiff(fz_context *doc, unsigned char *data, int size);
+
+struct fz_bitmap_s
+{
+ int refs;
+ int w, h, stride, n;
+ unsigned char *samples;
+};
+
+fz_bitmap *fz_new_bitmap(fz_context *ctx, int w, int h, int n);
+fz_bitmap *fz_keep_bitmap(fz_context *ctx, fz_bitmap *bit);
+void fz_clear_bitmap(fz_context *ctx, fz_bitmap *bit);
+
+
+struct fz_halftone_s
+{
+ int refs;
+ int n;
+ fz_pixmap *comp[1];
+};
+
+fz_halftone *fz_new_halftone(fz_context *ctx, int num_comps);
+fz_halftone *fz_keep_halftone(fz_context *ctx, fz_halftone *half);
+
+
+struct fz_colorspace_s
+{
+ fz_storable storable;
+ unsigned int size;
+ char name[16];
+ int n;
+ void (*to_rgb)(fz_context *ctx, fz_colorspace *, float *src, float *rgb);
+ void (*from_rgb)(fz_context *ctx, fz_colorspace *, float *rgb, float *dst);
+ void (*free_data)(fz_context *Ctx, fz_colorspace *);
+ void *data;
+};
+
+fz_colorspace *fz_new_colorspace(fz_context *ctx, char *name, int n);
+fz_colorspace *fz_keep_colorspace(fz_context *ctx, fz_colorspace *colorspace);
+void fz_drop_colorspace(fz_context *ctx, fz_colorspace *colorspace);
+void fz_free_colorspace_imp(fz_context *ctx, fz_storable *colorspace);
+
+void fz_convert_color(fz_context *ctx, fz_colorspace *srcs, float *srcv, fz_colorspace *dsts, float *dstv);
+void fz_convert_pixmap(fz_context *ctx, fz_pixmap *src, fz_pixmap *dst);
+
+fz_colorspace *fz_find_device_colorspace(char *name);
+
+/*
+ * Fonts come in two variants:
+ * Regular fonts are handled by FreeType.
+ * Type 3 fonts have callbacks to the interpreter.
+ */
+
+char *ft_error_string(int err);
+
+struct fz_font_s
+{
+ int refs;
+ char name[32];
+
+ void *ft_face; /* has an FT_Face if used */
+ int ft_substitute; /* ... substitute metrics */
+ int ft_bold; /* ... synthesize bold */
+ int ft_italic; /* ... synthesize italic */
+ int ft_hint; /* ... force hinting for DynaLab fonts */
+
+ /* origin of font data */
+ char *ft_file;
+ unsigned char *ft_data;
+ int ft_size;
+
+ fz_matrix t3matrix;
+ void *t3resources;
+ fz_buffer **t3procs; /* has 256 entries if used */
+ float *t3widths; /* has 256 entries if used */
+ char *t3flags; /* has 256 entries if used */
+ void *t3doc; /* a pdf_document for the callback */
+ void (*t3run)(void *doc, void *resources, fz_buffer *contents, fz_device *dev, fz_matrix ctm, void *gstate);
+ void (*t3freeres)(void *doc, void *resources);
+
+ fz_rect bbox; /* font bbox is used only for t3 fonts */
+
+ /* per glyph bounding box cache */
+ int use_glyph_bbox;
+ int bbox_count;
+ fz_rect *bbox_table;
+
+ /* substitute metrics */
+ int width_count;
+ int *width_table; /* in 1000 units */
+};
+
+void fz_new_font_context(fz_context *ctx);
+fz_font_context *fz_keep_font_context(fz_context *ctx);
+void fz_drop_font_context(fz_context *ctx);
+
+fz_font *fz_new_type3_font(fz_context *ctx, char *name, fz_matrix matrix);
+
+fz_font *fz_new_font_from_memory(fz_context *ctx, unsigned char *data, int len, int index, int use_glyph_bbox);
+fz_font *fz_new_font_from_file(fz_context *ctx, char *path, int index, int use_glyph_bbox);
+
+fz_font *fz_keep_font(fz_context *ctx, fz_font *font);
+void fz_drop_font(fz_context *ctx, fz_font *font);
+
+void fz_debug_font(fz_context *ctx, fz_font *font);
+
+void fz_set_font_bbox(fz_context *ctx, fz_font *font, float xmin, float ymin, float xmax, float ymax);
+fz_rect fz_bound_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix trm);
+int fz_glyph_cacheable(fz_context *ctx, fz_font *font, int gid);
+
+/*
+ * Vector path buffer.
+ * It can be stroked and dashed, or be filled.
+ * It has a fill rule (nonzero or even_odd).
+ *
+ * When rendering, they are flattened, stroked and dashed straight
+ * into the Global Edge List.
+ */
+
+typedef struct fz_path_s fz_path;
+typedef struct fz_stroke_state_s fz_stroke_state;
+
+typedef union fz_path_item_s fz_path_item;
+
+typedef enum fz_path_item_kind_e
+{
+ FZ_MOVETO,
+ FZ_LINETO,
+ FZ_CURVETO,
+ FZ_CLOSE_PATH
+} fz_path_item_kind;
+
+typedef enum fz_linecap_e
+{
+ FZ_LINECAP_BUTT = 0,
+ FZ_LINECAP_ROUND = 1,
+ FZ_LINECAP_SQUARE = 2,
+ FZ_LINECAP_TRIANGLE = 3
+} fz_linecap;
+
+typedef enum fz_linejoin_e
+{
+ FZ_LINEJOIN_MITER = 0,
+ FZ_LINEJOIN_ROUND = 1,
+ FZ_LINEJOIN_BEVEL = 2,
+ FZ_LINEJOIN_MITER_XPS = 3
+} fz_linejoin;
+
+union fz_path_item_s
+{
+ fz_path_item_kind k;
+ float v;
+};
+
+struct fz_path_s
+{
+ int len, cap;
+ fz_path_item *items;
+ int last;
+};
+
+struct fz_stroke_state_s
+{
+ fz_linecap start_cap, dash_cap, end_cap;
+ fz_linejoin linejoin;
+ float linewidth;
+ float miterlimit;
+ float dash_phase;
+ int dash_len;
+ float dash_list[32];
+};
+
+fz_path *fz_new_path(fz_context *ctx);
+void fz_moveto(fz_context*, fz_path*, float x, float y);
+void fz_lineto(fz_context*, fz_path*, float x, float y);
+void fz_curveto(fz_context*,fz_path*, float, float, float, float, float, float);
+void fz_curvetov(fz_context*,fz_path*, float, float, float, float);
+void fz_curvetoy(fz_context*,fz_path*, float, float, float, float);
+void fz_closepath(fz_context*,fz_path*);
+void fz_free_path(fz_context *ctx, fz_path *path);
+
+void fz_transform_path(fz_context *ctx, fz_path *path, fz_matrix transform);
+
+fz_path *fz_clone_path(fz_context *ctx, fz_path *old);
+
+fz_rect fz_bound_path(fz_context *ctx, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm);
+void fz_debug_path(fz_context *ctx, fz_path *, int indent);
+
+/*
+ * Glyph cache
+ */
+
+void fz_new_glyph_cache_context(fz_context *ctx);
+fz_glyph_cache *fz_keep_glyph_cache(fz_context *ctx);
+void fz_drop_glyph_cache_context(fz_context *ctx);
+void fz_purge_glyph_cache(fz_context *ctx);
+
+fz_pixmap *fz_render_ft_glyph(fz_context *ctx, fz_font *font, int cid, fz_matrix trm);
+fz_pixmap *fz_render_t3_glyph(fz_context *ctx, fz_font *font, int cid, fz_matrix trm, fz_colorspace *model);
+fz_pixmap *fz_render_ft_stroked_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix trm, fz_matrix ctm, fz_stroke_state *state);
+fz_pixmap *fz_render_glyph(fz_context *ctx, fz_font*, int, fz_matrix, fz_colorspace *model);
+fz_pixmap *fz_render_stroked_glyph(fz_context *ctx, fz_font*, int, fz_matrix, fz_matrix, fz_stroke_state *stroke);
+void fz_render_t3_glyph_direct(fz_context *ctx, fz_device *dev, fz_font *font, int gid, fz_matrix trm, void *gstate);
+
+/*
+ * Text buffer.
+ *
+ * The trm field contains the a, b, c and d coefficients.
+ * The e and f coefficients come from the individual elements,
+ * together they form the transform matrix for the glyph.
+ *
+ * Glyphs are referenced by glyph ID.
+ * The Unicode text equivalent is kept in a separate array
+ * with indexes into the glyph array.
+ */
+
+typedef struct fz_text_s fz_text;
+typedef struct fz_text_item_s fz_text_item;
+
+struct fz_text_item_s
+{
+ float x, y;
+ int gid; /* -1 for one gid to many ucs mappings */
+ int ucs; /* -1 for one ucs to many gid mappings */
+};
+
+struct fz_text_s
+{
+ fz_font *font;
+ fz_matrix trm;
+ int wmode;
+ int len, cap;
+ fz_text_item *items;
+};
+
+fz_text *fz_new_text(fz_context *ctx, fz_font *face, fz_matrix trm, int wmode);
+void fz_add_text(fz_context *ctx, fz_text *text, int gid, int ucs, float x, float y);
+void fz_free_text(fz_context *ctx, fz_text *text);
+fz_rect fz_bound_text(fz_context *ctx, fz_text *text, fz_matrix ctm);
+fz_text *fz_clone_text(fz_context *ctx, fz_text *old);
+void fz_debug_text(fz_context *ctx, fz_text*, int indent);
+
+/*
+ * The shading code uses gouraud shaded triangle meshes.
+ */
+
+enum
+{
+ FZ_LINEAR,
+ FZ_RADIAL,
+ FZ_MESH,
+};
+
+typedef struct fz_shade_s fz_shade;
+
+struct fz_shade_s
+{
+ fz_storable storable;
+
+ fz_rect bbox; /* can be fz_infinite_rect */
+ fz_colorspace *colorspace;
+
+ fz_matrix matrix; /* matrix from pattern dict */
+ int use_background; /* background color for fills but not 'sh' */
+ float background[FZ_MAX_COLORS];
+
+ int use_function;
+ float function[256][FZ_MAX_COLORS + 1];
+
+ int type; /* linear, radial, mesh */
+ int extend[2];
+
+ int mesh_len;
+ int mesh_cap;
+ float *mesh; /* [x y 0], [x y r], [x y t] or [x y c1 ... cn] */
+};
+
+fz_shade *fz_keep_shade(fz_context *ctx, fz_shade *shade);
+void fz_drop_shade(fz_context *ctx, fz_shade *shade);
+void fz_free_shade_imp(fz_context *ctx, fz_storable *shade);
+void fz_debug_shade(fz_context *ctx, fz_shade *shade);
+
+fz_rect fz_bound_shade(fz_context *ctx, fz_shade *shade, fz_matrix ctm);
+void fz_paint_shade(fz_context *ctx, fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox);
+
+/*
+ * Scan converter
+ */
+
+typedef struct fz_gel_s fz_gel;
+
+fz_gel *fz_new_gel(fz_context *ctx);
+void fz_insert_gel(fz_gel *gel, float x0, float y0, float x1, float y1);
+void fz_reset_gel(fz_gel *gel, fz_bbox clip);
+void fz_sort_gel(fz_gel *gel);
+fz_bbox fz_bound_gel(fz_gel *gel);
+void fz_free_gel(fz_gel *gel);
+int fz_is_rect_gel(fz_gel *gel);
+
+void fz_scan_convert(fz_gel *gel, int eofill, fz_bbox clip, fz_pixmap *pix, unsigned char *colorbv);
+
+void fz_flatten_fill_path(fz_gel *gel, fz_path *path, fz_matrix ctm, float flatness);
+void fz_flatten_stroke_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, float flatness, float linewidth);
+void fz_flatten_dash_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, float flatness, float linewidth);
+
+/*
+ * The device interface.
+ */
+
+enum
+{
+ /* Hints */
+ FZ_IGNORE_IMAGE = 1,
+ FZ_IGNORE_SHADE = 2,
+
+ /* Flags */
+ FZ_DEVFLAG_MASK = 1,
+ FZ_DEVFLAG_COLOR = 2,
+ FZ_DEVFLAG_UNCACHEABLE = 4,
+ FZ_DEVFLAG_FILLCOLOR_UNDEFINED = 8,
+ FZ_DEVFLAG_STROKECOLOR_UNDEFINED = 16,
+ FZ_DEVFLAG_STARTCAP_UNDEFINED = 32,
+ FZ_DEVFLAG_DASHCAP_UNDEFINED = 64,
+ FZ_DEVFLAG_ENDCAP_UNDEFINED = 128,
+ FZ_DEVFLAG_LINEJOIN_UNDEFINED = 256,
+ FZ_DEVFLAG_MITERLIMIT_UNDEFINED = 512,
+ FZ_DEVFLAG_LINEWIDTH_UNDEFINED = 1024,
+ /* Arguably we should have a bit for the dash pattern itself being
+ * undefined, but that causes problems; do we assume that it should
+ * always be set to non-dashing at the start of every glyph? */
+};
+
+struct fz_device_s
+{
+ int hints;
+ int flags;
+
+ void *user;
+ void (*free_user)(fz_device *);
+ fz_context *ctx;
+
+ void (*fill_path)(fz_device *, fz_path *, int even_odd, fz_matrix, fz_colorspace *, float *color, float alpha);
+ void (*stroke_path)(fz_device *, fz_path *, fz_stroke_state *, fz_matrix, fz_colorspace *, float *color, float alpha);
+ void (*clip_path)(fz_device *, fz_path *, fz_rect *rect, int even_odd, fz_matrix);
+ void (*clip_stroke_path)(fz_device *, fz_path *, fz_rect *rect, fz_stroke_state *, fz_matrix);
+
+ void (*fill_text)(fz_device *, fz_text *, fz_matrix, fz_colorspace *, float *color, float alpha);
+ void (*stroke_text)(fz_device *, fz_text *, fz_stroke_state *, fz_matrix, fz_colorspace *, float *color, float alpha);
+ void (*clip_text)(fz_device *, fz_text *, fz_matrix, int accumulate);
+ void (*clip_stroke_text)(fz_device *, fz_text *, fz_stroke_state *, fz_matrix);
+ void (*ignore_text)(fz_device *, fz_text *, fz_matrix);
+
+ void (*fill_shade)(fz_device *, fz_shade *shd, fz_matrix ctm, float alpha);
+ void (*fill_image)(fz_device *, fz_image *img, fz_matrix ctm, float alpha);
+ void (*fill_image_mask)(fz_device *, fz_image *img, fz_matrix ctm, fz_colorspace *, float *color, float alpha);
+ void (*clip_image_mask)(fz_device *, fz_image *img, fz_rect *rect, fz_matrix ctm);
+
+ void (*pop_clip)(fz_device *);
+
+ void (*begin_mask)(fz_device *, fz_rect, int luminosity, fz_colorspace *, float *bc);
+ void (*end_mask)(fz_device *);
+ void (*begin_group)(fz_device *, fz_rect, int isolated, int knockout, int blendmode, float alpha);
+ void (*end_group)(fz_device *);
+
+ void (*begin_tile)(fz_device *, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm);
+ void (*end_tile)(fz_device *);
+};
+
+void fz_fill_path(fz_device *dev, fz_path *path, int even_odd, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
+void fz_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
+void fz_clip_path(fz_device *dev, fz_path *path, fz_rect *rect, int even_odd, fz_matrix ctm);
+void fz_clip_stroke_path(fz_device *dev, fz_path *path, fz_rect *rect, fz_stroke_state *stroke, fz_matrix ctm);
+void fz_fill_text(fz_device *dev, fz_text *text, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
+void fz_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
+void fz_clip_text(fz_device *dev, fz_text *text, fz_matrix ctm, int accumulate);
+void fz_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm);
+void fz_ignore_text(fz_device *dev, fz_text *text, fz_matrix ctm);
+void fz_pop_clip(fz_device *dev);
+void fz_fill_shade(fz_device *dev, fz_shade *shade, fz_matrix ctm, float alpha);
+void fz_fill_image(fz_device *dev, fz_image *image, fz_matrix ctm, float alpha);
+void fz_fill_image_mask(fz_device *dev, fz_image *image, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
+void fz_clip_image_mask(fz_device *dev, fz_image *image, fz_rect *rect, fz_matrix ctm);
+void fz_begin_mask(fz_device *dev, fz_rect area, int luminosity, fz_colorspace *colorspace, float *bc);
+void fz_end_mask(fz_device *dev);
+void fz_begin_group(fz_device *dev, fz_rect area, int isolated, int knockout, int blendmode, float alpha);
+void fz_end_group(fz_device *dev);
+void fz_begin_tile(fz_device *dev, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm);
+void fz_end_tile(fz_device *dev);
+
+fz_device *fz_new_device(fz_context *ctx, void *user);
+
+
+
+/*
+ * Plotting functions.
+ */
+
+void fz_decode_tile(fz_pixmap *pix, float *decode);
+void fz_decode_indexed_tile(fz_pixmap *pix, float *decode, int maxval);
+void fz_unpack_tile(fz_pixmap *dst, unsigned char * restrict src, int n, int depth, int stride, int scale);
+
+void fz_paint_solid_alpha(unsigned char * restrict dp, int w, int alpha);
+void fz_paint_solid_color(unsigned char * restrict dp, int n, int w, unsigned char *color);
+
+void fz_paint_span(unsigned char * restrict dp, unsigned char * restrict sp, int n, int w, int alpha);
+void fz_paint_span_with_color(unsigned char * restrict dp, unsigned char * restrict mp, int n, int w, unsigned char *color);
+
+void fz_paint_image(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, int alpha);
+void fz_paint_image_with_color(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, unsigned char *colorbv);
+
+void fz_paint_pixmap(fz_pixmap *dst, fz_pixmap *src, int alpha);
+void fz_paint_pixmap_with_mask(fz_pixmap *dst, fz_pixmap *src, fz_pixmap *msk);
+void fz_paint_pixmap_with_rect(fz_pixmap *dst, fz_pixmap *src, int alpha, fz_bbox bbox);
+
+void fz_blend_pixmap(fz_pixmap *dst, fz_pixmap *src, int alpha, int blendmode, int isolated, fz_pixmap *shape);
+void fz_blend_pixel(unsigned char dp[3], unsigned char bp[3], unsigned char sp[3], int blendmode);
+
+enum
+{
+ /* PDF 1.4 -- standard separable */
+ FZ_BLEND_NORMAL,
+ FZ_BLEND_MULTIPLY,
+ FZ_BLEND_SCREEN,
+ FZ_BLEND_OVERLAY,
+ FZ_BLEND_DARKEN,
+ FZ_BLEND_LIGHTEN,
+ FZ_BLEND_COLOR_DODGE,
+ FZ_BLEND_COLOR_BURN,
+ FZ_BLEND_HARD_LIGHT,
+ FZ_BLEND_SOFT_LIGHT,
+ FZ_BLEND_DIFFERENCE,
+ FZ_BLEND_EXCLUSION,
+
+ /* PDF 1.4 -- standard non-separable */
+ FZ_BLEND_HUE,
+ FZ_BLEND_SATURATION,
+ FZ_BLEND_COLOR,
+ FZ_BLEND_LUMINOSITY,
+
+ /* For packing purposes */
+ FZ_BLEND_MODEMASK = 15,
+ FZ_BLEND_ISOLATED = 16,
+ FZ_BLEND_KNOCKOUT = 32
+};
+
+struct fz_document_s
+{
+ void (*close)(fz_document *);
+ int (*needs_password)(fz_document *doc);
+ int (*authenticate_password)(fz_document *doc, char *password);
+ fz_outline *(*load_outline)(fz_document *doc);
+ int (*count_pages)(fz_document *doc);
+ fz_page *(*load_page)(fz_document *doc, int number);
+ fz_link *(*load_links)(fz_document *doc, fz_page *page);
+ fz_rect (*bound_page)(fz_document *doc, fz_page *page);
+ void (*run_page)(fz_document *doc, fz_page *page, fz_device *dev, fz_matrix transform, fz_cookie *cookie);
+ void (*free_page)(fz_document *doc, fz_page *page);
+};
+
+#endif
diff --git a/fitz/fitz.h b/fitz/fitz.h
index 594bc4e9..732f2fc7 100644
--- a/fitz/fitz.h
+++ b/fitz/fitz.h
@@ -2,8 +2,8 @@
#define _FITZ_H_
/*
- * Include the standard libc headers.
- */
+ Include the standard libc headers.
+*/
#include <stdio.h>
#include <stdlib.h>
@@ -48,8 +48,8 @@
#define CLAMP(x,a,b) ( (x) > (b) ? (b) : ( (x) < (a) ? (a) : (x) ) )
/*
- * Some differences in libc can be smoothed over
- */
+ Some differences in libc can be smoothed over
+*/
#ifdef _MSC_VER /* Microsoft Visual C */
@@ -82,8 +82,8 @@ int gettimeofday(struct timeval *tv, struct timezone *tz);
#endif
/*
- * Variadic macros, inline and restrict keywords
- */
+ Variadic macros, inline and restrict keywords
+*/
#if __STDC_VERSION__ == 199901L /* C99 */
#elif _MSC_VER >= 1500 /* MSVC 9 or newer */
@@ -98,8 +98,8 @@ int gettimeofday(struct timeval *tv, struct timezone *tz);
#endif
/*
- * GCC can do type checking of printf strings
- */
+ GCC can do type checking of printf strings
+*/
#ifndef __printflike
#if __GNUC__ > 2 || __GNUC__ == 2 && __GNUC_MINOR__ >= 7
@@ -146,8 +146,10 @@ struct fz_error_context_s
void fz_var_imp(void *);
#define fz_var(var) fz_var_imp((void *)&(var))
-/* Exception macro definitions. Just treat these as a black box - pay no
- * attention to the man behind the curtain. */
+/*
+ Exception macro definitions. Just treat these as a black box - pay no
+ attention to the man behind the curtain.
+*/
#define fz_try(ctx) \
if (fz_push_try(ctx->error), \
@@ -164,77 +166,11 @@ void fz_var_imp(void *);
} \
if (ctx->error->stack[ctx->error->top--].code)
-/*
-
-We also include a couple of other formulations of the macros, with
-different strengths and weaknesses. These will be removed shortly, but
-I want them in git for at least 1 revision so I have a record of them.
-
-A formulation of try/always/catch that lifts limitation 2 above, but
-has problems when try/catch are nested in the same function; the inner
-nestings need to use fz_always_(ctx, label) and fz_catch_(ctx, label)
-instead. This was held as too high a price to pay to drop limitation 2.
-
-#define fz_try(ctx) \
- if (fz_push_try(ctx->error), \
- (ctx->error->stack[ctx->error->top].code = fz_setjmp(ctx->error->stack[ctx->error->top].buffer)) == 0) \
- { do {
-
-#define fz_always_(ctx, label) \
- } while (0); \
- goto ALWAYS_LABEL_ ## label ; \
- } \
- else if (ctx->error->stack[ctx->error->top].code) \
- { ALWAYS_LABEL_ ## label : \
- do {
-
-#define fz_catch_(ctx, label) \
- } while(0); \
- if (ctx->error->stack[ctx->error->top--].code) \
- goto CATCH_LABEL_ ## label; \
- } \
- else if (ctx->error->top--, 1) \
- CATCH_LABEL ## label:
-
-#define fz_always(ctx) fz_always_(ctx, TOP)
-#define fz_catch(ctx) fz_catch_(ctx, TOP)
-
-Another alternative formulation, that again removes limitation 2, but at
-the cost of an always block always costing us 1 extra longjmp per
-execution. Again this was felt to be too high a cost to use.
-
-#define fz_try(ctx) \
- if (fz_push_try(ctx->error), \
- (ctx->error->stack[ctx->error->top].code = fz_setjmp(ctx->error->stack[ctx->error->top].buffer)) == 0) \
- { do {
-
-#define fz_always(ctx) \
- } while (0); \
- fz_longjmp(ctx->error->stack[ctx->error->top].buffer, 3); \
- } \
- else if (ctx->error->stack[ctx->error->top].code & 1) \
- { do {
-
-#define fz_catch(ctx) \
- } while(0); \
- if (ctx->error->stack[ctx->error->top].code == 1) \
- fz_longjmp(ctx->error->stack[ctx->error->top].buffer, 2); \
- ctx->error->top--;\
- } \
- else if (ctx->error->top--, 1)
-*/
-
void fz_push_try(fz_error_context *ex);
void fz_throw(fz_context *, char *, ...) __printflike(2, 3);
void fz_rethrow(fz_context *);
-
-struct fz_warn_context_s
-{
- char message[256];
- int count;
-};
-
void fz_warn(fz_context *ctx, char *fmt, ...) __printflike(2, 3);
+
/*
fz_flush_warnings: Flush any repeated warnings.
@@ -261,6 +197,20 @@ struct fz_context_s
};
/*
+ Specifies the maximum size in bytes of the resource store in
+ fz_context. Given as argument to fz_new_context.
+
+ FZ_STORE_UNLIMITED: Let resource store grow unbounded.
+
+ FZ_STORE_DEFAULT: A reasonable upper bound on the size, for
+ devices that are not memory constrained.
+*/
+enum {
+ FZ_STORE_UNLIMITED = 0,
+ FZ_STORE_DEFAULT = 256 << 20,
+};
+
+/*
fz_new_context: Allocate context containing global state.
The global state contains an exception stack, resource store,
@@ -306,7 +256,6 @@ fz_context *fz_new_context(fz_alloc_context *alloc, fz_locks_context *locks, uns
Does not throw exception, but may return NULL.
*/
fz_context *fz_clone_context(fz_context *ctx);
-fz_context *fz_clone_context_internal(fz_context *ctx);
/*
fz_free_context: Free a context and its global state.
@@ -319,8 +268,19 @@ fz_context *fz_clone_context_internal(fz_context *ctx);
*/
void fz_free_context(fz_context *ctx);
-void fz_new_aa_context(fz_context *ctx);
-void fz_free_aa_context(fz_context *ctx);
+/*
+ fz_get_aa_level: Get the number of bits of antialiasing we are
+ using. Between 0 and 8.
+*/
+int fz_get_aa_level(fz_context *ctx);
+
+/*
+ fz_set_aa_level: Set the number of bits of antialiasing we should use.
+
+ bits: The number of bits of antialiasing to use (values are clamped
+ to within the 0 to 8 range).
+*/
+void fz_set_aa_level(fz_context *ctx, int bits);
/*
Locking functions
@@ -343,15 +303,11 @@ void fz_free_aa_context(fz_context *ctx);
enabled by defining FITZ_DEBUG_LOCKING.
*/
-#if defined(MEMENTO) || defined(DEBUG)
-#define FITZ_DEBUG_LOCKING
-#endif
-
struct fz_locks_context_s
{
void *user;
- void (*lock)(void *, int);
- void (*unlock)(void *, int);
+ void (*lock)(void *user, int lock);
+ void (*unlock)(void *user, int lock);
};
enum {
@@ -365,43 +321,6 @@ enum {
/* Default locks */
extern fz_locks_context fz_locks_default;
-#ifdef FITZ_DEBUG_LOCKING
-
-void fz_assert_lock_held(fz_context *ctx, int lock);
-void fz_assert_lock_not_held(fz_context *ctx, int lock);
-void fz_lock_debug_lock(fz_context *ctx, int lock);
-void fz_lock_debug_unlock(fz_context *ctx, int lock);
-
-#else
-
-#define fz_assert_lock_held(A,B) do { } while (0)
-#define fz_assert_lock_not_held(A,B) do { } while (0)
-#define fz_lock_debug_lock(A,B) do { } while (0)
-#define fz_lock_debug_unlock(A,B) do { } while (0)
-
-#endif /* !FITZ_DEBUG_LOCKING */
-
-static inline void
-fz_lock(fz_context *ctx, int lock)
-{
- fz_lock_debug_lock(ctx, lock);
- ctx->locks->lock(ctx->locks->user, lock);
-}
-
-static inline void
-fz_unlock(fz_context *ctx, int lock)
-{
- fz_lock_debug_unlock(ctx, lock);
- ctx->locks->unlock(ctx->locks->user, lock);
-}
-
-
-/*
- * Basic runtime and utility functions
- */
-
-/* memory allocation */
-
/* The following throw exceptions on failure to allocate */
void *fz_malloc(fz_context *ctx, unsigned int size);
void *fz_calloc(fz_context *ctx, unsigned int count, unsigned int size);
@@ -416,7 +335,7 @@ char *fz_strdup(fz_context *ctx, char *s);
*/
void fz_free(fz_context *ctx, void *p);
-/* The following returns NULL on failure to allocate */
+/* The following return NULL on failure to allocate */
void *fz_malloc_no_throw(fz_context *ctx, unsigned int size);
void *fz_malloc_array_no_throw(fz_context *ctx, unsigned int count, unsigned int size);
void *fz_calloc_no_throw(fz_context *ctx, unsigned int count, unsigned int size);
@@ -427,74 +346,19 @@ char *fz_strdup_no_throw(fz_context *ctx, char *s);
#define fz_malloc_struct(CTX, STRUCT) \
Memento_label(fz_calloc(CTX,1,sizeof(STRUCT)), #STRUCT)
-/* runtime (hah!) test for endian-ness */
-int fz_is_big_endian(void);
-
/* safe string functions */
char *fz_strsep(char **stringp, const char *delim);
int fz_strlcpy(char *dst, const char *src, int n);
int fz_strlcat(char *dst, const char *src, int n);
-/* Range checking atof */
-float fz_atof(const char *s);
-
-/* utf-8 encoding and decoding */
-int chartorune(int *rune, char *str);
-int runetochar(char *str, int *rune);
-int runelen(int c);
+/* runtime (hah!) test for endian-ness */
+int fz_is_big_endian(void);
/* getopt */
extern int fz_getopt(int nargc, char * const *nargv, const char *ostr);
extern int fz_optind;
extern char *fz_optarg;
-/*
- * Generic hash-table with fixed-length keys.
- */
-
-typedef struct fz_hash_table_s fz_hash_table;
-
-fz_hash_table *fz_new_hash_table(fz_context *ctx, int initialsize, int keylen, int lock);
-void fz_debug_hash(fz_context *ctx, fz_hash_table *table);
-void fz_empty_hash(fz_context *ctx, fz_hash_table *table);
-void fz_free_hash(fz_context *ctx, fz_hash_table *table);
-
-void *fz_hash_find(fz_context *ctx, fz_hash_table *table, void *key);
-void *fz_hash_insert(fz_context *ctx, fz_hash_table *table, void *key, void *val);
-void fz_hash_remove(fz_context *ctx, fz_hash_table *table, void *key);
-
-int fz_hash_len(fz_context *ctx, fz_hash_table *table);
-void *fz_hash_get_key(fz_context *ctx, fz_hash_table *table, int idx);
-void *fz_hash_get_val(fz_context *ctx, fz_hash_table *table, int idx);
-
-/*
- * Math and geometry
- */
-
-/* Multiply scaled two integers in the 0..255 range */
-static inline int fz_mul255(int a, int b)
-{
- /* see Jim Blinn's book "Dirty Pixels" for how this works */
- int x = a * b + 128;
- x += x >> 8;
- return x >> 8;
-}
-
-/* Expand a value A from the 0...255 range to the 0..256 range */
-#define FZ_EXPAND(A) ((A)+((A)>>7))
-
-/* Combine values A (in any range) and B (in the 0..256 range),
- * to give a single value in the same range as A was. */
-#define FZ_COMBINE(A,B) (((A)*(B))>>8)
-
-/* Combine values A and C (in the same (any) range) and B and D (in the
- * 0..256 range), to give a single value in the same range as A and C were. */
-#define FZ_COMBINE2(A,B,C,D) (FZ_COMBINE((A), (B)) + FZ_COMBINE((C), (D)))
-
-/* Blend SRC and DST (in the same range) together according to
- * AMOUNT (in the 0...256 range). */
-#define FZ_BLEND(SRC, DST, AMOUNT) ((((SRC)-(DST))*(AMOUNT) + ((DST)<<8))>>8)
-
typedef struct fz_matrix_s fz_matrix;
typedef struct fz_point_s fz_point;
typedef struct fz_rect_s fz_rect;
@@ -628,7 +492,7 @@ struct fz_rect_s
x0, y0: The top left corner.
- x1, y1: The botton right corner.
+ x1, y1: The bottom right corner.
*/
struct fz_bbox_s
{
@@ -725,9 +589,6 @@ fz_matrix fz_invert_matrix(fz_matrix matrix);
*/
int fz_is_rectilinear(fz_matrix m);
-float fz_matrix_expansion(fz_matrix m);
-float fz_matrix_max_expansion(fz_matrix m);
-
/*
fz_round_rect: Convert a rect into a bounding box.
@@ -839,291 +700,14 @@ fz_rect fz_transform_rect(fz_matrix transform, fz_rect rect);
*/
fz_bbox fz_transform_bbox(fz_matrix matrix, fz_bbox bbox);
-void fz_gridfit_matrix(fz_matrix *m);
-
-/*
- * Basic crypto functions.
- * Independent of the rest of fitz.
- * For further encapsulation in filters, or not.
- */
-
-/* md5 digests */
-
-typedef struct fz_md5_s fz_md5;
-
-struct fz_md5_s
-{
- unsigned int state[4];
- unsigned int count[2];
- unsigned char buffer[64];
-};
-
-void fz_md5_init(fz_md5 *state);
-void fz_md5_update(fz_md5 *state, const unsigned char *input, unsigned inlen);
-void fz_md5_final(fz_md5 *state, unsigned char digest[16]);
-
-/* sha-256 digests */
-
-typedef struct fz_sha256_s fz_sha256;
-
-struct fz_sha256_s
-{
- unsigned int state[8];
- unsigned int count[2];
- union {
- unsigned char u8[64];
- unsigned int u32[16];
- } buffer;
-};
-
-void fz_sha256_init(fz_sha256 *state);
-void fz_sha256_update(fz_sha256 *state, const unsigned char *input, unsigned int inlen);
-void fz_sha256_final(fz_sha256 *state, unsigned char digest[32]);
-
-/* arc4 crypto */
-
-typedef struct fz_arc4_s fz_arc4;
-
-struct fz_arc4_s
-{
- unsigned x;
- unsigned y;
- unsigned char state[256];
-};
-
-void fz_arc4_init(fz_arc4 *state, const unsigned char *key, unsigned len);
-void fz_arc4_encrypt(fz_arc4 *state, unsigned char *dest, const unsigned char *src, unsigned len);
-
-/* AES block cipher implementation from XYSSL */
-
-typedef struct fz_aes_s fz_aes;
-
-#define AES_DECRYPT 0
-#define AES_ENCRYPT 1
-
-struct fz_aes_s
-{
- int nr; /* number of rounds */
- unsigned long *rk; /* AES round keys */
- unsigned long buf[68]; /* unaligned data */
-};
-
-void aes_setkey_enc( fz_aes *ctx, const unsigned char *key, int keysize );
-void aes_setkey_dec( fz_aes *ctx, const unsigned char *key, int keysize );
-void aes_crypt_cbc( fz_aes *ctx, int mode, int length,
- unsigned char iv[16],
- const unsigned char *input,
- unsigned char *output );
-
/*
fz_buffer is a XXX
*/
typedef struct fz_buffer_s fz_buffer;
-struct fz_buffer_s
-{
- int refs;
- unsigned char *data;
- int cap, len;
-};
-
-fz_buffer *fz_new_buffer(fz_context *ctx, int size);
fz_buffer *fz_keep_buffer(fz_context *ctx, fz_buffer *buf);
-void fz_drop_buffer(fz_context *ctx, fz_buffer *buf);
-
-void fz_resize_buffer(fz_context *ctx, fz_buffer *buf, int size);
-void fz_grow_buffer(fz_context *ctx, fz_buffer *buf);
-void fz_trim_buffer(fz_context *ctx, fz_buffer *buf);
-
-/*
- Resource store
-
- MuPDF stores decoded "objects" into a store for potential reuse.
- If the size of the store gets too big, objects stored within it can
- be evicted and freed to recover space. When MuPDF comes to decode
- such an object, it will check to see if a version of this object is
- already in the store - if it is, it will simply reuse it. If not, it
- will decode it and place it into the store.
-
- All objects that can be placed into the store are derived from the
- fz_storable type (i.e. this should be the first component of the
- objects structure). This allows for consistent (thread safe)
- reference counting, and includes a function that will be called to
- free the object as soon as the reference count reaches zero.
-
- Most objects offer fz_keep_XXXX/fz_drop_XXXX functions derived
- from fz_keep_storable/fz_drop_storable. Creation of such objects
- includes a call to FZ_INIT_STORABLE to set up the fz_storable header.
- */
-
-typedef struct fz_storable_s fz_storable;
-
-typedef void (fz_store_free_fn)(fz_context *, fz_storable *);
-
-struct fz_storable_s {
- int refs;
- fz_store_free_fn *free;
-};
-
-#define FZ_INIT_STORABLE(S_,RC,FREE) \
- do { fz_storable *S = &(S_)->storable; S->refs = (RC); \
- S->free = (FREE); \
- } while (0)
-
-void *fz_keep_storable(fz_context *, fz_storable *);
-void fz_drop_storable(fz_context *, fz_storable *);
-
-/*
- Specifies the maximum size in bytes of the resource store in
- fz_context. Given as argument to fz_new_context.
-
- FZ_STORE_UNLIMITED: Let resource store grow unbounded.
-
- FZ_STORE_DEFAULT: A reasonable upper bound on the size, for
- devices that are not memory constrained.
-*/
-enum {
- FZ_STORE_UNLIMITED = 0,
- FZ_STORE_DEFAULT = 256 << 20,
-};
-
-/*
- The store can be seen as a dictionary that maps keys to fz_storable
- values. In order to allow keys of different types to be stored, we
- have a structure full of functions for each key 'type'; this
- fz_store_type pointer is stored with each key, and tells the store
- how to perform certain operations (like taking/dropping a reference,
- comparing two keys, outputting details for debugging etc).
-
- The store uses a hash table internally for speed where possible. In
- order for this to work, we need a mechanism for turning a generic
- 'key' into 'a hashable string'. For this purpose the type structure
- contains a make_hash_key function pointer that maps from a void *
- to an fz_store_hash structure. If make_hash_key function returns 0,
- then the key is determined not to be hashable, and the value is
- not stored in the hash table.
-*/
-typedef struct fz_store_hash_s fz_store_hash;
-
-struct fz_store_hash_s
-{
- fz_store_free_fn *free;
- union
- {
- struct
- {
- int i0;
- int i1;
- } i;
- struct
- {
- void *ptr;
- int i;
- } pi;
- } u;
-};
-
-typedef struct fz_store_type_s fz_store_type;
-
-struct fz_store_type_s
-{
- int (*make_hash_key)(fz_store_hash *, void *);
- void *(*keep_key)(fz_context *,void *);
- void (*drop_key)(fz_context *,void *);
- int (*cmp_key)(void *, void *);
- void (*debug)(void *);
-};
-
-/*
- fz_store_new_context: Create a new store inside the context
-
- max: The maximum size (in bytes) that the store is allowed to grow
- to. FZ_STORE_UNLIMITED means no limit.
-*/
-void fz_new_store_context(fz_context *ctx, unsigned int max);
-
-/*
- fz_drop_store_context: Drop a reference to the store.
-*/
-void fz_drop_store_context(fz_context *ctx);
-
-/*
- fz_keep_store_context: Take a reference to the store.
-*/
-fz_store *fz_keep_store_context(fz_context *ctx);
-
-/*
- fz_debug_store: Dump the contents of the store for debugging.
-*/
-void fz_debug_store(fz_context *ctx);
-
-/*
- fz_store_item: Add an item to the store.
-
- Add an item into the store, returning NULL for success. If an item
- with the same key is found in the store, then our item will not be
- inserted, and the function will return a pointer to that value
- instead. This function takes its own reference to val, as required
- (i.e. the caller maintains ownership of its own reference).
-
- key: The key to use to index the item.
-
- val: The value to store.
-
- itemsize: The size in bytes of the value (as counted towards the
- store size).
-
- type: Functions used to manipulate the key.
-*/
-void *fz_store_item(fz_context *ctx, void *key, void *val, unsigned int itemsize, fz_store_type *type);
-/*
- fz_find_item: Find an item within the store.
-
- free: The function used to free the value (to ensure we get a value
- of the correct type).
-
- key: The key to use to index the item.
-
- type: Functions used to manipulate the key.
-
- Returns NULL for not found, otherwise returns a pointer to the value
- indexed by key to which a reference has been taken.
-*/
-void *fz_find_item(fz_context *ctx, fz_store_free_fn *free, void *key, fz_store_type *type);
-
-/*
- fz_remove_item: Remove an item from the store.
-
- If an item indexed by the given key exists in the store, remove it.
-
- free: The function used to free the value (to ensure we get a value
- of the correct type).
-
- key: The key to use to find the item to remove.
-
- type: Functions used to manipulate the key.
-*/
-void fz_remove_item(fz_context *ctx, fz_store_free_fn *free, void *key, fz_store_type *type);
-
-/*
- fz_empty_store: Evict everything from the store.
-*/
-void fz_empty_store(fz_context *ctx);
-
-/*
- fz_store_scavenge: Internal function used as part of the scavenging
- allocator; when we fail to allocate memory, before returning a
- failure to the caller, we try to scavenge space within the store by
- evicting at least 'size' bytes. The allocator then retries.
-
- size: The number of bytes we are trying to have free.
-
- phase: What phase of the scavenge we are in. Updated on exit.
-
- Returns non zero if we managed to free any memory.
-*/
-int fz_store_scavenge(fz_context *ctx, unsigned int size, int *phase);
+void fz_drop_buffer(fz_context *ctx, fz_buffer *buf);
/*
fz_stream is a buffered reader capable of seeking in both
@@ -1136,41 +720,6 @@ int fz_store_scavenge(fz_context *ctx, unsigned int size, int *phase);
*/
typedef struct fz_stream_s fz_stream;
-struct fz_stream_s
-{
- fz_context *ctx;
- int refs;
- int error;
- int eof;
- int pos;
- int avail;
- int bits;
- int locked;
- unsigned char *bp, *rp, *wp, *ep;
- void *state;
- int (*read)(fz_stream *stm, unsigned char *buf, int len);
- void (*close)(fz_context *ctx, void *state);
- void (*seek)(fz_stream *stm, int offset, int whence);
- unsigned char buf[4096];
-};
-
-/*
- fz_open_file: Open the named file and wrap it in a stream.
-
- filename: Path to a file as it would be given to open(2).
-*/
-fz_stream *fz_open_file(fz_context *ctx, const char *filename);
-
-/*
- fz_open_file_w: Open the named file and wrap it in a stream.
-
- This function is only available when compiling for Win32.
-
- filename: Wide character path to the file as it would be given
- to _wopen().
-*/
-fz_stream *fz_open_file_w(fz_context *ctx, const wchar_t *filename);
-
/*
fz_open_fd: Wrap an open file descriptor in a stream.
@@ -1183,16 +732,6 @@ fz_stream *fz_open_file_w(fz_context *ctx, const wchar_t *filename);
fz_stream *fz_open_fd(fz_context *ctx, int file);
/*
- fz_open_buffer: XXX
-*/
-fz_stream *fz_open_buffer(fz_context *ctx, fz_buffer *buf);
-
-/*
- fz_open_memory: XXX
-*/
-fz_stream *fz_open_memory(fz_context *ctx, unsigned char *data, int len);
-
-/*
fz_close: Close an open stream.
Drops a reference for the stream. Once no references remain
@@ -1203,177 +742,27 @@ fz_stream *fz_open_memory(fz_context *ctx, unsigned char *data, int len);
*/
void fz_close(fz_stream *stm);
-void fz_lock_stream(fz_stream *stm);
-
-fz_stream *fz_new_stream(fz_context *ctx, void*, int(*)(fz_stream*, unsigned char*, int), void(*)(fz_context *, void *));
-fz_stream *fz_keep_stream(fz_stream *stm);
-void fz_fill_buffer(fz_stream *stm);
-
-int fz_tell(fz_stream *stm);
-void fz_seek(fz_stream *stm, int offset, int whence);
-
-int fz_read(fz_stream *stm, unsigned char *buf, int len);
-void fz_read_line(fz_stream *stm, char *buf, int max);
-fz_buffer *fz_read_all(fz_stream *stm, int initial);
-
-static inline int fz_read_byte(fz_stream *stm)
-{
- if (stm->rp == stm->wp)
- {
- fz_fill_buffer(stm);
- return stm->rp < stm->wp ? *stm->rp++ : EOF;
- }
- return *stm->rp++;
-}
-
-static inline int fz_peek_byte(fz_stream *stm)
-{
- if (stm->rp == stm->wp)
- {
- fz_fill_buffer(stm);
- return stm->rp < stm->wp ? *stm->rp : EOF;
- }
- return *stm->rp;
-}
-
-static inline void fz_unread_byte(fz_stream *stm)
-{
- if (stm->rp > stm->bp)
- stm->rp--;
-}
-
-static inline int fz_is_eof(fz_stream *stm)
-{
- if (stm->rp == stm->wp)
- {
- if (stm->eof)
- return 1;
- return fz_peek_byte(stm) == EOF;
- }
- return 0;
-}
-
-static inline unsigned int fz_read_bits(fz_stream *stm, int n)
-{
- unsigned int x;
-
- if (n <= stm->avail)
- {
- stm->avail -= n;
- x = (stm->bits >> stm->avail) & ((1 << n) - 1);
- }
- else
- {
- x = stm->bits & ((1 << stm->avail) - 1);
- n -= stm->avail;
- stm->avail = 0;
-
- while (n > 8)
- {
- x = (x << 8) | fz_read_byte(stm);
- n -= 8;
- }
-
- if (n > 0)
- {
- stm->bits = fz_read_byte(stm);
- stm->avail = 8 - n;
- x = (x << n) | (stm->bits >> stm->avail);
- }
- }
-
- return x;
-}
-
-static inline void fz_sync_bits(fz_stream *stm)
-{
- stm->avail = 0;
-}
-
-static inline int fz_is_eof_bits(fz_stream *stm)
-{
- return fz_is_eof(stm) && (stm->avail == 0 || stm->bits == EOF);
-}
-
/*
- * Data filters.
- */
-
-fz_stream *fz_open_copy(fz_stream *chain);
-fz_stream *fz_open_null(fz_stream *chain, int len);
-fz_stream *fz_open_arc4(fz_stream *chain, unsigned char *key, unsigned keylen);
-fz_stream *fz_open_aesd(fz_stream *chain, unsigned char *key, unsigned keylen);
-fz_stream *fz_open_a85d(fz_stream *chain);
-fz_stream *fz_open_ahxd(fz_stream *chain);
-fz_stream *fz_open_rld(fz_stream *chain);
-fz_stream *fz_open_dctd(fz_stream *chain, int color_transform);
-fz_stream *fz_open_resized_dctd(fz_stream *chain, int color_transform, int factor);
-fz_stream *fz_open_faxd(fz_stream *chain,
- int k, int end_of_line, int encoded_byte_align,
- int columns, int rows, int end_of_block, int black_is_1);
-fz_stream *fz_open_flated(fz_stream *chain);
-fz_stream *fz_open_lzwd(fz_stream *chain, int early_change);
-fz_stream *fz_open_predict(fz_stream *chain, int predictor, int columns, int colors, int bpc);
-fz_stream *fz_open_jbig2d(fz_stream *chain, fz_buffer *global);
-
-/*
- * Resources and other graphics related objects.
- */
-
-enum { FZ_MAX_COLORS = 32 };
+ Bitmaps have 1 bit per component. Only used for creating halftoned
+ versions of contone buffers, and saving out. Samples are stored msb
+ first, akin to pbms.
+*/
+typedef struct fz_bitmap_s fz_bitmap;
-int fz_find_blendmode(char *name);
-char *fz_blendmode_name(int blendmode);
+void fz_drop_bitmap(fz_context *ctx, fz_bitmap *bit);
/*
- * Pixmaps have n components per pixel. the last is always alpha.
- * premultiplied alpha when rendering, but non-premultiplied for colorspace
- * conversions and rescaling.
- */
-
+ Pixmaps represent a set of pixels for a 2 dimensional region of a
+ plane. Each pixel has n components per pixel, the last of which is
+ always alpha. The data is in premultiplied alpha when rendering, but
+ non-premultiplied for colorspace conversions and rescaling.
+*/
typedef struct fz_pixmap_s fz_pixmap;
-typedef struct fz_colorspace_s fz_colorspace;
-
-/*
- fz_pixmap is an image XXX
-
- x, y: XXX
-
- w, h: The width and height of the image in pixels.
-
- n: The number of color components in the image. Always
- includes a separate alpha channel. XXX RGBA=4
-
- interpolate: A boolean flag set to non-zero if the image
- will be drawn using linear interpolation, or set to zero if
- image will be using nearest neighbour sampling.
-
- xres, yres: Image resolution in dpi. Default is 96 dpi.
- colorspace: XXX
-
- samples:
-
- free_samples: Is zero when an application has provided its own
- buffer for pixel data through fz_new_pixmap_with_rect_and_data.
- If not zero the buffer will be freed when fz_drop_pixmap is
- called for the pixmap.
-*/
-struct fz_pixmap_s
-{
- fz_storable storable;
- int x, y, w, h, n;
- int interpolate;
- int xres, yres;
- fz_colorspace *colorspace;
- unsigned char *samples;
- int free_samples;
-};
+typedef struct fz_colorspace_s fz_colorspace;
fz_bbox fz_bound_pixmap(fz_pixmap *pix);
-fz_pixmap *fz_new_pixmap_with_data(fz_context *ctx, fz_colorspace *colorspace, int w, int h, unsigned char *samples);
-
/*
fz_new_pixmap_with_rect: Create a pixmap of a given size,
location and pixel format.
@@ -1391,22 +780,12 @@ fz_pixmap *fz_new_pixmap_with_data(fz_context *ctx, fz_colorspace *colorspace, i
fz_pixmap *fz_new_pixmap_with_rect(fz_context *ctx, fz_colorspace *colorspace, fz_bbox bbox);
/*
- fz_new_pixmap_with_rect_and_data: Create a pixmap using the
- provided buffer for pixel data.
+ fz_keep_pixmap: Take a reference to a pixmap.
- While fz_new_pixmap_with_rect allocates its own buffer for
- pixel data, fz_new_pixmap_with_rect_and_data lets the caller
- allocate and provide a buffer to be used. Otherwise the two
- functions are identical.
+ pix: The pixmap to increment the reference for.
- samples: An array of pixel samples. The created pixmap will
- keep a pointer to the array so it must not be modified or
- freed until the created pixmap is dropped and freed by
- fz_drop_pixmap.
+ Returns pix. Does not throw exceptions.
*/
-fz_pixmap *fz_new_pixmap_with_rect_and_data(fz_context *ctx,
-fz_colorspace *colorspace, fz_bbox bbox, unsigned char *samples);
-fz_pixmap *fz_new_pixmap(fz_context *ctx, fz_colorspace *, int w, int h);
fz_pixmap *fz_keep_pixmap(fz_context *ctx, fz_pixmap *pix);
/*
@@ -1419,8 +798,26 @@ fz_pixmap *fz_keep_pixmap(fz_context *ctx, fz_pixmap *pix);
*/
void fz_drop_pixmap(fz_context *ctx, fz_pixmap *pix);
-void fz_free_pixmap_imp(fz_context *ctx, fz_storable *pix);
-void fz_clear_pixmap(fz_context *ctx, fz_pixmap *pix);
+/*
+ fz_pixmap_colorspace: Return the colorspace of a pixmap
+
+ Returns colorspace. Does not throw exceptions.
+*/
+fz_colorspace *fz_pixmap_colorspace(fz_context *ctx, fz_pixmap *pix);
+
+/*
+ fz_pixmap_components: Return the number of components in a pixmap.
+
+ Returns the number of components. Does not throw exceptions.
+*/
+int fz_pixmap_components(fz_context *ctx, fz_pixmap *pix);
+
+/*
+ fz_pixmap_pixels: Returns a pointer to the pixel data of a pixmap.
+
+ Returns the pointer. Does not throw exceptions.
+*/
+unsigned char *fz_pixmap_pixels(fz_context *ctx, fz_pixmap *pix);
/*
fz_clear_pixmap_with_value: Clears a pixmap with the given value
@@ -1435,20 +832,17 @@ void fz_clear_pixmap(fz_context *ctx, fz_pixmap *pix);
*/
void fz_clear_pixmap_with_value(fz_context *ctx, fz_pixmap *pix, int value);
-void fz_clear_pixmap_rect_with_value(fz_context *ctx, fz_pixmap *pix, int value, fz_bbox r);
-void fz_copy_pixmap_rect(fz_context *ctx, fz_pixmap *dest, fz_pixmap *src, fz_bbox r);
-void fz_premultiply_pixmap(fz_context *ctx, fz_pixmap *pix);
-void fz_unmultiply_pixmap(fz_context *ctx, fz_pixmap *pix);
-fz_pixmap *fz_alpha_from_gray(fz_context *ctx, fz_pixmap *gray, int luminosity);
+void fz_clear_pixmap(fz_context *ctx, fz_pixmap *pix);
void fz_invert_pixmap(fz_context *ctx, fz_pixmap *pix);
+void fz_invert_pixmap_rect(fz_pixmap *image, fz_bbox rect);
void fz_gamma_pixmap(fz_context *ctx, fz_pixmap *pix, float gamma);
-unsigned int fz_pixmap_size(fz_context *ctx, fz_pixmap *pix);
-
-fz_pixmap *fz_scale_pixmap(fz_context *ctx, fz_pixmap *src, float x, float y, float w, float h, fz_bbox *clip);
-
+void fz_unmultiply_pixmap(fz_context *ctx, fz_pixmap *pix);
+void fz_save_pixmap(fz_context *ctx, fz_pixmap *img, char *name, int rgb);
void fz_write_pnm(fz_context *ctx, fz_pixmap *pixmap, char *filename);
void fz_write_pam(fz_context *ctx, fz_pixmap *pixmap, char *filename, int savealpha);
void fz_write_png(fz_context *ctx, fz_pixmap *pixmap, char *filename, int savealpha);
+void fz_write_pbm(fz_context *ctx, fz_bitmap *bitmap, char *filename);
+void fz_md5_pixmap(unsigned char digest[16], fz_pixmap *pixmap);
/*
Images are storable objects from which we can obtain fz_pixmaps.
@@ -1458,15 +852,6 @@ void fz_write_png(fz_context *ctx, fz_pixmap *pixmap, char *filename, int saveal
*/
typedef struct fz_image_s fz_image;
-struct fz_image_s
-{
- fz_storable storable;
- int w, h;
- fz_image *mask;
- fz_colorspace *colorspace;
- fz_pixmap *(*get_pixmap)(fz_context *, fz_image *, int w, int h);
-};
-
/*
fz_image_to_pixmap: Called to get a handle to a pixmap from an image.
@@ -1500,55 +885,19 @@ void fz_drop_image(fz_context *ctx, fz_image *image);
*/
fz_image *fz_keep_image(fz_context *ctx, fz_image *image);
-fz_pixmap *fz_load_jpx(fz_context *ctx, unsigned char *data, int size, fz_colorspace *cs);
-fz_pixmap *fz_load_jpeg(fz_context *doc, unsigned char *data, int size);
-fz_pixmap *fz_load_png(fz_context *doc, unsigned char *data, int size);
-fz_pixmap *fz_load_tiff(fz_context *doc, unsigned char *data, int size);
-
-/*
- Bitmaps have 1 bit per component. Only used for creating halftoned
- versions of contone buffers, and saving out. Samples are stored msb
- first, akin to pbms.
-*/
-typedef struct fz_bitmap_s fz_bitmap;
-
-struct fz_bitmap_s
-{
- int refs;
- int w, h, stride, n;
- unsigned char *samples;
-};
-
-fz_bitmap *fz_new_bitmap(fz_context *ctx, int w, int h, int n);
-fz_bitmap *fz_keep_bitmap(fz_context *ctx, fz_bitmap *bit);
-void fz_clear_bitmap(fz_context *ctx, fz_bitmap *bit);
-void fz_drop_bitmap(fz_context *ctx, fz_bitmap *bit);
-
-void fz_write_pbm(fz_context *ctx, fz_bitmap *bitmap, char *filename);
-
/*
A halftone is a set of threshold tiles, one per component. Each
threshold tile is a pixmap, possibly of varying sizes and phases.
*/
typedef struct fz_halftone_s fz_halftone;
-struct fz_halftone_s
-{
- int refs;
- int n;
- fz_pixmap *comp[1];
-};
-
-fz_halftone *fz_new_halftone(fz_context *ctx, int num_comps);
fz_halftone *fz_get_default_halftone(fz_context *ctx, int num_comps);
-fz_halftone *fz_keep_halftone(fz_context *ctx, fz_halftone *half);
void fz_drop_halftone(fz_context *ctx, fz_halftone *half);
-
fz_bitmap *fz_halftone_pixmap(fz_context *ctx, fz_pixmap *pix, fz_halftone *ht);
/*
- * Colorspace resources.
- */
+ Colorspace resources.
+*/
/*
fz_device_gray: XXX
@@ -1570,377 +919,9 @@ extern fz_colorspace *fz_device_bgr;
*/
extern fz_colorspace *fz_device_cmyk;
-struct fz_colorspace_s
-{
- fz_storable storable;
- unsigned int size;
- char name[16];
- int n;
- void (*to_rgb)(fz_context *ctx, fz_colorspace *, float *src, float *rgb);
- void (*from_rgb)(fz_context *ctx, fz_colorspace *, float *rgb, float *dst);
- void (*free_data)(fz_context *Ctx, fz_colorspace *);
- void *data;
-};
-
-fz_colorspace *fz_new_colorspace(fz_context *ctx, char *name, int n);
-fz_colorspace *fz_keep_colorspace(fz_context *ctx, fz_colorspace *colorspace);
-void fz_drop_colorspace(fz_context *ctx, fz_colorspace *colorspace);
-void fz_free_colorspace_imp(fz_context *ctx, fz_storable *colorspace);
-
-void fz_convert_color(fz_context *ctx, fz_colorspace *srcs, float *srcv, fz_colorspace *dsts, float *dstv);
-void fz_convert_pixmap(fz_context *ctx, fz_pixmap *src, fz_pixmap *dst);
-
-fz_colorspace *fz_find_device_colorspace(char *name);
-
-/*
- * Fonts come in two variants:
- * Regular fonts are handled by FreeType.
- * Type 3 fonts have callbacks to the interpreter.
- */
-
typedef struct fz_device_s fz_device;
typedef struct fz_font_s fz_font;
-char *ft_error_string(int err);
-
-struct fz_font_s
-{
- int refs;
- char name[32];
-
- void *ft_face; /* has an FT_Face if used */
- int ft_substitute; /* ... substitute metrics */
- int ft_bold; /* ... synthesize bold */
- int ft_italic; /* ... synthesize italic */
- int ft_hint; /* ... force hinting for DynaLab fonts */
-
- /* origin of font data */
- char *ft_file;
- unsigned char *ft_data;
- int ft_size;
-
- fz_matrix t3matrix;
- void *t3resources;
- fz_buffer **t3procs; /* has 256 entries if used */
- float *t3widths; /* has 256 entries if used */
- char *t3flags; /* has 256 entries if used */
- void *t3doc; /* a pdf_document for the callback */
- void (*t3run)(void *doc, void *resources, fz_buffer *contents, fz_device *dev, fz_matrix ctm, void *gstate);
- void (*t3freeres)(void *doc, void *resources);
-
- fz_rect bbox; /* font bbox is used only for t3 fonts */
-
- /* per glyph bounding box cache */
- int use_glyph_bbox;
- int bbox_count;
- fz_rect *bbox_table;
-
- /* substitute metrics */
- int width_count;
- int *width_table; /* in 1000 units */
-};
-
-void fz_new_font_context(fz_context *ctx);
-fz_font_context *fz_keep_font_context(fz_context *ctx);
-void fz_drop_font_context(fz_context *ctx);
-
-fz_font *fz_new_type3_font(fz_context *ctx, char *name, fz_matrix matrix);
-
-fz_font *fz_new_font_from_memory(fz_context *ctx, unsigned char *data, int len, int index, int use_glyph_bbox);
-fz_font *fz_new_font_from_file(fz_context *ctx, char *path, int index, int use_glyph_bbox);
-
-fz_font *fz_keep_font(fz_context *ctx, fz_font *font);
-void fz_drop_font(fz_context *ctx, fz_font *font);
-
-void fz_debug_font(fz_context *ctx, fz_font *font);
-
-void fz_set_font_bbox(fz_context *ctx, fz_font *font, float xmin, float ymin, float xmax, float ymax);
-fz_rect fz_bound_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix trm);
-int fz_glyph_cacheable(fz_context *ctx, fz_font *font, int gid);
-
-/*
- * Vector path buffer.
- * It can be stroked and dashed, or be filled.
- * It has a fill rule (nonzero or even_odd).
- *
- * When rendering, they are flattened, stroked and dashed straight
- * into the Global Edge List.
- */
-
-typedef struct fz_path_s fz_path;
-typedef struct fz_stroke_state_s fz_stroke_state;
-
-typedef union fz_path_item_s fz_path_item;
-
-typedef enum fz_path_item_kind_e
-{
- FZ_MOVETO,
- FZ_LINETO,
- FZ_CURVETO,
- FZ_CLOSE_PATH
-} fz_path_item_kind;
-
-typedef enum fz_linecap_e
-{
- FZ_LINECAP_BUTT = 0,
- FZ_LINECAP_ROUND = 1,
- FZ_LINECAP_SQUARE = 2,
- FZ_LINECAP_TRIANGLE = 3
-} fz_linecap;
-
-typedef enum fz_linejoin_e
-{
- FZ_LINEJOIN_MITER = 0,
- FZ_LINEJOIN_ROUND = 1,
- FZ_LINEJOIN_BEVEL = 2,
- FZ_LINEJOIN_MITER_XPS = 3
-} fz_linejoin;
-
-union fz_path_item_s
-{
- fz_path_item_kind k;
- float v;
-};
-
-struct fz_path_s
-{
- int len, cap;
- fz_path_item *items;
- int last;
-};
-
-struct fz_stroke_state_s
-{
- fz_linecap start_cap, dash_cap, end_cap;
- fz_linejoin linejoin;
- float linewidth;
- float miterlimit;
- float dash_phase;
- int dash_len;
- float dash_list[32];
-};
-
-fz_path *fz_new_path(fz_context *ctx);
-void fz_moveto(fz_context*, fz_path*, float x, float y);
-void fz_lineto(fz_context*, fz_path*, float x, float y);
-void fz_curveto(fz_context*,fz_path*, float, float, float, float, float, float);
-void fz_curvetov(fz_context*,fz_path*, float, float, float, float);
-void fz_curvetoy(fz_context*,fz_path*, float, float, float, float);
-void fz_closepath(fz_context*,fz_path*);
-void fz_free_path(fz_context *ctx, fz_path *path);
-
-void fz_transform_path(fz_context *ctx, fz_path *path, fz_matrix transform);
-
-fz_path *fz_clone_path(fz_context *ctx, fz_path *old);
-
-fz_rect fz_bound_path(fz_context *ctx, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm);
-void fz_debug_path(fz_context *ctx, fz_path *, int indent);
-
-/*
- * Glyph cache
- */
-
-void fz_new_glyph_cache_context(fz_context *ctx);
-fz_glyph_cache *fz_keep_glyph_cache(fz_context *ctx);
-void fz_drop_glyph_cache_context(fz_context *ctx);
-void fz_purge_glyph_cache(fz_context *ctx);
-
-fz_pixmap *fz_render_ft_glyph(fz_context *ctx, fz_font *font, int cid, fz_matrix trm);
-fz_pixmap *fz_render_t3_glyph(fz_context *ctx, fz_font *font, int cid, fz_matrix trm, fz_colorspace *model);
-fz_pixmap *fz_render_ft_stroked_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix trm, fz_matrix ctm, fz_stroke_state *state);
-fz_pixmap *fz_render_glyph(fz_context *ctx, fz_font*, int, fz_matrix, fz_colorspace *model);
-fz_pixmap *fz_render_stroked_glyph(fz_context *ctx, fz_font*, int, fz_matrix, fz_matrix, fz_stroke_state *stroke);
-void fz_render_t3_glyph_direct(fz_context *ctx, fz_device *dev, fz_font *font, int gid, fz_matrix trm, void *gstate);
-
-/*
- * Text buffer.
- *
- * The trm field contains the a, b, c and d coefficients.
- * The e and f coefficients come from the individual elements,
- * together they form the transform matrix for the glyph.
- *
- * Glyphs are referenced by glyph ID.
- * The Unicode text equivalent is kept in a separate array
- * with indexes into the glyph array.
- */
-
-typedef struct fz_text_s fz_text;
-typedef struct fz_text_item_s fz_text_item;
-
-struct fz_text_item_s
-{
- float x, y;
- int gid; /* -1 for one gid to many ucs mappings */
- int ucs; /* -1 for one ucs to many gid mappings */
-};
-
-struct fz_text_s
-{
- fz_font *font;
- fz_matrix trm;
- int wmode;
- int len, cap;
- fz_text_item *items;
-};
-
-fz_text *fz_new_text(fz_context *ctx, fz_font *face, fz_matrix trm, int wmode);
-void fz_add_text(fz_context *ctx, fz_text *text, int gid, int ucs, float x, float y);
-void fz_free_text(fz_context *ctx, fz_text *text);
-fz_rect fz_bound_text(fz_context *ctx, fz_text *text, fz_matrix ctm);
-fz_text *fz_clone_text(fz_context *ctx, fz_text *old);
-void fz_debug_text(fz_context *ctx, fz_text*, int indent);
-
-/*
- * The shading code uses gouraud shaded triangle meshes.
- */
-
-enum
-{
- FZ_LINEAR,
- FZ_RADIAL,
- FZ_MESH,
-};
-
-typedef struct fz_shade_s fz_shade;
-
-struct fz_shade_s
-{
- fz_storable storable;
-
- fz_rect bbox; /* can be fz_infinite_rect */
- fz_colorspace *colorspace;
-
- fz_matrix matrix; /* matrix from pattern dict */
- int use_background; /* background color for fills but not 'sh' */
- float background[FZ_MAX_COLORS];
-
- int use_function;
- float function[256][FZ_MAX_COLORS + 1];
-
- int type; /* linear, radial, mesh */
- int extend[2];
-
- int mesh_len;
- int mesh_cap;
- float *mesh; /* [x y 0], [x y r], [x y t] or [x y c1 ... cn] */
-};
-
-fz_shade *fz_keep_shade(fz_context *ctx, fz_shade *shade);
-void fz_drop_shade(fz_context *ctx, fz_shade *shade);
-void fz_free_shade_imp(fz_context *ctx, fz_storable *shade);
-void fz_debug_shade(fz_context *ctx, fz_shade *shade);
-
-fz_rect fz_bound_shade(fz_context *ctx, fz_shade *shade, fz_matrix ctm);
-void fz_paint_shade(fz_context *ctx, fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox);
-
-/*
- * Scan converter
- */
-
-int fz_get_aa_level(fz_context *ctx);
-void fz_set_aa_level(fz_context *ctx, int bits);
-
-typedef struct fz_gel_s fz_gel;
-
-fz_gel *fz_new_gel(fz_context *ctx);
-void fz_insert_gel(fz_gel *gel, float x0, float y0, float x1, float y1);
-void fz_reset_gel(fz_gel *gel, fz_bbox clip);
-void fz_sort_gel(fz_gel *gel);
-fz_bbox fz_bound_gel(fz_gel *gel);
-void fz_free_gel(fz_gel *gel);
-int fz_is_rect_gel(fz_gel *gel);
-
-void fz_scan_convert(fz_gel *gel, int eofill, fz_bbox clip, fz_pixmap *pix, unsigned char *colorbv);
-
-void fz_flatten_fill_path(fz_gel *gel, fz_path *path, fz_matrix ctm, float flatness);
-void fz_flatten_stroke_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, float flatness, float linewidth);
-void fz_flatten_dash_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, float flatness, float linewidth);
-
-/*
- * The device interface.
- */
-
-enum
-{
- /* Hints */
- FZ_IGNORE_IMAGE = 1,
- FZ_IGNORE_SHADE = 2,
-
- /* Flags */
- FZ_DEVFLAG_MASK = 1,
- FZ_DEVFLAG_COLOR = 2,
- FZ_DEVFLAG_UNCACHEABLE = 4,
- FZ_DEVFLAG_FILLCOLOR_UNDEFINED = 8,
- FZ_DEVFLAG_STROKECOLOR_UNDEFINED = 16,
- FZ_DEVFLAG_STARTCAP_UNDEFINED = 32,
- FZ_DEVFLAG_DASHCAP_UNDEFINED = 64,
- FZ_DEVFLAG_ENDCAP_UNDEFINED = 128,
- FZ_DEVFLAG_LINEJOIN_UNDEFINED = 256,
- FZ_DEVFLAG_MITERLIMIT_UNDEFINED = 512,
- FZ_DEVFLAG_LINEWIDTH_UNDEFINED = 1024,
- /* Arguably we should have a bit for the dash pattern itself being
- * undefined, but that causes problems; do we assume that it should
- * always be set to non-dashing at the start of every glyph? */
-};
-
-struct fz_device_s
-{
- int hints;
- int flags;
-
- void *user;
- void (*free_user)(fz_device *);
- fz_context *ctx;
-
- void (*fill_path)(fz_device *, fz_path *, int even_odd, fz_matrix, fz_colorspace *, float *color, float alpha);
- void (*stroke_path)(fz_device *, fz_path *, fz_stroke_state *, fz_matrix, fz_colorspace *, float *color, float alpha);
- void (*clip_path)(fz_device *, fz_path *, fz_rect *rect, int even_odd, fz_matrix);
- void (*clip_stroke_path)(fz_device *, fz_path *, fz_rect *rect, fz_stroke_state *, fz_matrix);
-
- void (*fill_text)(fz_device *, fz_text *, fz_matrix, fz_colorspace *, float *color, float alpha);
- void (*stroke_text)(fz_device *, fz_text *, fz_stroke_state *, fz_matrix, fz_colorspace *, float *color, float alpha);
- void (*clip_text)(fz_device *, fz_text *, fz_matrix, int accumulate);
- void (*clip_stroke_text)(fz_device *, fz_text *, fz_stroke_state *, fz_matrix);
- void (*ignore_text)(fz_device *, fz_text *, fz_matrix);
-
- void (*fill_shade)(fz_device *, fz_shade *shd, fz_matrix ctm, float alpha);
- void (*fill_image)(fz_device *, fz_image *img, fz_matrix ctm, float alpha);
- void (*fill_image_mask)(fz_device *, fz_image *img, fz_matrix ctm, fz_colorspace *, float *color, float alpha);
- void (*clip_image_mask)(fz_device *, fz_image *img, fz_rect *rect, fz_matrix ctm);
-
- void (*pop_clip)(fz_device *);
-
- void (*begin_mask)(fz_device *, fz_rect, int luminosity, fz_colorspace *, float *bc);
- void (*end_mask)(fz_device *);
- void (*begin_group)(fz_device *, fz_rect, int isolated, int knockout, int blendmode, float alpha);
- void (*end_group)(fz_device *);
-
- void (*begin_tile)(fz_device *, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm);
- void (*end_tile)(fz_device *);
-};
-
-void fz_fill_path(fz_device *dev, fz_path *path, int even_odd, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
-void fz_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
-void fz_clip_path(fz_device *dev, fz_path *path, fz_rect *rect, int even_odd, fz_matrix ctm);
-void fz_clip_stroke_path(fz_device *dev, fz_path *path, fz_rect *rect, fz_stroke_state *stroke, fz_matrix ctm);
-void fz_fill_text(fz_device *dev, fz_text *text, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
-void fz_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
-void fz_clip_text(fz_device *dev, fz_text *text, fz_matrix ctm, int accumulate);
-void fz_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, fz_matrix ctm);
-void fz_ignore_text(fz_device *dev, fz_text *text, fz_matrix ctm);
-void fz_pop_clip(fz_device *dev);
-void fz_fill_shade(fz_device *dev, fz_shade *shade, fz_matrix ctm, float alpha);
-void fz_fill_image(fz_device *dev, fz_image *image, fz_matrix ctm, float alpha);
-void fz_fill_image_mask(fz_device *dev, fz_image *image, fz_matrix ctm, fz_colorspace *colorspace, float *color, float alpha);
-void fz_clip_image_mask(fz_device *dev, fz_image *image, fz_rect *rect, fz_matrix ctm);
-void fz_begin_mask(fz_device *dev, fz_rect area, int luminosity, fz_colorspace *colorspace, float *bc);
-void fz_end_mask(fz_device *dev);
-void fz_begin_group(fz_device *dev, fz_rect area, int isolated, int knockout, int blendmode, float alpha);
-void fz_end_group(fz_device *dev);
-void fz_begin_tile(fz_device *dev, fz_rect area, fz_rect view, float xstep, float ystep, fz_matrix ctm);
-void fz_end_tile(fz_device *dev);
-
-fz_device *fz_new_device(fz_context *ctx, void *user);
/*
fz_free_device: Free a devices of any type and its resources.
@@ -1978,9 +959,8 @@ fz_device *fz_new_draw_device(fz_context *ctx, fz_pixmap *dest);
fz_device *fz_new_draw_device_type3(fz_context *ctx, fz_pixmap *dest);
/*
- * Text extraction device
- */
-
+ Text extraction device
+*/
typedef struct fz_text_span_s fz_text_span;
typedef struct fz_text_char_s fz_text_char;
@@ -2068,8 +1048,8 @@ struct fz_cookie_s
};
/*
- * Display list device -- record and play back device commands.
- */
+ Display list device -- record and play back device commands.
+*/
/*
fz_display_list is a list containing drawing commands (text,
@@ -2144,58 +1124,6 @@ void fz_run_display_list(fz_display_list *list, fz_device *dev, fz_matrix ctm, f
*/
void fz_free_display_list(fz_context *ctx, fz_display_list *list);
-/*
- * Plotting functions.
- */
-
-void fz_decode_tile(fz_pixmap *pix, float *decode);
-void fz_decode_indexed_tile(fz_pixmap *pix, float *decode, int maxval);
-void fz_unpack_tile(fz_pixmap *dst, unsigned char * restrict src, int n, int depth, int stride, int scale);
-
-void fz_paint_solid_alpha(unsigned char * restrict dp, int w, int alpha);
-void fz_paint_solid_color(unsigned char * restrict dp, int n, int w, unsigned char *color);
-
-void fz_paint_span(unsigned char * restrict dp, unsigned char * restrict sp, int n, int w, int alpha);
-void fz_paint_span_with_color(unsigned char * restrict dp, unsigned char * restrict mp, int n, int w, unsigned char *color);
-
-void fz_paint_image(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, int alpha);
-void fz_paint_image_with_color(fz_pixmap *dst, fz_bbox scissor, fz_pixmap *shape, fz_pixmap *img, fz_matrix ctm, unsigned char *colorbv);
-
-void fz_paint_pixmap(fz_pixmap *dst, fz_pixmap *src, int alpha);
-void fz_paint_pixmap_with_mask(fz_pixmap *dst, fz_pixmap *src, fz_pixmap *msk);
-void fz_paint_pixmap_with_rect(fz_pixmap *dst, fz_pixmap *src, int alpha, fz_bbox bbox);
-
-void fz_blend_pixmap(fz_pixmap *dst, fz_pixmap *src, int alpha, int blendmode, int isolated, fz_pixmap *shape);
-void fz_blend_pixel(unsigned char dp[3], unsigned char bp[3], unsigned char sp[3], int blendmode);
-
-enum
-{
- /* PDF 1.4 -- standard separable */
- FZ_BLEND_NORMAL,
- FZ_BLEND_MULTIPLY,
- FZ_BLEND_SCREEN,
- FZ_BLEND_OVERLAY,
- FZ_BLEND_DARKEN,
- FZ_BLEND_LIGHTEN,
- FZ_BLEND_COLOR_DODGE,
- FZ_BLEND_COLOR_BURN,
- FZ_BLEND_HARD_LIGHT,
- FZ_BLEND_SOFT_LIGHT,
- FZ_BLEND_DIFFERENCE,
- FZ_BLEND_EXCLUSION,
-
- /* PDF 1.4 -- standard non-separable */
- FZ_BLEND_HUE,
- FZ_BLEND_SATURATION,
- FZ_BLEND_COLOR,
- FZ_BLEND_LUMINOSITY,
-
- /* For packing purposes */
- FZ_BLEND_MODEMASK = 15,
- FZ_BLEND_ISOLATED = 16,
- FZ_BLEND_KNOCKOUT = 32
-};
-
/* Links */
typedef struct fz_link_s fz_link;
@@ -2372,20 +1300,6 @@ void fz_free_outline(fz_context *ctx, fz_outline *outline);
typedef struct fz_document_s fz_document;
typedef struct fz_page_s fz_page; /* doesn't have a definition -- always cast to *_page */
-struct fz_document_s
-{
- void (*close)(fz_document *);
- int (*needs_password)(fz_document *doc);
- int (*authenticate_password)(fz_document *doc, char *password);
- fz_outline *(*load_outline)(fz_document *doc);
- int (*count_pages)(fz_document *doc);
- fz_page *(*load_page)(fz_document *doc, int number);
- fz_link *(*load_links)(fz_document *doc, fz_page *page);
- fz_rect (*bound_page)(fz_document *doc, fz_page *page);
- void (*run_page)(fz_document *doc, fz_page *page, fz_device *dev, fz_matrix transform, fz_cookie *cookie);
- void (*free_page)(fz_document *doc, fz_page *page);
-};
-
/*
fz_open_document: Open a PDF, XPS or CBZ document.
@@ -2504,4 +1418,4 @@ void fz_run_page(fz_document *doc, fz_page *page, fz_device *dev, fz_matrix tran
*/
void fz_free_page(fz_document *doc, fz_page *page);
-#endif
+#endif /* _FITZ_H_ */
diff --git a/fitz/image_jpeg.c b/fitz/image_jpeg.c
index cef53d93..2840adbf 100644
--- a/fitz/image_jpeg.c
+++ b/fitz/image_jpeg.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include <jpeglib.h>
#include <setjmp.h>
diff --git a/fitz/image_jpx.c b/fitz/image_jpx.c
index 4d76b4e8..b2fc3601 100644
--- a/fitz/image_jpx.c
+++ b/fitz/image_jpx.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#define OPJ_STATIC
#include <openjpeg.h>
diff --git a/fitz/image_md5.c b/fitz/image_md5.c
new file mode 100644
index 00000000..c82c7066
--- /dev/null
+++ b/fitz/image_md5.c
@@ -0,0 +1,11 @@
+#include "fitz-internal.h"
+
+void fz_md5_pixmap(unsigned char digest[16], fz_pixmap *pix)
+{
+ fz_md5 md5;
+
+ fz_md5_init(&md5);
+ if (pix)
+ fz_md5_update(&md5, pix->samples, pix->w * pix->h * pix->n);
+ fz_md5_final(&md5, digest);
+}
diff --git a/fitz/image_png.c b/fitz/image_png.c
index b3fe39cc..e2092c10 100644
--- a/fitz/image_png.c
+++ b/fitz/image_png.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include <zlib.h>
diff --git a/fitz/image_save.c b/fitz/image_save.c
new file mode 100644
index 00000000..ef5dbfa5
--- /dev/null
+++ b/fitz/image_save.c
@@ -0,0 +1,32 @@
+#include "fitz-internal.h"
+
+void fz_save_pixmap(fz_context *ctx, fz_pixmap *img, char *file, int rgb)
+{
+ char name[1024];
+ fz_pixmap *converted = NULL;
+
+ if (!img)
+ return;
+
+ if (rgb && img->colorspace && img->colorspace != fz_device_rgb)
+ {
+ converted = fz_new_pixmap_with_rect(ctx, fz_device_rgb, fz_bound_pixmap(img));
+ fz_convert_pixmap(ctx, img, converted);
+ img = converted;
+ }
+
+ if (img->n <= 4)
+ {
+ sprintf(name, "%s.png", file);
+ printf("extracting image %s\n", name);
+ fz_write_png(ctx, img, name, 0);
+ }
+ else
+ {
+ sprintf(name, "%s.pam", file);
+ printf("extracting image %s\n", name);
+ fz_write_pam(ctx, img, name, 0);
+ }
+
+ fz_drop_pixmap(ctx, converted);
+}
diff --git a/fitz/image_tiff.c b/fitz/image_tiff.c
index fff91a9e..76f08447 100644
--- a/fitz/image_tiff.c
+++ b/fitz/image_tiff.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
/*
* TIFF image loader. Should be enough to support TIFF files in XPS.
diff --git a/fitz/res_bitmap.c b/fitz/res_bitmap.c
index 2aa28b02..62cdd8ca 100644
--- a/fitz/res_bitmap.c
+++ b/fitz/res_bitmap.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
fz_bitmap *
fz_new_bitmap(fz_context *ctx, int w, int h, int n)
@@ -74,3 +74,24 @@ fz_write_pbm(fz_context *ctx, fz_bitmap *bitmap, char *filename)
fclose(fp);
}
+
+fz_colorspace *fz_pixmap_colorspace(fz_context *ctx, fz_pixmap *pix)
+{
+ if (!pix)
+ return NULL;
+ return pix->colorspace;
+}
+
+int fz_pixmap_components(fz_context *ctx, fz_pixmap *pix)
+{
+ if (!pix)
+ return 0;
+ return pix->n;
+}
+
+unsigned char *fz_pixmap_pixels(fz_context *ctx, fz_pixmap *pix)
+{
+ if (!pix)
+ return NULL;
+ return pix->samples;
+}
diff --git a/fitz/res_colorspace.c b/fitz/res_colorspace.c
index 3cdc0fa3..1c26d1b3 100644
--- a/fitz/res_colorspace.c
+++ b/fitz/res_colorspace.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#define SLOWCMYK
diff --git a/fitz/res_font.c b/fitz/res_font.c
index e4a4d23a..93e578b5 100644
--- a/fitz/res_font.c
+++ b/fitz/res_font.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include <ft2build.h>
#include FT_FREETYPE_H
diff --git a/fitz/res_halftone.c b/fitz/res_halftone.c
index 7258ad01..b7728eb5 100644
--- a/fitz/res_halftone.c
+++ b/fitz/res_halftone.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
fz_halftone *
fz_new_halftone(fz_context *ctx, int comps)
diff --git a/fitz/res_path.c b/fitz/res_path.c
index a645f9d5..4964a09e 100644
--- a/fitz/res_path.c
+++ b/fitz/res_path.c
@@ -1,5 +1,5 @@
#include <assert.h>
-#include "fitz.h"
+#include "fitz-internal.h"
fz_path *
fz_new_path(fz_context *ctx)
diff --git a/fitz/res_pixmap.c b/fitz/res_pixmap.c
index 1b254f36..fc40135e 100644
--- a/fitz/res_pixmap.c
+++ b/fitz/res_pixmap.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
fz_pixmap *
fz_keep_pixmap(fz_context *ctx, fz_pixmap *pix)
@@ -282,6 +282,27 @@ fz_invert_pixmap(fz_context *ctx, fz_pixmap *pix)
}
}
+void fz_invert_pixmap_rect(fz_pixmap *image, fz_bbox rect)
+{
+ unsigned char *p;
+ int x, y, n;
+
+ int x0 = CLAMP(rect.x0 - image->x, 0, image->w - 1);
+ int x1 = CLAMP(rect.x1 - image->x, 0, image->w - 1);
+ int y0 = CLAMP(rect.y0 - image->y, 0, image->h - 1);
+ int y1 = CLAMP(rect.y1 - image->y, 0, image->h - 1);
+
+ for (y = y0; y < y1; y++)
+ {
+ p = image->samples + (y * image->w + x0) * image->n;
+ for (x = x0; x < x1; x++)
+ {
+ for (n = image->n; n > 0; n--, p++)
+ *p = 255 - *p;
+ }
+ }
+}
+
void
fz_gamma_pixmap(fz_context *ctx, fz_pixmap *pix, float gamma)
{
diff --git a/fitz/res_shade.c b/fitz/res_shade.c
index 3fdf2e15..f8f11a81 100644
--- a/fitz/res_shade.c
+++ b/fitz/res_shade.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
fz_shade *
fz_keep_shade(fz_context *ctx, fz_shade *shade)
diff --git a/fitz/res_store.c b/fitz/res_store.c
index df9c6e33..e85aead9 100644
--- a/fitz/res_store.c
+++ b/fitz/res_store.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
typedef struct fz_item_s fz_item;
diff --git a/fitz/res_text.c b/fitz/res_text.c
index cdfaaa98..433ff8f9 100644
--- a/fitz/res_text.c
+++ b/fitz/res_text.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
fz_text *
fz_new_text(fz_context *ctx, fz_font *font, fz_matrix trm, int wmode)
diff --git a/fitz/stm_buffer.c b/fitz/stm_buffer.c
index d70118e1..b5728d57 100644
--- a/fitz/stm_buffer.c
+++ b/fitz/stm_buffer.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
fz_buffer *
fz_new_buffer(fz_context *ctx, int size)
diff --git a/fitz/stm_open.c b/fitz/stm_open.c
index e634f729..1e303825 100644
--- a/fitz/stm_open.c
+++ b/fitz/stm_open.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
fz_stream *
fz_new_stream(fz_context *ctx, void *state,
diff --git a/fitz/stm_read.c b/fitz/stm_read.c
index a95c62c0..216d2207 100644
--- a/fitz/stm_read.c
+++ b/fitz/stm_read.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#define MIN_BOMB (100 << 20)
diff --git a/pdf/base_object.c b/pdf/base_object.c
index 94f1acfc..1dc07f1a 100644
--- a/pdf/base_object.c
+++ b/pdf/base_object.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
typedef enum pdf_objkind_e
{
diff --git a/pdf/mupdf-internal.h b/pdf/mupdf-internal.h
new file mode 100644
index 00000000..35f76904
--- /dev/null
+++ b/pdf/mupdf-internal.h
@@ -0,0 +1,600 @@
+#ifndef _MUPDF_INTERNAL_H_
+#define _MUPDF_INTERNAL_H_
+
+#include "mupdf.h"
+#include "fitz-internal.h"
+
+void pdf_set_str_len(pdf_obj *obj, int newlen); /* private */
+void *pdf_get_indirect_document(pdf_obj *obj); /* private */
+
+/*
+ * PDF Images
+ */
+
+typedef struct pdf_image_params_s pdf_image_params;
+
+struct pdf_image_params_s
+{
+ int type;
+ fz_colorspace *colorspace;
+ union
+ {
+ struct
+ {
+ int columns;
+ int rows;
+ int k;
+ int eol;
+ int eba;
+ int eob;
+ int bi1;
+ }
+ fax;
+ struct
+ {
+ int ct;
+ }
+ jpeg;
+ struct
+ {
+ int columns;
+ int colors;
+ int predictor;
+ int bpc;
+ }
+ flate;
+ struct
+ {
+ int columns;
+ int colors;
+ int predictor;
+ int bpc;
+ int ec;
+ }
+ lzw;
+ }
+ u;
+};
+
+
+typedef struct pdf_image_s pdf_image;
+
+struct pdf_image_s
+{
+ fz_image base;
+ fz_pixmap *tile;
+ int n, bpc;
+ pdf_image_params params;
+ fz_buffer *buffer;
+ int colorkey[FZ_MAX_COLORS * 2];
+ float decode[FZ_MAX_COLORS * 2];
+ int imagemask;
+ int interpolate;
+ int usecolorkey;
+};
+
+enum
+{
+ PDF_IMAGE_RAW,
+ PDF_IMAGE_FAX,
+ PDF_IMAGE_JPEG,
+ PDF_IMAGE_RLD,
+ PDF_IMAGE_FLATE,
+ PDF_IMAGE_LZW,
+ PDF_IMAGE_JPX
+};
+
+/*
+ * tokenizer and low-level object parser
+ */
+
+enum
+{
+ PDF_TOK_ERROR, PDF_TOK_EOF,
+ PDF_TOK_OPEN_ARRAY, PDF_TOK_CLOSE_ARRAY,
+ PDF_TOK_OPEN_DICT, PDF_TOK_CLOSE_DICT,
+ PDF_TOK_OPEN_BRACE, PDF_TOK_CLOSE_BRACE,
+ PDF_TOK_NAME, PDF_TOK_INT, PDF_TOK_REAL, PDF_TOK_STRING, PDF_TOK_KEYWORD,
+ PDF_TOK_R, PDF_TOK_TRUE, PDF_TOK_FALSE, PDF_TOK_NULL,
+ PDF_TOK_OBJ, PDF_TOK_ENDOBJ,
+ PDF_TOK_STREAM, PDF_TOK_ENDSTREAM,
+ PDF_TOK_XREF, PDF_TOK_TRAILER, PDF_TOK_STARTXREF,
+ PDF_NUM_TOKENS
+};
+
+enum
+{
+ PDF_LEXBUF_SMALL = 256,
+ PDF_LEXBUF_LARGE = 65536
+};
+
+typedef struct pdf_lexbuf_s pdf_lexbuf;
+typedef struct pdf_lexbuf_large_s pdf_lexbuf_large;
+
+struct pdf_lexbuf_s
+{
+ int size;
+ int len;
+ int i;
+ float f;
+ char scratch[PDF_LEXBUF_SMALL];
+};
+
+struct pdf_lexbuf_large_s
+{
+ pdf_lexbuf base;
+ char scratch[PDF_LEXBUF_LARGE - PDF_LEXBUF_SMALL];
+};
+
+int pdf_lex(fz_stream *f, pdf_lexbuf *lexbuf);
+
+pdf_obj *pdf_parse_array(pdf_document *doc, fz_stream *f, pdf_lexbuf *buf);
+pdf_obj *pdf_parse_dict(pdf_document *doc, fz_stream *f, pdf_lexbuf *buf);
+pdf_obj *pdf_parse_stm_obj(pdf_document *doc, fz_stream *f, pdf_lexbuf *buf);
+pdf_obj *pdf_parse_ind_obj(pdf_document *doc, fz_stream *f, pdf_lexbuf *buf, int *num, int *gen, int *stm_ofs);
+
+fz_matrix pdf_to_matrix(fz_context *ctx, pdf_obj *array);
+char *pdf_to_utf8(fz_context *ctx, pdf_obj *src);
+unsigned short *pdf_to_ucs2(fz_context *ctx, pdf_obj *src);
+pdf_obj *pdf_to_utf8_name(fz_context *ctx, pdf_obj *src);
+char *pdf_from_ucs2(fz_context *ctx, unsigned short *str);
+
+/*
+ * xref and object / stream api
+ */
+
+typedef struct pdf_crypt_s pdf_crypt;
+typedef struct pdf_ocg_descriptor_s pdf_ocg_descriptor;
+typedef struct pdf_ocg_entry_s pdf_ocg_entry;
+
+struct pdf_ocg_entry_s
+{
+ int num;
+ int gen;
+ int state;
+};
+
+struct pdf_ocg_descriptor_s
+{
+ int len;
+ pdf_ocg_entry *ocgs;
+ pdf_obj *intent;
+};
+
+struct pdf_document_s
+{
+ fz_document super;
+
+ fz_context *ctx;
+ fz_stream *file;
+
+ int version;
+ int startxref;
+ int file_size;
+ pdf_crypt *crypt;
+ pdf_obj *trailer;
+ pdf_ocg_descriptor *ocg;
+
+ int len;
+ pdf_xref_entry *table;
+
+ int page_len;
+ int page_cap;
+ pdf_obj **page_objs;
+ pdf_obj **page_refs;
+
+ pdf_lexbuf_large lexbuf;
+};
+
+void pdf_cache_object(pdf_document *doc, int num, int gen);
+
+fz_stream *pdf_open_inline_stream(pdf_document *doc, pdf_obj *stmobj, int length, fz_stream *chain, pdf_image_params *params);
+fz_buffer *pdf_load_image_stream(pdf_document *doc, int num, int gen, pdf_image_params *params);
+fz_stream *pdf_open_image_stream(pdf_document *doc, int num, int gen, pdf_image_params *params);
+fz_stream *pdf_open_stream_with_offset(pdf_document *doc, int num, int gen, pdf_obj *dict, int stm_ofs);
+fz_stream *pdf_open_image_decomp_stream(fz_context *ctx, fz_buffer *, pdf_image_params *params, int *factor);
+
+
+/* private */
+void pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf);
+void pdf_repair_obj_stms(pdf_document *doc);
+void pdf_debug_xref(pdf_document *);
+void pdf_resize_xref(pdf_document *doc, int newcap);
+
+/*
+ * Encryption
+ */
+
+enum
+{
+ PDF_PERM_PRINT = 1 << 2,
+ PDF_PERM_CHANGE = 1 << 3,
+ PDF_PERM_COPY = 1 << 4,
+ PDF_PERM_NOTES = 1 << 5,
+ PDF_PERM_FILL_FORM = 1 << 8,
+ PDF_PERM_ACCESSIBILITY = 1 << 9,
+ PDF_PERM_ASSEMBLE = 1 << 10,
+ PDF_PERM_HIGH_RES_PRINT = 1 << 11,
+ PDF_DEFAULT_PERM_FLAGS = 0xfffc
+};
+
+pdf_crypt *pdf_new_crypt(fz_context *ctx, pdf_obj *enc, pdf_obj *id);
+void pdf_free_crypt(fz_context *ctx, pdf_crypt *crypt);
+
+void pdf_crypt_obj(fz_context *ctx, pdf_crypt *crypt, pdf_obj *obj, int num, int gen);
+fz_stream *pdf_open_crypt(fz_stream *chain, pdf_crypt *crypt, int num, int gen);
+fz_stream *pdf_open_crypt_with_filter(fz_stream *chain, pdf_crypt *crypt, char *name, int num, int gen);
+
+int pdf_has_permission(pdf_document *doc, int p);
+
+int pdf_get_crypt_revision(pdf_document *doc);
+char *pdf_get_crypt_method(pdf_document *doc);
+int pdf_get_crypt_length(pdf_document *doc);
+unsigned char *pdf_get_crypt_key(pdf_document *doc);
+
+void pdf_debug_crypt(pdf_crypt *crypt);
+
+/*
+ * Functions, Colorspaces, Shadings and Images
+ */
+
+typedef struct pdf_function_s pdf_function;
+
+pdf_function *pdf_load_function(pdf_document *doc, pdf_obj *ref);
+void pdf_eval_function(fz_context *ctx, pdf_function *func, float *in, int inlen, float *out, int outlen);
+pdf_function *pdf_keep_function(fz_context *ctx, pdf_function *func);
+void pdf_drop_function(fz_context *ctx, pdf_function *func);
+unsigned int pdf_function_size(pdf_function *func);
+
+fz_colorspace *pdf_load_colorspace(pdf_document *doc, pdf_obj *obj);
+fz_pixmap *pdf_expand_indexed_pixmap(fz_context *ctx, fz_pixmap *src);
+
+fz_shade *pdf_load_shading(pdf_document *doc, pdf_obj *obj);
+
+fz_image *pdf_load_inline_image(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file);
+int pdf_is_jpx_image(fz_context *ctx, pdf_obj *dict);
+
+/*
+ * Pattern
+ */
+
+typedef struct pdf_pattern_s pdf_pattern;
+
+struct pdf_pattern_s
+{
+ fz_storable storable;
+ int ismask;
+ float xstep;
+ float ystep;
+ fz_matrix matrix;
+ fz_rect bbox;
+ pdf_obj *resources;
+ fz_buffer *contents;
+};
+
+pdf_pattern *pdf_load_pattern(pdf_document *doc, pdf_obj *obj);
+pdf_pattern *pdf_keep_pattern(fz_context *ctx, pdf_pattern *pat);
+void pdf_drop_pattern(fz_context *ctx, pdf_pattern *pat);
+
+/*
+ * XObject
+ */
+
+typedef struct pdf_xobject_s pdf_xobject;
+
+struct pdf_xobject_s
+{
+ fz_storable storable;
+ fz_matrix matrix;
+ fz_rect bbox;
+ int isolated;
+ int knockout;
+ int transparency;
+ fz_colorspace *colorspace;
+ pdf_obj *resources;
+ fz_buffer *contents;
+ pdf_obj *me;
+};
+
+pdf_xobject *pdf_load_xobject(pdf_document *doc, pdf_obj *obj);
+pdf_xobject *pdf_keep_xobject(fz_context *ctx, pdf_xobject *xobj);
+void pdf_drop_xobject(fz_context *ctx, pdf_xobject *xobj);
+
+/*
+ * CMap
+ */
+
+typedef struct pdf_cmap_s pdf_cmap;
+typedef struct pdf_range_s pdf_range;
+
+enum { PDF_CMAP_SINGLE, PDF_CMAP_RANGE, PDF_CMAP_TABLE, PDF_CMAP_MULTI };
+
+struct pdf_range_s
+{
+ unsigned short low;
+ /* Next, we pack 2 fields into the same unsigned short. Top 14 bits
+ * are the extent, bottom 2 bits are flags: single, range, table,
+ * multi */
+ unsigned short extent_flags;
+ unsigned short offset; /* range-delta or table-index */
+};
+
+struct pdf_cmap_s
+{
+ fz_storable storable;
+ char cmap_name[32];
+
+ char usecmap_name[32];
+ pdf_cmap *usecmap;
+
+ int wmode;
+
+ int codespace_len;
+ struct
+ {
+ unsigned short n;
+ unsigned short low;
+ unsigned short high;
+ } codespace[40];
+
+ int rlen, rcap;
+ pdf_range *ranges;
+
+ int tlen, tcap;
+ unsigned short *table;
+};
+
+pdf_cmap *pdf_new_cmap(fz_context *ctx);
+pdf_cmap *pdf_keep_cmap(fz_context *ctx, pdf_cmap *cmap);
+void pdf_drop_cmap(fz_context *ctx, pdf_cmap *cmap);
+void pdf_free_cmap_imp(fz_context *ctx, fz_storable *cmap);
+unsigned int pdf_cmap_size(fz_context *ctx, pdf_cmap *cmap);
+
+void pdf_debug_cmap(fz_context *ctx, pdf_cmap *cmap);
+int pdf_get_wmode(fz_context *ctx, pdf_cmap *cmap);
+void pdf_set_wmode(fz_context *ctx, pdf_cmap *cmap, int wmode);
+void pdf_set_usecmap(fz_context *ctx, pdf_cmap *cmap, pdf_cmap *usecmap);
+
+void pdf_add_codespace(fz_context *ctx, pdf_cmap *cmap, int low, int high, int n);
+void pdf_map_range_to_table(fz_context *ctx, pdf_cmap *cmap, int low, int *map, int len);
+void pdf_map_range_to_range(fz_context *ctx, pdf_cmap *cmap, int srclo, int srchi, int dstlo);
+void pdf_map_one_to_many(fz_context *ctx, pdf_cmap *cmap, int one, int *many, int len);
+void pdf_sort_cmap(fz_context *ctx, pdf_cmap *cmap);
+
+int pdf_lookup_cmap(pdf_cmap *cmap, int cpt);
+int pdf_lookup_cmap_full(pdf_cmap *cmap, int cpt, int *out);
+int pdf_decode_cmap(pdf_cmap *cmap, unsigned char *s, int *cpt);
+
+pdf_cmap *pdf_new_identity_cmap(fz_context *ctx, int wmode, int bytes);
+pdf_cmap *pdf_load_cmap(fz_context *ctx, fz_stream *file);
+pdf_cmap *pdf_load_system_cmap(fz_context *ctx, char *name);
+pdf_cmap *pdf_load_builtin_cmap(fz_context *ctx, char *name);
+pdf_cmap *pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *ref);
+
+/*
+ * Font
+ */
+
+enum
+{
+ PDF_FD_FIXED_PITCH = 1 << 0,
+ PDF_FD_SERIF = 1 << 1,
+ PDF_FD_SYMBOLIC = 1 << 2,
+ PDF_FD_SCRIPT = 1 << 3,
+ PDF_FD_NONSYMBOLIC = 1 << 5,
+ PDF_FD_ITALIC = 1 << 6,
+ PDF_FD_ALL_CAP = 1 << 16,
+ PDF_FD_SMALL_CAP = 1 << 17,
+ PDF_FD_FORCE_BOLD = 1 << 18
+};
+
+enum { PDF_ROS_CNS, PDF_ROS_GB, PDF_ROS_JAPAN, PDF_ROS_KOREA };
+
+void pdf_load_encoding(char **estrings, char *encoding);
+int pdf_lookup_agl(char *name);
+const char **pdf_lookup_agl_duplicates(int ucs);
+
+extern const unsigned short pdf_doc_encoding[256];
+extern const char * const pdf_mac_roman[256];
+extern const char * const pdf_mac_expert[256];
+extern const char * const pdf_win_ansi[256];
+extern const char * const pdf_standard[256];
+
+typedef struct pdf_font_desc_s pdf_font_desc;
+typedef struct pdf_hmtx_s pdf_hmtx;
+typedef struct pdf_vmtx_s pdf_vmtx;
+
+struct pdf_hmtx_s
+{
+ unsigned short lo;
+ unsigned short hi;
+ int w; /* type3 fonts can be big! */
+};
+
+struct pdf_vmtx_s
+{
+ unsigned short lo;
+ unsigned short hi;
+ short x;
+ short y;
+ short w;
+};
+
+struct pdf_font_desc_s
+{
+ fz_storable storable;
+ unsigned int size;
+
+ fz_font *font;
+
+ /* FontDescriptor */
+ int flags;
+ float italic_angle;
+ float ascent;
+ float descent;
+ float cap_height;
+ float x_height;
+ float missing_width;
+
+ /* Encoding (CMap) */
+ pdf_cmap *encoding;
+ pdf_cmap *to_ttf_cmap;
+ int cid_to_gid_len;
+ unsigned short *cid_to_gid;
+
+ /* ToUnicode */
+ pdf_cmap *to_unicode;
+ int cid_to_ucs_len;
+ unsigned short *cid_to_ucs;
+
+ /* Metrics (given in the PDF file) */
+ int wmode;
+
+ int hmtx_len, hmtx_cap;
+ pdf_hmtx dhmtx;
+ pdf_hmtx *hmtx;
+
+ int vmtx_len, vmtx_cap;
+ pdf_vmtx dvmtx;
+ pdf_vmtx *vmtx;
+
+ int is_embedded;
+};
+
+void pdf_set_font_wmode(fz_context *ctx, pdf_font_desc *font, int wmode);
+void pdf_set_default_hmtx(fz_context *ctx, pdf_font_desc *font, int w);
+void pdf_set_default_vmtx(fz_context *ctx, pdf_font_desc *font, int y, int w);
+void pdf_add_hmtx(fz_context *ctx, pdf_font_desc *font, int lo, int hi, int w);
+void pdf_add_vmtx(fz_context *ctx, pdf_font_desc *font, int lo, int hi, int x, int y, int w);
+void pdf_end_hmtx(fz_context *ctx, pdf_font_desc *font);
+void pdf_end_vmtx(fz_context *ctx, pdf_font_desc *font);
+pdf_hmtx pdf_get_hmtx(fz_context *ctx, pdf_font_desc *font, int cid);
+pdf_vmtx pdf_get_vmtx(fz_context *ctx, pdf_font_desc *font, int cid);
+
+void pdf_load_to_unicode(pdf_document *doc, pdf_font_desc *font, char **strings, char *collection, pdf_obj *cmapstm);
+
+int pdf_font_cid_to_gid(fz_context *ctx, pdf_font_desc *fontdesc, int cid);
+
+unsigned char *pdf_find_builtin_font(char *name, unsigned int *len);
+unsigned char *pdf_find_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len);
+unsigned char *pdf_find_substitute_cjk_font(int ros, int serif, unsigned int *len);
+
+pdf_font_desc *pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *obj);
+pdf_font_desc *pdf_load_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *obj);
+
+pdf_font_desc *pdf_new_font_desc(fz_context *ctx);
+pdf_font_desc *pdf_keep_font(fz_context *ctx, pdf_font_desc *fontdesc);
+void pdf_drop_font(fz_context *ctx, pdf_font_desc *font);
+
+void pdf_debug_font(fz_context *ctx, pdf_font_desc *fontdesc);
+
+/*
+ * Interactive features
+ */
+
+typedef struct pdf_annot_s pdf_annot;
+
+struct pdf_annot_s
+{
+ pdf_obj *obj;
+ fz_rect rect;
+ pdf_xobject *ap;
+ fz_matrix matrix;
+ pdf_annot *next;
+};
+
+fz_link_dest pdf_parse_link_dest(pdf_document *doc, pdf_obj *dest);
+fz_link_dest pdf_parse_action(pdf_document *doc, pdf_obj *action);
+pdf_obj *pdf_lookup_dest(pdf_document *doc, pdf_obj *needle);
+pdf_obj *pdf_lookup_name(pdf_document *doc, char *which, pdf_obj *needle);
+pdf_obj *pdf_load_name_tree(pdf_document *doc, char *which);
+
+fz_outline *pdf_load_outline(pdf_document *doc);
+
+fz_link *pdf_load_link_annots(pdf_document *, pdf_obj *annots, fz_matrix page_ctm);
+
+pdf_annot *pdf_load_annots(pdf_document *, pdf_obj *annots);
+void pdf_free_annot(fz_context *ctx, pdf_annot *link);
+
+/*
+ * Page tree, pages and related objects
+ */
+
+typedef struct pdf_page_s pdf_page;
+
+struct pdf_page_s
+{
+ fz_matrix ctm; /* calculated from mediabox and rotate */
+ fz_rect mediabox;
+ int rotate;
+ int transparency;
+ pdf_obj *resources;
+ fz_buffer *contents;
+ fz_link *links;
+ pdf_annot *annots;
+};
+
+int pdf_find_page_number(pdf_document *doc, pdf_obj *pageobj);
+int pdf_count_pages(pdf_document *doc);
+
+/*
+ pdf_load_page: Load a page and its resources.
+
+ Locates the page in the PDF document and loads the page and its
+ resources. After pdf_load_page is it possible to retrieve the size
+ of the page using pdf_bound_page, or to render the page using
+ pdf_run_page_*.
+
+ number: page number, where 0 is the first page of the document.
+*/
+pdf_page *pdf_load_page(pdf_document *doc, int number);
+
+fz_link *pdf_load_links(pdf_document *doc, pdf_page *page);
+
+/*
+ pdf_bound_page: Determine the size of a page.
+
+ Determine the page size in user space units, taking page rotation
+ into account. The page size is taken to be the crop box if it
+ exists (visible area after cropping), otherwise the media box will
+ be used (possibly including printing marks).
+
+ Does not throw exceptions.
+*/
+fz_rect pdf_bound_page(pdf_document *doc, pdf_page *page);
+
+/*
+ pdf_free_page: Frees a page and its resources.
+
+ Does not throw exceptions.
+*/
+void pdf_free_page(pdf_document *doc, pdf_page *page);
+
+/*
+ * Content stream parsing
+ */
+
+/*
+ pdf_run_page: Interpret a loaded page and render it on a device.
+
+ page: A page loaded by pdf_load_page.
+
+ dev: Device used for rendering, obtained from fz_new_*_device.
+
+ ctm: A transformation matrix applied to the objects on the page,
+ e.g. to scale or rotate the page contents as desired.
+*/
+void pdf_run_page(pdf_document *doc, pdf_page *page, fz_device *dev, fz_matrix ctm, fz_cookie *cookie);
+
+void pdf_run_page_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev, fz_matrix ctm, char *event, fz_cookie *cookie);
+void pdf_run_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, fz_matrix ctm, void *gstate);
+
+/*
+ * PDF interface to store
+ */
+
+void pdf_store_item(fz_context *ctx, pdf_obj *key, void *val, unsigned int itemsize);
+void *pdf_find_item(fz_context *ctx, fz_store_free_fn *free, pdf_obj *key);
+void pdf_remove_item(fz_context *ctx, fz_store_free_fn *free, pdf_obj *key);
+
+#endif /* _MUPDF_INTERNAL_H_ */
diff --git a/pdf/mupdf.h b/pdf/mupdf.h
index 5d775044..0e5df0d9 100644
--- a/pdf/mupdf.h
+++ b/pdf/mupdf.h
@@ -1,9 +1,9 @@
#ifndef _MUPDF_H_
#define _MUPDF_H_
-#ifndef _FITZ_H_
-#error "fitz.h must be included before mupdf.h"
-#endif
+#include "fitz.h"
+
+typedef struct pdf_document_s pdf_document;
/*
* Dynamic objects.
@@ -39,6 +39,7 @@ int pdf_is_string(pdf_obj *obj);
int pdf_is_array(pdf_obj *obj);
int pdf_is_dict(pdf_obj *obj);
int pdf_is_indirect(pdf_obj *obj);
+int pdf_is_stream(pdf_document *doc, int num, int gen);
int pdf_objcmp(pdf_obj *a, pdf_obj *b);
@@ -81,156 +82,9 @@ int pdf_fprint_obj(FILE *fp, pdf_obj *obj, int tight);
void pdf_debug_obj(pdf_obj *obj);
void pdf_debug_ref(pdf_obj *obj);
-void pdf_set_str_len(pdf_obj *obj, int newlen); /* private */
-void *pdf_get_indirect_document(pdf_obj *obj); /* private */
-
-/*
- * PDF Images
- */
-
-typedef struct pdf_image_params_s pdf_image_params;
-
-struct pdf_image_params_s
-{
- int type;
- fz_colorspace *colorspace;
- union
- {
- struct
- {
- int columns;
- int rows;
- int k;
- int eol;
- int eba;
- int eob;
- int bi1;
- }
- fax;
- struct
- {
- int ct;
- }
- jpeg;
- struct
- {
- int columns;
- int colors;
- int predictor;
- int bpc;
- }
- flate;
- struct
- {
- int columns;
- int colors;
- int predictor;
- int bpc;
- int ec;
- }
- lzw;
- }
- u;
-};
-
-
-typedef struct pdf_image_s pdf_image;
-
-struct pdf_image_s
-{
- fz_image base;
- fz_pixmap *tile;
- int n, bpc;
- pdf_image_params params;
- fz_buffer *buffer;
- int colorkey[FZ_MAX_COLORS * 2];
- float decode[FZ_MAX_COLORS * 2];
- int imagemask;
- int interpolate;
- int usecolorkey;
-};
-
-enum
-{
- PDF_IMAGE_RAW,
- PDF_IMAGE_FAX,
- PDF_IMAGE_JPEG,
- PDF_IMAGE_RLD,
- PDF_IMAGE_FLATE,
- PDF_IMAGE_LZW,
- PDF_IMAGE_JPX
-};
-
-typedef struct pdf_document_s pdf_document;
-
-/*
- * tokenizer and low-level object parser
- */
-
-enum
-{
- PDF_TOK_ERROR, PDF_TOK_EOF,
- PDF_TOK_OPEN_ARRAY, PDF_TOK_CLOSE_ARRAY,
- PDF_TOK_OPEN_DICT, PDF_TOK_CLOSE_DICT,
- PDF_TOK_OPEN_BRACE, PDF_TOK_CLOSE_BRACE,
- PDF_TOK_NAME, PDF_TOK_INT, PDF_TOK_REAL, PDF_TOK_STRING, PDF_TOK_KEYWORD,
- PDF_TOK_R, PDF_TOK_TRUE, PDF_TOK_FALSE, PDF_TOK_NULL,
- PDF_TOK_OBJ, PDF_TOK_ENDOBJ,
- PDF_TOK_STREAM, PDF_TOK_ENDSTREAM,
- PDF_TOK_XREF, PDF_TOK_TRAILER, PDF_TOK_STARTXREF,
- PDF_NUM_TOKENS
-};
-
-enum
-{
- PDF_LEXBUF_SMALL = 256,
- PDF_LEXBUF_LARGE = 65536
-};
-
-
-
-typedef struct pdf_lexbuf_s pdf_lexbuf;
-typedef struct pdf_lexbuf_large_s pdf_lexbuf_large;
-
-struct pdf_lexbuf_s
-{
- int size;
- int len;
- int i;
- float f;
- char scratch[PDF_LEXBUF_SMALL];
-};
-
-struct pdf_lexbuf_large_s
-{
- pdf_lexbuf base;
- char scratch[PDF_LEXBUF_LARGE - PDF_LEXBUF_SMALL];
-};
-
-
-
-int pdf_lex(fz_stream *f, pdf_lexbuf *lexbuf);
-
-pdf_obj *pdf_parse_array(pdf_document *doc, fz_stream *f, pdf_lexbuf *buf);
-pdf_obj *pdf_parse_dict(pdf_document *doc, fz_stream *f, pdf_lexbuf *buf);
-pdf_obj *pdf_parse_stm_obj(pdf_document *doc, fz_stream *f, pdf_lexbuf *buf);
-pdf_obj *pdf_parse_ind_obj(pdf_document *doc, fz_stream *f, pdf_lexbuf *buf, int *num, int *gen, int *stm_ofs);
-
fz_rect pdf_to_rect(fz_context *ctx, pdf_obj *array);
-fz_matrix pdf_to_matrix(fz_context *ctx, pdf_obj *array);
-char *pdf_to_utf8(fz_context *ctx, pdf_obj *src);
-unsigned short *pdf_to_ucs2(fz_context *ctx, pdf_obj *src);
-pdf_obj *pdf_to_utf8_name(fz_context *ctx, pdf_obj *src);
-char *pdf_from_ucs2(fz_context *ctx, unsigned short *str);
-
-/*
- * xref and object / stream api
- */
typedef struct pdf_xref_entry_s pdf_xref_entry;
-typedef struct pdf_crypt_s pdf_crypt;
-typedef struct pdf_ocg_descriptor_s pdf_ocg_descriptor;
-typedef struct pdf_ocg_entry_s pdf_ocg_entry;
struct pdf_xref_entry_s
{
@@ -241,60 +95,14 @@ struct pdf_xref_entry_s
int type; /* 0=unset (f)ree i(n)use (o)bjstm */
};
-struct pdf_ocg_entry_s
-{
- int num;
- int gen;
- int state;
-};
-
-struct pdf_ocg_descriptor_s
-{
- int len;
- pdf_ocg_entry *ocgs;
- pdf_obj *intent;
-};
-
-struct pdf_document_s
-{
- fz_document super;
-
- fz_context *ctx;
- fz_stream *file;
-
- int version;
- int startxref;
- int file_size;
- pdf_crypt *crypt;
- pdf_obj *trailer;
- pdf_ocg_descriptor *ocg;
-
- int len;
- pdf_xref_entry *table;
-
- int page_len;
- int page_cap;
- pdf_obj **page_objs;
- pdf_obj **page_refs;
-
- pdf_lexbuf_large lexbuf;
-};
-
pdf_obj *pdf_resolve_indirect(pdf_obj *ref);
-void pdf_cache_object(pdf_document *doc, int num, int gen);
pdf_obj *pdf_load_object(pdf_document *doc, int num, int gen);
void pdf_update_object(pdf_document *doc, int num, int gen, pdf_obj *newobj);
-int pdf_is_stream(pdf_document *doc, int num, int gen);
-fz_stream *pdf_open_inline_stream(pdf_document *doc, pdf_obj *stmobj, int length, fz_stream *chain, pdf_image_params *params);
fz_buffer *pdf_load_raw_stream(pdf_document *doc, int num, int gen);
fz_buffer *pdf_load_stream(pdf_document *doc, int num, int gen);
-fz_buffer *pdf_load_image_stream(pdf_document *doc, int num, int gen, pdf_image_params *params);
fz_stream *pdf_open_raw_stream(pdf_document *doc, int num, int gen);
-fz_stream *pdf_open_image_stream(pdf_document *doc, int num, int gen, pdf_image_params *params);
fz_stream *pdf_open_stream(pdf_document *doc, int num, int gen);
-fz_stream *pdf_open_stream_with_offset(pdf_document *doc, int num, int gen, pdf_obj *dict, int stm_ofs);
-fz_stream *pdf_open_image_decomp_stream(fz_context *ctx, fz_buffer *, pdf_image_params *params, int *factor);
/*
pdf_open_document: Open a PDF document.
@@ -336,409 +144,9 @@ pdf_document *pdf_open_document_with_stream(fz_stream *file);
*/
void pdf_close_document(pdf_document *doc);
-/* private */
-void pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf);
-void pdf_repair_obj_stms(pdf_document *doc);
-void pdf_debug_xref(pdf_document *);
-void pdf_resize_xref(pdf_document *doc, int newcap);
-
-/*
- * Encryption
- */
-
-enum
-{
- PDF_PERM_PRINT = 1 << 2,
- PDF_PERM_CHANGE = 1 << 3,
- PDF_PERM_COPY = 1 << 4,
- PDF_PERM_NOTES = 1 << 5,
- PDF_PERM_FILL_FORM = 1 << 8,
- PDF_PERM_ACCESSIBILITY = 1 << 9,
- PDF_PERM_ASSEMBLE = 1 << 10,
- PDF_PERM_HIGH_RES_PRINT = 1 << 11,
- PDF_DEFAULT_PERM_FLAGS = 0xfffc
-};
-
-pdf_crypt *pdf_new_crypt(fz_context *ctx, pdf_obj *enc, pdf_obj *id);
-void pdf_free_crypt(fz_context *ctx, pdf_crypt *crypt);
-
-void pdf_crypt_obj(fz_context *ctx, pdf_crypt *crypt, pdf_obj *obj, int num, int gen);
-fz_stream *pdf_open_crypt(fz_stream *chain, pdf_crypt *crypt, int num, int gen);
-fz_stream *pdf_open_crypt_with_filter(fz_stream *chain, pdf_crypt *crypt, char *name, int num, int gen);
-
int pdf_needs_password(pdf_document *doc);
int pdf_authenticate_password(pdf_document *doc, char *pw);
-int pdf_has_permission(pdf_document *doc, int p);
-
-int pdf_get_crypt_revision(pdf_document *doc);
-char *pdf_get_crypt_method(pdf_document *doc);
-int pdf_get_crypt_length(pdf_document *doc);
-unsigned char *pdf_get_crypt_key(pdf_document *doc);
-
-void pdf_debug_crypt(pdf_crypt *crypt);
-
-/*
- * Functions, Colorspaces, Shadings and Images
- */
-
-typedef struct pdf_function_s pdf_function;
-
-pdf_function *pdf_load_function(pdf_document *doc, pdf_obj *ref);
-void pdf_eval_function(fz_context *ctx, pdf_function *func, float *in, int inlen, float *out, int outlen);
-pdf_function *pdf_keep_function(fz_context *ctx, pdf_function *func);
-void pdf_drop_function(fz_context *ctx, pdf_function *func);
-unsigned int pdf_function_size(pdf_function *func);
-fz_colorspace *pdf_load_colorspace(pdf_document *doc, pdf_obj *obj);
-fz_pixmap *pdf_expand_indexed_pixmap(fz_context *ctx, fz_pixmap *src);
-
-fz_shade *pdf_load_shading(pdf_document *doc, pdf_obj *obj);
-
-fz_image *pdf_load_inline_image(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file);
fz_image *pdf_load_image(pdf_document *doc, pdf_obj *obj);
-int pdf_is_jpx_image(fz_context *ctx, pdf_obj *dict);
-
-/*
- * Pattern
- */
-
-typedef struct pdf_pattern_s pdf_pattern;
-
-struct pdf_pattern_s
-{
- fz_storable storable;
- int ismask;
- float xstep;
- float ystep;
- fz_matrix matrix;
- fz_rect bbox;
- pdf_obj *resources;
- fz_buffer *contents;
-};
-
-pdf_pattern *pdf_load_pattern(pdf_document *doc, pdf_obj *obj);
-pdf_pattern *pdf_keep_pattern(fz_context *ctx, pdf_pattern *pat);
-void pdf_drop_pattern(fz_context *ctx, pdf_pattern *pat);
-
-/*
- * XObject
- */
-
-typedef struct pdf_xobject_s pdf_xobject;
-
-struct pdf_xobject_s
-{
- fz_storable storable;
- fz_matrix matrix;
- fz_rect bbox;
- int isolated;
- int knockout;
- int transparency;
- fz_colorspace *colorspace;
- pdf_obj *resources;
- fz_buffer *contents;
- pdf_obj *me;
-};
-
-pdf_xobject *pdf_load_xobject(pdf_document *doc, pdf_obj *obj);
-pdf_xobject *pdf_keep_xobject(fz_context *ctx, pdf_xobject *xobj);
-void pdf_drop_xobject(fz_context *ctx, pdf_xobject *xobj);
-
-/*
- * CMap
- */
-
-typedef struct pdf_cmap_s pdf_cmap;
-typedef struct pdf_range_s pdf_range;
-
-enum { PDF_CMAP_SINGLE, PDF_CMAP_RANGE, PDF_CMAP_TABLE, PDF_CMAP_MULTI };
-
-struct pdf_range_s
-{
- unsigned short low;
- /* Next, we pack 2 fields into the same unsigned short. Top 14 bits
- * are the extent, bottom 2 bits are flags: single, range, table,
- * multi */
- unsigned short extent_flags;
- unsigned short offset; /* range-delta or table-index */
-};
-
-struct pdf_cmap_s
-{
- fz_storable storable;
- char cmap_name[32];
-
- char usecmap_name[32];
- pdf_cmap *usecmap;
-
- int wmode;
-
- int codespace_len;
- struct
- {
- unsigned short n;
- unsigned short low;
- unsigned short high;
- } codespace[40];
-
- int rlen, rcap;
- pdf_range *ranges;
-
- int tlen, tcap;
- unsigned short *table;
-};
-
-pdf_cmap *pdf_new_cmap(fz_context *ctx);
-pdf_cmap *pdf_keep_cmap(fz_context *ctx, pdf_cmap *cmap);
-void pdf_drop_cmap(fz_context *ctx, pdf_cmap *cmap);
-void pdf_free_cmap_imp(fz_context *ctx, fz_storable *cmap);
-unsigned int pdf_cmap_size(fz_context *ctx, pdf_cmap *cmap);
-
-void pdf_debug_cmap(fz_context *ctx, pdf_cmap *cmap);
-int pdf_get_wmode(fz_context *ctx, pdf_cmap *cmap);
-void pdf_set_wmode(fz_context *ctx, pdf_cmap *cmap, int wmode);
-void pdf_set_usecmap(fz_context *ctx, pdf_cmap *cmap, pdf_cmap *usecmap);
-
-void pdf_add_codespace(fz_context *ctx, pdf_cmap *cmap, int low, int high, int n);
-void pdf_map_range_to_table(fz_context *ctx, pdf_cmap *cmap, int low, int *map, int len);
-void pdf_map_range_to_range(fz_context *ctx, pdf_cmap *cmap, int srclo, int srchi, int dstlo);
-void pdf_map_one_to_many(fz_context *ctx, pdf_cmap *cmap, int one, int *many, int len);
-void pdf_sort_cmap(fz_context *ctx, pdf_cmap *cmap);
-
-int pdf_lookup_cmap(pdf_cmap *cmap, int cpt);
-int pdf_lookup_cmap_full(pdf_cmap *cmap, int cpt, int *out);
-int pdf_decode_cmap(pdf_cmap *cmap, unsigned char *s, int *cpt);
-
-pdf_cmap *pdf_new_identity_cmap(fz_context *ctx, int wmode, int bytes);
-pdf_cmap *pdf_load_cmap(fz_context *ctx, fz_stream *file);
-pdf_cmap *pdf_load_system_cmap(fz_context *ctx, char *name);
-pdf_cmap *pdf_load_builtin_cmap(fz_context *ctx, char *name);
-pdf_cmap *pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *ref);
-
-/*
- * Font
- */
-
-enum
-{
- PDF_FD_FIXED_PITCH = 1 << 0,
- PDF_FD_SERIF = 1 << 1,
- PDF_FD_SYMBOLIC = 1 << 2,
- PDF_FD_SCRIPT = 1 << 3,
- PDF_FD_NONSYMBOLIC = 1 << 5,
- PDF_FD_ITALIC = 1 << 6,
- PDF_FD_ALL_CAP = 1 << 16,
- PDF_FD_SMALL_CAP = 1 << 17,
- PDF_FD_FORCE_BOLD = 1 << 18
-};
-
-enum { PDF_ROS_CNS, PDF_ROS_GB, PDF_ROS_JAPAN, PDF_ROS_KOREA };
-
-void pdf_load_encoding(char **estrings, char *encoding);
-int pdf_lookup_agl(char *name);
-const char **pdf_lookup_agl_duplicates(int ucs);
-
-extern const unsigned short pdf_doc_encoding[256];
-extern const char * const pdf_mac_roman[256];
-extern const char * const pdf_mac_expert[256];
-extern const char * const pdf_win_ansi[256];
-extern const char * const pdf_standard[256];
-
-typedef struct pdf_font_desc_s pdf_font_desc;
-typedef struct pdf_hmtx_s pdf_hmtx;
-typedef struct pdf_vmtx_s pdf_vmtx;
-
-struct pdf_hmtx_s
-{
- unsigned short lo;
- unsigned short hi;
- int w; /* type3 fonts can be big! */
-};
-
-struct pdf_vmtx_s
-{
- unsigned short lo;
- unsigned short hi;
- short x;
- short y;
- short w;
-};
-
-struct pdf_font_desc_s
-{
- fz_storable storable;
- unsigned int size;
-
- fz_font *font;
-
- /* FontDescriptor */
- int flags;
- float italic_angle;
- float ascent;
- float descent;
- float cap_height;
- float x_height;
- float missing_width;
-
- /* Encoding (CMap) */
- pdf_cmap *encoding;
- pdf_cmap *to_ttf_cmap;
- int cid_to_gid_len;
- unsigned short *cid_to_gid;
-
- /* ToUnicode */
- pdf_cmap *to_unicode;
- int cid_to_ucs_len;
- unsigned short *cid_to_ucs;
-
- /* Metrics (given in the PDF file) */
- int wmode;
-
- int hmtx_len, hmtx_cap;
- pdf_hmtx dhmtx;
- pdf_hmtx *hmtx;
-
- int vmtx_len, vmtx_cap;
- pdf_vmtx dvmtx;
- pdf_vmtx *vmtx;
-
- int is_embedded;
-};
-
-void pdf_set_font_wmode(fz_context *ctx, pdf_font_desc *font, int wmode);
-void pdf_set_default_hmtx(fz_context *ctx, pdf_font_desc *font, int w);
-void pdf_set_default_vmtx(fz_context *ctx, pdf_font_desc *font, int y, int w);
-void pdf_add_hmtx(fz_context *ctx, pdf_font_desc *font, int lo, int hi, int w);
-void pdf_add_vmtx(fz_context *ctx, pdf_font_desc *font, int lo, int hi, int x, int y, int w);
-void pdf_end_hmtx(fz_context *ctx, pdf_font_desc *font);
-void pdf_end_vmtx(fz_context *ctx, pdf_font_desc *font);
-pdf_hmtx pdf_get_hmtx(fz_context *ctx, pdf_font_desc *font, int cid);
-pdf_vmtx pdf_get_vmtx(fz_context *ctx, pdf_font_desc *font, int cid);
-
-void pdf_load_to_unicode(pdf_document *doc, pdf_font_desc *font, char **strings, char *collection, pdf_obj *cmapstm);
-
-int pdf_font_cid_to_gid(fz_context *ctx, pdf_font_desc *fontdesc, int cid);
-
-unsigned char *pdf_find_builtin_font(char *name, unsigned int *len);
-unsigned char *pdf_find_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len);
-unsigned char *pdf_find_substitute_cjk_font(int ros, int serif, unsigned int *len);
-
-pdf_font_desc *pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *obj);
-pdf_font_desc *pdf_load_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *obj);
-
-pdf_font_desc *pdf_new_font_desc(fz_context *ctx);
-pdf_font_desc *pdf_keep_font(fz_context *ctx, pdf_font_desc *fontdesc);
-void pdf_drop_font(fz_context *ctx, pdf_font_desc *font);
-
-void pdf_debug_font(fz_context *ctx, pdf_font_desc *fontdesc);
-
-/*
- * Interactive features
- */
-
-typedef struct pdf_annot_s pdf_annot;
-
-struct pdf_annot_s
-{
- pdf_obj *obj;
- fz_rect rect;
- pdf_xobject *ap;
- fz_matrix matrix;
- pdf_annot *next;
-};
-
-fz_link_dest pdf_parse_link_dest(pdf_document *doc, pdf_obj *dest);
-fz_link_dest pdf_parse_action(pdf_document *doc, pdf_obj *action);
-pdf_obj *pdf_lookup_dest(pdf_document *doc, pdf_obj *needle);
-pdf_obj *pdf_lookup_name(pdf_document *doc, char *which, pdf_obj *needle);
-pdf_obj *pdf_load_name_tree(pdf_document *doc, char *which);
-
-fz_outline *pdf_load_outline(pdf_document *doc);
-
-fz_link *pdf_load_link_annots(pdf_document *, pdf_obj *annots, fz_matrix page_ctm);
-
-pdf_annot *pdf_load_annots(pdf_document *, pdf_obj *annots);
-void pdf_free_annot(fz_context *ctx, pdf_annot *link);
-
-/*
- * Page tree, pages and related objects
- */
-
-typedef struct pdf_page_s pdf_page;
-
-struct pdf_page_s
-{
- fz_matrix ctm; /* calculated from mediabox and rotate */
- fz_rect mediabox;
- int rotate;
- int transparency;
- pdf_obj *resources;
- fz_buffer *contents;
- fz_link *links;
- pdf_annot *annots;
-};
-
-int pdf_find_page_number(pdf_document *doc, pdf_obj *pageobj);
-int pdf_count_pages(pdf_document *doc);
-
-/*
- pdf_load_page: Load a page and its resources.
-
- Locates the page in the PDF document and loads the page and its
- resources. After pdf_load_page is it possible to retrieve the size
- of the page using pdf_bound_page, or to render the page using
- pdf_run_page_*.
-
- number: page number, where 0 is the first page of the document.
-*/
-pdf_page *pdf_load_page(pdf_document *doc, int number);
-
-fz_link *pdf_load_links(pdf_document *doc, pdf_page *page);
-
-/*
- pdf_bound_page: Determine the size of a page.
-
- Determine the page size in user space units, taking page rotation
- into account. The page size is taken to be the crop box if it
- exists (visible area after cropping), otherwise the media box will
- be used (possibly including printing marks).
-
- Does not throw exceptions.
-*/
-fz_rect pdf_bound_page(pdf_document *doc, pdf_page *page);
-
-/*
- pdf_free_page: Frees a page and its resources.
-
- Does not throw exceptions.
-*/
-void pdf_free_page(pdf_document *doc, pdf_page *page);
-
-/*
- * Content stream parsing
- */
-
-/*
- pdf_run_page: Interpret a loaded page and render it on a device.
-
- page: A page loaded by pdf_load_page.
-
- dev: Device used for rendering, obtained from fz_new_*_device.
-
- ctm: A transformation matrix applied to the objects on the page,
- e.g. to scale or rotate the page contents as desired.
-*/
-void pdf_run_page(pdf_document *doc, pdf_page *page, fz_device *dev, fz_matrix ctm, fz_cookie *cookie);
-
-void pdf_run_page_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev, fz_matrix ctm, char *event, fz_cookie *cookie);
-void pdf_run_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, fz_matrix ctm, void *gstate);
-
-/*
- * PDF interface to store
- */
-
-void pdf_store_item(fz_context *ctx, pdf_obj *key, void *val, unsigned int itemsize);
-void *pdf_find_item(fz_context *ctx, fz_store_free_fn *free, pdf_obj *key);
-void pdf_remove_item(fz_context *ctx, fz_store_free_fn *free, pdf_obj *key);
-#endif
+#endif /* _MUPDF_H_ */
diff --git a/pdf/pdf_annot.c b/pdf/pdf_annot.c
index 81e5d887..bd0ad808 100644
--- a/pdf/pdf_annot.c
+++ b/pdf/pdf_annot.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
static pdf_obj *
resolve_dest_rec(pdf_document *xref, pdf_obj *dest, int depth)
diff --git a/pdf/pdf_cmap.c b/pdf/pdf_cmap.c
index 987da592..712ebfe7 100644
--- a/pdf/pdf_cmap.c
+++ b/pdf/pdf_cmap.c
@@ -15,8 +15,8 @@
* or can trust the parser to give us optimal mappings.
*/
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
/* Macros for accessing the combined extent_flags field */
#define pdf_range_high(r) ((r)->low + ((r)->extent_flags >> 2))
diff --git a/pdf/pdf_cmap_load.c b/pdf/pdf_cmap_load.c
index d4e161c8..6867d845 100644
--- a/pdf/pdf_cmap_load.c
+++ b/pdf/pdf_cmap_load.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
unsigned int
pdf_cmap_size(fz_context *ctx, pdf_cmap *cmap)
diff --git a/pdf/pdf_cmap_parse.c b/pdf/pdf_cmap_parse.c
index 4933dea5..3396e3ae 100644
--- a/pdf/pdf_cmap_parse.c
+++ b/pdf/pdf_cmap_parse.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
/*
* CMap parser
diff --git a/pdf/pdf_cmap_table.c b/pdf/pdf_cmap_table.c
index fbe528e0..21dfe5fa 100644
--- a/pdf/pdf_cmap_table.c
+++ b/pdf/pdf_cmap_table.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
#ifndef NOCJK
#include "../generated/cmap_cns.h"
diff --git a/pdf/pdf_colorspace.c b/pdf/pdf_colorspace.c
index 05d0c135..5bf84535 100644
--- a/pdf/pdf_colorspace.c
+++ b/pdf/pdf_colorspace.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
/* ICCBased */
diff --git a/pdf/pdf_crypt.c b/pdf/pdf_crypt.c
index 510acc7b..2927527e 100644
--- a/pdf/pdf_crypt.c
+++ b/pdf/pdf_crypt.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
enum
{
diff --git a/pdf/pdf_encoding.c b/pdf/pdf_encoding.c
index 9a42a1c1..eb36ed96 100644
--- a/pdf/pdf_encoding.c
+++ b/pdf/pdf_encoding.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
#include "data_encodings.h"
#include "data_glyphlist.h"
diff --git a/pdf/pdf_font.c b/pdf/pdf_font.c
index 5e54e0bb..11c97d37 100644
--- a/pdf/pdf_font.c
+++ b/pdf/pdf_font.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
#include <ft2build.h>
#include FT_FREETYPE_H
diff --git a/pdf/pdf_fontfile.c b/pdf/pdf_fontfile.c
index 543ce763..4dbbe91c 100644
--- a/pdf/pdf_fontfile.c
+++ b/pdf/pdf_fontfile.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
#ifdef NOCJK
#define NOCJKFONT
diff --git a/pdf/pdf_function.c b/pdf/pdf_function.c
index 932d4c77..159515c1 100644
--- a/pdf/pdf_function.c
+++ b/pdf/pdf_function.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
enum
{
diff --git a/pdf/pdf_image.c b/pdf/pdf_image.c
index 4cdd374a..17996a74 100644
--- a/pdf/pdf_image.c
+++ b/pdf/pdf_image.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
typedef struct pdf_image_key_s pdf_image_key;
diff --git a/pdf/pdf_interpret.c b/pdf/pdf_interpret.c
index ca957d09..1c2a11f3 100644
--- a/pdf/pdf_interpret.c
+++ b/pdf/pdf_interpret.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
#define TILE
diff --git a/pdf/pdf_lex.c b/pdf/pdf_lex.c
index 322d945c..6774167a 100644
--- a/pdf/pdf_lex.c
+++ b/pdf/pdf_lex.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
#define IS_NUMBER \
'+':case'-':case'.':case'0':case'1':case'2':case'3':\
diff --git a/pdf/pdf_metrics.c b/pdf/pdf_metrics.c
index fc888257..ae4405ed 100644
--- a/pdf/pdf_metrics.c
+++ b/pdf/pdf_metrics.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
void
pdf_set_font_wmode(fz_context *ctx, pdf_font_desc *font, int wmode)
diff --git a/pdf/pdf_nametree.c b/pdf/pdf_nametree.c
index 98a10241..b24d2c24 100644
--- a/pdf/pdf_nametree.c
+++ b/pdf/pdf_nametree.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
static pdf_obj *
pdf_lookup_name_imp(fz_context *ctx, pdf_obj *node, pdf_obj *needle)
diff --git a/pdf/pdf_outline.c b/pdf/pdf_outline.c
index 793b5f77..d4bea75a 100644
--- a/pdf/pdf_outline.c
+++ b/pdf/pdf_outline.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
static fz_outline *
pdf_load_outline_imp(pdf_document *xref, pdf_obj *dict)
diff --git a/pdf/pdf_page.c b/pdf/pdf_page.c
index ca38aacf..5b9106d1 100644
--- a/pdf/pdf_page.c
+++ b/pdf/pdf_page.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
struct info
{
diff --git a/pdf/pdf_parse.c b/pdf/pdf_parse.c
index 57ba1d6f..d2cf8d81 100644
--- a/pdf/pdf_parse.c
+++ b/pdf/pdf_parse.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
fz_rect
pdf_to_rect(fz_context *ctx, pdf_obj *array)
diff --git a/pdf/pdf_pattern.c b/pdf/pdf_pattern.c
index 00e4b8fb..14175670 100644
--- a/pdf/pdf_pattern.c
+++ b/pdf/pdf_pattern.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
pdf_pattern *
pdf_keep_pattern(fz_context *ctx, pdf_pattern *pat)
diff --git a/pdf/pdf_repair.c b/pdf/pdf_repair.c
index f42198eb..fda1e6b5 100644
--- a/pdf/pdf_repair.c
+++ b/pdf/pdf_repair.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
/* Scan file for objects and reconstruct xref table */
diff --git a/pdf/pdf_shade.c b/pdf/pdf_shade.c
index c3bddcbc..589b7613 100644
--- a/pdf/pdf_shade.c
+++ b/pdf/pdf_shade.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
#define HUGENUM 32000 /* how far to extend axial/radial shadings */
#define FUNSEGS 32 /* size of sampled mesh for function-based shadings */
diff --git a/pdf/pdf_store.c b/pdf/pdf_store.c
index 38abe10b..ae8eac9a 100644
--- a/pdf/pdf_store.c
+++ b/pdf/pdf_store.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
static int
pdf_make_hash_key(fz_store_hash *hash, void *key_)
diff --git a/pdf/pdf_stream.c b/pdf/pdf_stream.c
index 6afb2cdb..84f966ec 100644
--- a/pdf/pdf_stream.c
+++ b/pdf/pdf_stream.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
/*
* Check if an object is a stream or not.
diff --git a/pdf/pdf_type3.c b/pdf/pdf_type3.c
index dc931e22..6603fc8b 100644
--- a/pdf/pdf_type3.c
+++ b/pdf/pdf_type3.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
static void
pdf_run_glyph_func(void *doc, void *rdb_, fz_buffer *contents, fz_device *dev, fz_matrix ctm, void *gstate)
diff --git a/pdf/pdf_unicode.c b/pdf/pdf_unicode.c
index edfda708..c94a6683 100644
--- a/pdf/pdf_unicode.c
+++ b/pdf/pdf_unicode.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
/* Load or synthesize ToUnicode map for fonts */
diff --git a/pdf/pdf_xobject.c b/pdf/pdf_xobject.c
index 36c5c483..ffa86184 100644
--- a/pdf/pdf_xobject.c
+++ b/pdf/pdf_xobject.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
pdf_xobject *
pdf_keep_xobject(fz_context *ctx, pdf_xobject *xobj)
diff --git a/pdf/pdf_xref.c b/pdf/pdf_xref.c
index f0dbde96..1952c9bf 100644
--- a/pdf/pdf_xref.c
+++ b/pdf/pdf_xref.c
@@ -1,5 +1,5 @@
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
static inline int iswhite(int ch)
{
diff --git a/scripts/cmapdump.c b/scripts/cmapdump.c
index db250382..3e1230ad 100644
--- a/scripts/cmapdump.c
+++ b/scripts/cmapdump.c
@@ -6,8 +6,8 @@
/* We never want to build memento versions of the cmapdump util */
#undef MEMENTO
-#include "fitz.h"
-#include "mupdf.h"
+#include "fitz-internal.h"
+#include "mupdf-internal.h"
#include "../fitz/base_context.c"
#include "../fitz/base_error.c"
diff --git a/win32/libmupdf.vcproj b/win32/libmupdf.vcproj
index eb9324d0..de66ac7a 100644
--- a/win32/libmupdf.vcproj
+++ b/win32/libmupdf.vcproj
@@ -222,6 +222,10 @@
>
</File>
<File
+ RelativePath="..\pdf\mupdf-internal.h"
+ >
+ </File>
+ <File
RelativePath="..\pdf\mupdf.h"
>
</File>
@@ -450,6 +454,10 @@
>
</File>
<File
+ RelativePath="..\fitz\fitz-internal.h"
+ >
+ </File>
+ <File
RelativePath="..\fitz\fitz.h"
>
</File>
@@ -462,10 +470,18 @@
>
</File>
<File
+ RelativePath="..\fitz\image_md5.c"
+ >
+ </File>
+ <File
RelativePath="..\fitz\image_png.c"
>
</File>
<File
+ RelativePath="..\fitz\image_save.c"
+ >
+ </File>
+ <File
RelativePath="..\fitz\image_tiff.c"
>
</File>
diff --git a/xps/muxps.h b/xps/muxps.h
index c90d92ba..caba3322 100644
--- a/xps/muxps.h
+++ b/xps/muxps.h
@@ -1,9 +1,7 @@
#ifndef _MUXPS_H_
#define _MUXPS_H_
-#ifndef _FITZ_H_
-#error "fitz.h must be included before muxps.h"
-#endif
+#include "fitz-internal.h"
typedef unsigned char byte;
diff --git a/xps/xps_common.c b/xps/xps_common.c
index 32ea3fdc..c8464459 100644
--- a/xps/xps_common.c
+++ b/xps/xps_common.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "muxps.h"
static inline int unhex(int a)
diff --git a/xps/xps_doc.c b/xps/xps_doc.c
index d8ab7bf4..5515b47a 100644
--- a/xps/xps_doc.c
+++ b/xps/xps_doc.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "muxps.h"
static void
diff --git a/xps/xps_glyphs.c b/xps/xps_glyphs.c
index f7098ed1..2c0b339d 100644
--- a/xps/xps_glyphs.c
+++ b/xps/xps_glyphs.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "muxps.h"
#include <ft2build.h>
diff --git a/xps/xps_gradient.c b/xps/xps_gradient.c
index f0ad0104..5630c976 100644
--- a/xps/xps_gradient.c
+++ b/xps/xps_gradient.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "muxps.h"
#define MAX_STOPS 256
diff --git a/xps/xps_image.c b/xps/xps_image.c
index a2021223..665b6d11 100644
--- a/xps/xps_image.c
+++ b/xps/xps_image.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "muxps.h"
typedef struct xps_image_s xps_image;
diff --git a/xps/xps_outline.c b/xps/xps_outline.c
index 30357491..577cdb6b 100644
--- a/xps/xps_outline.c
+++ b/xps/xps_outline.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "muxps.h"
/*
diff --git a/xps/xps_path.c b/xps/xps_path.c
index 76b9bb21..b3dda187 100644
--- a/xps/xps_path.c
+++ b/xps/xps_path.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "muxps.h"
char *
diff --git a/xps/xps_resource.c b/xps/xps_resource.c
index dcf3717d..c65893a1 100644
--- a/xps/xps_resource.c
+++ b/xps/xps_resource.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "muxps.h"
static xml_element *
diff --git a/xps/xps_tile.c b/xps/xps_tile.c
index e87d76f7..93783ee1 100644
--- a/xps/xps_tile.c
+++ b/xps/xps_tile.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "muxps.h"
#define TILE
diff --git a/xps/xps_util.c b/xps/xps_util.c
index b79927ba..aed6c19f 100644
--- a/xps/xps_util.c
+++ b/xps/xps_util.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "muxps.h"
static inline int xps_tolower(int c)
diff --git a/xps/xps_xml.c b/xps/xps_xml.c
index 15c510a6..b6f3eea3 100644
--- a/xps/xps_xml.c
+++ b/xps/xps_xml.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "muxps.h"
struct attribute
diff --git a/xps/xps_zip.c b/xps/xps_zip.c
index 08d9832a..a2182d5c 100644
--- a/xps/xps_zip.c
+++ b/xps/xps_zip.c
@@ -1,4 +1,4 @@
-#include "fitz.h"
+#include "fitz-internal.h"
#include "muxps.h"
#include <zlib.h>