diff options
135 files changed, 3042 insertions, 3108 deletions
@@ -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> |