summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile10
-rw-r--r--android/jni/mupdf.c6
-rw-r--r--apps/mudraw.c2
-rw-r--r--apps/pdfapp.h3
-rw-r--r--apps/pdfclean.c3
-rw-r--r--apps/pdfextract.c1
-rw-r--r--apps/pdfinfo.c3
-rw-r--r--apps/pdfposter.c3
-rw-r--r--apps/pdfshow.c2
-rw-r--r--cbz/mucbz.c1
-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/base_trans.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_pkcs7.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_svg.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/image_jpeg.c2
-rw-r--r--fitz/image_jpx.c2
-rw-r--r--fitz/image_md5.c2
-rw-r--r--fitz/image_png.c2
-rw-r--r--fitz/image_save.c2
-rw-r--r--fitz/image_tiff.c2
-rw-r--r--fitz/res_bitmap.c2
-rw-r--r--fitz/res_colorspace.c2
-rw-r--r--fitz/res_font.c2
-rw-r--r--fitz/res_func.c2
-rw-r--r--fitz/res_halftone.c2
-rw-r--r--fitz/res_image.c2
-rw-r--r--fitz/res_path.c2
-rw-r--r--fitz/res_pcl.c2
-rw-r--r--fitz/res_pixmap.c2
-rw-r--r--fitz/res_pwg.c2
-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_comp_buf.c2
-rw-r--r--fitz/stm_open.c2
-rw-r--r--fitz/stm_output.c2
-rw-r--r--fitz/stm_read.c2
-rw-r--r--fitz/text_extract.c2
-rw-r--r--fitz/text_output.c2
-rw-r--r--fitz/text_paragraph.c2
-rw-r--r--fitz/text_search.c2
-rw-r--r--image/muimage.c1
-rw-r--r--include/mupdf/fitz-internal.h1620
-rw-r--r--include/mupdf/fitz.h1616
-rw-r--r--include/mupdf/pdf-internal.h1071
-rw-r--r--include/mupdf/pdf.h1066
-rw-r--r--include/mupdf/xps-internal.h224
-rw-r--r--include/mupdf/xps.h217
-rw-r--r--pdf/pdf_annot.c3
-rw-r--r--pdf/pdf_cmap.c3
-rw-r--r--pdf/pdf_cmap_load.c3
-rw-r--r--pdf/pdf_cmap_parse.c3
-rw-r--r--pdf/pdf_cmap_table.c11
-rw-r--r--pdf/pdf_colorspace.c3
-rw-r--r--pdf/pdf_crypt.c3
-rw-r--r--pdf/pdf_device.c2
-rw-r--r--pdf/pdf_encoding.c3
-rw-r--r--pdf/pdf_event.c2
-rw-r--r--pdf/pdf_field.c3
-rw-r--r--pdf/pdf_font.c3
-rw-r--r--pdf/pdf_fontfile.c11
-rw-r--r--pdf/pdf_form.c3
-rw-r--r--pdf/pdf_function.c3
-rw-r--r--pdf/pdf_image.c3
-rw-r--r--pdf/pdf_interpret.c3
-rw-r--r--pdf/pdf_js.c3
-rw-r--r--pdf/pdf_js_none.c3
-rw-r--r--pdf/pdf_jsimp_cpp.c3
-rw-r--r--pdf/pdf_lex.c3
-rw-r--r--pdf/pdf_metrics.c3
-rw-r--r--pdf/pdf_nametree.c3
-rw-r--r--pdf/pdf_object.c3
-rw-r--r--pdf/pdf_outline.c3
-rw-r--r--pdf/pdf_page.c3
-rw-r--r--pdf/pdf_parse.c3
-rw-r--r--pdf/pdf_pattern.c3
-rw-r--r--pdf/pdf_repair.c3
-rw-r--r--pdf/pdf_shade.c3
-rw-r--r--pdf/pdf_store.c3
-rw-r--r--pdf/pdf_stream.c3
-rw-r--r--pdf/pdf_type3.c3
-rw-r--r--pdf/pdf_unicode.c3
-rw-r--r--pdf/pdf_write.c3
-rw-r--r--pdf/pdf_xobject.c3
-rw-r--r--pdf/pdf_xref.c3
-rw-r--r--pdf/pdf_xref_aux.c3
-rw-r--r--scripts/cmapdump.c3
-rw-r--r--winrt/mupdfwinrt/Cache.h5
-rw-r--r--winrt/mupdfwinrt/muctx.h5
-rw-r--r--xps/xps_common.c2
-rw-r--r--xps/xps_doc.c2
-rw-r--r--xps/xps_glyphs.c6
-rw-r--r--xps/xps_gradient.c2
-rw-r--r--xps/xps_image.c4
-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_zip.c2
135 files changed, 3042 insertions, 3108 deletions
diff --git a/Makefile b/Makefile
index 21dd4528..533811ab 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
build ?= debug
-OUT ?= build/$(build)
+OUT := build/$(build)
GEN := generated
# --- Variables, Commands, etc... ---
@@ -12,7 +12,7 @@ default: all
# Do not specify CFLAGS or LIBS on the make invocation line - specify
# XCFLAGS or XLIBS instead. Make ignores any lines in the makefile that
# set a variable that was set on the command line.
-CFLAGS += $(XCFLAGS) -Iinclude -Iucdn -Iscripts
+CFLAGS += $(XCFLAGS) -Iinclude -Iscripts -I$(GEN) -Iucdn
LIBS += $(XLIBS) -lm
include Makerules
@@ -58,9 +58,9 @@ RM_CMD = $(QUIET_RM) rm -f $@
# --- Rules ---
-FITZ_HDR := include/mupdf/fitz.h include/mupdf/fitz-internal.h
-MUPDF_HDR := $(FITZ_HDR) include/mupdf/pdf.h include/mupdf/pdf-internal.h
-MUXPS_HDR := $(FITZ_HDR) include/mupdf/xps.h include/mupdf/xps-internal.h
+FITZ_HDR := include/mupdf/fitz.h
+MUPDF_HDR := $(FITZ_HDR) include/mupdf/pdf.h
+MUXPS_HDR := $(FITZ_HDR) include/mupdf/xps.h
MUCBZ_HDR := $(FITZ_HDR) include/mupdf/cbz.h
MUIMAGE_HDR := $(FITZ_HDR) include/mupdf/image.h
diff --git a/android/jni/mupdf.c b/android/jni/mupdf.c
index e4333df0..342cf364 100644
--- a/android/jni/mupdf.c
+++ b/android/jni/mupdf.c
@@ -12,10 +12,8 @@
#include "prof.h"
#endif
-#include "fitz.h"
-#include "fitz-internal.h"
-#include "mupdf.h"
-#include "mupdf-internal.h"
+#include "mupdf/fitz.h"
+#include "mupdf/pdf.h"
#define JNI_FN(A) Java_com_artifex_mupdfdemo_ ## A
#define PACKAGENAME "com/artifex/mupdfdemo"
diff --git a/apps/mudraw.c b/apps/mudraw.c
index e38aa99b..366cdb8a 100644
--- a/apps/mudraw.c
+++ b/apps/mudraw.c
@@ -3,7 +3,7 @@
*/
#include "mupdf/fitz.h"
-#include "mupdf/pdf-internal.h" /* for mujstest */
+#include "mupdf/pdf.h" /* for mujstest */
#ifdef _MSC_VER
#include <winsock2.h>
diff --git a/apps/pdfapp.h b/apps/pdfapp.h
index ec87ab12..3e40e0c4 100644
--- a/apps/pdfapp.h
+++ b/apps/pdfapp.h
@@ -1,7 +1,8 @@
#ifndef PDFAPP_H
#define PDFAPP_H
-#include "mupdf/pdf-internal.h"
+#include "mupdf/fitz.h"
+#include "mupdf/pdf.h"
/*
* Utility object for handling a pdf application / view
diff --git a/apps/pdfclean.c b/apps/pdfclean.c
index 8d1748ae..3c1e810e 100644
--- a/apps/pdfclean.c
+++ b/apps/pdfclean.c
@@ -9,8 +9,7 @@
* TODO: linearize document for fast web view
*/
-#include "mupdf/fitz.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
static pdf_document *xref = NULL;
static fz_context *ctx = NULL;
diff --git a/apps/pdfextract.c b/apps/pdfextract.c
index d82f045b..e30b8268 100644
--- a/apps/pdfextract.c
+++ b/apps/pdfextract.c
@@ -3,7 +3,6 @@
*/
#include "mupdf/pdf.h"
-#include "mupdf/pdf-internal.h"
static pdf_document *doc = NULL;
static fz_context *ctx = NULL;
diff --git a/apps/pdfinfo.c b/apps/pdfinfo.c
index fdc23e99..fa21431e 100644
--- a/apps/pdfinfo.c
+++ b/apps/pdfinfo.c
@@ -3,8 +3,7 @@
* Print information about the input pdf.
*/
-#include "mupdf/fitz.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
pdf_document *xref;
fz_context *ctx;
diff --git a/apps/pdfposter.c b/apps/pdfposter.c
index c92de7aa..050a497f 100644
--- a/apps/pdfposter.c
+++ b/apps/pdfposter.c
@@ -9,8 +9,7 @@
* TODO: linearize document for fast web view
*/
-#include "mupdf/fitz.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
static int x_factor = 0;
static int y_factor = 0;
diff --git a/apps/pdfshow.c b/apps/pdfshow.c
index 78573e10..586a2fc6 100644
--- a/apps/pdfshow.c
+++ b/apps/pdfshow.c
@@ -2,7 +2,7 @@
* pdfshow -- the ultimate pdf debugging tool
*/
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
static pdf_document *doc = NULL;
static fz_context *ctx = NULL;
diff --git a/cbz/mucbz.c b/cbz/mucbz.c
index 043b6409..c61304d2 100644
--- a/cbz/mucbz.c
+++ b/cbz/mucbz.c
@@ -1,4 +1,3 @@
-#include "mupdf/fitz-internal.h"
#include "mupdf/cbz.h"
#include <zlib.h>
diff --git a/draw/draw_affine.c b/draw/draw_affine.c
index 9ee1d50c..eb8ae8eb 100644
--- a/draw/draw_affine.c
+++ b/draw/draw_affine.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
typedef unsigned char byte;
diff --git a/draw/draw_blend.c b/draw/draw_blend.c
index 70a3e1af..ffc8f4d2 100644
--- a/draw/draw_blend.c
+++ b/draw/draw_blend.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* PDF 1.4 blend modes. These are slow. */
diff --git a/draw/draw_device.c b/draw/draw_device.c
index e7287963..00596d99 100644
--- a/draw/draw_device.c
+++ b/draw/draw_device.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.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 137edc62..a850b571 100644
--- a/draw/draw_edge.c
+++ b/draw/draw_edge.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#define BBOX_MIN -(1<<20)
#define BBOX_MAX (1<<20)
diff --git a/draw/draw_glyph.c b/draw/draw_glyph.c
index e8d47c0b..c23d5429 100644
--- a/draw/draw_glyph.c
+++ b/draw/draw_glyph.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#define MAX_GLYPH_SIZE 256
#define MAX_CACHE_SIZE (1024*1024)
diff --git a/draw/draw_mesh.c b/draw/draw_mesh.c
index 3fa783f0..5b8f3165 100644
--- a/draw/draw_mesh.c
+++ b/draw/draw_mesh.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
enum { MAXN = 2 + FZ_MAX_COLORS };
diff --git a/draw/draw_paint.c b/draw/draw_paint.c
index 1fccec1f..328069b9 100644
--- a/draw/draw_paint.c
+++ b/draw/draw_paint.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/*
diff --git a/draw/draw_path.c b/draw/draw_path.c
index 601b6e9c..bd1a85ef 100644
--- a/draw/draw_path.c
+++ b/draw/draw_path.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#define MAX_DEPTH 8
diff --git a/draw/draw_scale.c b/draw/draw_scale.c
index 370bd549..74221b3d 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 "mupdf/fitz-internal.h"
+#include "mupdf/fitz.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 81b4a845..bef7981a 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 "mupdf/fitz-internal.h"
+#include "mupdf/fitz.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 7951b6ef..1f33d237 100644
--- a/draw/draw_unpack.c
+++ b/draw/draw_unpack.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* Unpack image samples and optionally pad pixels with opaque alpha */
diff --git a/fitz/base_context.c b/fitz/base_context.c
index 93e4fe92..bf61e27d 100644
--- a/fitz/base_context.c
+++ b/fitz/base_context.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
struct fz_id_context_s
{
diff --git a/fitz/base_error.c b/fitz/base_error.c
index d9ad770b..31d285fe 100644
--- a/fitz/base_error.c
+++ b/fitz/base_error.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* Warning context */
diff --git a/fitz/base_geometry.c b/fitz/base_geometry.c
index f5e7cc91..81450246 100644
--- a/fitz/base_geometry.c
+++ b/fitz/base_geometry.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#define MAX4(a,b,c,d) fz_max(fz_max(a,b), fz_max(c,d))
#define MIN4(a,b,c,d) fz_min(fz_min(a,b), fz_min(c,d))
diff --git a/fitz/base_hash.c b/fitz/base_hash.c
index b66a7a87..e6ed019b 100644
--- a/fitz/base_hash.c
+++ b/fitz/base_hash.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/*
Simple hashtable with open addressing linear probe.
diff --git a/fitz/base_memory.c b/fitz/base_memory.c
index 91881e45..dc1d0df0 100644
--- a/fitz/base_memory.c
+++ b/fitz/base_memory.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* Enable FITZ_DEBUG_LOCKING_TIMES below if you want to check the times
* for which locks are held too. */
diff --git a/fitz/base_string.c b/fitz/base_string.c
index d584b570..b29cdbdc 100644
--- a/fitz/base_string.c
+++ b/fitz/base_string.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
char *
fz_strsep(char **stringp, const char *delim)
diff --git a/fitz/base_trans.c b/fitz/base_trans.c
index 81a08735..92582253 100644
--- a/fitz/base_trans.c
+++ b/fitz/base_trans.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
static int
fade(fz_pixmap *tpix, fz_pixmap *opix, fz_pixmap *npix, int time)
diff --git a/fitz/crypt_aes.c b/fitz/crypt_aes.c
index eb5d260f..6ce14903 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 "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#define aes_context fz_aes
diff --git a/fitz/crypt_arc4.c b/fitz/crypt_arc4.c
index 1f15dd25..9c54fbae 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 "mupdf/fitz-internal.h"
+#include "mupdf/fitz.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 3c896379..7490c0bc 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 "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* Constants for MD5Transform routine */
enum
diff --git a/fitz/crypt_pkcs7.c b/fitz/crypt_pkcs7.c
index b4f63cb7..26389ae4 100644
--- a/fitz/crypt_pkcs7.c
+++ b/fitz/crypt_pkcs7.c
@@ -1,4 +1,4 @@
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h" // TODO: move this file to pdf module
#ifdef HAVE_OPENSSL
diff --git a/fitz/crypt_sha2.c b/fitz/crypt_sha2.c
index 62df2506..ffedfc95 100644
--- a/fitz/crypt_sha2.c
+++ b/fitz/crypt_sha2.c
@@ -9,7 +9,7 @@ You can do whatever you want with this file.
SHA-384 and SHA-512 were also taken from Crypto++ and adapted for fitz.
*/
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
static inline int isbigendian(void)
{
diff --git a/fitz/dev_bbox.c b/fitz/dev_bbox.c
index d9077ed9..9cb2a27e 100644
--- a/fitz/dev_bbox.c
+++ b/fitz/dev_bbox.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#define STACK_SIZE 96
diff --git a/fitz/dev_list.c b/fitz/dev_list.c
index 5de71cc9..6ffe165f 100644
--- a/fitz/dev_list.c
+++ b/fitz/dev_list.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
typedef struct fz_display_node_s fz_display_node;
diff --git a/fitz/dev_null.c b/fitz/dev_null.c
index 14bcc292..bf548d7f 100644
--- a/fitz/dev_null.c
+++ b/fitz/dev_null.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
fz_device *
fz_new_device(fz_context *ctx, void *user)
diff --git a/fitz/dev_svg.c b/fitz/dev_svg.c
index 99457d20..4dd82120 100644
--- a/fitz/dev_svg.c
+++ b/fitz/dev_svg.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
typedef struct svg_device_s svg_device;
diff --git a/fitz/dev_trace.c b/fitz/dev_trace.c
index e157e9cc..b3cade91 100644
--- a/fitz/dev_trace.c
+++ b/fitz/dev_trace.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
static void
fz_trace_matrix(const fz_matrix *ctm)
diff --git a/fitz/doc_document.c b/fitz/doc_document.c
index 673aba3f..8adbf816 100644
--- a/fitz/doc_document.c
+++ b/fitz/doc_document.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* Yuck! Promiscuous we are. */
extern struct pdf_document *pdf_open_document(fz_context *ctx, const char *filename);
diff --git a/fitz/doc_link.c b/fitz/doc_link.c
index 730d4110..30dca222 100644
--- a/fitz/doc_link.c
+++ b/fitz/doc_link.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.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 d3604bdf..e26fd378 100644
--- a/fitz/doc_outline.c
+++ b/fitz/doc_outline.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
void
fz_free_outline(fz_context *ctx, fz_outline *outline)
diff --git a/fitz/filt_basic.c b/fitz/filt_basic.c
index 2446d41d..dcebd912 100644
--- a/fitz/filt_basic.c
+++ b/fitz/filt_basic.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* Pretend we have a filter that just copies data forever */
diff --git a/fitz/filt_dctd.c b/fitz/filt_dctd.c
index 196b7a73..0a50dfa3 100644
--- a/fitz/filt_dctd.c
+++ b/fitz/filt_dctd.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#include <jpeglib.h>
#include <setjmp.h>
diff --git a/fitz/filt_faxd.c b/fitz/filt_faxd.c
index 27accedb..fab66f1a 100644
--- a/fitz/filt_faxd.c
+++ b/fitz/filt_faxd.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* Fax G3/G4 decoder */
diff --git a/fitz/filt_flate.c b/fitz/filt_flate.c
index 155f6c78..ee7a83f9 100644
--- a/fitz/filt_flate.c
+++ b/fitz/filt_flate.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#include <zlib.h>
diff --git a/fitz/filt_jbig2d.c b/fitz/filt_jbig2d.c
index 14683954..3cb0bcef 100644
--- a/fitz/filt_jbig2d.c
+++ b/fitz/filt_jbig2d.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#include <jbig2.h>
diff --git a/fitz/filt_lzwd.c b/fitz/filt_lzwd.c
index 4f8b96b7..73909ca1 100644
--- a/fitz/filt_lzwd.c
+++ b/fitz/filt_lzwd.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* TODO: error checking */
diff --git a/fitz/filt_predict.c b/fitz/filt_predict.c
index 3387a66d..c8de290a 100644
--- a/fitz/filt_predict.c
+++ b/fitz/filt_predict.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* TODO: check if this works with 16bpp images */
diff --git a/fitz/image_jpeg.c b/fitz/image_jpeg.c
index 2ab83180..faca16ef 100644
--- a/fitz/image_jpeg.c
+++ b/fitz/image_jpeg.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#include <jpeglib.h>
diff --git a/fitz/image_jpx.c b/fitz/image_jpx.c
index be7368f4..43a4d2ef 100644
--- a/fitz/image_jpx.c
+++ b/fitz/image_jpx.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* Without the definition of OPJ_STATIC, compilation fails on windows
* due to the use of __stdcall. We believe it is required on some
diff --git a/fitz/image_md5.c b/fitz/image_md5.c
index 3e479d69..aea290ec 100644
--- a/fitz/image_md5.c
+++ b/fitz/image_md5.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
void fz_md5_pixmap(fz_pixmap *pix, unsigned char digest[16])
{
diff --git a/fitz/image_png.c b/fitz/image_png.c
index a86f4b56..1f48e298 100644
--- a/fitz/image_png.c
+++ b/fitz/image_png.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#include <zlib.h>
diff --git a/fitz/image_save.c b/fitz/image_save.c
index b44323ab..0a564ed1 100644
--- a/fitz/image_save.c
+++ b/fitz/image_save.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
void fz_write_pixmap(fz_context *ctx, fz_pixmap *img, char *file, int rgb)
{
diff --git a/fitz/image_tiff.c b/fitz/image_tiff.c
index 1249927f..6a650bff 100644
--- a/fitz/image_tiff.c
+++ b/fitz/image_tiff.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.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 c31e85b4..ecdca8e5 100644
--- a/fitz/res_bitmap.c
+++ b/fitz/res_bitmap.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
fz_bitmap *
fz_new_bitmap(fz_context *ctx, int w, int h, int n, int xres, int yres)
diff --git a/fitz/res_colorspace.c b/fitz/res_colorspace.c
index 2486799d..e1533218 100644
--- a/fitz/res_colorspace.c
+++ b/fitz/res_colorspace.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#define SLOWCMYK
diff --git a/fitz/res_font.c b/fitz/res_font.c
index 5f8721f6..aa3ace9b 100644
--- a/fitz/res_font.c
+++ b/fitz/res_font.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#include <ft2build.h>
#include FT_FREETYPE_H
diff --git a/fitz/res_func.c b/fitz/res_func.c
index 53f0d2c9..b5ba4815 100644
--- a/fitz/res_func.c
+++ b/fitz/res_func.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
void
fz_eval_function(fz_context *ctx, fz_function *func, float *in_, int inlen, float *out_, int outlen)
diff --git a/fitz/res_halftone.c b/fitz/res_halftone.c
index 0472a8d9..15aebead 100644
--- a/fitz/res_halftone.c
+++ b/fitz/res_halftone.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
fz_halftone *
fz_new_halftone(fz_context *ctx, int comps)
diff --git a/fitz/res_image.c b/fitz/res_image.c
index 06d1f2f0..542ff40a 100644
--- a/fitz/res_image.c
+++ b/fitz/res_image.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
fz_pixmap *
fz_image_to_pixmap(fz_context *ctx, fz_image *image, int w, int h)
diff --git a/fitz/res_path.c b/fitz/res_path.c
index 142928b9..cbdfc7bc 100644
--- a/fitz/res_path.c
+++ b/fitz/res_path.c
@@ -1,5 +1,5 @@
#include <assert.h>
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
fz_path *
fz_new_path(fz_context *ctx)
diff --git a/fitz/res_pcl.c b/fitz/res_pcl.c
index e456f401..d5b351d4 100644
--- a/fitz/res_pcl.c
+++ b/fitz/res_pcl.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* Lifted from ghostscript gdevjlm.h */
/*
diff --git a/fitz/res_pixmap.c b/fitz/res_pixmap.c
index c528a77d..4288d379 100644
--- a/fitz/res_pixmap.c
+++ b/fitz/res_pixmap.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
fz_pixmap *
fz_keep_pixmap(fz_context *ctx, fz_pixmap *pix)
diff --git a/fitz/res_pwg.c b/fitz/res_pwg.c
index 0cdcc771..e9d1b626 100644
--- a/fitz/res_pwg.c
+++ b/fitz/res_pwg.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
void
fz_output_pwg_file_header(fz_output *out)
diff --git a/fitz/res_shade.c b/fitz/res_shade.c
index 0bbbeae3..676f375c 100644
--- a/fitz/res_shade.c
+++ b/fitz/res_shade.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#define SWAP(a,b) {fz_vertex *t = (a); (a) = (b); (b) = t;}
diff --git a/fitz/res_store.c b/fitz/res_store.c
index 5b25f197..609f10dc 100644
--- a/fitz/res_store.c
+++ b/fitz/res_store.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
typedef struct fz_item_s fz_item;
diff --git a/fitz/res_text.c b/fitz/res_text.c
index 28142e2c..81e2e1d0 100644
--- a/fitz/res_text.c
+++ b/fitz/res_text.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
fz_text *
fz_new_text(fz_context *ctx, fz_font *font, const fz_matrix *trm, int wmode)
diff --git a/fitz/stm_buffer.c b/fitz/stm_buffer.c
index 40adff0c..388e0461 100644
--- a/fitz/stm_buffer.c
+++ b/fitz/stm_buffer.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
fz_buffer *
fz_new_buffer(fz_context *ctx, int size)
diff --git a/fitz/stm_comp_buf.c b/fitz/stm_comp_buf.c
index 77f7b741..acdf2747 100644
--- a/fitz/stm_comp_buf.c
+++ b/fitz/stm_comp_buf.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* This code needs to be kept out of stm_buffer.c to avoid it being
* pulled into cmapdump.c */
diff --git a/fitz/stm_open.c b/fitz/stm_open.c
index 3b2eb53f..d82acf0a 100644
--- a/fitz/stm_open.c
+++ b/fitz/stm_open.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
fz_stream *
fz_new_stream(fz_context *ctx, void *state,
diff --git a/fitz/stm_output.c b/fitz/stm_output.c
index ff9e866b..f98b945e 100644
--- a/fitz/stm_output.c
+++ b/fitz/stm_output.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
static int
file_printf(fz_output *out, const char *fmt, va_list ap)
diff --git a/fitz/stm_read.c b/fitz/stm_read.c
index a0988f46..3ffb918f 100644
--- a/fitz/stm_read.c
+++ b/fitz/stm_read.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#define MIN_BOMB (100 << 20)
diff --git a/fitz/text_extract.c b/fitz/text_extract.c
index cf32ae53..e3bf9d19 100644
--- a/fitz/text_extract.c
+++ b/fitz/text_extract.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#include "ucdn.h"
/* Extract text into an unsorted span soup. */
diff --git a/fitz/text_output.c b/fitz/text_output.c
index b3af936f..d3241131 100644
--- a/fitz/text_output.c
+++ b/fitz/text_output.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
#define SUBSCRIPT_OFFSET 0.2f
#define SUPERSCRIPT_OFFSET -0.2f
diff --git a/fitz/text_paragraph.c b/fitz/text_paragraph.c
index df626f5e..51062938 100644
--- a/fitz/text_paragraph.c
+++ b/fitz/text_paragraph.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
/* Assemble span soup into blocks and lines. */
diff --git a/fitz/text_search.c b/fitz/text_search.c
index a90a682f..f1f0d203 100644
--- a/fitz/text_search.c
+++ b/fitz/text_search.c
@@ -1,4 +1,4 @@
-#include "mupdf/fitz-internal.h"
+#include "mupdf/fitz.h"
static inline int fz_tolower(int c)
{
diff --git a/image/muimage.c b/image/muimage.c
index cbaae139..890457ab 100644
--- a/image/muimage.c
+++ b/image/muimage.c
@@ -1,4 +1,3 @@
-#include "mupdf/fitz-internal.h"
#include "mupdf/image.h"
#include <ctype.h> /* for tolower */
diff --git a/include/mupdf/fitz-internal.h b/include/mupdf/fitz-internal.h
deleted file mode 100644
index df6cceea..00000000
--- a/include/mupdf/fitz-internal.h
+++ /dev/null
@@ -1,1620 +0,0 @@
-#ifndef FITZ_INTERNAL_H
-#define FITZ_INTERNAL_H
-
-#include "mupdf/fitz.h"
-
-#ifdef _WIN32 /* Microsoft Visual C++ */
-
-typedef signed char int8_t;
-typedef short int int16_t;
-typedef int int32_t;
-typedef __int64 int64_t;
-
-typedef unsigned char uint8_t;
-typedef unsigned short int uint16_t;
-typedef unsigned int uint32_t;
-typedef unsigned __int64 uint64_t;
-
-#else
-#include <inttypes.h>
-#endif
-
-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);
-void fz_copy_aa_context(fz_context *dst, fz_context *src);
-
-/* Default allocator */
-extern fz_alloc_context fz_alloc_default;
-
-/* Default locks */
-extern fz_locks_context fz_locks_default;
-
-#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);
-}
-
-/* ARM assembly specific defines */
-
-#ifdef ARCH_ARM
-#ifdef NDK_PROFILER
-extern void __gnu_mcount_nc(void);
-#define ENTER_PG "push {lr}\nbl __gnu_mcount_nc\n"
-#else
-#define ENTER_PG
-#endif
-
-/* If we're compiling as thumb code, then we need to tell the compiler
- * to enter and exit ARM mode around our assembly sections. If we move
- * the ARM functions to a separate file and arrange for it to be compiled
- * without thumb mode, we can save some time on entry.
- */
-#ifdef ARCH_THUMB
-#define ENTER_ARM ".balign 4\nmov r12,pc\nbx r12\n0:.arm\n" ENTER_PG
-#define ENTER_THUMB "9:.thumb\n" ENTER_PG
-#else
-#define ENTER_ARM
-#define ENTER_THUMB
-#endif
-#endif
-
-/*
- * Basic runtime and utility functions
- */
-
-#ifdef CLUSTER
-#define LOCAL_TRIG_FNS
-#endif
-
-#ifdef LOCAL_TRIG_FNS
-/*
- * Trig functions
- */
-static float
-my_atan_table[258] =
-{
-0.0000000000f, 0.00390623013f,0.00781234106f,0.0117182136f,
-0.0156237286f, 0.0195287670f, 0.0234332099f, 0.0273369383f,
-0.0312398334f, 0.0351417768f, 0.0390426500f, 0.0429423347f,
-0.0468407129f, 0.0507376669f, 0.0546330792f, 0.0585268326f,
-0.0624188100f, 0.0663088949f, 0.0701969711f, 0.0740829225f,
-0.0779666338f, 0.0818479898f, 0.0857268758f, 0.0896031775f,
-0.0934767812f, 0.0973475735f, 0.1012154420f, 0.1050802730f,
-0.1089419570f, 0.1128003810f, 0.1166554350f, 0.1205070100f,
-0.1243549950f, 0.1281992810f, 0.1320397620f, 0.1358763280f,
-0.1397088740f, 0.1435372940f, 0.1473614810f, 0.1511813320f,
-0.1549967420f, 0.1588076080f, 0.1626138290f, 0.1664153010f,
-0.1702119250f, 0.1740036010f, 0.1777902290f, 0.1815717110f,
-0.1853479500f, 0.1891188490f, 0.1928843120f, 0.1966442450f,
-0.2003985540f, 0.2041471450f, 0.2078899270f, 0.2116268090f,
-0.2153577000f, 0.2190825110f, 0.2228011540f, 0.2265135410f,
-0.2302195870f, 0.2339192060f, 0.2376123140f, 0.2412988270f,
-0.2449786630f, 0.2486517410f, 0.2523179810f, 0.2559773030f,
-0.2596296290f, 0.2632748830f, 0.2669129880f, 0.2705438680f,
-0.2741674510f, 0.2777836630f, 0.2813924330f, 0.2849936890f,
-0.2885873620f, 0.2921733830f, 0.2957516860f, 0.2993222020f,
-0.3028848680f, 0.3064396190f, 0.3099863910f, 0.3135251230f,
-0.3170557530f, 0.3205782220f, 0.3240924700f, 0.3275984410f,
-0.3310960770f, 0.3345853220f, 0.3380661230f, 0.3415384250f,
-0.3450021770f, 0.3484573270f, 0.3519038250f, 0.3553416220f,
-0.3587706700f, 0.3621909220f, 0.3656023320f, 0.3690048540f,
-0.3723984470f, 0.3757830650f, 0.3791586690f, 0.3825252170f,
-0.3858826690f, 0.3892309880f, 0.3925701350f, 0.3959000740f,
-0.3992207700f, 0.4025321870f, 0.4058342930f, 0.4091270550f,
-0.4124104420f, 0.4156844220f, 0.4189489670f, 0.4222040480f,
-0.4254496370f, 0.4286857080f, 0.4319122350f, 0.4351291940f,
-0.4383365600f, 0.4415343100f, 0.4447224240f, 0.4479008790f,
-0.4510696560f, 0.4542287350f, 0.4573780990f, 0.4605177290f,
-0.4636476090f, 0.4667677240f, 0.4698780580f, 0.4729785980f,
-0.4760693300f, 0.4791502430f, 0.4822213240f, 0.4852825630f,
-0.4883339510f, 0.4913754780f, 0.4944071350f, 0.4974289160f,
-0.5004408130f, 0.5034428210f, 0.5064349340f, 0.5094171490f,
-0.5123894600f, 0.5153518660f, 0.5183043630f, 0.5212469510f,
-0.5241796290f, 0.5271023950f, 0.5300152510f, 0.5329181980f,
-0.5358112380f, 0.5386943730f, 0.5415676050f, 0.5444309400f,
-0.5472843810f, 0.5501279330f, 0.5529616020f, 0.5557853940f,
-0.5585993150f, 0.5614033740f, 0.5641975770f, 0.5669819340f,
-0.5697564530f, 0.5725211450f, 0.5752760180f, 0.5780210840f,
-0.5807563530f, 0.5834818390f, 0.5861975510f, 0.5889035040f,
-0.5915997100f, 0.5942861830f, 0.5969629370f, 0.5996299860f,
-0.6022873460f, 0.6049350310f, 0.6075730580f, 0.6102014430f,
-0.6128202020f, 0.6154293530f, 0.6180289120f, 0.6206188990f,
-0.6231993300f, 0.6257702250f, 0.6283316020f, 0.6308834820f,
-0.6334258830f, 0.6359588250f, 0.6384823300f, 0.6409964180f,
-0.6435011090f, 0.6459964250f, 0.6484823880f, 0.6509590190f,
-0.6534263410f, 0.6558843770f, 0.6583331480f, 0.6607726790f,
-0.6632029930f, 0.6656241120f, 0.6680360620f, 0.6704388650f,
-0.6728325470f, 0.6752171330f, 0.6775926450f, 0.6799591110f,
-0.6823165550f, 0.6846650020f, 0.6870044780f, 0.6893350100f,
-0.6916566220f, 0.6939693410f, 0.6962731940f, 0.6985682070f,
-0.7008544080f, 0.7031318220f, 0.7054004770f, 0.7076604000f,
-0.7099116190f, 0.7121541600f, 0.7143880520f, 0.7166133230f,
-0.7188300000f, 0.7210381110f, 0.7232376840f, 0.7254287490f,
-0.7276113330f, 0.7297854640f, 0.7319511710f, 0.7341084830f,
-0.7362574290f, 0.7383980370f, 0.7405303370f, 0.7426543560f,
-0.7447701260f, 0.7468776740f, 0.7489770290f, 0.7510682220f,
-0.7531512810f, 0.7552262360f, 0.7572931160f, 0.7593519510f,
-0.7614027700f, 0.7634456020f, 0.7654804790f, 0.7675074280f,
-0.7695264800f, 0.7715376650f, 0.7735410110f, 0.7755365500f,
-0.7775243100f, 0.7795043220f, 0.7814766150f, 0.7834412190f,
-0.7853981630f, 0.7853981630f /* Extended by 1 for interpolation */
-};
-
-static inline float my_sinf(float x)
-{
- float x2, xn;
- int i;
- /* Map x into the -PI to PI range. We could do this using:
- * x = fmodf(x, (float)(2.0 * M_PI));
- * but that's C99, and seems to misbehave with negative numbers
- * on some platforms. */
- x -= (float)M_PI;
- i = x / (float)(2.0f * M_PI);
- x -= i * (float)(2.0f * M_PI);
- if (x < 0.0f)
- x += (float)(2.0f * M_PI);
- x -= (float)M_PI;
- if (x <= (float)(-M_PI/2.0))
- x = -(float)M_PI-x;
- else if (x >= (float)(M_PI/2.0))
- x = (float)M_PI-x;
- x2 = x*x;
- xn = x*x2/6.0f;
- x -= xn;
- xn *= x2/20.0f;
- x += xn;
- xn *= x2/42.0f;
- x -= xn;
- xn *= x2/72.0f;
- x += xn;
- return x;
-}
-
-static inline float my_atan2f(float o, float a)
-{
- int negate = 0, flip = 0, i;
- float r, s;
- if (o == 0.0f)
- {
- if (a > 0)
- return 0.0f;
- else
- return (float)M_PI;
- }
- if (o < 0)
- o = -o, negate = 1;
- if (a < 0)
- a = -a, flip = 1;
- if (o < a)
- i = (int)(65536.0f*o/a + 0.5f);
- else
- i = (int)(65536.0f*a/o + 0.5f);
- r = my_atan_table[i>>8];
- s = my_atan_table[(i>>8)+1];
- r += (s-r)*(i&255)/256.0f;
- if (o >= a)
- r = (float)(M_PI/2.0f) - r;
- if (flip)
- r = (float)M_PI - r;
- if (negate)
- r = -r;
- return r;
-}
-
-#define sinf(x) my_sinf(x)
-#define cosf(x) my_sinf(((float)(M_PI/2.0f)) + (x))
-#define atan2f(x,y) my_atan2f((x),(y))
-#endif
-
-/* Range checking atof */
-float fz_atof(const char *s);
-
-/* atoi that copes with NULL */
-int fz_atoi(const char *s);
-
-/*
- * 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_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_insert_with_pos(fz_context *ctx, fz_hash_table *table, void *key, void *val, unsigned *pos);
-void fz_hash_remove(fz_context *ctx, fz_hash_table *table, void *key);
-void fz_hash_remove_fast(fz_context *ctx, fz_hash_table *table, void *key, unsigned pos);
-
-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);
-
-#ifndef NDEBUG
-void fz_print_hash(fz_context *ctx, FILE *out, fz_hash_table *table);
-void fz_print_hash_details(fz_context *ctx, FILE *out, fz_hash_table *table, void (*details)(FILE *, void *));
-#endif
-
-/*
- * 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)
-
-void fz_gridfit_matrix(fz_matrix *m);
-float fz_matrix_max_expansion(const 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]);
-
-/* sha-512 digests */
-
-typedef struct fz_sha512_s fz_sha512;
-
-struct fz_sha512_s
-{
- uint64_t state[8];
- unsigned int count[2];
- union {
- unsigned char u8[128];
- uint64_t u64[16];
- } buffer;
-};
-
-void fz_sha512_init(fz_sha512 *state);
-void fz_sha512_update(fz_sha512 *state, const unsigned char *input, unsigned int inlen);
-void fz_sha512_final(fz_sha512 *state, unsigned char digest[64]);
-
-/* sha-384 digests */
-
-typedef struct fz_sha512_s fz_sha384;
-
-void fz_sha384_init(fz_sha384 *state);
-void fz_sha384_update(fz_sha384 *state, const unsigned char *input, unsigned int inlen);
-void fz_sha384_final(fz_sha384 *state, unsigned char digest[64]);
-
-/* 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 */
-};
-
-int aes_setkey_enc( fz_aes *ctx, const unsigned char *key, int keysize );
-int 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 );
-
-/*
- 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;
- struct
- {
- int id;
- float m[4];
- } im;
- } 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 *);
-#ifndef NDEBUG
- void (*debug)(FILE *, void *);
-#endif
-};
-
-/*
- 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_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);
-
-/*
- fz_print_store: Dump the contents of the store for debugging.
-*/
-#ifndef NDEBUG
-void fz_print_store(fz_context *ctx, FILE *out);
-void fz_print_store_locked(fz_context *ctx, FILE *out);
-#endif
-
-struct fz_buffer_s
-{
- int refs;
- unsigned char *data;
- int cap, len;
- int unused_bits;
-};
-
-/*
- fz_new_buffer: Create a new buffer.
-
- capacity: Initial capacity.
-
- Returns pointer to new buffer. Throws exception on allocation
- failure.
-*/
-fz_buffer *fz_new_buffer(fz_context *ctx, int capacity);
-
-/*
- fz_new_buffer: Create a new buffer.
-
- capacity: Initial capacity.
-
- Returns pointer to new buffer. Throws exception on allocation
- failure.
-*/
-fz_buffer *fz_new_buffer_from_data(fz_context *ctx, unsigned char *data, int size);
-
-/*
- fz_resize_buffer: Ensure that a buffer has a given capacity,
- truncating data if required.
-
- buf: The buffer to alter.
-
- capacity: The desired capacity for the buffer. If the current size
- of the buffer contents is smaller than capacity, it is truncated.
-
-*/
-void fz_resize_buffer(fz_context *ctx, fz_buffer *buf, int capacity);
-
-/*
- fz_grow_buffer: Make some space within a buffer (i.e. ensure that
- capacity > size).
-
- buf: The buffer to grow.
-
- May throw exception on failure to allocate.
-*/
-void fz_grow_buffer(fz_context *ctx, fz_buffer *buf);
-
-/*
- fz_trim_buffer: Trim wasted capacity from a buffer.
-
- buf: The buffer to trim.
-*/
-void fz_trim_buffer(fz_context *ctx, fz_buffer *buf);
-
-/*
- fz_buffer_cat: Concatenate buffers
-
- buf: first to concatenate and the holder of the result
- extra: second to concatenate
-
- May throw exception on failure to allocate.
-*/
-void fz_buffer_cat(fz_context *ctx, fz_buffer *buf, fz_buffer *extra);
-
-void fz_write_buffer(fz_context *ctx, fz_buffer *buf, const void *data, int len);
-
-void fz_write_buffer_byte(fz_context *ctx, fz_buffer *buf, int val);
-
-void fz_write_buffer_rune(fz_context *ctx, fz_buffer *buf, int val);
-
-void fz_write_buffer_bits(fz_context *ctx, fz_buffer *buf, int val, int bits);
-
-void fz_write_buffer_pad(fz_context *ctx, fz_buffer *buf);
-
-/*
- fz_buffer_printf: print formatted to a buffer. The buffer will grow
- as required.
-*/
-int fz_buffer_printf(fz_context *ctx, fz_buffer *buffer, const char *fmt, ...);
-int fz_buffer_vprintf(fz_context *ctx, fz_buffer *buffer, const char *fmt, va_list args);
-
-/*
- fz_buffer_printf: print a string formatted as a pdf string to a buffer.
- The buffer will grow.
-*/
-void
-fz_buffer_cat_pdf_string(fz_context *ctx, fz_buffer *buffer, const char *text);
-
-struct fz_stream_s
-{
- fz_context *ctx;
- int refs;
- int error;
- int eof;
- int pos;
- int avail;
- int bits;
- 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_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);
-
-/*
- fz_read_best: Attempt to read a stream into a buffer. If truncated
- is NULL behaves as fz_read_all, otherwise does not throw exceptions
- in the case of failure, but instead sets a truncated flag.
-
- stm: The stream to read from.
-
- initial: Suggested initial size for the buffer.
-
- truncated: Flag to store success/failure indication in.
-
- Returns a buffer created from reading from the stream.
-*/
-fz_buffer *fz_read_best(fz_stream *stm, int initial, int *truncated);
-
-void fz_read_line(fz_stream *stm, char *buf, int max);
-
-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);
-}
-
-static inline int fz_write_int32be(fz_output *out, int x)
-{
- char data[4];
-
- data[0] = x>>24;
- data[1] = x>>16;
- data[2] = x>>8;
- data[3] = x;
-
- return fz_write(out, data, 4);
-}
-
-static inline void
-fz_write_byte(fz_output *out, int x)
-{
- char data = x;
-
- fz_write(out, &data, 1);
-}
-
-/*
- * Data filters.
- */
-
-fz_stream *fz_open_copy(fz_stream *chain);
-fz_stream *fz_open_null(fz_stream *chain, int len, int offset);
-fz_stream *fz_open_concat(fz_context *ctx, int max, int pad);
-void fz_concat_push(fz_stream *concat, fz_stream *chain); /* Ownership of chain is passed in */
-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 l2factor);
-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.
- */
-
-int fz_lookup_blendmode(char *name);
-char *fz_blendmode_name(int blendmode);
-
-struct fz_bitmap_s
-{
- int refs;
- int w, h, stride, n;
- int xres, yres;
- unsigned char *samples;
-};
-
-fz_bitmap *fz_new_bitmap(fz_context *ctx, int w, int h, int n, int xres, int yres);
-
-void fz_bitmap_details(fz_bitmap *bitmap, int *w, int *h, int *n, int *stride);
-
-void fz_clear_bitmap(fz_context *ctx, fz_bitmap *bit);
-
-/*
- 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.
-
- x, y: The minimum x and y coord of the region in pixels.
-
- w, h: The width and height of the region in pixels.
-
- n: The number of color components in the image. Always
- includes a separate alpha channel. For mask images n=1, for greyscale
- (plus alpha) images n=2, for rgb (plus alpha) images n=3.
-
- 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: Pointer to a colorspace object describing the colorspace
- the pixmap is in. If NULL, the image is a mask.
-
- samples: A simple block of memory w * h * n bytes of memory in which
- the components are stored. The first n bytes are components 0 to n-1
- for the pixel at (x,y). Each successive n bytes gives another pixel
- in scanline order. Subsequent scanlines follow on with no padding.
-
- free_samples: Is zero when an application has provided its own
- buffer for pixel data through fz_new_pixmap_with_bbox_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;
-};
-
-void fz_free_pixmap_imp(fz_context *ctx, fz_storable *pix);
-
-void fz_copy_pixmap_rect(fz_context *ctx, fz_pixmap *dest, fz_pixmap *src, const fz_irect *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_irect *clip);
-
-typedef struct fz_scale_cache_s fz_scale_cache;
-
-fz_scale_cache *fz_new_scale_cache(fz_context *ctx);
-void fz_free_scale_cache(fz_context *ctx, fz_scale_cache *cache);
-fz_pixmap *fz_scale_pixmap_cached(fz_context *ctx, fz_pixmap *src, float x, float y, float w, float h, const fz_irect *clip, fz_scale_cache *cache_x, fz_scale_cache *cache_y);
-
-void fz_subsample_pixmap(fz_context *ctx, fz_pixmap *tile, int factor);
-
-fz_irect *fz_pixmap_bbox_no_ctx(fz_pixmap *src, fz_irect *bbox);
-
-typedef struct fz_compression_params_s fz_compression_params;
-
-typedef struct fz_compressed_buffer_s fz_compressed_buffer;
-unsigned int fz_compressed_buffer_size(fz_compressed_buffer *buffer);
-
-fz_stream *fz_open_compressed_buffer(fz_context *ctx, fz_compressed_buffer *);
-fz_stream *fz_open_image_decomp_stream(fz_context *ctx, fz_compressed_buffer *, int *l2factor);
-
-enum
-{
- FZ_IMAGE_UNKNOWN = 0,
- FZ_IMAGE_JPEG = 1,
- FZ_IMAGE_JPX = 2, /* Placeholder until supported */
- FZ_IMAGE_FAX = 3,
- FZ_IMAGE_JBIG2 = 4, /* Placeholder until supported */
- FZ_IMAGE_RAW = 5,
- FZ_IMAGE_RLD = 6,
- FZ_IMAGE_FLATE = 7,
- FZ_IMAGE_LZW = 8,
- FZ_IMAGE_PNG = 9,
- FZ_IMAGE_TIFF = 10
-};
-
-struct fz_compression_params_s
-{
- int type;
- union {
- struct {
- int color_transform;
- } jpeg;
- struct {
- int smask_in_data;
- } jpx;
- struct {
- int columns;
- int rows;
- int k;
- int end_of_line;
- int encoded_byte_align;
- int end_of_block;
- int black_is_1;
- int damaged_rows_before_error;
- } fax;
- struct
- {
- int columns;
- int colors;
- int predictor;
- int bpc;
- }
- flate;
- struct
- {
- int columns;
- int colors;
- int predictor;
- int bpc;
- int early_change;
- } lzw;
- } u;
-};
-
-struct fz_compressed_buffer_s
-{
- fz_compression_params params;
- fz_buffer *buffer;
-};
-
-void fz_free_compressed_buffer(fz_context *ctx, fz_compressed_buffer *buf);
-
-fz_image *fz_new_image(fz_context *ctx, int w, int h, int bpc, fz_colorspace *colorspace, int xres, int yres, int interpolate, int imagemask, float *decode, int *colorkey, fz_compressed_buffer *buffer, fz_image *mask);
-fz_image *fz_new_image_from_pixmap(fz_context *ctx, fz_pixmap *pixmap, fz_image *mask);
-fz_image *fz_new_image_from_data(fz_context *ctx, unsigned char *data, int len);
-fz_image *fz_new_image_from_buffer(fz_context *ctx, fz_buffer *buffer);
-fz_pixmap *fz_image_get_pixmap(fz_context *ctx, fz_image *image, int w, int h);
-void fz_free_image(fz_context *ctx, fz_storable *image);
-fz_pixmap *fz_decomp_image_from_stream(fz_context *ctx, fz_stream *stm, fz_image *image, int in_line, int indexed, int l2factor, int native_l2factor);
-fz_pixmap *fz_expand_indexed_pixmap(fz_context *ctx, fz_pixmap *src);
-
-struct fz_image_s
-{
- fz_storable storable;
- int w, h, n, bpc;
- fz_image *mask;
- fz_colorspace *colorspace;
- fz_pixmap *(*get_pixmap)(fz_context *, fz_image *, int w, int h);
- fz_compressed_buffer *buffer;
- int colorkey[FZ_MAX_COLORS * 2];
- float decode[FZ_MAX_COLORS * 2];
- int imagemask;
- int interpolate;
- int usecolorkey;
- fz_pixmap *tile; /* Private to the implementation */
- int xres; /* As given in the image, not necessarily as rendered */
- int yres; /* As given in the image, not necessarily as rendered */
-};
-
-fz_pixmap *fz_load_jpx(fz_context *ctx, unsigned char *data, int size, fz_colorspace *cs, int indexed);
-fz_pixmap *fz_load_png(fz_context *ctx, unsigned char *data, int size);
-fz_pixmap *fz_load_tiff(fz_context *ctx, unsigned char *data, int size);
-
-void fz_load_jpeg_info(fz_context *ctx, unsigned char *data, int size, int *w, int *h, int *xres, int *yres, fz_colorspace **cspace);
-void fz_load_png_info(fz_context *ctx, unsigned char *data, int size, int *w, int *h, int *xres, int *yres, fz_colorspace **cspace);
-void fz_load_tiff_info(fz_context *ctx, unsigned char *data, int size, int *w, int *h, int *xres, int *yres, fz_colorspace **cspace);
-
-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_default_halftone(fz_context *ctx, int num_comps);
-void fz_drop_halftone(fz_context *ctx, fz_halftone *half);
-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_new_indexed_colorspace(fz_context *ctx, fz_colorspace *base, int high, unsigned char *lookup);
-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 *dsts, float *dstv, fz_colorspace *srcs, float *srcv);
-
-void fz_new_colorspace_context(fz_context *ctx);
-fz_colorspace_context *fz_keep_colorspace_context(fz_context *ctx);
-void fz_drop_colorspace_context(fz_context *ctx);
-
-typedef struct fz_color_converter_s fz_color_converter;
-
-/* This structure is public because it allows us to avoid dynamic allocations.
- * Callers should only rely on the convert entry - the rest of the structure
- * is subject to change without notice.
- */
-struct fz_color_converter_s
-{
- void (*convert)(fz_color_converter *, float *, float *);
- fz_context *ctx;
- fz_colorspace *ds;
- fz_colorspace *ss;
-};
-
-void fz_lookup_color_converter(fz_color_converter *cc, fz_context *ctx, fz_colorspace *ds, fz_colorspace *ss);
-
-/*
- * 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 */
- fz_display_list **t3lists; /* 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, const fz_matrix *ctm, void *gstate, int nestedDepth);
- 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, const fz_matrix *matrix);
-
-fz_font *fz_new_font_from_memory(fz_context *ctx, char *name, unsigned char *data, int len, int index, int use_glyph_bbox);
-fz_font *fz_new_font_from_file(fz_context *ctx, char *name, 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_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, const fz_matrix *trm, fz_rect *r);
-int fz_glyph_cacheable(fz_context *ctx, fz_font *font, int gid);
-
-#ifndef NDEBUG
-void fz_print_font(fz_context *ctx, FILE *out, fz_font *font);
-#endif
-
-/*
- * 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
-{
- int refs;
- 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);
-fz_point fz_currentpoint(fz_context *ctx, fz_path *path);
-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, const 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, const fz_stroke_state *stroke, const fz_matrix *ctm, fz_rect *r);
-fz_rect *fz_adjust_rect_for_stroke(fz_rect *r, const fz_stroke_state *stroke, const fz_matrix *ctm);
-
-fz_stroke_state *fz_new_stroke_state(fz_context *ctx);
-fz_stroke_state *fz_new_stroke_state_with_len(fz_context *ctx, int len);
-fz_stroke_state *fz_keep_stroke_state(fz_context *ctx, fz_stroke_state *stroke);
-void fz_drop_stroke_state(fz_context *ctx, fz_stroke_state *stroke);
-fz_stroke_state *fz_unshare_stroke_state(fz_context *ctx, fz_stroke_state *shared);
-fz_stroke_state *fz_unshare_stroke_state_with_len(fz_context *ctx, fz_stroke_state *shared, int len);
-
-#ifndef NDEBUG
-void fz_print_path(fz_context *ctx, FILE *out, fz_path *, int indent);
-#endif
-
-/*
- * 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_path *fz_outline_ft_glyph(fz_context *ctx, fz_font *font, int gid, const fz_matrix *trm);
-fz_path *fz_outline_glyph(fz_context *ctx, fz_font *font, int gid, const fz_matrix *ctm);
-fz_pixmap *fz_render_ft_glyph(fz_context *ctx, fz_font *font, int cid, const fz_matrix *trm, int aa);
-fz_pixmap *fz_render_t3_glyph(fz_context *ctx, fz_font *font, int cid, const fz_matrix *trm, fz_colorspace *model, fz_irect scissor);
-fz_pixmap *fz_render_ft_stroked_glyph(fz_context *ctx, fz_font *font, int gid, const fz_matrix *trm, const fz_matrix *ctm, fz_stroke_state *state);
-fz_pixmap *fz_render_glyph(fz_context *ctx, fz_font*, int, const fz_matrix *, fz_colorspace *model, fz_irect scissor);
-fz_pixmap *fz_render_stroked_glyph(fz_context *ctx, fz_font*, int, const fz_matrix *, const fz_matrix *, fz_stroke_state *stroke, fz_irect scissor);
-void fz_render_t3_glyph_direct(fz_context *ctx, fz_device *dev, fz_font *font, int gid, const fz_matrix *trm, void *gstate, int nestedDepth);
-void fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nestedDepth);
-
-/*
- * 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, const 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, const fz_stroke_state *stroke, const fz_matrix *ctm, fz_rect *r);
-fz_text *fz_clone_text(fz_context *ctx, fz_text *old);
-void fz_print_text(fz_context *ctx, FILE *out, fz_text*);
-
-/*
- * The generic function support.
- */
-
-typedef struct fz_function_s fz_function;
-
-void fz_eval_function(fz_context *ctx, fz_function *func, float *in, int inlen, float *out, int outlen);
-fz_function *fz_keep_function(fz_context *ctx, fz_function *func);
-void fz_drop_function(fz_context *ctx, fz_function *func);
-unsigned int fz_function_size(fz_function *func);
-#ifndef DEBUG
-void pdf_debug_function(fz_function *func);
-#endif
-
-enum
-{
- FZ_FN_MAXN = FZ_MAX_COLORS,
- FZ_FN_MAXM = FZ_MAX_COLORS
-};
-
-struct fz_function_s
-{
- fz_storable storable;
- unsigned int size;
- int m; /* number of input values */
- int n; /* number of output values */
- void (*evaluate)(fz_context *ctx, fz_function *func, float *in, float *out);
-#ifndef NDEBUG
- void (*debug)(fz_function *func);
-#endif
-};
-
-/*
- * The shading code uses gouraud shaded triangle meshes.
- */
-
-enum
-{
- FZ_FUNCTION_BASED = 1,
- FZ_LINEAR = 2,
- FZ_RADIAL = 3,
- FZ_MESH_TYPE4 = 4,
- FZ_MESH_TYPE5 = 5,
- FZ_MESH_TYPE6 = 6,
- FZ_MESH_TYPE7 = 7
-};
-
-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; /* function, linear, radial, mesh */
- union
- {
- struct
- {
- int extend[2];
- float coords[2][3]; /* (x,y,r) twice */
- } l_or_r;
- struct
- {
- int vprow;
- int bpflag;
- int bpcoord;
- int bpcomp;
- float x0, x1;
- float y0, y1;
- float c0[FZ_MAX_COLORS];
- float c1[FZ_MAX_COLORS];
- } m;
- struct
- {
- fz_matrix matrix;
- int xdivs;
- int ydivs;
- float domain[2][2];
- float *fn_vals;
- } f;
- } u;
-
- fz_compressed_buffer *buffer;
-};
-
-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);
-
-fz_rect *fz_bound_shade(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz_rect *r);
-void fz_paint_shade(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz_pixmap *dest, const fz_irect *bbox);
-
-/*
- * Handy routine for processing mesh based shades
- */
-typedef struct fz_vertex_s fz_vertex;
-
-struct fz_vertex_s
-{
- fz_point p;
- float c[FZ_MAX_COLORS];
-};
-
-typedef struct fz_mesh_processor_s fz_mesh_processor;
-
-typedef void (fz_mesh_process_fn)(void *arg, fz_vertex *av, fz_vertex *bv, fz_vertex *cv);
-
-struct fz_mesh_processor_s {
- fz_context *ctx;
- fz_shade *shade;
- fz_mesh_process_fn *process;
- void *process_arg;
- int ncomp;
-};
-
-void fz_process_mesh(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm,
- fz_mesh_process_fn *process, void *process_arg);
-
-#ifndef NDEBUG
-void fz_print_shade(fz_context *ctx, FILE *out, fz_shade *shade);
-#endif
-
-/*
- * 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, const fz_irect *clip);
-void fz_sort_gel(fz_gel *gel);
-fz_irect *fz_bound_gel(const fz_gel *gel, fz_irect *bbox);
-void fz_free_gel(fz_gel *gel);
-int fz_is_rect_gel(fz_gel *gel);
-
-void fz_scan_convert(fz_gel *gel, int eofill, const fz_irect *clip, fz_pixmap *pix, unsigned char *colorbv);
-
-void fz_flatten_fill_path(fz_gel *gel, fz_path *path, const fz_matrix *ctm, float flatness);
-void fz_flatten_stroke_path(fz_gel *gel, fz_path *path, const fz_stroke_state *stroke, const fz_matrix *ctm, float flatness, float linewidth);
-void fz_flatten_dash_path(fz_gel *gel, fz_path *path, const fz_stroke_state *stroke, const fz_matrix *ctm, float flatness, float linewidth);
-
-fz_irect *fz_bound_path_accurate(fz_context *ctx, fz_irect *bbox, const fz_irect *scissor, fz_path *path, const fz_stroke_state *stroke, const fz_matrix *ctm, float flatness, float linewidth);
-
-/*
- * The device interface.
- */
-
-fz_device *fz_new_draw_device_type3(fz_context *ctx, fz_pixmap *dest);
-
-enum
-{
- /* 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 (*begin_page)(fz_device *, const fz_rect *rect, const fz_matrix *ctm);
- void (*end_page)(fz_device *);
-
- void (*fill_path)(fz_device *, fz_path *, int even_odd, const fz_matrix *, fz_colorspace *, float *color, float alpha);
- void (*stroke_path)(fz_device *, fz_path *, fz_stroke_state *, const fz_matrix *, fz_colorspace *, float *color, float alpha);
- void (*clip_path)(fz_device *, fz_path *, const fz_rect *rect, int even_odd, const fz_matrix *);
- void (*clip_stroke_path)(fz_device *, fz_path *, const fz_rect *rect, fz_stroke_state *, const fz_matrix *);
-
- void (*fill_text)(fz_device *, fz_text *, const fz_matrix *, fz_colorspace *, float *color, float alpha);
- void (*stroke_text)(fz_device *, fz_text *, fz_stroke_state *, const fz_matrix *, fz_colorspace *, float *color, float alpha);
- void (*clip_text)(fz_device *, fz_text *, const fz_matrix *, int accumulate);
- void (*clip_stroke_text)(fz_device *, fz_text *, fz_stroke_state *, const fz_matrix *);
- void (*ignore_text)(fz_device *, fz_text *, const fz_matrix *);
-
- void (*fill_shade)(fz_device *, fz_shade *shd, const fz_matrix *ctm, float alpha);
- void (*fill_image)(fz_device *, fz_image *img, const fz_matrix *ctm, float alpha);
- void (*fill_image_mask)(fz_device *, fz_image *img, const fz_matrix *ctm, fz_colorspace *, float *color, float alpha);
- void (*clip_image_mask)(fz_device *, fz_image *img, const fz_rect *rect, const fz_matrix *ctm);
-
- void (*pop_clip)(fz_device *);
-
- void (*begin_mask)(fz_device *, const fz_rect *, int luminosity, fz_colorspace *, float *bc);
- void (*end_mask)(fz_device *);
- void (*begin_group)(fz_device *, const fz_rect *, int isolated, int knockout, int blendmode, float alpha);
- void (*end_group)(fz_device *);
-
- int (*begin_tile)(fz_device *, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id);
- void (*end_tile)(fz_device *);
-
- int error_depth;
- char errmess[256];
-};
-
-void fz_begin_page(fz_device *dev, const fz_rect *rect, const fz_matrix *ctm);
-void fz_end_page(fz_device *dev);
-void fz_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
-void fz_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
-void fz_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm);
-void fz_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm);
-void fz_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
-void fz_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
-void fz_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate);
-void fz_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm);
-void fz_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm);
-void fz_pop_clip(fz_device *dev);
-void fz_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha);
-void fz_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha);
-void fz_fill_image_mask(fz_device *dev, fz_image *image, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
-void fz_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm);
-void fz_begin_mask(fz_device *dev, const fz_rect *area, int luminosity, fz_colorspace *colorspace, float *bc);
-void fz_end_mask(fz_device *dev);
-void fz_begin_group(fz_device *dev, const 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, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm);
-int fz_begin_tile_id(fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id);
-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, const fz_irect *scissor, fz_pixmap *shape, fz_pixmap *img, const fz_matrix *ctm, int alpha);
-void fz_paint_image_with_color(fz_pixmap *dst, const fz_irect *scissor, fz_pixmap *shape, fz_pixmap *img, const 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_bbox(fz_pixmap *dst, fz_pixmap *src, int alpha, fz_irect 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, fz_rect *);
- void (*run_page_contents)(fz_document *doc, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
- void (*run_annot)(fz_document *doc, fz_page *page, fz_annot *annot, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
- void (*free_page)(fz_document *doc, fz_page *page);
- int (*meta)(fz_document *doc, int key, void *ptr, int size);
- fz_transition *(*page_presentation)(fz_document *doc, fz_page *page, float *duration);
- void (*write)(fz_document *doc, char *filename, fz_write_options *opts);
- fz_annot *(*first_annot)(fz_document *doc, fz_page *page);
- fz_annot *(*next_annot)(fz_document *doc, fz_annot *annot);
- fz_rect *(*bound_annot)(fz_document *doc, fz_annot *annot, fz_rect *rect);
-};
-
-#endif
diff --git a/include/mupdf/fitz.h b/include/mupdf/fitz.h
index 02104b05..e199b5ee 100644
--- a/include/mupdf/fitz.h
+++ b/include/mupdf/fitz.h
@@ -3187,4 +3187,1620 @@ void fz_write_pcl(fz_context *ctx, fz_pixmap *pixmap, char *filename, int append
void fz_write_pcl_bitmap(fz_context *ctx, fz_bitmap *bitmap, char *filename, int append, fz_pcl_options *pcl);
+/* fitz-internal.h */
+
+#ifdef _WIN32 /* Microsoft Visual C++ */
+
+typedef signed char int8_t;
+typedef short int int16_t;
+typedef int int32_t;
+typedef __int64 int64_t;
+
+typedef unsigned char uint8_t;
+typedef unsigned short int uint16_t;
+typedef unsigned int uint32_t;
+typedef unsigned __int64 uint64_t;
+
+#else
+#include <inttypes.h>
+#endif
+
+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);
+void fz_copy_aa_context(fz_context *dst, fz_context *src);
+
+/* Default allocator */
+extern fz_alloc_context fz_alloc_default;
+
+/* Default locks */
+extern fz_locks_context fz_locks_default;
+
+#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);
+}
+
+/* ARM assembly specific defines */
+
+#ifdef ARCH_ARM
+#ifdef NDK_PROFILER
+extern void __gnu_mcount_nc(void);
+#define ENTER_PG "push {lr}\nbl __gnu_mcount_nc\n"
+#else
+#define ENTER_PG
+#endif
+
+/* If we're compiling as thumb code, then we need to tell the compiler
+ * to enter and exit ARM mode around our assembly sections. If we move
+ * the ARM functions to a separate file and arrange for it to be compiled
+ * without thumb mode, we can save some time on entry.
+ */
+#ifdef ARCH_THUMB
+#define ENTER_ARM ".balign 4\nmov r12,pc\nbx r12\n0:.arm\n" ENTER_PG
+#define ENTER_THUMB "9:.thumb\n" ENTER_PG
+#else
+#define ENTER_ARM
+#define ENTER_THUMB
+#endif
+#endif
+
+/*
+ * Basic runtime and utility functions
+ */
+
+#ifdef CLUSTER
+#define LOCAL_TRIG_FNS
+#endif
+
+#ifdef LOCAL_TRIG_FNS
+/*
+ * Trig functions
+ */
+static float
+my_atan_table[258] =
+{
+0.0000000000f, 0.00390623013f,0.00781234106f,0.0117182136f,
+0.0156237286f, 0.0195287670f, 0.0234332099f, 0.0273369383f,
+0.0312398334f, 0.0351417768f, 0.0390426500f, 0.0429423347f,
+0.0468407129f, 0.0507376669f, 0.0546330792f, 0.0585268326f,
+0.0624188100f, 0.0663088949f, 0.0701969711f, 0.0740829225f,
+0.0779666338f, 0.0818479898f, 0.0857268758f, 0.0896031775f,
+0.0934767812f, 0.0973475735f, 0.1012154420f, 0.1050802730f,
+0.1089419570f, 0.1128003810f, 0.1166554350f, 0.1205070100f,
+0.1243549950f, 0.1281992810f, 0.1320397620f, 0.1358763280f,
+0.1397088740f, 0.1435372940f, 0.1473614810f, 0.1511813320f,
+0.1549967420f, 0.1588076080f, 0.1626138290f, 0.1664153010f,
+0.1702119250f, 0.1740036010f, 0.1777902290f, 0.1815717110f,
+0.1853479500f, 0.1891188490f, 0.1928843120f, 0.1966442450f,
+0.2003985540f, 0.2041471450f, 0.2078899270f, 0.2116268090f,
+0.2153577000f, 0.2190825110f, 0.2228011540f, 0.2265135410f,
+0.2302195870f, 0.2339192060f, 0.2376123140f, 0.2412988270f,
+0.2449786630f, 0.2486517410f, 0.2523179810f, 0.2559773030f,
+0.2596296290f, 0.2632748830f, 0.2669129880f, 0.2705438680f,
+0.2741674510f, 0.2777836630f, 0.2813924330f, 0.2849936890f,
+0.2885873620f, 0.2921733830f, 0.2957516860f, 0.2993222020f,
+0.3028848680f, 0.3064396190f, 0.3099863910f, 0.3135251230f,
+0.3170557530f, 0.3205782220f, 0.3240924700f, 0.3275984410f,
+0.3310960770f, 0.3345853220f, 0.3380661230f, 0.3415384250f,
+0.3450021770f, 0.3484573270f, 0.3519038250f, 0.3553416220f,
+0.3587706700f, 0.3621909220f, 0.3656023320f, 0.3690048540f,
+0.3723984470f, 0.3757830650f, 0.3791586690f, 0.3825252170f,
+0.3858826690f, 0.3892309880f, 0.3925701350f, 0.3959000740f,
+0.3992207700f, 0.4025321870f, 0.4058342930f, 0.4091270550f,
+0.4124104420f, 0.4156844220f, 0.4189489670f, 0.4222040480f,
+0.4254496370f, 0.4286857080f, 0.4319122350f, 0.4351291940f,
+0.4383365600f, 0.4415343100f, 0.4447224240f, 0.4479008790f,
+0.4510696560f, 0.4542287350f, 0.4573780990f, 0.4605177290f,
+0.4636476090f, 0.4667677240f, 0.4698780580f, 0.4729785980f,
+0.4760693300f, 0.4791502430f, 0.4822213240f, 0.4852825630f,
+0.4883339510f, 0.4913754780f, 0.4944071350f, 0.4974289160f,
+0.5004408130f, 0.5034428210f, 0.5064349340f, 0.5094171490f,
+0.5123894600f, 0.5153518660f, 0.5183043630f, 0.5212469510f,
+0.5241796290f, 0.5271023950f, 0.5300152510f, 0.5329181980f,
+0.5358112380f, 0.5386943730f, 0.5415676050f, 0.5444309400f,
+0.5472843810f, 0.5501279330f, 0.5529616020f, 0.5557853940f,
+0.5585993150f, 0.5614033740f, 0.5641975770f, 0.5669819340f,
+0.5697564530f, 0.5725211450f, 0.5752760180f, 0.5780210840f,
+0.5807563530f, 0.5834818390f, 0.5861975510f, 0.5889035040f,
+0.5915997100f, 0.5942861830f, 0.5969629370f, 0.5996299860f,
+0.6022873460f, 0.6049350310f, 0.6075730580f, 0.6102014430f,
+0.6128202020f, 0.6154293530f, 0.6180289120f, 0.6206188990f,
+0.6231993300f, 0.6257702250f, 0.6283316020f, 0.6308834820f,
+0.6334258830f, 0.6359588250f, 0.6384823300f, 0.6409964180f,
+0.6435011090f, 0.6459964250f, 0.6484823880f, 0.6509590190f,
+0.6534263410f, 0.6558843770f, 0.6583331480f, 0.6607726790f,
+0.6632029930f, 0.6656241120f, 0.6680360620f, 0.6704388650f,
+0.6728325470f, 0.6752171330f, 0.6775926450f, 0.6799591110f,
+0.6823165550f, 0.6846650020f, 0.6870044780f, 0.6893350100f,
+0.6916566220f, 0.6939693410f, 0.6962731940f, 0.6985682070f,
+0.7008544080f, 0.7031318220f, 0.7054004770f, 0.7076604000f,
+0.7099116190f, 0.7121541600f, 0.7143880520f, 0.7166133230f,
+0.7188300000f, 0.7210381110f, 0.7232376840f, 0.7254287490f,
+0.7276113330f, 0.7297854640f, 0.7319511710f, 0.7341084830f,
+0.7362574290f, 0.7383980370f, 0.7405303370f, 0.7426543560f,
+0.7447701260f, 0.7468776740f, 0.7489770290f, 0.7510682220f,
+0.7531512810f, 0.7552262360f, 0.7572931160f, 0.7593519510f,
+0.7614027700f, 0.7634456020f, 0.7654804790f, 0.7675074280f,
+0.7695264800f, 0.7715376650f, 0.7735410110f, 0.7755365500f,
+0.7775243100f, 0.7795043220f, 0.7814766150f, 0.7834412190f,
+0.7853981630f, 0.7853981630f /* Extended by 1 for interpolation */
+};
+
+static inline float my_sinf(float x)
+{
+ float x2, xn;
+ int i;
+ /* Map x into the -PI to PI range. We could do this using:
+ * x = fmodf(x, (float)(2.0 * M_PI));
+ * but that's C99, and seems to misbehave with negative numbers
+ * on some platforms. */
+ x -= (float)M_PI;
+ i = x / (float)(2.0f * M_PI);
+ x -= i * (float)(2.0f * M_PI);
+ if (x < 0.0f)
+ x += (float)(2.0f * M_PI);
+ x -= (float)M_PI;
+ if (x <= (float)(-M_PI/2.0))
+ x = -(float)M_PI-x;
+ else if (x >= (float)(M_PI/2.0))
+ x = (float)M_PI-x;
+ x2 = x*x;
+ xn = x*x2/6.0f;
+ x -= xn;
+ xn *= x2/20.0f;
+ x += xn;
+ xn *= x2/42.0f;
+ x -= xn;
+ xn *= x2/72.0f;
+ x += xn;
+ return x;
+}
+
+static inline float my_atan2f(float o, float a)
+{
+ int negate = 0, flip = 0, i;
+ float r, s;
+ if (o == 0.0f)
+ {
+ if (a > 0)
+ return 0.0f;
+ else
+ return (float)M_PI;
+ }
+ if (o < 0)
+ o = -o, negate = 1;
+ if (a < 0)
+ a = -a, flip = 1;
+ if (o < a)
+ i = (int)(65536.0f*o/a + 0.5f);
+ else
+ i = (int)(65536.0f*a/o + 0.5f);
+ r = my_atan_table[i>>8];
+ s = my_atan_table[(i>>8)+1];
+ r += (s-r)*(i&255)/256.0f;
+ if (o >= a)
+ r = (float)(M_PI/2.0f) - r;
+ if (flip)
+ r = (float)M_PI - r;
+ if (negate)
+ r = -r;
+ return r;
+}
+
+#define sinf(x) my_sinf(x)
+#define cosf(x) my_sinf(((float)(M_PI/2.0f)) + (x))
+#define atan2f(x,y) my_atan2f((x),(y))
+#endif
+
+/* Range checking atof */
+float fz_atof(const char *s);
+
+/* atoi that copes with NULL */
+int fz_atoi(const char *s);
+
+/*
+ * 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_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_insert_with_pos(fz_context *ctx, fz_hash_table *table, void *key, void *val, unsigned *pos);
+void fz_hash_remove(fz_context *ctx, fz_hash_table *table, void *key);
+void fz_hash_remove_fast(fz_context *ctx, fz_hash_table *table, void *key, unsigned pos);
+
+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);
+
+#ifndef NDEBUG
+void fz_print_hash(fz_context *ctx, FILE *out, fz_hash_table *table);
+void fz_print_hash_details(fz_context *ctx, FILE *out, fz_hash_table *table, void (*details)(FILE *, void *));
+#endif
+
+/*
+ * 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)
+
+void fz_gridfit_matrix(fz_matrix *m);
+float fz_matrix_max_expansion(const 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]);
+
+/* sha-512 digests */
+
+typedef struct fz_sha512_s fz_sha512;
+
+struct fz_sha512_s
+{
+ uint64_t state[8];
+ unsigned int count[2];
+ union {
+ unsigned char u8[128];
+ uint64_t u64[16];
+ } buffer;
+};
+
+void fz_sha512_init(fz_sha512 *state);
+void fz_sha512_update(fz_sha512 *state, const unsigned char *input, unsigned int inlen);
+void fz_sha512_final(fz_sha512 *state, unsigned char digest[64]);
+
+/* sha-384 digests */
+
+typedef struct fz_sha512_s fz_sha384;
+
+void fz_sha384_init(fz_sha384 *state);
+void fz_sha384_update(fz_sha384 *state, const unsigned char *input, unsigned int inlen);
+void fz_sha384_final(fz_sha384 *state, unsigned char digest[64]);
+
+/* 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 */
+};
+
+int aes_setkey_enc( fz_aes *ctx, const unsigned char *key, int keysize );
+int 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 );
+
+/*
+ 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;
+ struct
+ {
+ int id;
+ float m[4];
+ } im;
+ } 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 *);
+#ifndef NDEBUG
+ void (*debug)(FILE *, void *);
+#endif
+};
+
+/*
+ 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_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);
+
+/*
+ fz_print_store: Dump the contents of the store for debugging.
+*/
+#ifndef NDEBUG
+void fz_print_store(fz_context *ctx, FILE *out);
+void fz_print_store_locked(fz_context *ctx, FILE *out);
+#endif
+
+struct fz_buffer_s
+{
+ int refs;
+ unsigned char *data;
+ int cap, len;
+ int unused_bits;
+};
+
+/*
+ fz_new_buffer: Create a new buffer.
+
+ capacity: Initial capacity.
+
+ Returns pointer to new buffer. Throws exception on allocation
+ failure.
+*/
+fz_buffer *fz_new_buffer(fz_context *ctx, int capacity);
+
+/*
+ fz_new_buffer: Create a new buffer.
+
+ capacity: Initial capacity.
+
+ Returns pointer to new buffer. Throws exception on allocation
+ failure.
+*/
+fz_buffer *fz_new_buffer_from_data(fz_context *ctx, unsigned char *data, int size);
+
+/*
+ fz_resize_buffer: Ensure that a buffer has a given capacity,
+ truncating data if required.
+
+ buf: The buffer to alter.
+
+ capacity: The desired capacity for the buffer. If the current size
+ of the buffer contents is smaller than capacity, it is truncated.
+
+*/
+void fz_resize_buffer(fz_context *ctx, fz_buffer *buf, int capacity);
+
+/*
+ fz_grow_buffer: Make some space within a buffer (i.e. ensure that
+ capacity > size).
+
+ buf: The buffer to grow.
+
+ May throw exception on failure to allocate.
+*/
+void fz_grow_buffer(fz_context *ctx, fz_buffer *buf);
+
+/*
+ fz_trim_buffer: Trim wasted capacity from a buffer.
+
+ buf: The buffer to trim.
+*/
+void fz_trim_buffer(fz_context *ctx, fz_buffer *buf);
+
+/*
+ fz_buffer_cat: Concatenate buffers
+
+ buf: first to concatenate and the holder of the result
+ extra: second to concatenate
+
+ May throw exception on failure to allocate.
+*/
+void fz_buffer_cat(fz_context *ctx, fz_buffer *buf, fz_buffer *extra);
+
+void fz_write_buffer(fz_context *ctx, fz_buffer *buf, const void *data, int len);
+
+void fz_write_buffer_byte(fz_context *ctx, fz_buffer *buf, int val);
+
+void fz_write_buffer_rune(fz_context *ctx, fz_buffer *buf, int val);
+
+void fz_write_buffer_bits(fz_context *ctx, fz_buffer *buf, int val, int bits);
+
+void fz_write_buffer_pad(fz_context *ctx, fz_buffer *buf);
+
+/*
+ fz_buffer_printf: print formatted to a buffer. The buffer will grow
+ as required.
+*/
+int fz_buffer_printf(fz_context *ctx, fz_buffer *buffer, const char *fmt, ...);
+int fz_buffer_vprintf(fz_context *ctx, fz_buffer *buffer, const char *fmt, va_list args);
+
+/*
+ fz_buffer_printf: print a string formatted as a pdf string to a buffer.
+ The buffer will grow.
+*/
+void
+fz_buffer_cat_pdf_string(fz_context *ctx, fz_buffer *buffer, const char *text);
+
+struct fz_stream_s
+{
+ fz_context *ctx;
+ int refs;
+ int error;
+ int eof;
+ int pos;
+ int avail;
+ int bits;
+ 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_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);
+
+/*
+ fz_read_best: Attempt to read a stream into a buffer. If truncated
+ is NULL behaves as fz_read_all, otherwise does not throw exceptions
+ in the case of failure, but instead sets a truncated flag.
+
+ stm: The stream to read from.
+
+ initial: Suggested initial size for the buffer.
+
+ truncated: Flag to store success/failure indication in.
+
+ Returns a buffer created from reading from the stream.
+*/
+fz_buffer *fz_read_best(fz_stream *stm, int initial, int *truncated);
+
+void fz_read_line(fz_stream *stm, char *buf, int max);
+
+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);
+}
+
+static inline int fz_write_int32be(fz_output *out, int x)
+{
+ char data[4];
+
+ data[0] = x>>24;
+ data[1] = x>>16;
+ data[2] = x>>8;
+ data[3] = x;
+
+ return fz_write(out, data, 4);
+}
+
+static inline void
+fz_write_byte(fz_output *out, int x)
+{
+ char data = x;
+
+ fz_write(out, &data, 1);
+}
+
+/*
+ * Data filters.
+ */
+
+fz_stream *fz_open_copy(fz_stream *chain);
+fz_stream *fz_open_null(fz_stream *chain, int len, int offset);
+fz_stream *fz_open_concat(fz_context *ctx, int max, int pad);
+void fz_concat_push(fz_stream *concat, fz_stream *chain); /* Ownership of chain is passed in */
+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 l2factor);
+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.
+ */
+
+int fz_lookup_blendmode(char *name);
+char *fz_blendmode_name(int blendmode);
+
+struct fz_bitmap_s
+{
+ int refs;
+ int w, h, stride, n;
+ int xres, yres;
+ unsigned char *samples;
+};
+
+fz_bitmap *fz_new_bitmap(fz_context *ctx, int w, int h, int n, int xres, int yres);
+
+void fz_bitmap_details(fz_bitmap *bitmap, int *w, int *h, int *n, int *stride);
+
+void fz_clear_bitmap(fz_context *ctx, fz_bitmap *bit);
+
+/*
+ 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.
+
+ x, y: The minimum x and y coord of the region in pixels.
+
+ w, h: The width and height of the region in pixels.
+
+ n: The number of color components in the image. Always
+ includes a separate alpha channel. For mask images n=1, for greyscale
+ (plus alpha) images n=2, for rgb (plus alpha) images n=3.
+
+ 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: Pointer to a colorspace object describing the colorspace
+ the pixmap is in. If NULL, the image is a mask.
+
+ samples: A simple block of memory w * h * n bytes of memory in which
+ the components are stored. The first n bytes are components 0 to n-1
+ for the pixel at (x,y). Each successive n bytes gives another pixel
+ in scanline order. Subsequent scanlines follow on with no padding.
+
+ free_samples: Is zero when an application has provided its own
+ buffer for pixel data through fz_new_pixmap_with_bbox_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;
+};
+
+void fz_free_pixmap_imp(fz_context *ctx, fz_storable *pix);
+
+void fz_copy_pixmap_rect(fz_context *ctx, fz_pixmap *dest, fz_pixmap *src, const fz_irect *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_irect *clip);
+
+typedef struct fz_scale_cache_s fz_scale_cache;
+
+fz_scale_cache *fz_new_scale_cache(fz_context *ctx);
+void fz_free_scale_cache(fz_context *ctx, fz_scale_cache *cache);
+fz_pixmap *fz_scale_pixmap_cached(fz_context *ctx, fz_pixmap *src, float x, float y, float w, float h, const fz_irect *clip, fz_scale_cache *cache_x, fz_scale_cache *cache_y);
+
+void fz_subsample_pixmap(fz_context *ctx, fz_pixmap *tile, int factor);
+
+fz_irect *fz_pixmap_bbox_no_ctx(fz_pixmap *src, fz_irect *bbox);
+
+typedef struct fz_compression_params_s fz_compression_params;
+
+typedef struct fz_compressed_buffer_s fz_compressed_buffer;
+unsigned int fz_compressed_buffer_size(fz_compressed_buffer *buffer);
+
+fz_stream *fz_open_compressed_buffer(fz_context *ctx, fz_compressed_buffer *);
+fz_stream *fz_open_image_decomp_stream(fz_context *ctx, fz_compressed_buffer *, int *l2factor);
+
+enum
+{
+ FZ_IMAGE_UNKNOWN = 0,
+ FZ_IMAGE_JPEG = 1,
+ FZ_IMAGE_JPX = 2, /* Placeholder until supported */
+ FZ_IMAGE_FAX = 3,
+ FZ_IMAGE_JBIG2 = 4, /* Placeholder until supported */
+ FZ_IMAGE_RAW = 5,
+ FZ_IMAGE_RLD = 6,
+ FZ_IMAGE_FLATE = 7,
+ FZ_IMAGE_LZW = 8,
+ FZ_IMAGE_PNG = 9,
+ FZ_IMAGE_TIFF = 10
+};
+
+struct fz_compression_params_s
+{
+ int type;
+ union {
+ struct {
+ int color_transform;
+ } jpeg;
+ struct {
+ int smask_in_data;
+ } jpx;
+ struct {
+ int columns;
+ int rows;
+ int k;
+ int end_of_line;
+ int encoded_byte_align;
+ int end_of_block;
+ int black_is_1;
+ int damaged_rows_before_error;
+ } fax;
+ struct
+ {
+ int columns;
+ int colors;
+ int predictor;
+ int bpc;
+ }
+ flate;
+ struct
+ {
+ int columns;
+ int colors;
+ int predictor;
+ int bpc;
+ int early_change;
+ } lzw;
+ } u;
+};
+
+struct fz_compressed_buffer_s
+{
+ fz_compression_params params;
+ fz_buffer *buffer;
+};
+
+void fz_free_compressed_buffer(fz_context *ctx, fz_compressed_buffer *buf);
+
+fz_image *fz_new_image(fz_context *ctx, int w, int h, int bpc, fz_colorspace *colorspace, int xres, int yres, int interpolate, int imagemask, float *decode, int *colorkey, fz_compressed_buffer *buffer, fz_image *mask);
+fz_image *fz_new_image_from_pixmap(fz_context *ctx, fz_pixmap *pixmap, fz_image *mask);
+fz_image *fz_new_image_from_data(fz_context *ctx, unsigned char *data, int len);
+fz_image *fz_new_image_from_buffer(fz_context *ctx, fz_buffer *buffer);
+fz_pixmap *fz_image_get_pixmap(fz_context *ctx, fz_image *image, int w, int h);
+void fz_free_image(fz_context *ctx, fz_storable *image);
+fz_pixmap *fz_decomp_image_from_stream(fz_context *ctx, fz_stream *stm, fz_image *image, int in_line, int indexed, int l2factor, int native_l2factor);
+fz_pixmap *fz_expand_indexed_pixmap(fz_context *ctx, fz_pixmap *src);
+
+struct fz_image_s
+{
+ fz_storable storable;
+ int w, h, n, bpc;
+ fz_image *mask;
+ fz_colorspace *colorspace;
+ fz_pixmap *(*get_pixmap)(fz_context *, fz_image *, int w, int h);
+ fz_compressed_buffer *buffer;
+ int colorkey[FZ_MAX_COLORS * 2];
+ float decode[FZ_MAX_COLORS * 2];
+ int imagemask;
+ int interpolate;
+ int usecolorkey;
+ fz_pixmap *tile; /* Private to the implementation */
+ int xres; /* As given in the image, not necessarily as rendered */
+ int yres; /* As given in the image, not necessarily as rendered */
+};
+
+fz_pixmap *fz_load_jpx(fz_context *ctx, unsigned char *data, int size, fz_colorspace *cs, int indexed);
+fz_pixmap *fz_load_png(fz_context *ctx, unsigned char *data, int size);
+fz_pixmap *fz_load_tiff(fz_context *ctx, unsigned char *data, int size);
+
+void fz_load_jpeg_info(fz_context *ctx, unsigned char *data, int size, int *w, int *h, int *xres, int *yres, fz_colorspace **cspace);
+void fz_load_png_info(fz_context *ctx, unsigned char *data, int size, int *w, int *h, int *xres, int *yres, fz_colorspace **cspace);
+void fz_load_tiff_info(fz_context *ctx, unsigned char *data, int size, int *w, int *h, int *xres, int *yres, fz_colorspace **cspace);
+
+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_default_halftone(fz_context *ctx, int num_comps);
+void fz_drop_halftone(fz_context *ctx, fz_halftone *half);
+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_new_indexed_colorspace(fz_context *ctx, fz_colorspace *base, int high, unsigned char *lookup);
+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 *dsts, float *dstv, fz_colorspace *srcs, float *srcv);
+
+void fz_new_colorspace_context(fz_context *ctx);
+fz_colorspace_context *fz_keep_colorspace_context(fz_context *ctx);
+void fz_drop_colorspace_context(fz_context *ctx);
+
+typedef struct fz_color_converter_s fz_color_converter;
+
+/* This structure is public because it allows us to avoid dynamic allocations.
+ * Callers should only rely on the convert entry - the rest of the structure
+ * is subject to change without notice.
+ */
+struct fz_color_converter_s
+{
+ void (*convert)(fz_color_converter *, float *, float *);
+ fz_context *ctx;
+ fz_colorspace *ds;
+ fz_colorspace *ss;
+};
+
+void fz_lookup_color_converter(fz_color_converter *cc, fz_context *ctx, fz_colorspace *ds, fz_colorspace *ss);
+
+/*
+ * 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 */
+ fz_display_list **t3lists; /* 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, const fz_matrix *ctm, void *gstate, int nestedDepth);
+ 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, const fz_matrix *matrix);
+
+fz_font *fz_new_font_from_memory(fz_context *ctx, char *name, unsigned char *data, int len, int index, int use_glyph_bbox);
+fz_font *fz_new_font_from_file(fz_context *ctx, char *name, 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_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, const fz_matrix *trm, fz_rect *r);
+int fz_glyph_cacheable(fz_context *ctx, fz_font *font, int gid);
+
+#ifndef NDEBUG
+void fz_print_font(fz_context *ctx, FILE *out, fz_font *font);
+#endif
+
+/*
+ * 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
+{
+ int refs;
+ 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);
+fz_point fz_currentpoint(fz_context *ctx, fz_path *path);
+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, const 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, const fz_stroke_state *stroke, const fz_matrix *ctm, fz_rect *r);
+fz_rect *fz_adjust_rect_for_stroke(fz_rect *r, const fz_stroke_state *stroke, const fz_matrix *ctm);
+
+fz_stroke_state *fz_new_stroke_state(fz_context *ctx);
+fz_stroke_state *fz_new_stroke_state_with_len(fz_context *ctx, int len);
+fz_stroke_state *fz_keep_stroke_state(fz_context *ctx, fz_stroke_state *stroke);
+void fz_drop_stroke_state(fz_context *ctx, fz_stroke_state *stroke);
+fz_stroke_state *fz_unshare_stroke_state(fz_context *ctx, fz_stroke_state *shared);
+fz_stroke_state *fz_unshare_stroke_state_with_len(fz_context *ctx, fz_stroke_state *shared, int len);
+
+#ifndef NDEBUG
+void fz_print_path(fz_context *ctx, FILE *out, fz_path *, int indent);
+#endif
+
+/*
+ * 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_path *fz_outline_ft_glyph(fz_context *ctx, fz_font *font, int gid, const fz_matrix *trm);
+fz_path *fz_outline_glyph(fz_context *ctx, fz_font *font, int gid, const fz_matrix *ctm);
+fz_pixmap *fz_render_ft_glyph(fz_context *ctx, fz_font *font, int cid, const fz_matrix *trm, int aa);
+fz_pixmap *fz_render_t3_glyph(fz_context *ctx, fz_font *font, int cid, const fz_matrix *trm, fz_colorspace *model, fz_irect scissor);
+fz_pixmap *fz_render_ft_stroked_glyph(fz_context *ctx, fz_font *font, int gid, const fz_matrix *trm, const fz_matrix *ctm, fz_stroke_state *state);
+fz_pixmap *fz_render_glyph(fz_context *ctx, fz_font*, int, const fz_matrix *, fz_colorspace *model, fz_irect scissor);
+fz_pixmap *fz_render_stroked_glyph(fz_context *ctx, fz_font*, int, const fz_matrix *, const fz_matrix *, fz_stroke_state *stroke, fz_irect scissor);
+void fz_render_t3_glyph_direct(fz_context *ctx, fz_device *dev, fz_font *font, int gid, const fz_matrix *trm, void *gstate, int nestedDepth);
+void fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nestedDepth);
+
+/*
+ * 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, const 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, const fz_stroke_state *stroke, const fz_matrix *ctm, fz_rect *r);
+fz_text *fz_clone_text(fz_context *ctx, fz_text *old);
+void fz_print_text(fz_context *ctx, FILE *out, fz_text*);
+
+/*
+ * The generic function support.
+ */
+
+typedef struct fz_function_s fz_function;
+
+void fz_eval_function(fz_context *ctx, fz_function *func, float *in, int inlen, float *out, int outlen);
+fz_function *fz_keep_function(fz_context *ctx, fz_function *func);
+void fz_drop_function(fz_context *ctx, fz_function *func);
+unsigned int fz_function_size(fz_function *func);
+#ifndef DEBUG
+void pdf_debug_function(fz_function *func);
+#endif
+
+enum
+{
+ FZ_FN_MAXN = FZ_MAX_COLORS,
+ FZ_FN_MAXM = FZ_MAX_COLORS
+};
+
+struct fz_function_s
+{
+ fz_storable storable;
+ unsigned int size;
+ int m; /* number of input values */
+ int n; /* number of output values */
+ void (*evaluate)(fz_context *ctx, fz_function *func, float *in, float *out);
+#ifndef NDEBUG
+ void (*debug)(fz_function *func);
+#endif
+};
+
+/*
+ * The shading code uses gouraud shaded triangle meshes.
+ */
+
+enum
+{
+ FZ_FUNCTION_BASED = 1,
+ FZ_LINEAR = 2,
+ FZ_RADIAL = 3,
+ FZ_MESH_TYPE4 = 4,
+ FZ_MESH_TYPE5 = 5,
+ FZ_MESH_TYPE6 = 6,
+ FZ_MESH_TYPE7 = 7
+};
+
+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; /* function, linear, radial, mesh */
+ union
+ {
+ struct
+ {
+ int extend[2];
+ float coords[2][3]; /* (x,y,r) twice */
+ } l_or_r;
+ struct
+ {
+ int vprow;
+ int bpflag;
+ int bpcoord;
+ int bpcomp;
+ float x0, x1;
+ float y0, y1;
+ float c0[FZ_MAX_COLORS];
+ float c1[FZ_MAX_COLORS];
+ } m;
+ struct
+ {
+ fz_matrix matrix;
+ int xdivs;
+ int ydivs;
+ float domain[2][2];
+ float *fn_vals;
+ } f;
+ } u;
+
+ fz_compressed_buffer *buffer;
+};
+
+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);
+
+fz_rect *fz_bound_shade(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz_rect *r);
+void fz_paint_shade(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz_pixmap *dest, const fz_irect *bbox);
+
+/*
+ * Handy routine for processing mesh based shades
+ */
+typedef struct fz_vertex_s fz_vertex;
+
+struct fz_vertex_s
+{
+ fz_point p;
+ float c[FZ_MAX_COLORS];
+};
+
+typedef struct fz_mesh_processor_s fz_mesh_processor;
+
+typedef void (fz_mesh_process_fn)(void *arg, fz_vertex *av, fz_vertex *bv, fz_vertex *cv);
+
+struct fz_mesh_processor_s {
+ fz_context *ctx;
+ fz_shade *shade;
+ fz_mesh_process_fn *process;
+ void *process_arg;
+ int ncomp;
+};
+
+void fz_process_mesh(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm,
+ fz_mesh_process_fn *process, void *process_arg);
+
+#ifndef NDEBUG
+void fz_print_shade(fz_context *ctx, FILE *out, fz_shade *shade);
+#endif
+
+/*
+ * 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, const fz_irect *clip);
+void fz_sort_gel(fz_gel *gel);
+fz_irect *fz_bound_gel(const fz_gel *gel, fz_irect *bbox);
+void fz_free_gel(fz_gel *gel);
+int fz_is_rect_gel(fz_gel *gel);
+
+void fz_scan_convert(fz_gel *gel, int eofill, const fz_irect *clip, fz_pixmap *pix, unsigned char *colorbv);
+
+void fz_flatten_fill_path(fz_gel *gel, fz_path *path, const fz_matrix *ctm, float flatness);
+void fz_flatten_stroke_path(fz_gel *gel, fz_path *path, const fz_stroke_state *stroke, const fz_matrix *ctm, float flatness, float linewidth);
+void fz_flatten_dash_path(fz_gel *gel, fz_path *path, const fz_stroke_state *stroke, const fz_matrix *ctm, float flatness, float linewidth);
+
+fz_irect *fz_bound_path_accurate(fz_context *ctx, fz_irect *bbox, const fz_irect *scissor, fz_path *path, const fz_stroke_state *stroke, const fz_matrix *ctm, float flatness, float linewidth);
+
+/*
+ * The device interface.
+ */
+
+fz_device *fz_new_draw_device_type3(fz_context *ctx, fz_pixmap *dest);
+
+enum
+{
+ /* 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 (*begin_page)(fz_device *, const fz_rect *rect, const fz_matrix *ctm);
+ void (*end_page)(fz_device *);
+
+ void (*fill_path)(fz_device *, fz_path *, int even_odd, const fz_matrix *, fz_colorspace *, float *color, float alpha);
+ void (*stroke_path)(fz_device *, fz_path *, fz_stroke_state *, const fz_matrix *, fz_colorspace *, float *color, float alpha);
+ void (*clip_path)(fz_device *, fz_path *, const fz_rect *rect, int even_odd, const fz_matrix *);
+ void (*clip_stroke_path)(fz_device *, fz_path *, const fz_rect *rect, fz_stroke_state *, const fz_matrix *);
+
+ void (*fill_text)(fz_device *, fz_text *, const fz_matrix *, fz_colorspace *, float *color, float alpha);
+ void (*stroke_text)(fz_device *, fz_text *, fz_stroke_state *, const fz_matrix *, fz_colorspace *, float *color, float alpha);
+ void (*clip_text)(fz_device *, fz_text *, const fz_matrix *, int accumulate);
+ void (*clip_stroke_text)(fz_device *, fz_text *, fz_stroke_state *, const fz_matrix *);
+ void (*ignore_text)(fz_device *, fz_text *, const fz_matrix *);
+
+ void (*fill_shade)(fz_device *, fz_shade *shd, const fz_matrix *ctm, float alpha);
+ void (*fill_image)(fz_device *, fz_image *img, const fz_matrix *ctm, float alpha);
+ void (*fill_image_mask)(fz_device *, fz_image *img, const fz_matrix *ctm, fz_colorspace *, float *color, float alpha);
+ void (*clip_image_mask)(fz_device *, fz_image *img, const fz_rect *rect, const fz_matrix *ctm);
+
+ void (*pop_clip)(fz_device *);
+
+ void (*begin_mask)(fz_device *, const fz_rect *, int luminosity, fz_colorspace *, float *bc);
+ void (*end_mask)(fz_device *);
+ void (*begin_group)(fz_device *, const fz_rect *, int isolated, int knockout, int blendmode, float alpha);
+ void (*end_group)(fz_device *);
+
+ int (*begin_tile)(fz_device *, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id);
+ void (*end_tile)(fz_device *);
+
+ int error_depth;
+ char errmess[256];
+};
+
+void fz_begin_page(fz_device *dev, const fz_rect *rect, const fz_matrix *ctm);
+void fz_end_page(fz_device *dev);
+void fz_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
+void fz_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
+void fz_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm);
+void fz_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm);
+void fz_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
+void fz_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
+void fz_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate);
+void fz_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm);
+void fz_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm);
+void fz_pop_clip(fz_device *dev);
+void fz_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha);
+void fz_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha);
+void fz_fill_image_mask(fz_device *dev, fz_image *image, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
+void fz_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm);
+void fz_begin_mask(fz_device *dev, const fz_rect *area, int luminosity, fz_colorspace *colorspace, float *bc);
+void fz_end_mask(fz_device *dev);
+void fz_begin_group(fz_device *dev, const 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, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm);
+int fz_begin_tile_id(fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id);
+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, const fz_irect *scissor, fz_pixmap *shape, fz_pixmap *img, const fz_matrix *ctm, int alpha);
+void fz_paint_image_with_color(fz_pixmap *dst, const fz_irect *scissor, fz_pixmap *shape, fz_pixmap *img, const 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_bbox(fz_pixmap *dst, fz_pixmap *src, int alpha, fz_irect 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, fz_rect *);
+ void (*run_page_contents)(fz_document *doc, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
+ void (*run_annot)(fz_document *doc, fz_page *page, fz_annot *annot, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
+ void (*free_page)(fz_document *doc, fz_page *page);
+ int (*meta)(fz_document *doc, int key, void *ptr, int size);
+ fz_transition *(*page_presentation)(fz_document *doc, fz_page *page, float *duration);
+ void (*write)(fz_document *doc, char *filename, fz_write_options *opts);
+ fz_annot *(*first_annot)(fz_document *doc, fz_page *page);
+ fz_annot *(*next_annot)(fz_document *doc, fz_annot *annot);
+ fz_rect *(*bound_annot)(fz_document *doc, fz_annot *annot, fz_rect *rect);
+};
+
#endif
diff --git a/include/mupdf/pdf-internal.h b/include/mupdf/pdf-internal.h
deleted file mode 100644
index 4a3f913c..00000000
--- a/include/mupdf/pdf-internal.h
+++ /dev/null
@@ -1,1071 +0,0 @@
-#ifndef MUPDF_INTERNAL_H
-#define MUPDF_INTERNAL_H
-
-#include "mupdf/pdf.h"
-#include "mupdf/fitz-internal.h"
-
-void pdf_set_str_len(pdf_obj *obj, int newlen);
-void *pdf_get_indirect_document(pdf_obj *obj);
-void pdf_set_int(pdf_obj *obj, int i);
-
-/*
- * tokenizer and low-level object parser
- */
-
-typedef 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
-} pdf_token;
-
-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
-{
- fz_context *ctx;
- int size;
- int base_size;
- int len;
- int i;
- float f;
- char *scratch;
- char buffer[PDF_LEXBUF_SMALL];
-};
-
-struct pdf_lexbuf_large_s
-{
- pdf_lexbuf base;
- char buffer[PDF_LEXBUF_LARGE - PDF_LEXBUF_SMALL];
-};
-
-void pdf_lexbuf_init(fz_context *ctx, pdf_lexbuf *lexbuf, int size);
-void pdf_lexbuf_fin(pdf_lexbuf *lexbuf);
-ptrdiff_t pdf_lexbuf_grow(pdf_lexbuf *lexbuf);
-
-pdf_token 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);
-
-/*
- pdf_print_token: print a lexed token to a buffer, growing if necessary
-*/
-void pdf_print_token(fz_context *ctx, fz_buffer *buf, int tok, pdf_lexbuf *lex);
-
-/*
- * xref and object / stream api
- */
-
-typedef struct pdf_xref_entry_s pdf_xref_entry;
-
-struct pdf_xref_entry_s
-{
- char type; /* 0=unset (f)ree i(n)use (o)bjstm */
- int ofs; /* file offset / objstm object number */
- int gen; /* generation / objstm index */
- int stm_ofs; /* on-disk stream */
- fz_buffer *stm_buf; /* in-memory stream (for updated objects) */
- pdf_obj *obj; /* stored/cached object */
-};
-
-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;
-typedef struct pdf_hotspot_s pdf_hotspot;
-
-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;
-};
-
-enum
-{
- HOTSPOT_POINTER_DOWN = 0x1,
- HOTSPOT_POINTER_OVER = 0x2
-};
-
-struct pdf_hotspot_s
-{
- int num;
- int gen;
- int state;
-};
-
-typedef struct pdf_js_s pdf_js;
-
-typedef struct pdf_xref_s
-{
- int len;
- pdf_xref_entry *table;
- pdf_obj *trailer;
-} pdf_xref;
-
-/*
- Document event structures are mostly opaque to the app. Only the type
- is visible to the app.
-*/
-typedef struct pdf_doc_event_s pdf_doc_event;
-
-/*
- pdf_doc_event_cb: the type of function via which the app receives
- document events.
-*/
-typedef void (pdf_doc_event_cb)(pdf_doc_event *event, void *data);
-
-struct pdf_document_s
-{
- fz_document super;
-
- fz_context *ctx;
- fz_stream *file;
-
- int version;
- int startxref;
- int file_size;
- pdf_crypt *crypt;
- pdf_ocg_descriptor *ocg;
- pdf_hotspot hotspot;
-
- int num_xref_sections;
- pdf_xref *xref_sections;
- int xref_altered;
-
- int page_len;
- int page_cap;
- pdf_obj **page_objs;
- pdf_obj **page_refs;
- int resources_localised;
-
- pdf_lexbuf_large lexbuf;
-
- pdf_annot *focus;
- pdf_obj *focus_obj;
-
- pdf_js *js;
- int recalculating;
- int dirty;
- void (*update_appearance)(pdf_document *xref, pdf_obj *annot);
-
- pdf_doc_event_cb *event_cb;
- void *event_cb_data;
-};
-
-pdf_document *pdf_open_document_no_run(fz_context *ctx, const char *filename);
-pdf_document *pdf_open_document_no_run_with_stream(fz_context *ctx, fz_stream *file);
-
-void pdf_localise_page_resources(pdf_document *xref);
-
-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, fz_compression_params *params);
-fz_compressed_buffer *pdf_load_compressed_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_compressed_stream(fz_context *ctx, fz_compressed_buffer *);
-fz_stream *pdf_open_contents_stream(pdf_document *xref, pdf_obj *obj);
-fz_buffer *pdf_load_raw_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen);
-fz_buffer *pdf_load_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen, int *truncated);
-fz_stream *pdf_open_raw_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen);
-
-pdf_obj *pdf_trailer(pdf_document *doc);
-void pdf_set_populating_xref_trailer(pdf_document *doc, pdf_obj *trailer);
-int pdf_xref_len(pdf_document *doc);
-pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int i);
-pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i);
-void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n);
-
-void pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf);
-void pdf_repair_obj_stms(pdf_document *doc);
-pdf_obj *pdf_new_ref(pdf_document *doc, pdf_obj *obj);
-
-void pdf_print_xref(pdf_document *);
-
-/*
- * Encryption
- */
-
-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);
-void pdf_crypt_buffer(fz_context *ctx, pdf_crypt *crypt, fz_buffer *buf, 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_crypt_version(pdf_document *doc);
-int pdf_crypt_revision(pdf_document *doc);
-char *pdf_crypt_method(pdf_document *doc);
-int pdf_crypt_length(pdf_document *doc);
-unsigned char *pdf_crypt_key(pdf_document *doc);
-
-#ifndef NDEBUG
-void pdf_print_crypt(pdf_crypt *crypt);
-#endif
-
-/*
- * Functions, Colorspaces, Shadings and Images
- */
-
-fz_function *pdf_load_function(pdf_document *doc, pdf_obj *ref, int in, int out);
-
-fz_colorspace *pdf_load_colorspace(pdf_document *doc, pdf_obj *obj);
-
-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;
- pdf_obj *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;
- pdf_obj *contents;
- pdf_obj *me;
- int iteration;
-};
-
-pdf_xobject *pdf_load_xobject(pdf_document *doc, pdf_obj *obj);
-pdf_obj *pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat);
-pdf_xobject *pdf_keep_xobject(fz_context *ctx, pdf_xobject *xobj);
-void pdf_drop_xobject(fz_context *ctx, pdf_xobject *xobj);
-void pdf_update_xobject_contents(pdf_document *xref, pdf_xobject *form, fz_buffer *buffer);
-
-void pdf_update_appearance(pdf_document *doc, pdf_obj *obj);
-
-/*
- * 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);
-
-int pdf_cmap_wmode(fz_context *ctx, pdf_cmap *cmap);
-void pdf_set_cmap_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);
-
-#ifndef NDEBUG
-void pdf_print_cmap(fz_context *ctx, pdf_cmap *cmap);
-#endif
-
-/*
- * 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_lookup_hmtx(fz_context *ctx, pdf_font_desc *font, int cid);
-pdf_vmtx pdf_lookup_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_lookup_builtin_font(char *name, unsigned int *len);
-unsigned char *pdf_lookup_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len);
-unsigned char *pdf_lookup_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);
-void pdf_load_type3_glyphs(pdf_document *doc, pdf_font_desc *fontdesc, int nestedDepth);
-pdf_font_desc *pdf_load_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *obj, int nestedDepth);
-
-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);
-
-#ifndef NDEBUG
-void pdf_print_font(fz_context *ctx, pdf_font_desc *fontdesc);
-#endif
-
-fz_rect *pdf_measure_text(fz_context *ctx, pdf_font_desc *fontdesc, unsigned char *buf, int len, fz_rect *rect);
-float pdf_text_stride(fz_context *ctx, pdf_font_desc *fontdesc, float fontsize, unsigned char *buf, int len, float room, int *count);
-
-/*
- * Interactive features
- */
-
-struct pdf_annot_s
-{
- pdf_page *page;
- pdf_obj *obj;
- fz_rect rect;
- fz_rect pagerect;
- pdf_xobject *ap;
- int ap_iteration;
- fz_matrix matrix;
- pdf_annot *next;
- pdf_annot *next_changed;
- int annot_type;
- int widget_type;
-};
-
-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_link *pdf_load_link_annots(pdf_document *, pdf_obj *annots, const fz_matrix *page_ctm);
-
-pdf_annot *pdf_load_annots(pdf_document *, pdf_obj *annots, pdf_page *page);
-void pdf_update_annot(pdf_document *, pdf_annot *annot);
-void pdf_free_annot(fz_context *ctx, pdf_annot *link);
-
-/* Field flags */
-enum
-{
- Ff_Multiline = 1 << (13-1),
- Ff_Password = 1 << (14-1),
- Ff_NoToggleToOff = 1 << (15-1),
- Ff_Radio = 1 << (16-1),
- Ff_Pushbutton = 1 << (17-1),
- Ff_Combo = 1 << (18-1),
- Ff_FileSelect = 1 << (21-1),
- Ff_MultiSelect = 1 << (22-1),
- Ff_DoNotSpellCheck = 1 << (23-1),
- Ff_DoNotScroll = 1 << (24-1),
- Ff_Comb = 1 << (25-1),
- Ff_RadioInUnison = 1 << (26-1)
-};
-
-pdf_obj *pdf_get_inheritable(pdf_document *doc, pdf_obj *obj, char *key);
-int pdf_get_field_flags(pdf_document *doc, pdf_obj *obj);
-int pdf_field_type(pdf_document *doc, pdf_obj *field);
-char *pdf_field_value(pdf_document *doc, pdf_obj *field);
-int pdf_field_set_value(pdf_document *doc, pdf_obj *field, char *text);
-char *pdf_field_border_style(pdf_document *doc, pdf_obj *field);
-void pdf_field_set_border_style(pdf_document *doc, pdf_obj *field, char *text);
-void pdf_field_set_button_caption(pdf_document *doc, pdf_obj *field, char *text);
-void pdf_field_set_fill_color(pdf_document *doc, pdf_obj *field, pdf_obj *col);
-void pdf_field_set_text_color(pdf_document *doc, pdf_obj *field, pdf_obj *col);
-int pdf_field_display(pdf_document *doc, pdf_obj *field);
-char *pdf_field_name(pdf_document *doc, pdf_obj *field);
-void pdf_field_set_display(pdf_document *doc, pdf_obj *field, int d);
-pdf_obj *pdf_lookup_field(pdf_obj *form, char *name);
-void pdf_field_reset(pdf_document *doc, pdf_obj *field);
-
-/*
- * Page tree, pages and related objects
- */
-
-struct pdf_page_s
-{
- fz_matrix ctm; /* calculated from mediabox and rotate */
- fz_rect mediabox;
- int rotate;
- int transparency;
- pdf_obj *resources;
- pdf_obj *contents;
- fz_link *links;
- pdf_annot *annots;
- pdf_annot *changed_annots;
- pdf_annot *deleted_annots;
- pdf_annot *tmp_annots;
- pdf_obj *me;
- float duration;
- int transition_present;
- fz_transition transition;
-};
-
-/*
- * Content stream parsing
- */
-
-void pdf_run_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nestedDepth);
-
-/*
- * 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);
-
-/*
- * PDF interaction interface
- */
-
-/* Types of widget */
-enum
-{
- PDF_WIDGET_TYPE_NOT_WIDGET = -1,
- PDF_WIDGET_TYPE_PUSHBUTTON,
- PDF_WIDGET_TYPE_CHECKBOX,
- PDF_WIDGET_TYPE_RADIOBUTTON,
- PDF_WIDGET_TYPE_TEXT,
- PDF_WIDGET_TYPE_LISTBOX,
- PDF_WIDGET_TYPE_COMBOBOX,
- PDF_WIDGET_TYPE_SIGNATURE
-};
-
-/* Types of text widget content */
-enum
-{
- PDF_WIDGET_CONTENT_UNRESTRAINED,
- PDF_WIDGET_CONTENT_NUMBER,
- PDF_WIDGET_CONTENT_SPECIAL,
- PDF_WIDGET_CONTENT_DATE,
- PDF_WIDGET_CONTENT_TIME
-};
-
-/* Types of UI event */
-enum
-{
- PDF_EVENT_TYPE_POINTER,
-};
-
-/* Types of pointer event */
-enum
-{
- PDF_POINTER_DOWN,
- PDF_POINTER_UP,
-};
-
-
-/*
- UI events that can be passed to an interactive document.
-*/
-typedef struct pdf_ui_event_s
-{
- int etype;
- union
- {
- struct
- {
- int ptype;
- fz_point pt;
- } pointer;
- } event;
-} pdf_ui_event;
-
-/*
- pdf_init_ui_pointer_event: Set up a pointer event
-*/
-void pdf_init_ui_pointer_event(pdf_ui_event *event, int type, float x, float y);
-
-/*
- Widgets that may appear in PDF forms
-*/
-typedef struct pdf_widget_s pdf_widget;
-
-/*
- Determine whether changes have been made since the
- document was opened or last saved.
-*/
-int pdf_has_unsaved_changes(pdf_document *doc);
-
-/*
- pdf_pass_event: Pass a UI event to an interactive
- document.
-
- Returns a boolean indication of whether the ui_event was
- handled. Example of use for the return value: when considering
- passing the events that make up a drag, if the down event isn't
- accepted then don't send the move events or the up event.
-*/
-int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event);
-
-/*
- pdf_update_page: update a page for the sake of changes caused by a call
- to pdf_pass_event. pdf_update_page regenerates any appearance streams that
- are out of date, checks for cases where different appearance streams
- should be selected because of state changes, and records internally
- each annotation that has changed appearance. The list of changed annotations
- is then available via pdf_poll_changed_annot. Note that a call to
- pdf_pass_event for one page may lead to changes on any other, so an app
- should call pdf_update_page for every page it currently displays. Also
- it is important that the pdf_page object is the one used to last render
- the page. If instead the app were to drop the page and reload it then
- a call to pdf_update_page would not reliably be able to report all changed
- areas.
-*/
-void pdf_update_page(pdf_document *doc, pdf_page *page);
-
-fz_annot_type pdf_annot_obj_type(pdf_obj *obj);
-
-/*
- pdf_poll_changed_annot: enumerate the changed annotations recoreded
- by a call to pdf_update_page.
-*/
-pdf_annot *pdf_poll_changed_annot(pdf_document *idoc, pdf_page *page);
-
-/*
- pdf_focused_widget: returns the currently focussed widget
-
- Widgets can become focussed as a result of passing in ui events.
- NULL is returned if there is no currently focussed widget. An
- app may wish to create a native representative of the focussed
- widget, e.g., to collect the text for a text widget, rather than
- routing key strokes through pdf_pass_event.
-*/
-pdf_widget *pdf_focused_widget(pdf_document *doc);
-
-/*
- pdf_first_widget: get first widget when enumerating
-*/
-pdf_widget *pdf_first_widget(pdf_document *doc, pdf_page *page);
-
-/*
- pdf_next_widget: get next widget when enumerating
-*/
-pdf_widget *pdf_next_widget(pdf_widget *previous);
-
-/*
- pdf_widget_get_type: find out the type of a widget.
-
- The type determines what widget subclass the widget
- can safely be cast to.
-*/
-int pdf_widget_get_type(pdf_widget *widget);
-
-/*
- pdf_bound_widget: get the bounding box of a widget.
-*/
-fz_rect *pdf_bound_widget(pdf_widget *widget, fz_rect *);
-
-/*
- pdf_text_widget_text: Get the text currently displayed in
- a text widget.
-*/
-char *pdf_text_widget_text(pdf_document *doc, pdf_widget *tw);
-
-/*
- pdf_widget_text_max_len: get the maximum number of
- characters permitted in a text widget
-*/
-int pdf_text_widget_max_len(pdf_document *doc, pdf_widget *tw);
-
-/*
- pdf_text_widget_content_type: get the type of content
- required by a text widget
-*/
-int pdf_text_widget_content_type(pdf_document *doc, pdf_widget *tw);
-
-/*
- pdf_text_widget_set_text: Update the text of a text widget.
- The text is first validated and accepted only if it passes. The
- function returns whether validation passed.
-*/
-int pdf_text_widget_set_text(pdf_document *doc, pdf_widget *tw, char *text);
-
-/*
- pdf_choice_widget_options: get the list of options for a list
- box or combo box. Returns the number of options and fills in their
- names within the supplied array. Should first be called with a
- NULL array to find out how big the array should be.
-*/
-int pdf_choice_widget_options(pdf_document *doc, pdf_widget *tw, char *opts[]);
-
-/*
- pdf_choice_widget_is_multiselect: returns whether a list box or
- combo box supports selection of multiple options
-*/
-int pdf_choice_widget_is_multiselect(pdf_document *doc, pdf_widget *tw);
-
-/*
- pdf_choice_widget_value: get the value of a choice widget.
- Returns the number of options curently selected and fills in
- the supplied array with their strings. Should first be called
- with NULL as the array to find out how big the array need to
- be. The filled in elements should not be freed by the caller.
-*/
-int pdf_choice_widget_value(pdf_document *doc, pdf_widget *tw, char *opts[]);
-
-/*
- pdf_widget_set_value: set the value of a choice widget. The
- caller should pass the number of options selected and an
- array of their names
-*/
-void pdf_choice_widget_set_value(pdf_document *doc, pdf_widget *tw, int n, char *opts[]);
-
-/*
- pdf_signature_widget_byte_range: retrieve the byte range for a signature widget
-*/
-int pdf_signature_widget_byte_range(pdf_document *doc, pdf_widget *widget, int (*byte_range)[2]);
-
-/*
- pdf_signature_widget_contents: retrieve the contents for a signature widget
-*/
-int pdf_signature_widget_contents(pdf_document *doc, pdf_widget *widget, char **contents);
-
-/*
- fz_check_signature: check a signature's certificate chain and digest
-*/
-int pdf_check_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize);
-
-/*
- fz_create_annot: create a new annotation of the specified type on the
- specified page. The returned pdf_annot structure is owned by the page
- and does not need to be freed.
-*/
-pdf_annot *pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type);
-
-/*
- fz_delete_annot: delete an annotation
-*/
-void pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot);
-
-/*
- fz_set_annot_appearance: update the appearance of an annotation based
- on a display list.
-*/
-void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect, fz_display_list *disp_list);
-
-/*
- fz_set_markup_annot_quadpoints: set the quadpoints for a text-markup annotation.
-*/
-void pdf_set_markup_annot_quadpoints(pdf_document *doc, pdf_annot *annot, fz_point *qp, int n);
-
-void pdf_set_markup_obj_appearance(pdf_document *doc, pdf_obj *annot, float color[3], float alpha, float line_thickness, float line_height);
-
-/*
- fz_set_markup_appearance: set the appearance stream of a text markup annotations, basing it on
- its QuadPoints array
-*/
-void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[3], float alpha, float line_thickness, float line_height);
-
-/*
- fz_set_ink_annot_list: set the details of an ink annotation. All the points of the multiple arcs
- are carried in a single array, with the counts for each arc held in a secondary array.
-*/
-void pdf_set_ink_annot_list(pdf_document *doc, pdf_annot *annot, fz_point *pts, int *counts, int ncount, float color[3], float thickness);
-void pdf_set_ink_obj_appearance(pdf_document *doc, pdf_obj *annot);
-
-/*
- Document events: the objects via which MuPDF informs the calling app
- of occurrences emanating from the document, possibly from user interaction
- or javascript execution. MuPDF informs the app of document events via a
- callback.
-*/
-
-struct pdf_doc_event_s
-{
- int type;
-};
-
-enum
-{
- PDF_DOCUMENT_EVENT_ALERT,
- PDF_DOCUMENT_EVENT_PRINT,
- PDF_DOCUMENT_EVENT_LAUNCH_URL,
- PDF_DOCUMENT_EVENT_MAIL_DOC,
- PDF_DOCUMENT_EVENT_SUBMIT,
- PDF_DOCUMENT_EVENT_EXEC_MENU_ITEM,
- PDF_DOCUMENT_EVENT_EXEC_DIALOG
-};
-
-/*
- pdf_set_doc_event_callback: set the function via which to receive
- document events.
-*/
-void pdf_set_doc_event_callback(pdf_document *doc, pdf_doc_event_cb *event_cb, void *data);
-
-/*
- The various types of document events
-*/
-
-/*
- pdf_alert_event: details of an alert event. In response the app should
- display an alert dialog with the bittons specified by "button_type_group".
- If "check_box_message" is non-NULL, a checkbox should be displayed in
- the lower-left corned along with the messsage.
-
- "finally_checked" and "button_pressed" should be set by the app
- before returning from the callback. "finally_checked" need be set
- only if "check_box_message" is non-NULL.
-*/
-typedef struct
-{
- char *message;
- int icon_type;
- int button_group_type;
- char *title;
- char *check_box_message;
- int initially_checked;
- int finally_checked;
- int button_pressed;
-} pdf_alert_event;
-
-/* Possible values of icon_type */
-enum
-{
- PDF_ALERT_ICON_ERROR,
- PDF_ALERT_ICON_WARNING,
- PDF_ALERT_ICON_QUESTION,
- PDF_ALERT_ICON_STATUS
-};
-
-/* Possible values of button_group_type */
-enum
-{
- PDF_ALERT_BUTTON_GROUP_OK,
- PDF_ALERT_BUTTON_GROUP_OK_CANCEL,
- PDF_ALERT_BUTTON_GROUP_YES_NO,
- PDF_ALERT_BUTTON_GROUP_YES_NO_CANCEL
-};
-
-/* Possible values of button_pressed */
-enum
-{
- PDF_ALERT_BUTTON_NONE,
- PDF_ALERT_BUTTON_OK,
- PDF_ALERT_BUTTON_CANCEL,
- PDF_ALERT_BUTTON_NO,
- PDF_ALERT_BUTTON_YES
-};
-
-/*
- pdf_access_alert_event: access the details of an alert event
- The returned pointer and all the data referred to by the
- structire are owned by mupdf and need not be freed by the
- caller.
-*/
-pdf_alert_event *pdf_access_alert_event(pdf_doc_event *event);
-
-/*
- pdf_access_exec_menu_item_event: access the details of am execMenuItem
- event, which consists of just the name of the menu item
-*/
-char *pdf_access_exec_menu_item_event(pdf_doc_event *event);
-
-/*
- pdf_submit_event: details of a submit event. The app should submit
- the specified data to the specified url. "get" determines whether
- to use the GET or POST method.
-*/
-typedef struct
-{
- char *url;
- char *data;
- int data_len;
- int get;
-} pdf_submit_event;
-
-/*
- pdf_access_submit_event: access the details of a submit event
- The returned pointer and all data referred to by the structure are
- owned by mupdf and need not be freed by the caller.
-*/
-pdf_submit_event *pdf_access_submit_event(pdf_doc_event *event);
-
-/*
- pdf_launch_url_event: details of a launch-url event. The app should
- open the url, either in a new frame or in the current window.
-*/
-typedef struct
-{
- char *url;
- int new_frame;
-} pdf_launch_url_event;
-
-/*
- pdf_access_launch_url_event: access the details of a launch-url
- event. The returned pointer and all data referred to by the structure
- are owned by mupdf and need not be freed by the caller.
-*/
-pdf_launch_url_event *pdf_access_launch_url_event(pdf_doc_event *event);
-
-/*
- pdf_mail_doc_event: details of a mail_doc event. The app should save
- the current state of the document and email it using the specified
- parameters.
-*/
-typedef struct
-{
- int ask_user;
- char *to;
- char *cc;
- char *bcc;
- char *subject;
- char *message;
-} pdf_mail_doc_event;
-
-/*
- pdf_acccess_mail_doc_event: access the details of a mail-doc event.
-*/
-pdf_mail_doc_event *pdf_access_mail_doc_event(pdf_doc_event *event);
-
-void pdf_event_issue_alert(pdf_document *doc, pdf_alert_event *event);
-void pdf_event_issue_print(pdf_document *doc);
-void pdf_event_issue_exec_menu_item(pdf_document *doc, char *item);
-void pdf_event_issue_exec_dialog(pdf_document *doc);
-void pdf_event_issue_launch_url(pdf_document *doc, char *url, int new_frame);
-void pdf_event_issue_mail_doc(pdf_document *doc, pdf_mail_doc_event *event);
-
-/*
- * Javascript handler
- */
-typedef struct pdf_js_event_s
-{
- pdf_obj *target;
- char *value;
- int rc;
-} pdf_js_event;
-
-int pdf_js_supported(void);
-pdf_js *pdf_new_js(pdf_document *doc);
-void pdf_drop_js(pdf_js *js);
-void pdf_js_load_document_level(pdf_js *js);
-void pdf_js_setup_event(pdf_js *js, pdf_js_event *e);
-pdf_js_event *pdf_js_get_event(pdf_js *js);
-void pdf_js_execute(pdf_js *js, char *code);
-void pdf_js_execute_count(pdf_js *js, char *code, int count);
-
-/*
- * Javascript engine interface
- */
-typedef struct pdf_jsimp_s pdf_jsimp;
-typedef struct pdf_jsimp_type_s pdf_jsimp_type;
-typedef struct pdf_jsimp_obj_s pdf_jsimp_obj;
-
-typedef void (pdf_jsimp_dtr)(void *jsctx, void *obj);
-typedef pdf_jsimp_obj *(pdf_jsimp_method)(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[]);
-typedef pdf_jsimp_obj *(pdf_jsimp_getter)(void *jsctx, void *obj);
-typedef void (pdf_jsimp_setter)(void *jsctx, void *obj, pdf_jsimp_obj *val);
-
-enum
-{
- JS_TYPE_UNKNOWN,
- JS_TYPE_NULL,
- JS_TYPE_STRING,
- JS_TYPE_NUMBER,
- JS_TYPE_ARRAY,
- JS_TYPE_BOOLEAN
-};
-
-pdf_jsimp *pdf_new_jsimp(fz_context *ctx, void *jsctx);
-void pdf_drop_jsimp(pdf_jsimp *imp);
-
-pdf_jsimp_type *pdf_jsimp_new_type(pdf_jsimp *imp, pdf_jsimp_dtr *dtr);
-void pdf_jsimp_drop_type(pdf_jsimp *imp, pdf_jsimp_type *type);
-void pdf_jsimp_addmethod(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf_jsimp_method *meth);
-void pdf_jsimp_addproperty(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf_jsimp_getter *get, pdf_jsimp_setter *set);
-void pdf_jsimp_set_global_type(pdf_jsimp *imp, pdf_jsimp_type *type);
-
-pdf_jsimp_obj *pdf_jsimp_new_obj(pdf_jsimp *imp, pdf_jsimp_type *type, void *obj);
-void pdf_jsimp_drop_obj(pdf_jsimp *imp, pdf_jsimp_obj *obj);
-
-int pdf_jsimp_to_type(pdf_jsimp *imp, pdf_jsimp_obj *obj);
-
-pdf_jsimp_obj *pdf_jsimp_from_string(pdf_jsimp *imp, char *str);
-char *pdf_jsimp_to_string(pdf_jsimp *imp, pdf_jsimp_obj *obj);
-
-pdf_jsimp_obj *pdf_jsimp_from_number(pdf_jsimp *imp, double num);
-double pdf_jsimp_to_number(pdf_jsimp *imp, pdf_jsimp_obj *obj);
-
-int pdf_jsimp_array_len(pdf_jsimp *imp, pdf_jsimp_obj *obj);
-pdf_jsimp_obj *pdf_jsimp_array_item(pdf_jsimp *imp, pdf_jsimp_obj *obj, int i);
-
-pdf_jsimp_obj *pdf_jsimp_property(pdf_jsimp *imp, pdf_jsimp_obj *obj, char *prop);
-
-void pdf_jsimp_execute(pdf_jsimp *imp, char *code);
-void pdf_jsimp_execute_count(pdf_jsimp *imp, char *code, int count);
-
-#endif
diff --git a/include/mupdf/pdf.h b/include/mupdf/pdf.h
index d7173972..2e242acb 100644
--- a/include/mupdf/pdf.h
+++ b/include/mupdf/pdf.h
@@ -333,4 +333,1070 @@ int pdf_meta(pdf_document *doc, int key, void *ptr, int size);
*/
fz_transition *pdf_page_presentation(pdf_document *doc, pdf_page *page, float *duration);
+/* pdf-internal.h */
+
+void pdf_set_str_len(pdf_obj *obj, int newlen);
+void *pdf_get_indirect_document(pdf_obj *obj);
+void pdf_set_int(pdf_obj *obj, int i);
+
+/*
+ * tokenizer and low-level object parser
+ */
+
+typedef 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
+} pdf_token;
+
+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
+{
+ fz_context *ctx;
+ int size;
+ int base_size;
+ int len;
+ int i;
+ float f;
+ char *scratch;
+ char buffer[PDF_LEXBUF_SMALL];
+};
+
+struct pdf_lexbuf_large_s
+{
+ pdf_lexbuf base;
+ char buffer[PDF_LEXBUF_LARGE - PDF_LEXBUF_SMALL];
+};
+
+void pdf_lexbuf_init(fz_context *ctx, pdf_lexbuf *lexbuf, int size);
+void pdf_lexbuf_fin(pdf_lexbuf *lexbuf);
+ptrdiff_t pdf_lexbuf_grow(pdf_lexbuf *lexbuf);
+
+pdf_token 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);
+
+/*
+ pdf_print_token: print a lexed token to a buffer, growing if necessary
+*/
+void pdf_print_token(fz_context *ctx, fz_buffer *buf, int tok, pdf_lexbuf *lex);
+
+/*
+ * xref and object / stream api
+ */
+
+typedef struct pdf_xref_entry_s pdf_xref_entry;
+
+struct pdf_xref_entry_s
+{
+ char type; /* 0=unset (f)ree i(n)use (o)bjstm */
+ int ofs; /* file offset / objstm object number */
+ int gen; /* generation / objstm index */
+ int stm_ofs; /* on-disk stream */
+ fz_buffer *stm_buf; /* in-memory stream (for updated objects) */
+ pdf_obj *obj; /* stored/cached object */
+};
+
+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;
+typedef struct pdf_hotspot_s pdf_hotspot;
+
+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;
+};
+
+enum
+{
+ HOTSPOT_POINTER_DOWN = 0x1,
+ HOTSPOT_POINTER_OVER = 0x2
+};
+
+struct pdf_hotspot_s
+{
+ int num;
+ int gen;
+ int state;
+};
+
+typedef struct pdf_js_s pdf_js;
+
+typedef struct pdf_xref_s
+{
+ int len;
+ pdf_xref_entry *table;
+ pdf_obj *trailer;
+} pdf_xref;
+
+/*
+ Document event structures are mostly opaque to the app. Only the type
+ is visible to the app.
+*/
+typedef struct pdf_doc_event_s pdf_doc_event;
+
+/*
+ pdf_doc_event_cb: the type of function via which the app receives
+ document events.
+*/
+typedef void (pdf_doc_event_cb)(pdf_doc_event *event, void *data);
+
+struct pdf_document_s
+{
+ fz_document super;
+
+ fz_context *ctx;
+ fz_stream *file;
+
+ int version;
+ int startxref;
+ int file_size;
+ pdf_crypt *crypt;
+ pdf_ocg_descriptor *ocg;
+ pdf_hotspot hotspot;
+
+ int num_xref_sections;
+ pdf_xref *xref_sections;
+ int xref_altered;
+
+ int page_len;
+ int page_cap;
+ pdf_obj **page_objs;
+ pdf_obj **page_refs;
+ int resources_localised;
+
+ pdf_lexbuf_large lexbuf;
+
+ pdf_annot *focus;
+ pdf_obj *focus_obj;
+
+ pdf_js *js;
+ int recalculating;
+ int dirty;
+ void (*update_appearance)(pdf_document *xref, pdf_obj *annot);
+
+ pdf_doc_event_cb *event_cb;
+ void *event_cb_data;
+};
+
+pdf_document *pdf_open_document_no_run(fz_context *ctx, const char *filename);
+pdf_document *pdf_open_document_no_run_with_stream(fz_context *ctx, fz_stream *file);
+
+void pdf_localise_page_resources(pdf_document *xref);
+
+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, fz_compression_params *params);
+fz_compressed_buffer *pdf_load_compressed_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_compressed_stream(fz_context *ctx, fz_compressed_buffer *);
+fz_stream *pdf_open_contents_stream(pdf_document *xref, pdf_obj *obj);
+fz_buffer *pdf_load_raw_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen);
+fz_buffer *pdf_load_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen, int *truncated);
+fz_stream *pdf_open_raw_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen);
+
+pdf_obj *pdf_trailer(pdf_document *doc);
+void pdf_set_populating_xref_trailer(pdf_document *doc, pdf_obj *trailer);
+int pdf_xref_len(pdf_document *doc);
+pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int i);
+pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i);
+void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n);
+
+void pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf);
+void pdf_repair_obj_stms(pdf_document *doc);
+pdf_obj *pdf_new_ref(pdf_document *doc, pdf_obj *obj);
+
+void pdf_print_xref(pdf_document *);
+
+/*
+ * Encryption
+ */
+
+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);
+void pdf_crypt_buffer(fz_context *ctx, pdf_crypt *crypt, fz_buffer *buf, 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_crypt_version(pdf_document *doc);
+int pdf_crypt_revision(pdf_document *doc);
+char *pdf_crypt_method(pdf_document *doc);
+int pdf_crypt_length(pdf_document *doc);
+unsigned char *pdf_crypt_key(pdf_document *doc);
+
+#ifndef NDEBUG
+void pdf_print_crypt(pdf_crypt *crypt);
+#endif
+
+/*
+ * Functions, Colorspaces, Shadings and Images
+ */
+
+fz_function *pdf_load_function(pdf_document *doc, pdf_obj *ref, int in, int out);
+
+fz_colorspace *pdf_load_colorspace(pdf_document *doc, pdf_obj *obj);
+
+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;
+ pdf_obj *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;
+ pdf_obj *contents;
+ pdf_obj *me;
+ int iteration;
+};
+
+pdf_xobject *pdf_load_xobject(pdf_document *doc, pdf_obj *obj);
+pdf_obj *pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat);
+pdf_xobject *pdf_keep_xobject(fz_context *ctx, pdf_xobject *xobj);
+void pdf_drop_xobject(fz_context *ctx, pdf_xobject *xobj);
+void pdf_update_xobject_contents(pdf_document *xref, pdf_xobject *form, fz_buffer *buffer);
+
+void pdf_update_appearance(pdf_document *doc, pdf_obj *obj);
+
+/*
+ * 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);
+
+int pdf_cmap_wmode(fz_context *ctx, pdf_cmap *cmap);
+void pdf_set_cmap_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);
+
+#ifndef NDEBUG
+void pdf_print_cmap(fz_context *ctx, pdf_cmap *cmap);
+#endif
+
+/*
+ * 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_lookup_hmtx(fz_context *ctx, pdf_font_desc *font, int cid);
+pdf_vmtx pdf_lookup_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_lookup_builtin_font(char *name, unsigned int *len);
+unsigned char *pdf_lookup_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len);
+unsigned char *pdf_lookup_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);
+void pdf_load_type3_glyphs(pdf_document *doc, pdf_font_desc *fontdesc, int nestedDepth);
+pdf_font_desc *pdf_load_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *obj, int nestedDepth);
+
+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);
+
+#ifndef NDEBUG
+void pdf_print_font(fz_context *ctx, pdf_font_desc *fontdesc);
+#endif
+
+fz_rect *pdf_measure_text(fz_context *ctx, pdf_font_desc *fontdesc, unsigned char *buf, int len, fz_rect *rect);
+float pdf_text_stride(fz_context *ctx, pdf_font_desc *fontdesc, float fontsize, unsigned char *buf, int len, float room, int *count);
+
+/*
+ * Interactive features
+ */
+
+struct pdf_annot_s
+{
+ pdf_page *page;
+ pdf_obj *obj;
+ fz_rect rect;
+ fz_rect pagerect;
+ pdf_xobject *ap;
+ int ap_iteration;
+ fz_matrix matrix;
+ pdf_annot *next;
+ pdf_annot *next_changed;
+ int annot_type;
+ int widget_type;
+};
+
+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_link *pdf_load_link_annots(pdf_document *, pdf_obj *annots, const fz_matrix *page_ctm);
+
+pdf_annot *pdf_load_annots(pdf_document *, pdf_obj *annots, pdf_page *page);
+void pdf_update_annot(pdf_document *, pdf_annot *annot);
+void pdf_free_annot(fz_context *ctx, pdf_annot *link);
+
+/* Field flags */
+enum
+{
+ Ff_Multiline = 1 << (13-1),
+ Ff_Password = 1 << (14-1),
+ Ff_NoToggleToOff = 1 << (15-1),
+ Ff_Radio = 1 << (16-1),
+ Ff_Pushbutton = 1 << (17-1),
+ Ff_Combo = 1 << (18-1),
+ Ff_FileSelect = 1 << (21-1),
+ Ff_MultiSelect = 1 << (22-1),
+ Ff_DoNotSpellCheck = 1 << (23-1),
+ Ff_DoNotScroll = 1 << (24-1),
+ Ff_Comb = 1 << (25-1),
+ Ff_RadioInUnison = 1 << (26-1)
+};
+
+pdf_obj *pdf_get_inheritable(pdf_document *doc, pdf_obj *obj, char *key);
+int pdf_get_field_flags(pdf_document *doc, pdf_obj *obj);
+int pdf_field_type(pdf_document *doc, pdf_obj *field);
+char *pdf_field_value(pdf_document *doc, pdf_obj *field);
+int pdf_field_set_value(pdf_document *doc, pdf_obj *field, char *text);
+char *pdf_field_border_style(pdf_document *doc, pdf_obj *field);
+void pdf_field_set_border_style(pdf_document *doc, pdf_obj *field, char *text);
+void pdf_field_set_button_caption(pdf_document *doc, pdf_obj *field, char *text);
+void pdf_field_set_fill_color(pdf_document *doc, pdf_obj *field, pdf_obj *col);
+void pdf_field_set_text_color(pdf_document *doc, pdf_obj *field, pdf_obj *col);
+int pdf_field_display(pdf_document *doc, pdf_obj *field);
+char *pdf_field_name(pdf_document *doc, pdf_obj *field);
+void pdf_field_set_display(pdf_document *doc, pdf_obj *field, int d);
+pdf_obj *pdf_lookup_field(pdf_obj *form, char *name);
+void pdf_field_reset(pdf_document *doc, pdf_obj *field);
+
+/*
+ * Page tree, pages and related objects
+ */
+
+struct pdf_page_s
+{
+ fz_matrix ctm; /* calculated from mediabox and rotate */
+ fz_rect mediabox;
+ int rotate;
+ int transparency;
+ pdf_obj *resources;
+ pdf_obj *contents;
+ fz_link *links;
+ pdf_annot *annots;
+ pdf_annot *changed_annots;
+ pdf_annot *deleted_annots;
+ pdf_annot *tmp_annots;
+ pdf_obj *me;
+ float duration;
+ int transition_present;
+ fz_transition transition;
+};
+
+/*
+ * Content stream parsing
+ */
+
+void pdf_run_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nestedDepth);
+
+/*
+ * 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);
+
+/*
+ * PDF interaction interface
+ */
+
+/* Types of widget */
+enum
+{
+ PDF_WIDGET_TYPE_NOT_WIDGET = -1,
+ PDF_WIDGET_TYPE_PUSHBUTTON,
+ PDF_WIDGET_TYPE_CHECKBOX,
+ PDF_WIDGET_TYPE_RADIOBUTTON,
+ PDF_WIDGET_TYPE_TEXT,
+ PDF_WIDGET_TYPE_LISTBOX,
+ PDF_WIDGET_TYPE_COMBOBOX,
+ PDF_WIDGET_TYPE_SIGNATURE
+};
+
+/* Types of text widget content */
+enum
+{
+ PDF_WIDGET_CONTENT_UNRESTRAINED,
+ PDF_WIDGET_CONTENT_NUMBER,
+ PDF_WIDGET_CONTENT_SPECIAL,
+ PDF_WIDGET_CONTENT_DATE,
+ PDF_WIDGET_CONTENT_TIME
+};
+
+/* Types of UI event */
+enum
+{
+ PDF_EVENT_TYPE_POINTER,
+};
+
+/* Types of pointer event */
+enum
+{
+ PDF_POINTER_DOWN,
+ PDF_POINTER_UP,
+};
+
+
+/*
+ UI events that can be passed to an interactive document.
+*/
+typedef struct pdf_ui_event_s
+{
+ int etype;
+ union
+ {
+ struct
+ {
+ int ptype;
+ fz_point pt;
+ } pointer;
+ } event;
+} pdf_ui_event;
+
+/*
+ pdf_init_ui_pointer_event: Set up a pointer event
+*/
+void pdf_init_ui_pointer_event(pdf_ui_event *event, int type, float x, float y);
+
+/*
+ Widgets that may appear in PDF forms
+*/
+typedef struct pdf_widget_s pdf_widget;
+
+/*
+ Determine whether changes have been made since the
+ document was opened or last saved.
+*/
+int pdf_has_unsaved_changes(pdf_document *doc);
+
+/*
+ pdf_pass_event: Pass a UI event to an interactive
+ document.
+
+ Returns a boolean indication of whether the ui_event was
+ handled. Example of use for the return value: when considering
+ passing the events that make up a drag, if the down event isn't
+ accepted then don't send the move events or the up event.
+*/
+int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event);
+
+/*
+ pdf_update_page: update a page for the sake of changes caused by a call
+ to pdf_pass_event. pdf_update_page regenerates any appearance streams that
+ are out of date, checks for cases where different appearance streams
+ should be selected because of state changes, and records internally
+ each annotation that has changed appearance. The list of changed annotations
+ is then available via pdf_poll_changed_annot. Note that a call to
+ pdf_pass_event for one page may lead to changes on any other, so an app
+ should call pdf_update_page for every page it currently displays. Also
+ it is important that the pdf_page object is the one used to last render
+ the page. If instead the app were to drop the page and reload it then
+ a call to pdf_update_page would not reliably be able to report all changed
+ areas.
+*/
+void pdf_update_page(pdf_document *doc, pdf_page *page);
+
+fz_annot_type pdf_annot_obj_type(pdf_obj *obj);
+
+/*
+ pdf_poll_changed_annot: enumerate the changed annotations recoreded
+ by a call to pdf_update_page.
+*/
+pdf_annot *pdf_poll_changed_annot(pdf_document *idoc, pdf_page *page);
+
+/*
+ pdf_focused_widget: returns the currently focussed widget
+
+ Widgets can become focussed as a result of passing in ui events.
+ NULL is returned if there is no currently focussed widget. An
+ app may wish to create a native representative of the focussed
+ widget, e.g., to collect the text for a text widget, rather than
+ routing key strokes through pdf_pass_event.
+*/
+pdf_widget *pdf_focused_widget(pdf_document *doc);
+
+/*
+ pdf_first_widget: get first widget when enumerating
+*/
+pdf_widget *pdf_first_widget(pdf_document *doc, pdf_page *page);
+
+/*
+ pdf_next_widget: get next widget when enumerating
+*/
+pdf_widget *pdf_next_widget(pdf_widget *previous);
+
+/*
+ pdf_widget_get_type: find out the type of a widget.
+
+ The type determines what widget subclass the widget
+ can safely be cast to.
+*/
+int pdf_widget_get_type(pdf_widget *widget);
+
+/*
+ pdf_bound_widget: get the bounding box of a widget.
+*/
+fz_rect *pdf_bound_widget(pdf_widget *widget, fz_rect *);
+
+/*
+ pdf_text_widget_text: Get the text currently displayed in
+ a text widget.
+*/
+char *pdf_text_widget_text(pdf_document *doc, pdf_widget *tw);
+
+/*
+ pdf_widget_text_max_len: get the maximum number of
+ characters permitted in a text widget
+*/
+int pdf_text_widget_max_len(pdf_document *doc, pdf_widget *tw);
+
+/*
+ pdf_text_widget_content_type: get the type of content
+ required by a text widget
+*/
+int pdf_text_widget_content_type(pdf_document *doc, pdf_widget *tw);
+
+/*
+ pdf_text_widget_set_text: Update the text of a text widget.
+ The text is first validated and accepted only if it passes. The
+ function returns whether validation passed.
+*/
+int pdf_text_widget_set_text(pdf_document *doc, pdf_widget *tw, char *text);
+
+/*
+ pdf_choice_widget_options: get the list of options for a list
+ box or combo box. Returns the number of options and fills in their
+ names within the supplied array. Should first be called with a
+ NULL array to find out how big the array should be.
+*/
+int pdf_choice_widget_options(pdf_document *doc, pdf_widget *tw, char *opts[]);
+
+/*
+ pdf_choice_widget_is_multiselect: returns whether a list box or
+ combo box supports selection of multiple options
+*/
+int pdf_choice_widget_is_multiselect(pdf_document *doc, pdf_widget *tw);
+
+/*
+ pdf_choice_widget_value: get the value of a choice widget.
+ Returns the number of options curently selected and fills in
+ the supplied array with their strings. Should first be called
+ with NULL as the array to find out how big the array need to
+ be. The filled in elements should not be freed by the caller.
+*/
+int pdf_choice_widget_value(pdf_document *doc, pdf_widget *tw, char *opts[]);
+
+/*
+ pdf_widget_set_value: set the value of a choice widget. The
+ caller should pass the number of options selected and an
+ array of their names
+*/
+void pdf_choice_widget_set_value(pdf_document *doc, pdf_widget *tw, int n, char *opts[]);
+
+/*
+ pdf_signature_widget_byte_range: retrieve the byte range for a signature widget
+*/
+int pdf_signature_widget_byte_range(pdf_document *doc, pdf_widget *widget, int (*byte_range)[2]);
+
+/*
+ pdf_signature_widget_contents: retrieve the contents for a signature widget
+*/
+int pdf_signature_widget_contents(pdf_document *doc, pdf_widget *widget, char **contents);
+
+/*
+ fz_check_signature: check a signature's certificate chain and digest
+*/
+int pdf_check_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize);
+
+/*
+ fz_create_annot: create a new annotation of the specified type on the
+ specified page. The returned pdf_annot structure is owned by the page
+ and does not need to be freed.
+*/
+pdf_annot *pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type);
+
+/*
+ fz_delete_annot: delete an annotation
+*/
+void pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot);
+
+/*
+ fz_set_annot_appearance: update the appearance of an annotation based
+ on a display list.
+*/
+void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect, fz_display_list *disp_list);
+
+/*
+ fz_set_markup_annot_quadpoints: set the quadpoints for a text-markup annotation.
+*/
+void pdf_set_markup_annot_quadpoints(pdf_document *doc, pdf_annot *annot, fz_point *qp, int n);
+
+void pdf_set_markup_obj_appearance(pdf_document *doc, pdf_obj *annot, float color[3], float alpha, float line_thickness, float line_height);
+
+/*
+ fz_set_markup_appearance: set the appearance stream of a text markup annotations, basing it on
+ its QuadPoints array
+*/
+void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[3], float alpha, float line_thickness, float line_height);
+
+/*
+ fz_set_ink_annot_list: set the details of an ink annotation. All the points of the multiple arcs
+ are carried in a single array, with the counts for each arc held in a secondary array.
+*/
+void pdf_set_ink_annot_list(pdf_document *doc, pdf_annot *annot, fz_point *pts, int *counts, int ncount, float color[3], float thickness);
+void pdf_set_ink_obj_appearance(pdf_document *doc, pdf_obj *annot);
+
+/*
+ Document events: the objects via which MuPDF informs the calling app
+ of occurrences emanating from the document, possibly from user interaction
+ or javascript execution. MuPDF informs the app of document events via a
+ callback.
+*/
+
+struct pdf_doc_event_s
+{
+ int type;
+};
+
+enum
+{
+ PDF_DOCUMENT_EVENT_ALERT,
+ PDF_DOCUMENT_EVENT_PRINT,
+ PDF_DOCUMENT_EVENT_LAUNCH_URL,
+ PDF_DOCUMENT_EVENT_MAIL_DOC,
+ PDF_DOCUMENT_EVENT_SUBMIT,
+ PDF_DOCUMENT_EVENT_EXEC_MENU_ITEM,
+ PDF_DOCUMENT_EVENT_EXEC_DIALOG
+};
+
+/*
+ pdf_set_doc_event_callback: set the function via which to receive
+ document events.
+*/
+void pdf_set_doc_event_callback(pdf_document *doc, pdf_doc_event_cb *event_cb, void *data);
+
+/*
+ The various types of document events
+*/
+
+/*
+ pdf_alert_event: details of an alert event. In response the app should
+ display an alert dialog with the bittons specified by "button_type_group".
+ If "check_box_message" is non-NULL, a checkbox should be displayed in
+ the lower-left corned along with the messsage.
+
+ "finally_checked" and "button_pressed" should be set by the app
+ before returning from the callback. "finally_checked" need be set
+ only if "check_box_message" is non-NULL.
+*/
+typedef struct
+{
+ char *message;
+ int icon_type;
+ int button_group_type;
+ char *title;
+ char *check_box_message;
+ int initially_checked;
+ int finally_checked;
+ int button_pressed;
+} pdf_alert_event;
+
+/* Possible values of icon_type */
+enum
+{
+ PDF_ALERT_ICON_ERROR,
+ PDF_ALERT_ICON_WARNING,
+ PDF_ALERT_ICON_QUESTION,
+ PDF_ALERT_ICON_STATUS
+};
+
+/* Possible values of button_group_type */
+enum
+{
+ PDF_ALERT_BUTTON_GROUP_OK,
+ PDF_ALERT_BUTTON_GROUP_OK_CANCEL,
+ PDF_ALERT_BUTTON_GROUP_YES_NO,
+ PDF_ALERT_BUTTON_GROUP_YES_NO_CANCEL
+};
+
+/* Possible values of button_pressed */
+enum
+{
+ PDF_ALERT_BUTTON_NONE,
+ PDF_ALERT_BUTTON_OK,
+ PDF_ALERT_BUTTON_CANCEL,
+ PDF_ALERT_BUTTON_NO,
+ PDF_ALERT_BUTTON_YES
+};
+
+/*
+ pdf_access_alert_event: access the details of an alert event
+ The returned pointer and all the data referred to by the
+ structire are owned by mupdf and need not be freed by the
+ caller.
+*/
+pdf_alert_event *pdf_access_alert_event(pdf_doc_event *event);
+
+/*
+ pdf_access_exec_menu_item_event: access the details of am execMenuItem
+ event, which consists of just the name of the menu item
+*/
+char *pdf_access_exec_menu_item_event(pdf_doc_event *event);
+
+/*
+ pdf_submit_event: details of a submit event. The app should submit
+ the specified data to the specified url. "get" determines whether
+ to use the GET or POST method.
+*/
+typedef struct
+{
+ char *url;
+ char *data;
+ int data_len;
+ int get;
+} pdf_submit_event;
+
+/*
+ pdf_access_submit_event: access the details of a submit event
+ The returned pointer and all data referred to by the structure are
+ owned by mupdf and need not be freed by the caller.
+*/
+pdf_submit_event *pdf_access_submit_event(pdf_doc_event *event);
+
+/*
+ pdf_launch_url_event: details of a launch-url event. The app should
+ open the url, either in a new frame or in the current window.
+*/
+typedef struct
+{
+ char *url;
+ int new_frame;
+} pdf_launch_url_event;
+
+/*
+ pdf_access_launch_url_event: access the details of a launch-url
+ event. The returned pointer and all data referred to by the structure
+ are owned by mupdf and need not be freed by the caller.
+*/
+pdf_launch_url_event *pdf_access_launch_url_event(pdf_doc_event *event);
+
+/*
+ pdf_mail_doc_event: details of a mail_doc event. The app should save
+ the current state of the document and email it using the specified
+ parameters.
+*/
+typedef struct
+{
+ int ask_user;
+ char *to;
+ char *cc;
+ char *bcc;
+ char *subject;
+ char *message;
+} pdf_mail_doc_event;
+
+/*
+ pdf_acccess_mail_doc_event: access the details of a mail-doc event.
+*/
+pdf_mail_doc_event *pdf_access_mail_doc_event(pdf_doc_event *event);
+
+void pdf_event_issue_alert(pdf_document *doc, pdf_alert_event *event);
+void pdf_event_issue_print(pdf_document *doc);
+void pdf_event_issue_exec_menu_item(pdf_document *doc, char *item);
+void pdf_event_issue_exec_dialog(pdf_document *doc);
+void pdf_event_issue_launch_url(pdf_document *doc, char *url, int new_frame);
+void pdf_event_issue_mail_doc(pdf_document *doc, pdf_mail_doc_event *event);
+
+/*
+ * Javascript handler
+ */
+typedef struct pdf_js_event_s
+{
+ pdf_obj *target;
+ char *value;
+ int rc;
+} pdf_js_event;
+
+int pdf_js_supported(void);
+pdf_js *pdf_new_js(pdf_document *doc);
+void pdf_drop_js(pdf_js *js);
+void pdf_js_load_document_level(pdf_js *js);
+void pdf_js_setup_event(pdf_js *js, pdf_js_event *e);
+pdf_js_event *pdf_js_get_event(pdf_js *js);
+void pdf_js_execute(pdf_js *js, char *code);
+void pdf_js_execute_count(pdf_js *js, char *code, int count);
+
+/*
+ * Javascript engine interface
+ */
+typedef struct pdf_jsimp_s pdf_jsimp;
+typedef struct pdf_jsimp_type_s pdf_jsimp_type;
+typedef struct pdf_jsimp_obj_s pdf_jsimp_obj;
+
+typedef void (pdf_jsimp_dtr)(void *jsctx, void *obj);
+typedef pdf_jsimp_obj *(pdf_jsimp_method)(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[]);
+typedef pdf_jsimp_obj *(pdf_jsimp_getter)(void *jsctx, void *obj);
+typedef void (pdf_jsimp_setter)(void *jsctx, void *obj, pdf_jsimp_obj *val);
+
+enum
+{
+ JS_TYPE_UNKNOWN,
+ JS_TYPE_NULL,
+ JS_TYPE_STRING,
+ JS_TYPE_NUMBER,
+ JS_TYPE_ARRAY,
+ JS_TYPE_BOOLEAN
+};
+
+pdf_jsimp *pdf_new_jsimp(fz_context *ctx, void *jsctx);
+void pdf_drop_jsimp(pdf_jsimp *imp);
+
+pdf_jsimp_type *pdf_jsimp_new_type(pdf_jsimp *imp, pdf_jsimp_dtr *dtr);
+void pdf_jsimp_drop_type(pdf_jsimp *imp, pdf_jsimp_type *type);
+void pdf_jsimp_addmethod(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf_jsimp_method *meth);
+void pdf_jsimp_addproperty(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf_jsimp_getter *get, pdf_jsimp_setter *set);
+void pdf_jsimp_set_global_type(pdf_jsimp *imp, pdf_jsimp_type *type);
+
+pdf_jsimp_obj *pdf_jsimp_new_obj(pdf_jsimp *imp, pdf_jsimp_type *type, void *obj);
+void pdf_jsimp_drop_obj(pdf_jsimp *imp, pdf_jsimp_obj *obj);
+
+int pdf_jsimp_to_type(pdf_jsimp *imp, pdf_jsimp_obj *obj);
+
+pdf_jsimp_obj *pdf_jsimp_from_string(pdf_jsimp *imp, char *str);
+char *pdf_jsimp_to_string(pdf_jsimp *imp, pdf_jsimp_obj *obj);
+
+pdf_jsimp_obj *pdf_jsimp_from_number(pdf_jsimp *imp, double num);
+double pdf_jsimp_to_number(pdf_jsimp *imp, pdf_jsimp_obj *obj);
+
+int pdf_jsimp_array_len(pdf_jsimp *imp, pdf_jsimp_obj *obj);
+pdf_jsimp_obj *pdf_jsimp_array_item(pdf_jsimp *imp, pdf_jsimp_obj *obj, int i);
+
+pdf_jsimp_obj *pdf_jsimp_property(pdf_jsimp *imp, pdf_jsimp_obj *obj, char *prop);
+
+void pdf_jsimp_execute(pdf_jsimp *imp, char *code);
+void pdf_jsimp_execute_count(pdf_jsimp *imp, char *code, int count);
+
#endif
diff --git a/include/mupdf/xps-internal.h b/include/mupdf/xps-internal.h
deleted file mode 100644
index a2c089e5..00000000
--- a/include/mupdf/xps-internal.h
+++ /dev/null
@@ -1,224 +0,0 @@
-#ifndef MUXPS_INTERNAL_H
-#define MUXPS_INTERNAL_H
-
-#include "mupdf/xps.h"
-#include "mupdf/fitz-internal.h"
-
-typedef unsigned char byte;
-
-/*
- * Memory, and string functions.
- */
-
-int xps_strcasecmp(char *a, char *b);
-void xps_resolve_url(char *output, char *base_uri, char *path, int output_size);
-int xps_url_is_remote(char *path);
-char *xps_parse_point(char *s_in, float *x, float *y);
-
-/*
- * Container parts.
- */
-
-typedef struct xps_part_s xps_part;
-
-struct xps_part_s
-{
- char *name;
- int size;
- int cap;
- byte *data;
-};
-
-xps_part *xps_new_part(xps_document *doc, char *name, int size);
-int xps_has_part(xps_document *doc, char *partname);
-xps_part *xps_read_part(xps_document *doc, char *partname);
-void xps_free_part(xps_document *doc, xps_part *part);
-
-/*
- * Document structure.
- */
-
-typedef struct xps_fixdoc_s xps_fixdoc;
-typedef struct xps_target_s xps_target;
-
-struct xps_fixdoc_s
-{
- char *name;
- char *outline;
- xps_fixdoc *next;
-};
-
-struct xps_page_s
-{
- char *name;
- int number;
- int width;
- int height;
- fz_xml *root;
- int links_resolved;
- fz_link *links;
- xps_page *next;
-};
-
-struct xps_target_s
-{
- char *name;
- int page;
- xps_target *next;
-};
-
-void xps_read_page_list(xps_document *doc);
-void xps_print_page_list(xps_document *doc);
-void xps_free_page_list(xps_document *doc);
-
-int xps_count_pages(xps_document *doc);
-xps_page *xps_load_page(xps_document *doc, int number);
-fz_link *xps_load_links(xps_document *doc, xps_page *page);
-fz_rect *xps_bound_page(xps_document *doc, xps_page *page, fz_rect *rect);
-void xps_free_page(xps_document *doc, xps_page *page);
-
-fz_outline *xps_load_outline(xps_document *doc);
-
-int xps_lookup_link_target(xps_document *doc, char *target_uri);
-void xps_add_link(xps_document *doc, const fz_rect *area, char *base_uri, char *target_uri);
-/*
- * Images, fonts, and colorspaces.
- */
-
-typedef struct xps_font_cache_s xps_font_cache;
-
-struct xps_font_cache_s
-{
- char *name;
- fz_font *font;
- xps_font_cache *next;
-};
-
-typedef struct xps_glyph_metrics_s xps_glyph_metrics;
-
-struct xps_glyph_metrics_s
-{
- float hadv, vadv, vorg;
-};
-
-int xps_count_font_encodings(fz_font *font);
-void xps_identify_font_encoding(fz_font *font, int idx, int *pid, int *eid);
-void xps_select_font_encoding(fz_font *font, int idx);
-int xps_encode_font_char(fz_font *font, int key);
-
-void xps_measure_font_glyph(xps_document *doc, fz_font *font, int gid, xps_glyph_metrics *mtx);
-
-void xps_print_path(xps_document *doc);
-
-void xps_parse_color(xps_document *doc, char *base_uri, char *hexstring, fz_colorspace **csp, float *samples);
-void xps_set_color(xps_document *doc, fz_colorspace *colorspace, float *samples);
-
-/*
- * Resource dictionaries.
- */
-
-typedef struct xps_resource_s xps_resource;
-
-struct xps_resource_s
-{
- char *name;
- char *base_uri; /* only used in the head nodes */
- fz_xml *base_xml; /* only used in the head nodes, to free the xml document */
- fz_xml *data;
- xps_resource *next;
- xps_resource *parent; /* up to the previous dict in the stack */
-};
-
-xps_resource * xps_parse_resource_dictionary(xps_document *doc, char *base_uri, fz_xml *root);
-void xps_free_resource_dictionary(xps_document *doc, xps_resource *dict);
-void xps_resolve_resource_reference(xps_document *doc, xps_resource *dict, char **attp, fz_xml **tagp, char **urip);
-
-void xps_print_resource_dictionary(xps_resource *dict);
-
-/*
- * Fixed page/graphics parsing.
- */
-
-void xps_parse_fixed_page(xps_document *doc, const fz_matrix *ctm, xps_page *page);
-void xps_parse_canvas(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
-void xps_parse_path(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *node);
-void xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *node);
-void xps_parse_solid_color_brush(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *node);
-void xps_parse_image_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
-void xps_parse_visual_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
-void xps_parse_linear_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
-void xps_parse_radial_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
-
-void xps_parse_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *root, void(*func)(xps_document*, const fz_matrix *, const fz_rect *, char*, xps_resource*, fz_xml*, void*), void *user);
-
-void xps_parse_matrix_transform(xps_document *doc, fz_xml *root, fz_matrix *matrix);
-void xps_parse_render_transform(xps_document *doc, char *text, fz_matrix *matrix);
-void xps_parse_rectangle(xps_document *doc, char *text, fz_rect *rect);
-
-void xps_begin_opacity(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, char *opacity_att, fz_xml *opacity_mask_tag);
-void xps_end_opacity(xps_document *doc, char *base_uri, xps_resource *dict, char *opacity_att, fz_xml *opacity_mask_tag);
-
-void xps_parse_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
-void xps_parse_element(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
-
-void xps_clip(xps_document *doc, const fz_matrix *ctm, xps_resource *dict, char *clip_att, fz_xml *clip_tag);
-
-fz_xml *xps_lookup_alternate_content(fz_xml *node);
-
-/*
- * The interpreter context.
- */
-
-typedef struct xps_entry_s xps_entry;
-
-struct xps_entry_s
-{
- char *name;
- int offset;
- int csize;
- int usize;
-};
-
-struct xps_document_s
-{
- fz_document super;
-
- fz_context *ctx;
- char *directory;
- fz_stream *file;
- int zip_count;
- xps_entry *zip_table;
-
- char *start_part; /* fixed document sequence */
- xps_fixdoc *first_fixdoc; /* first fixed document */
- xps_fixdoc *last_fixdoc; /* last fixed document */
- xps_page *first_page; /* first page of document */
- xps_page *last_page; /* last page of document */
- int page_count;
-
- xps_target *target; /* link targets */
-
- char *base_uri; /* base uri for parsing XML and resolving relative paths */
- char *part_uri; /* part uri for parsing metadata relations */
-
- /* We cache font resources */
- xps_font_cache *font_table;
-
- /* Opacity attribute stack */
- float opacity[64];
- int opacity_top;
-
- /* Current color */
- fz_colorspace *colorspace;
- float color[8];
- float alpha;
-
- /* Current device */
- fz_cookie *cookie;
- fz_device *dev;
-
- /* Current page we are loading */
- xps_page *current_page;
-};
-
-#endif
diff --git a/include/mupdf/xps.h b/include/mupdf/xps.h
index 2de11500..5f492f68 100644
--- a/include/mupdf/xps.h
+++ b/include/mupdf/xps.h
@@ -51,4 +51,221 @@ void xps_free_page(xps_document *doc, xps_page *page);
fz_outline *xps_load_outline(xps_document *doc);
+/* xps-internal.h */
+
+/*
+ * Memory, and string functions.
+ */
+
+int xps_strcasecmp(char *a, char *b);
+void xps_resolve_url(char *output, char *base_uri, char *path, int output_size);
+int xps_url_is_remote(char *path);
+char *xps_parse_point(char *s_in, float *x, float *y);
+
+/*
+ * Container parts.
+ */
+
+typedef struct xps_part_s xps_part;
+
+struct xps_part_s
+{
+ char *name;
+ int size;
+ int cap;
+ unsigned char *data;
+};
+
+xps_part *xps_new_part(xps_document *doc, char *name, int size);
+int xps_has_part(xps_document *doc, char *partname);
+xps_part *xps_read_part(xps_document *doc, char *partname);
+void xps_free_part(xps_document *doc, xps_part *part);
+
+/*
+ * Document structure.
+ */
+
+typedef struct xps_fixdoc_s xps_fixdoc;
+typedef struct xps_target_s xps_target;
+
+struct xps_fixdoc_s
+{
+ char *name;
+ char *outline;
+ xps_fixdoc *next;
+};
+
+struct xps_page_s
+{
+ char *name;
+ int number;
+ int width;
+ int height;
+ fz_xml *root;
+ int links_resolved;
+ fz_link *links;
+ xps_page *next;
+};
+
+struct xps_target_s
+{
+ char *name;
+ int page;
+ xps_target *next;
+};
+
+void xps_read_page_list(xps_document *doc);
+void xps_print_page_list(xps_document *doc);
+void xps_free_page_list(xps_document *doc);
+
+int xps_count_pages(xps_document *doc);
+xps_page *xps_load_page(xps_document *doc, int number);
+fz_link *xps_load_links(xps_document *doc, xps_page *page);
+fz_rect *xps_bound_page(xps_document *doc, xps_page *page, fz_rect *rect);
+void xps_free_page(xps_document *doc, xps_page *page);
+
+fz_outline *xps_load_outline(xps_document *doc);
+
+int xps_lookup_link_target(xps_document *doc, char *target_uri);
+void xps_add_link(xps_document *doc, const fz_rect *area, char *base_uri, char *target_uri);
+/*
+ * Images, fonts, and colorspaces.
+ */
+
+typedef struct xps_font_cache_s xps_font_cache;
+
+struct xps_font_cache_s
+{
+ char *name;
+ fz_font *font;
+ xps_font_cache *next;
+};
+
+typedef struct xps_glyph_metrics_s xps_glyph_metrics;
+
+struct xps_glyph_metrics_s
+{
+ float hadv, vadv, vorg;
+};
+
+int xps_count_font_encodings(fz_font *font);
+void xps_identify_font_encoding(fz_font *font, int idx, int *pid, int *eid);
+void xps_select_font_encoding(fz_font *font, int idx);
+int xps_encode_font_char(fz_font *font, int key);
+
+void xps_measure_font_glyph(xps_document *doc, fz_font *font, int gid, xps_glyph_metrics *mtx);
+
+void xps_print_path(xps_document *doc);
+
+void xps_parse_color(xps_document *doc, char *base_uri, char *hexstring, fz_colorspace **csp, float *samples);
+void xps_set_color(xps_document *doc, fz_colorspace *colorspace, float *samples);
+
+/*
+ * Resource dictionaries.
+ */
+
+typedef struct xps_resource_s xps_resource;
+
+struct xps_resource_s
+{
+ char *name;
+ char *base_uri; /* only used in the head nodes */
+ fz_xml *base_xml; /* only used in the head nodes, to free the xml document */
+ fz_xml *data;
+ xps_resource *next;
+ xps_resource *parent; /* up to the previous dict in the stack */
+};
+
+xps_resource * xps_parse_resource_dictionary(xps_document *doc, char *base_uri, fz_xml *root);
+void xps_free_resource_dictionary(xps_document *doc, xps_resource *dict);
+void xps_resolve_resource_reference(xps_document *doc, xps_resource *dict, char **attp, fz_xml **tagp, char **urip);
+
+void xps_print_resource_dictionary(xps_resource *dict);
+
+/*
+ * Fixed page/graphics parsing.
+ */
+
+void xps_parse_fixed_page(xps_document *doc, const fz_matrix *ctm, xps_page *page);
+void xps_parse_canvas(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_path(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_solid_color_brush(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_image_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_visual_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_linear_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_radial_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
+
+void xps_parse_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *root, void(*func)(xps_document*, const fz_matrix *, const fz_rect *, char*, xps_resource*, fz_xml*, void*), void *user);
+
+void xps_parse_matrix_transform(xps_document *doc, fz_xml *root, fz_matrix *matrix);
+void xps_parse_render_transform(xps_document *doc, char *text, fz_matrix *matrix);
+void xps_parse_rectangle(xps_document *doc, char *text, fz_rect *rect);
+
+void xps_begin_opacity(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, char *opacity_att, fz_xml *opacity_mask_tag);
+void xps_end_opacity(xps_document *doc, char *base_uri, xps_resource *dict, char *opacity_att, fz_xml *opacity_mask_tag);
+
+void xps_parse_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_element(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
+
+void xps_clip(xps_document *doc, const fz_matrix *ctm, xps_resource *dict, char *clip_att, fz_xml *clip_tag);
+
+fz_xml *xps_lookup_alternate_content(fz_xml *node);
+
+/*
+ * The interpreter context.
+ */
+
+typedef struct xps_entry_s xps_entry;
+
+struct xps_entry_s
+{
+ char *name;
+ int offset;
+ int csize;
+ int usize;
+};
+
+struct xps_document_s
+{
+ fz_document super;
+
+ fz_context *ctx;
+ char *directory;
+ fz_stream *file;
+ int zip_count;
+ xps_entry *zip_table;
+
+ char *start_part; /* fixed document sequence */
+ xps_fixdoc *first_fixdoc; /* first fixed document */
+ xps_fixdoc *last_fixdoc; /* last fixed document */
+ xps_page *first_page; /* first page of document */
+ xps_page *last_page; /* last page of document */
+ int page_count;
+
+ xps_target *target; /* link targets */
+
+ char *base_uri; /* base uri for parsing XML and resolving relative paths */
+ char *part_uri; /* part uri for parsing metadata relations */
+
+ /* We cache font resources */
+ xps_font_cache *font_table;
+
+ /* Opacity attribute stack */
+ float opacity[64];
+ int opacity_top;
+
+ /* Current color */
+ fz_colorspace *colorspace;
+ float color[8];
+ float alpha;
+
+ /* Current device */
+ fz_cookie *cookie;
+ fz_device *dev;
+
+ /* Current page we are loading */
+ xps_page *current_page;
+};
+
#endif
diff --git a/pdf/pdf_annot.c b/pdf/pdf_annot.c
index d32a276b..4ed14abf 100644
--- a/pdf/pdf_annot.c
+++ b/pdf/pdf_annot.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
#define SMALL_FLOAT (0.00001)
diff --git a/pdf/pdf_cmap.c b/pdf/pdf_cmap.c
index 100a8a3f..c006c6bb 100644
--- a/pdf/pdf_cmap.c
+++ b/pdf/pdf_cmap.c
@@ -15,8 +15,7 @@
* or can trust the parser to give us optimal mappings.
*/
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.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 b3374ab2..340f914b 100644
--- a/pdf/pdf_cmap_load.c
+++ b/pdf/pdf_cmap_load.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.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 435fcd44..85b89939 100644
--- a/pdf/pdf_cmap_parse.c
+++ b/pdf/pdf_cmap_parse.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
/*
* CMap parser
diff --git a/pdf/pdf_cmap_table.c b/pdf/pdf_cmap_table.c
index 8c4d0b26..d3c567d7 100644
--- a/pdf/pdf_cmap_table.c
+++ b/pdf/pdf_cmap_table.c
@@ -1,11 +1,10 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
#ifndef NOCJK
-#include "../generated/cmap_cns.h"
-#include "../generated/cmap_gb.h"
-#include "../generated/cmap_japan.h"
-#include "../generated/cmap_korea.h"
+#include "cmap_cns.h"
+#include "cmap_gb.h"
+#include "cmap_japan.h"
+#include "cmap_korea.h"
#endif
static const struct { char *name; pdf_cmap *cmap; } cmap_table[] =
diff --git a/pdf/pdf_colorspace.c b/pdf/pdf_colorspace.c
index 1894e284..fc1ff541 100644
--- a/pdf/pdf_colorspace.c
+++ b/pdf/pdf_colorspace.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
/* ICCBased */
diff --git a/pdf/pdf_crypt.c b/pdf/pdf_crypt.c
index 8cfa59e4..9ffce0e1 100644
--- a/pdf/pdf_crypt.c
+++ b/pdf/pdf_crypt.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
enum
{
diff --git a/pdf/pdf_device.c b/pdf/pdf_device.c
index 56d4ef86..ecd3cd3f 100644
--- a/pdf/pdf_device.c
+++ b/pdf/pdf_device.c
@@ -1,4 +1,4 @@
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
typedef struct pdf_device_s pdf_device;
diff --git a/pdf/pdf_encoding.c b/pdf/pdf_encoding.c
index 51956a6c..bc06dcee 100644
--- a/pdf/pdf_encoding.c
+++ b/pdf/pdf_encoding.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
#include "data_encodings.h"
#include "data_glyphlist.h"
diff --git a/pdf/pdf_event.c b/pdf/pdf_event.c
index 3ece04e8..dc908985 100644
--- a/pdf/pdf_event.c
+++ b/pdf/pdf_event.c
@@ -1,5 +1,5 @@
#include "mupdf/fitz.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
typedef struct
{
diff --git a/pdf/pdf_field.c b/pdf/pdf_field.c
index 8c08828d..d8e1a240 100644
--- a/pdf/pdf_field.c
+++ b/pdf/pdf_field.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
pdf_obj *pdf_get_inheritable(pdf_document *doc, pdf_obj *obj, char *key)
{
diff --git a/pdf/pdf_font.c b/pdf/pdf_font.c
index 84c56c47..65589c94 100644
--- a/pdf/pdf_font.c
+++ b/pdf/pdf_font.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
#include <ft2build.h>
#include FT_FREETYPE_H
diff --git a/pdf/pdf_fontfile.c b/pdf/pdf_fontfile.c
index 8decb50f..5e8ad478 100644
--- a/pdf/pdf_fontfile.c
+++ b/pdf/pdf_fontfile.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
/*
Which fonts are embedded is based on a few preprocessor definitions.
@@ -19,17 +18,17 @@
#define NOCJKFONT
#endif
-#include "../generated/font_base14.h"
+#include "font_base14.h"
#ifndef NODROIDFONT
-#include "../generated/font_droid.h"
+#include "font_droid.h"
#endif
#ifndef NOCJKFONT
#ifndef NOCJKFULL
-#include "../generated/font_cjk_full.h"
+#include "font_cjk_full.h"
#else
-#include "../generated/font_cjk.h"
+#include "font_cjk.h"
#endif
#endif
diff --git a/pdf/pdf_form.c b/pdf/pdf_form.c
index 45242b92..9b58c07b 100644
--- a/pdf/pdf_form.c
+++ b/pdf/pdf_form.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
#define MATRIX_COEFS (6)
diff --git a/pdf/pdf_function.c b/pdf/pdf_function.c
index 172d0760..368c1415 100644
--- a/pdf/pdf_function.c
+++ b/pdf/pdf_function.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
typedef struct psobj_s psobj;
diff --git a/pdf/pdf_image.c b/pdf/pdf_image.c
index ee5be441..a75e6a73 100644
--- a/pdf/pdf_image.c
+++ b/pdf/pdf_image.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
static fz_image *pdf_load_jpx(pdf_document *xref, pdf_obj *dict, int forcemask);
diff --git a/pdf/pdf_interpret.c b/pdf/pdf_interpret.c
index fc6b7b6d..ab883021 100644
--- a/pdf/pdf_interpret.c
+++ b/pdf/pdf_interpret.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
#define TILE
diff --git a/pdf/pdf_js.c b/pdf/pdf_js.c
index ec0570f1..c5caffc7 100644
--- a/pdf/pdf_js.c
+++ b/pdf/pdf_js.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
struct pdf_js_s
{
diff --git a/pdf/pdf_js_none.c b/pdf/pdf_js_none.c
index dc0124bc..00cc5b54 100644
--- a/pdf/pdf_js_none.c
+++ b/pdf/pdf_js_none.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
pdf_js *pdf_new_js(pdf_document *doc)
{
diff --git a/pdf/pdf_jsimp_cpp.c b/pdf/pdf_jsimp_cpp.c
index ac815639..10fd835b 100644
--- a/pdf/pdf_jsimp_cpp.c
+++ b/pdf/pdf_jsimp_cpp.c
@@ -2,8 +2,7 @@
* in C++, from which calls to fz_throw aren't safe. The C++ versions
* return errors explicitly, and these wrappers then throw them. */
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
#include "pdf_jsimp_cpp.h"
pdf_jsimp *pdf_new_jsimp(fz_context *ctx, void *jsctx)
diff --git a/pdf/pdf_lex.c b/pdf/pdf_lex.c
index f23c00d4..a8bf9f4b 100644
--- a/pdf/pdf_lex.c
+++ b/pdf/pdf_lex.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.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 06161d60..8a4b7d11 100644
--- a/pdf/pdf_metrics.c
+++ b/pdf/pdf_metrics.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.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 6d83ae41..ea386dda 100644
--- a/pdf/pdf_nametree.c
+++ b/pdf/pdf_nametree.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
static pdf_obj *
pdf_lookup_name_imp(fz_context *ctx, pdf_obj *node, pdf_obj *needle)
diff --git a/pdf/pdf_object.c b/pdf/pdf_object.c
index 3eefede1..ac1609cf 100644
--- a/pdf/pdf_object.c
+++ b/pdf/pdf_object.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
typedef enum pdf_objkind_e
{
diff --git a/pdf/pdf_outline.c b/pdf/pdf_outline.c
index cbfdb230..584d60ea 100644
--- a/pdf/pdf_outline.c
+++ b/pdf/pdf_outline.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.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 c4cdbf6b..df75ff51 100644
--- a/pdf/pdf_page.c
+++ b/pdf/pdf_page.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
struct info
{
diff --git a/pdf/pdf_parse.c b/pdf/pdf_parse.c
index d7648e2a..b50e1094 100644
--- a/pdf/pdf_parse.c
+++ b/pdf/pdf_parse.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
fz_rect *
pdf_to_rect(fz_context *ctx, pdf_obj *array, fz_rect *r)
diff --git a/pdf/pdf_pattern.c b/pdf/pdf_pattern.c
index d388f5d7..15d0b942 100644
--- a/pdf/pdf_pattern.c
+++ b/pdf/pdf_pattern.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.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 398edf94..e482ec3a 100644
--- a/pdf/pdf_repair.c
+++ b/pdf/pdf_repair.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
/* Scan file for objects and reconstruct xref table */
diff --git a/pdf/pdf_shade.c b/pdf/pdf_shade.c
index f8004cfb..04c50b03 100644
--- a/pdf/pdf_shade.c
+++ b/pdf/pdf_shade.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
/* FIXME: Remove this somehow */
#define FUNSEGS 32 /* size of sampled mesh for function-based shadings */
diff --git a/pdf/pdf_store.c b/pdf/pdf_store.c
index 9fb7777d..d3873e76 100644
--- a/pdf/pdf_store.c
+++ b/pdf/pdf_store.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.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 37f04b02..7c1f4a6c 100644
--- a/pdf/pdf_stream.c
+++ b/pdf/pdf_stream.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
/*
* Check if an object is a stream or not.
diff --git a/pdf/pdf_type3.c b/pdf/pdf_type3.c
index 95ce8b79..bb952ff7 100644
--- a/pdf/pdf_type3.c
+++ b/pdf/pdf_type3.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
static void
pdf_run_glyph_func(void *doc, void *rdb, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth)
diff --git a/pdf/pdf_unicode.c b/pdf/pdf_unicode.c
index ba7dad44..694cbac6 100644
--- a/pdf/pdf_unicode.c
+++ b/pdf/pdf_unicode.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
/* Load or synthesize ToUnicode map for fonts */
diff --git a/pdf/pdf_write.c b/pdf/pdf_write.c
index c76fdee3..9ca4607e 100644
--- a/pdf/pdf_write.c
+++ b/pdf/pdf_write.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
/* #define DEBUG_LINEARIZATION */
/* #define DEBUG_HEAP_SORT */
diff --git a/pdf/pdf_xobject.c b/pdf/pdf_xobject.c
index ff751fe0..a47ea687 100644
--- a/pdf/pdf_xobject.c
+++ b/pdf/pdf_xobject.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.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 92ce8583..9b3d6653 100644
--- a/pdf/pdf_xref.c
+++ b/pdf/pdf_xref.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
static inline int iswhite(int ch)
{
diff --git a/pdf/pdf_xref_aux.c b/pdf/pdf_xref_aux.c
index 4a847cbe..48634374 100644
--- a/pdf/pdf_xref_aux.c
+++ b/pdf/pdf_xref_aux.c
@@ -1,5 +1,4 @@
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
/*
These functions have been split out of pdf_xref.c to allow tools
diff --git a/scripts/cmapdump.c b/scripts/cmapdump.c
index caaa3efa..96bed646 100644
--- a/scripts/cmapdump.c
+++ b/scripts/cmapdump.c
@@ -6,8 +6,7 @@
/* We never want to build memento versions of the cmapdump util */
#undef MEMENTO
-#include "mupdf/fitz-internal.h"
-#include "mupdf/pdf-internal.h"
+#include "mupdf/pdf.h"
#include "../fitz/base_context.c"
#include "../fitz/base_error.c"
diff --git a/winrt/mupdfwinrt/Cache.h b/winrt/mupdfwinrt/Cache.h
index f8dd8ecb..0763dba4 100644
--- a/winrt/mupdfwinrt/Cache.h
+++ b/winrt/mupdfwinrt/Cache.h
@@ -2,10 +2,7 @@
#include <mutex>
extern "C" {
- #include "fitz.h"
- #include "fitz-internal.h"
- #include "muxps.h"
- #include "mupdf.h"
+ #include "mupdf/fitz.h"
}
#define MAX_DISPLAY_CACHE_SIZE 3
diff --git a/winrt/mupdfwinrt/muctx.h b/winrt/mupdfwinrt/muctx.h
index 7c984b91..35070372 100644
--- a/winrt/mupdfwinrt/muctx.h
+++ b/winrt/mupdfwinrt/muctx.h
@@ -9,10 +9,7 @@
#include "Cache.h"
extern "C" {
- #include "fitz.h"
- #include "fitz-internal.h"
- #include "muxps.h"
- #include "mupdf.h"
+ #include "mupdf/fitz.h"
}
typedef enum {
diff --git a/xps/xps_common.c b/xps/xps_common.c
index e0917f6b..ec16d879 100644
--- a/xps/xps_common.c
+++ b/xps/xps_common.c
@@ -1,4 +1,4 @@
-#include "mupdf/xps-internal.h"
+#include "mupdf/xps.h"
static inline int unhex(int a)
{
diff --git a/xps/xps_doc.c b/xps/xps_doc.c
index 4f6c38db..0bee4931 100644
--- a/xps/xps_doc.c
+++ b/xps/xps_doc.c
@@ -1,4 +1,4 @@
-#include "mupdf/xps-internal.h"
+#include "mupdf/xps.h"
#define REL_START_PART \
"http://schemas.microsoft.com/xps/2005/06/fixedrepresentation"
diff --git a/xps/xps_glyphs.c b/xps/xps_glyphs.c
index 2e5be59f..dd4487d4 100644
--- a/xps/xps_glyphs.c
+++ b/xps/xps_glyphs.c
@@ -1,4 +1,4 @@
-#include "mupdf/xps-internal.h"
+#include "mupdf/xps.h"
#include <ft2build.h>
#include FT_FREETYPE_H
@@ -97,8 +97,8 @@ xps_insert_font(xps_document *doc, char *name, fz_font *font)
static void
xps_deobfuscate_font_resource(xps_document *doc, xps_part *part)
{
- byte buf[33];
- byte key[16];
+ unsigned char buf[33];
+ unsigned char key[16];
char *p;
int i;
diff --git a/xps/xps_gradient.c b/xps/xps_gradient.c
index 6b2a5780..88ed470b 100644
--- a/xps/xps_gradient.c
+++ b/xps/xps_gradient.c
@@ -1,4 +1,4 @@
-#include "mupdf/xps-internal.h"
+#include "mupdf/xps.h"
#define MAX_STOPS 256
diff --git a/xps/xps_image.c b/xps/xps_image.c
index ab3cda53..c00c96ae 100644
--- a/xps/xps_image.c
+++ b/xps/xps_image.c
@@ -1,10 +1,10 @@
-#include "mupdf/xps-internal.h"
+#include "mupdf/xps.h"
static fz_image *
xps_load_image(fz_context *ctx, xps_part *part)
{
/* Ownership of data always passes in here */
- byte *data = part->data;
+ unsigned char *data = part->data;
part->data = NULL;
return fz_new_image_from_data(ctx, data, part->size);
}
diff --git a/xps/xps_outline.c b/xps/xps_outline.c
index 608e66f5..bb5eccb0 100644
--- a/xps/xps_outline.c
+++ b/xps/xps_outline.c
@@ -1,4 +1,4 @@
-#include "mupdf/xps-internal.h"
+#include "mupdf/xps.h"
/*
* Parse the document structure / outline parts referenced from fixdoc relationships.
diff --git a/xps/xps_path.c b/xps/xps_path.c
index 24f10e78..371f52ab 100644
--- a/xps/xps_path.c
+++ b/xps/xps_path.c
@@ -1,4 +1,4 @@
-#include "mupdf/xps-internal.h"
+#include "mupdf/xps.h"
static char *
xps_parse_float_array(char *s, int num, float *x)
diff --git a/xps/xps_resource.c b/xps/xps_resource.c
index c91e0abc..658129c9 100644
--- a/xps/xps_resource.c
+++ b/xps/xps_resource.c
@@ -1,4 +1,4 @@
-#include "mupdf/xps-internal.h"
+#include "mupdf/xps.h"
static fz_xml *
xps_lookup_resource(xps_document *doc, xps_resource *dict, char *name, char **urip)
diff --git a/xps/xps_tile.c b/xps/xps_tile.c
index bebd94aa..cbf3943d 100644
--- a/xps/xps_tile.c
+++ b/xps/xps_tile.c
@@ -1,4 +1,4 @@
-#include "mupdf/xps-internal.h"
+#include "mupdf/xps.h"
#define TILE
diff --git a/xps/xps_util.c b/xps/xps_util.c
index 97886820..a74dc30f 100644
--- a/xps/xps_util.c
+++ b/xps/xps_util.c
@@ -1,4 +1,4 @@
-#include "mupdf/xps-internal.h"
+#include "mupdf/xps.h"
static inline int xps_tolower(int c)
{
diff --git a/xps/xps_zip.c b/xps/xps_zip.c
index b0a44914..0bda1341 100644
--- a/xps/xps_zip.c
+++ b/xps/xps_zip.c
@@ -1,4 +1,4 @@
-#include "mupdf/xps-internal.h"
+#include "mupdf/xps.h"
#include <zlib.h>