summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile20
-rw-r--r--docs/example.c2
-rw-r--r--docs/multi-threaded.c2
-rw-r--r--include/mupdf/cbz.h51
-rw-r--r--include/mupdf/fitz/annotation.h8
-rw-r--r--include/mupdf/fitz/colorspace.h11
-rw-r--r--include/mupdf/fitz/compressed-buffer.h2
-rw-r--r--include/mupdf/fitz/context.h38
-rw-r--r--include/mupdf/fitz/device.h113
-rw-r--r--include/mupdf/fitz/display-list.h4
-rw-r--r--include/mupdf/fitz/document.h117
-rw-r--r--include/mupdf/fitz/filter.h30
-rw-r--r--include/mupdf/fitz/font.h4
-rw-r--r--include/mupdf/fitz/function.h6
-rw-r--r--include/mupdf/fitz/glyph-cache.h2
-rw-r--r--include/mupdf/fitz/hash.h2
-rw-r--r--include/mupdf/fitz/image.h4
-rw-r--r--include/mupdf/fitz/link.h2
-rw-r--r--include/mupdf/fitz/meta.h2
-rw-r--r--include/mupdf/fitz/outline.h4
-rw-r--r--include/mupdf/fitz/output-pcl.h4
-rw-r--r--include/mupdf/fitz/output-png.h10
-rw-r--r--include/mupdf/fitz/output-pnm.h8
-rw-r--r--include/mupdf/fitz/output-pwg.h8
-rw-r--r--include/mupdf/fitz/output.h47
-rw-r--r--include/mupdf/fitz/path.h10
-rw-r--r--include/mupdf/fitz/pixmap.h17
-rw-r--r--include/mupdf/fitz/shade.h17
-rw-r--r--include/mupdf/fitz/store.h24
-rw-r--r--include/mupdf/fitz/stream.h88
-rw-r--r--include/mupdf/fitz/structured-text.h8
-rw-r--r--include/mupdf/fitz/text.h6
-rw-r--r--include/mupdf/fitz/transition.h2
-rw-r--r--include/mupdf/fitz/tree.h2
-rw-r--r--include/mupdf/fitz/unzip.h4
-rw-r--r--include/mupdf/fitz/write-document.h2
-rw-r--r--include/mupdf/fitz/xml.h4
-rw-r--r--include/mupdf/html.h6
-rw-r--r--include/mupdf/img.h51
-rw-r--r--include/mupdf/pdf/annot.h50
-rw-r--r--include/mupdf/pdf/appearance.h20
-rw-r--r--include/mupdf/pdf/cmap.h4
-rw-r--r--include/mupdf/pdf/crypt.h36
-rw-r--r--include/mupdf/pdf/document.h50
-rw-r--r--include/mupdf/pdf/event.h28
-rw-r--r--include/mupdf/pdf/field.h36
-rw-r--r--include/mupdf/pdf/font.h18
-rw-r--r--include/mupdf/pdf/javascript.h6
-rw-r--r--include/mupdf/pdf/object.h180
-rw-r--r--include/mupdf/pdf/output-pdf.h6
-rw-r--r--include/mupdf/pdf/page.h32
-rw-r--r--include/mupdf/pdf/parse.h16
-rw-r--r--include/mupdf/pdf/resource.h26
-rw-r--r--include/mupdf/pdf/widget.h28
-rw-r--r--include/mupdf/pdf/xref.h86
-rw-r--r--include/mupdf/tiff.h51
-rw-r--r--include/mupdf/xps.h115
-rw-r--r--platform/android/jni/mupdf.c320
-rw-r--r--platform/android/src/com/artifex/mupdfdemo/ReaderView.java2
-rw-r--r--platform/ios/Classes/MuDocRef.m4
-rw-r--r--platform/ios/Classes/MuDocumentController.m2
-rw-r--r--platform/ios/Classes/MuPageViewNormal.m18
-rw-r--r--platform/ios/Classes/MuPageViewReflow.m8
-rw-r--r--platform/ios/Classes/MuPrintPageRenderer.m2
-rw-r--r--platform/ios/common.m6
-rw-r--r--platform/win32/generate.bat1
-rw-r--r--platform/win32/libmupdf.vcproj32
-rw-r--r--platform/windows/gsprint.vcxproj164
-rw-r--r--platform/windows/gsprint/dllmain.cpp19
-rw-r--r--platform/windows/gsprint/gsprint.cpp73
-rw-r--r--platform/windows/gsprint/gsprint.h12
-rw-r--r--platform/windows/gsview/Install32/Install32.vdproj1225
-rw-r--r--platform/windows/gsview/Install64/Install64.vdproj1238
-rw-r--r--platform/windows/gsview/LICENSE66
-rw-r--r--platform/windows/gsview/MainWindow.xaml2
-rw-r--r--platform/windows/gsview/MainWindow.xaml.cs210
-rw-r--r--platform/windows/gsview/PrintControl.xaml247
-rw-r--r--platform/windows/gsview/PrintControl.xaml.cs697
-rw-r--r--platform/windows/gsview/ghostsharp.cs17
-rw-r--r--platform/windows/gsview/gsprint.cs315
-rw-r--r--platform/windows/gsview/gsview.csproj7
-rw-r--r--platform/windows/gsview/mudocument.cs49
-rw-r--r--platform/windows/gsview/nsis/gsview.nsi552
-rw-r--r--platform/windows/libmupdf/libmupdf.vcxproj4
-rw-r--r--platform/windows/libmupdf/libmupdf.vcxproj.filters8
-rw-r--r--platform/windows/libmupdf_winRT.vcxproj4
-rw-r--r--platform/windows/libmupdf_winRT.vcxproj.filters5
-rw-r--r--platform/windows/mupdf.sln152
-rw-r--r--platform/windows/mupdfnet/mupdfnet.cpp12
-rw-r--r--platform/windows/mupdfnet/mupdfnet.h2
-rw-r--r--platform/windows/mupdfwinrt/Cache.cpp14
-rw-r--r--platform/windows/mupdfwinrt/muctx.cpp23
-rw-r--r--platform/windows/mupdfwinrt/muctx.h1
-rw-r--r--platform/windows/mupdfwinrt/mudocument.cpp6
-rw-r--r--platform/x11/curl_stream.c28
-rw-r--r--platform/x11/jstest_main.c2
-rw-r--r--platform/x11/pdfapp.c142
-rw-r--r--platform/x11/win_main.c17
-rw-r--r--platform/x11/x11_main.c2
-rw-r--r--resources/fonts/droid/DroidSans.ttfbin190776 -> 0 bytes
-rw-r--r--resources/fonts/droid/DroidSansMono.ttfbin119380 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusMon-Bol.cffbin28112 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusMon-BolObl.cffbin28868 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusMon-Obl.cffbin25908 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusMon-Reg.cffbin23300 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusMono-Bold.cffbin0 -> 62684 bytes
-rw-r--r--resources/fonts/urw/NimbusMono-BoldOblique.cffbin0 -> 67852 bytes
-rw-r--r--resources/fonts/urw/NimbusMono-Oblique.cffbin0 -> 63536 bytes
-rw-r--r--resources/fonts/urw/NimbusMono-Regular.cffbin0 -> 55996 bytes
-rw-r--r--resources/fonts/urw/NimbusRom-Ita.cffbin23796 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusRom-Med.cffbin21952 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusRom-MedIta.cffbin23144 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusRom-Reg.cffbin22268 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusRomNo9L-Med.cffbin0 -> 63036 bytes
-rw-r--r--resources/fonts/urw/NimbusRomNo9L-MedIta.cffbin0 -> 67203 bytes
-rw-r--r--resources/fonts/urw/NimbusRomNo9L-Reg.cffbin0 -> 60468 bytes
-rw-r--r--resources/fonts/urw/NimbusRomNo9L-RegIta.cffbin0 -> 69073 bytes
-rw-r--r--resources/fonts/urw/NimbusSan-Bol.cffbin17096 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusSan-BolIta.cffbin18536 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusSan-Ita.cffbin18892 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusSan-Reg.cffbin16424 -> 0 bytes
-rw-r--r--resources/fonts/urw/NimbusSanL-Bol.cffbin0 -> 46110 bytes
-rw-r--r--resources/fonts/urw/NimbusSanL-BolIta.cffbin0 -> 50494 bytes
-rw-r--r--resources/fonts/urw/NimbusSanL-Reg.cffbin0 -> 44632 bytes
-rw-r--r--resources/fonts/urw/NimbusSanL-RegIta.cffbin0 -> 50172 bytes
-rw-r--r--scripts/cmapdump.c8
-rw-r--r--source/cbz/mucbz.c197
-rw-r--r--source/cbz/muimg.c183
-rw-r--r--source/cbz/mutiff.c (renamed from source/tiff/mutiff.c)199
-rw-r--r--source/fitz/bbox-device.c184
-rw-r--r--source/fitz/buffer.c4
-rw-r--r--source/fitz/colorspace.c99
-rw-r--r--source/fitz/compressed-buffer.c16
-rw-r--r--source/fitz/context.c38
-rw-r--r--source/fitz/device.c185
-rw-r--r--source/fitz/document.c167
-rw-r--r--source/fitz/draw-device.c741
-rw-r--r--source/fitz/draw-edge.c135
-rw-r--r--source/fitz/draw-glyph.c10
-rw-r--r--source/fitz/draw-imp.h26
-rw-r--r--source/fitz/draw-mesh.c14
-rw-r--r--source/fitz/draw-path.c198
-rw-r--r--source/fitz/draw-scale-simple.c2
-rw-r--r--source/fitz/draw-unpack.c6
-rw-r--r--source/fitz/filter-basic.c183
-rw-r--r--source/fitz/filter-dct.c36
-rw-r--r--source/fitz/filter-fax.c44
-rw-r--r--source/fitz/filter-flate.c28
-rw-r--r--source/fitz/filter-jbig2.c28
-rw-r--r--source/fitz/filter-leech.c22
-rw-r--r--source/fitz/filter-lzw.c38
-rw-r--r--source/fitz/filter-predict.c20
-rw-r--r--source/fitz/font.c45
-rw-r--r--source/fitz/function.c2
-rw-r--r--source/fitz/glyph.c12
-rw-r--r--source/fitz/hash.c10
-rw-r--r--source/fitz/image.c97
-rw-r--r--source/fitz/link.c6
-rw-r--r--source/fitz/list-device.c1666
-rw-r--r--source/fitz/load-png.c99
-rw-r--r--source/fitz/load-tiff.c159
-rw-r--r--source/fitz/outline.c30
-rw-r--r--source/fitz/output-pcl.c110
-rw-r--r--source/fitz/output-pwg.c175
-rw-r--r--source/fitz/output.c81
-rw-r--r--source/fitz/path.c79
-rw-r--r--source/fitz/pixmap.c159
-rw-r--r--source/fitz/shade.c211
-rw-r--r--source/fitz/stext-device.c153
-rw-r--r--source/fitz/stext-output.c172
-rw-r--r--source/fitz/stext-search.c32
-rw-r--r--source/fitz/store.c78
-rw-r--r--source/fitz/stream-open.c43
-rw-r--r--source/fitz/stream-prog.c20
-rw-r--r--source/fitz/stream-read.c47
-rw-r--r--source/fitz/svg-device.c622
-rw-r--r--source/fitz/test-device.c113
-rw-r--r--source/fitz/text.c41
-rw-r--r--source/fitz/trace-device.c56
-rw-r--r--source/fitz/transition.c2
-rw-r--r--source/fitz/tree.c10
-rw-r--r--source/fitz/unzip.c189
-rw-r--r--source/fitz/xml.c58
-rw-r--r--source/html/css-parse.c26
-rw-r--r--source/html/epub-doc.c90
-rw-r--r--source/html/html-doc.c97
-rw-r--r--source/html/html-font.c4
-rw-r--r--source/html/html-layout.c22
-rw-r--r--source/img/muimage.c184
-rw-r--r--source/pdf/js/pdf-js-none.c6
-rw-r--r--source/pdf/js/pdf-js.c138
-rw-r--r--source/pdf/js/pdf-jsimp-mu.c25
-rw-r--r--source/pdf/pdf-annot-edit.c201
-rw-r--r--source/pdf/pdf-annot.c278
-rw-r--r--source/pdf/pdf-appearance.c472
-rw-r--r--source/pdf/pdf-clean.c159
-rw-r--r--source/pdf/pdf-cmap-load.c43
-rw-r--r--source/pdf/pdf-cmap-parse.c34
-rw-r--r--source/pdf/pdf-cmap.c4
-rw-r--r--source/pdf/pdf-colorspace.c107
-rw-r--r--source/pdf/pdf-crypt.c236
-rw-r--r--source/pdf/pdf-device.c666
-rw-r--r--source/pdf/pdf-event.c34
-rw-r--r--source/pdf/pdf-field.c47
-rw-r--r--source/pdf/pdf-font.c282
-rw-r--r--source/pdf/pdf-fontfile.c95
-rw-r--r--source/pdf/pdf-form.c635
-rw-r--r--source/pdf/pdf-function.c213
-rw-r--r--source/pdf/pdf-image.c114
-rw-r--r--source/pdf/pdf-interpret-imp.h13
-rw-r--r--source/pdf/pdf-interpret.c127
-rw-r--r--source/pdf/pdf-lex.c141
-rw-r--r--source/pdf/pdf-nametree.c115
-rw-r--r--source/pdf/pdf-object.c1098
-rw-r--r--source/pdf/pdf-op-buffer.c267
-rw-r--r--source/pdf/pdf-op-filter.c25
-rw-r--r--source/pdf/pdf-op-run.c431
-rw-r--r--source/pdf/pdf-outline.c41
-rw-r--r--source/pdf/pdf-page.c399
-rw-r--r--source/pdf/pdf-parse.c267
-rw-r--r--source/pdf/pdf-pattern.c33
-rw-r--r--source/pdf/pdf-pkcs7.c67
-rw-r--r--source/pdf/pdf-repair.c249
-rw-r--r--source/pdf/pdf-run.c76
-rw-r--r--source/pdf/pdf-shade.c204
-rw-r--r--source/pdf/pdf-store.c37
-rw-r--r--source/pdf/pdf-stream.c332
-rw-r--r--source/pdf/pdf-type3.c80
-rw-r--r--source/pdf/pdf-unicode.c7
-rw-r--r--source/pdf/pdf-write.c980
-rw-r--r--source/pdf/pdf-xobject.c140
-rw-r--r--source/pdf/pdf-xref-aux.c6
-rw-r--r--source/pdf/pdf-xref.c1072
-rw-r--r--source/tools/mjsgen.c14
-rw-r--r--source/tools/mudraw.c174
-rw-r--r--source/tools/pdfclean.c134
-rw-r--r--source/tools/pdfextract.c48
-rw-r--r--source/tools/pdfinfo.c501
-rw-r--r--source/tools/pdfposter.c68
-rw-r--r--source/tools/pdfshow.c54
-rw-r--r--source/xps/xps-common.c56
-rw-r--r--source/xps/xps-doc.c269
-rw-r--r--source/xps/xps-glyphs.c123
-rw-r--r--source/xps/xps-gradient.c100
-rw-r--r--source/xps/xps-image.c50
-rw-r--r--source/xps/xps-outline.c56
-rw-r--r--source/xps/xps-path.c259
-rw-r--r--source/xps/xps-resource.c47
-rw-r--r--source/xps/xps-tile.c131
-rw-r--r--source/xps/xps-util.c12
-rw-r--r--source/xps/xps-zip.c106
m---------thirdparty/mujs0
252 files changed, 13683 insertions, 13566 deletions
diff --git a/Makefile b/Makefile
index d56bc32e..aad26389 100644
--- a/Makefile
+++ b/Makefile
@@ -74,32 +74,23 @@ ALL_DIR += $(OUT)/platform/x11/curl
FITZ_HDR := include/mupdf/fitz.h $(wildcard include/mupdf/fitz/*.h)
PDF_HDR := include/mupdf/pdf.h $(wildcard include/mupdf/pdf/*.h)
XPS_HDR := include/mupdf/xps.h
-CBZ_HDR := include/mupdf/cbz.h
-IMG_HDR := include/mupdf/img.h
HTML_HDR := include/mupdf/html.h
FITZ_SRC := $(wildcard source/fitz/*.c)
PDF_SRC := $(wildcard source/pdf/*.c)
XPS_SRC := $(wildcard source/xps/*.c)
CBZ_SRC := $(wildcard source/cbz/*.c)
-IMG_SRC := $(wildcard source/img/*.c)
-TIFF_SRC := $(wildcard source/tiff/*.c)
HTML_SRC := $(wildcard source/html/*.c)
FITZ_SRC_HDR := $(wildcard source/fitz/*.h)
PDF_SRC_HDR := $(wildcard source/pdf/*.h)
XPS_SRC_HDR := $(wildcard source/xps/*.h)
-CBZ_SRC_HDR := $(wildcard source/cbz/*.h)
-IMG_SRC_HDR := $(wildcard source/img/*.h)
-TIFF_SRC_HDR := $(wildcard source/tiff/*.h)
HTML_SRC_HDR := $(wildcard source/html/*.h)
FITZ_OBJ := $(subst source/, $(OUT)/, $(addsuffix .o, $(basename $(FITZ_SRC))))
PDF_OBJ := $(subst source/, $(OUT)/, $(addsuffix .o, $(basename $(PDF_SRC))))
XPS_OBJ := $(subst source/, $(OUT)/, $(addsuffix .o, $(basename $(XPS_SRC))))
CBZ_OBJ := $(subst source/, $(OUT)/, $(addsuffix .o, $(basename $(CBZ_SRC))))
-IMG_OBJ := $(subst source/, $(OUT)/, $(addsuffix .o, $(basename $(IMG_SRC))))
-TIFF_OBJ := $(subst source/, $(OUT)/, $(addsuffix .o, $(basename $(TIFF_SRC))))
HTML_OBJ := $(subst source/, $(OUT)/, $(addsuffix .o, $(basename $(HTML_SRC))))
# --- Choice of Javascript library ---
@@ -127,16 +118,14 @@ endif
$(FITZ_OBJ) : $(FITZ_HDR) $(FITZ_SRC_HDR)
$(PDF_OBJ) : $(FITZ_HDR) $(PDF_HDR) $(PDF_SRC_HDR)
$(XPS_OBJ) : $(FITZ_HDR) $(XPS_HDR) $(XPS_SRC_HDR)
-$(CBZ_OBJ) : $(FITZ_HDR) $(CBZ_HDR) $(CBZ_SRC_HDR)
-$(IMG_OBJ) : $(FITZ_HDR) $(IMG_HDR) $(IMG_SRC_HDR)
-$(TIFF_OBJ) : $(FITZ_HDR) $(IMG_HDR) $(TIFF_SRC_HDR)
+$(CBZ_OBJ) : $(FITZ_HDR)
$(HTML_OBJ) : $(FITZ_HDR) $(HTML_HDR) $(HTML_SRC_HDR)
# --- Library ---
MUPDF_LIB := $(OUT)/libmupdf.a
-$(MUPDF_LIB) : $(FITZ_OBJ) $(PDF_OBJ) $(XPS_OBJ) $(CBZ_OBJ) $(IMG_OBJ) $(TIFF_OBJ) $(HTML_OBJ)
+$(MUPDF_LIB) : $(FITZ_OBJ) $(PDF_OBJ) $(XPS_OBJ) $(CBZ_OBJ) $(HTML_OBJ)
INSTALL_LIBS := $(MUPDF_LIB)
@@ -183,7 +172,6 @@ CMAP_JAPAN_SRC := $(wildcard resources/cmaps/japan/*)
CMAP_KOREA_SRC := $(wildcard resources/cmaps/korea/*)
FONT_BASE14_SRC := $(wildcard resources/fonts/urw/*.cff)
-FONT_DROID_SRC := resources/fonts/droid/DroidSans.ttf resources/fonts/droid/DroidSansMono.ttf
FONT_CJK_SRC := resources/fonts/droid/DroidSansFallback.ttc
FONT_CJK_FULL_SRC := resources/fonts/droid/DroidSansFallbackFull.ttc
@@ -200,14 +188,12 @@ CMAP_GEN := $(addprefix $(GEN)/, gen_cmap_cns.h gen_cmap_gb.h gen_cmap_japan.h g
$(GEN)/gen_font_base14.h : $(FONT_BASE14_SRC)
$(QUIET_GEN) $(FONTDUMP) $@ $(FONT_BASE14_SRC)
-$(GEN)/gen_font_droid.h : $(FONT_DROID_SRC)
- $(QUIET_GEN) $(FONTDUMP) $@ $(FONT_DROID_SRC)
$(GEN)/gen_font_cjk.h : $(FONT_CJK_SRC)
$(QUIET_GEN) $(FONTDUMP) $@ $(FONT_CJK_SRC)
$(GEN)/gen_font_cjk_full.h : $(FONT_CJK_FULL_SRC)
$(QUIET_GEN) $(FONTDUMP) $@ $(FONT_CJK_FULL_SRC)
-FONT_GEN := $(GEN)/gen_font_base14.h $(GEN)/gen_font_droid.h $(GEN)/gen_font_cjk.h $(GEN)/gen_font_cjk_full.h
+FONT_GEN := $(GEN)/gen_font_base14.h $(GEN)/gen_font_cjk.h $(GEN)/gen_font_cjk_full.h
JAVASCRIPT_SRC := source/pdf/js/pdf-util.js
JAVASCRIPT_GEN := $(GEN)/gen_js_util.h
diff --git a/docs/example.c b/docs/example.c
index 19372d81..bf04c805 100644
--- a/docs/example.c
+++ b/docs/example.c
@@ -93,7 +93,7 @@ render(char *filename, int pagenumber, int zoom, int rotation)
fz_drop_pixmap(ctx, pix);
fz_free_page(doc, page);
- fz_close_document(doc);
+ fz_drop_document(doc);
fz_free_context(ctx);
}
diff --git a/docs/multi-threaded.c b/docs/multi-threaded.c
index 2742fdf8..c5df1f4e 100644
--- a/docs/multi-threaded.c
+++ b/docs/multi-threaded.c
@@ -272,7 +272,7 @@ int main(int argc, char **argv)
// Finally the document is closed and the main thread's
// context is freed.
- fz_close_document(doc);
+ fz_drop_document(doc);
fz_free_context(ctx);
return 0;
diff --git a/include/mupdf/cbz.h b/include/mupdf/cbz.h
deleted file mode 100644
index 5c0f9a66..00000000
--- a/include/mupdf/cbz.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef MUPDF_CBZ_H
-#define MUPDF_CBZ_H
-
-#include "mupdf/fitz.h"
-
-typedef struct cbz_document_s cbz_document;
-typedef struct cbz_page_s cbz_page;
-
-/*
- cbz_open_document: Open a document.
-
- Open a document for reading so the library is able to locate
- objects and pages inside the file.
-
- The returned cbz_document should be used when calling most
- other functions. Note that it wraps the context, so those
- functions implicitly get access to the global state in
- context.
-
- filename: a path to a file as it would be given to open(2).
-*/
-cbz_document *cbz_open_document(fz_context *ctx, const char *filename);
-
-/*
- cbz_open_document_with_stream: Opens a document.
-
- Same as cbz_open_document, but takes a stream instead of a
- filename to locate the document to open. Increments the
- reference count of the stream. See fz_open_file,
- fz_open_file_w or fz_open_fd for opening a stream, and
- fz_close for closing an open stream.
-*/
-cbz_document *cbz_open_document_with_stream(fz_context *ctx, fz_stream *file);
-
-/*
- cbz_close_document: Closes and frees an opened document.
-
- The resource store in the context associated with cbz_document
- is emptied.
-
- Does not throw exceptions.
-*/
-void cbz_close_document(cbz_document *doc);
-
-int cbz_count_pages(cbz_document *doc);
-cbz_page *cbz_load_page(cbz_document *doc, int number);
-fz_rect *cbz_bound_page(cbz_document *doc, cbz_page *page, fz_rect *rect);
-void cbz_free_page(cbz_document *doc, cbz_page *page);
-void cbz_run_page(cbz_document *doc, cbz_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie);
-
-#endif
diff --git a/include/mupdf/fitz/annotation.h b/include/mupdf/fitz/annotation.h
index 13f955e4..122777de 100644
--- a/include/mupdf/fitz/annotation.h
+++ b/include/mupdf/fitz/annotation.h
@@ -38,27 +38,27 @@ typedef enum
/*
fz_get_annot_type: return the type of an annotation
*/
-fz_annot_type fz_get_annot_type(fz_annot *annot);
+fz_annot_type fz_get_annot_type(fz_context *ctx, fz_annot *annot);
/*
fz_first_annot: Return a pointer to the first annotation on a page.
Does not throw exceptions.
*/
-fz_annot *fz_first_annot(fz_document *doc, fz_page *page);
+fz_annot *fz_first_annot(fz_context *ctx, fz_page *page);
/*
fz_next_annot: Return a pointer to the next annotation on a page.
Does not throw exceptions.
*/
-fz_annot *fz_next_annot(fz_document *doc, fz_annot *annot);
+fz_annot *fz_next_annot(fz_context *ctx, fz_page *page, fz_annot *annot);
/*
fz_bound_annot: Return the bounding rectangle of the annotation.
Does not throw exceptions.
*/
-fz_rect *fz_bound_annot(fz_document *doc, fz_annot *annot, fz_rect *rect);
+fz_rect *fz_bound_annot(fz_context *ctx, fz_page *page, fz_annot *annot, fz_rect *rect);
#endif
diff --git a/include/mupdf/fitz/colorspace.h b/include/mupdf/fitz/colorspace.h
index 1572211f..b1b82999 100644
--- a/include/mupdf/fitz/colorspace.h
+++ b/include/mupdf/fitz/colorspace.h
@@ -26,7 +26,7 @@ fz_colorspace *fz_lookup_device_colorspace(fz_context *ctx, char *name);
fz_colorspace_is_indexed: Return true, iff a given colorspace is
indexed.
*/
-int fz_colorspace_is_indexed(fz_colorspace *cs);
+int fz_colorspace_is_indexed(fz_context *ctx, fz_colorspace *cs);
/*
fz_device_gray: Get colorspace representing device specific gray.
@@ -84,7 +84,7 @@ 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_drop_colorspace_imp(fz_context *ctx, fz_storable *colorspace);
void fz_convert_color(fz_context *ctx, fz_colorspace *dsts, float *dstv, fz_colorspace *srcs, const float *srcv);
@@ -100,16 +100,15 @@ typedef struct fz_color_converter_s fz_color_converter;
*/
struct fz_color_converter_s
{
- void (*convert)(fz_color_converter *, float *, const float *);
- fz_context *ctx;
+ void (*convert)(fz_context *, fz_color_converter *, float *, const float *);
fz_colorspace *ds;
fz_colorspace *ss;
void *opaque;
};
-void fz_lookup_color_converter(fz_color_converter *cc, fz_context *ctx, fz_colorspace *ds, fz_colorspace *ss);
+void fz_lookup_color_converter(fz_context *ctx, fz_color_converter *cc, fz_colorspace *ds, fz_colorspace *ss);
void fz_init_cached_color_converter(fz_context *ctx, fz_color_converter *cc, fz_colorspace *ds, fz_colorspace *ss);
-void fz_fin_cached_color_converter(fz_color_converter *cc);
+void fz_fin_cached_color_converter(fz_context *ctx, fz_color_converter *cc);
#endif
diff --git a/include/mupdf/fitz/compressed-buffer.h b/include/mupdf/fitz/compressed-buffer.h
index 384a7744..5139b90d 100644
--- a/include/mupdf/fitz/compressed-buffer.h
+++ b/include/mupdf/fitz/compressed-buffer.h
@@ -76,6 +76,6 @@ struct fz_compressed_buffer_s
fz_buffer *buffer;
};
-void fz_free_compressed_buffer(fz_context *ctx, fz_compressed_buffer *buf);
+void fz_drop_compressed_buffer(fz_context *ctx, fz_compressed_buffer *buf);
#endif
diff --git a/include/mupdf/fitz/context.h b/include/mupdf/fitz/context.h
index dc134511..f694bc39 100644
--- a/include/mupdf/fitz/context.h
+++ b/include/mupdf/fitz/context.h
@@ -131,7 +131,7 @@ enum {
The global state contains an exception stack, resource store,
etc. Most functions in MuPDF take a context argument to be
- able to reference the global state. See fz_free_context for
+ able to reference the global state. See fz_drop_context for
freeing an allocated context.
alloc: Supply a custom memory allocator through a set of
@@ -176,7 +176,7 @@ fz_context *fz_new_context_imp(fz_alloc_context *alloc, fz_locks_context *locks,
fz_context *fz_clone_context(fz_context *ctx);
/*
- fz_free_context: Free a context and its global state.
+ fz_drop_context: Free a context and its global state.
The context and all of its global state is freed, and any
buffered warnings are flushed (see fz_flush_warnings). If NULL
@@ -184,7 +184,7 @@ fz_context *fz_clone_context(fz_context *ctx);
Does not throw exceptions.
*/
-void fz_free_context(fz_context *ctx);
+void fz_drop_context(fz_context *ctx);
/*
fz_aa_level: Get the number of bits of antialiasing we are
@@ -410,7 +410,7 @@ struct fz_warn_context_s
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_drop_aa_context(fz_context *ctx);
void fz_copy_aa_context(fz_context *dst, fz_context *src);
void fz_new_document_handler_context(fz_context *ctx);
@@ -457,4 +457,34 @@ fz_unlock(fz_context *ctx, int lock)
ctx->locks->unlock(ctx->locks->user, lock);
}
+static inline void *
+fz_keep_imp(fz_context *ctx, void *p, int *refs)
+{
+ if (p)
+ {
+ fz_lock(ctx, FZ_LOCK_ALLOC);
+ if (*refs > 0)
+ ++*refs;
+ fz_unlock(ctx, FZ_LOCK_ALLOC);
+ }
+ return p;
+}
+
+static inline int
+fz_drop_imp(fz_context *ctx, void *p, int *refs)
+{
+ if (p)
+ {
+ int drop;
+ fz_lock(ctx, FZ_LOCK_ALLOC);
+ if (*refs > 0)
+ drop = --*refs == 0;
+ else
+ drop = 0;
+ fz_unlock(ctx, FZ_LOCK_ALLOC);
+ return drop;
+ }
+ return 0;
+}
+
#endif
diff --git a/include/mupdf/fitz/device.h b/include/mupdf/fitz/device.h
index ef27cd5d..e8098502 100644
--- a/include/mupdf/fitz/device.h
+++ b/include/mupdf/fitz/device.h
@@ -99,40 +99,36 @@ struct fz_device_s
int hints;
int flags;
- void *user;
- void (*free_user)(fz_device *);
- fz_context *ctx;
+ void (*drop_imp)(fz_context *, fz_device *);
- void (*rebind)(fz_device *);
+ void (*begin_page)(fz_context *, fz_device *, const fz_rect *rect, const fz_matrix *ctm);
+ void (*end_page)(fz_context *, fz_device *);
- void (*begin_page)(fz_device *, const fz_rect *rect, const fz_matrix *ctm);
- void (*end_page)(fz_device *);
+ void (*fill_path)(fz_context *, fz_device *, fz_path *, int even_odd, const fz_matrix *, fz_colorspace *, float *color, float alpha);
+ void (*stroke_path)(fz_context *, fz_device *, fz_path *, fz_stroke_state *, const fz_matrix *, fz_colorspace *, float *color, float alpha);
+ void (*clip_path)(fz_context *, fz_device *, fz_path *, const fz_rect *rect, int even_odd, const fz_matrix *);
+ void (*clip_stroke_path)(fz_context *, fz_device *, fz_path *, const fz_rect *rect, fz_stroke_state *, const fz_matrix *);
- 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_context *, fz_device *, fz_text *, const fz_matrix *, fz_colorspace *, float *color, float alpha);
+ void (*stroke_text)(fz_context *, fz_device *, fz_text *, fz_stroke_state *, const fz_matrix *, fz_colorspace *, float *color, float alpha);
+ void (*clip_text)(fz_context *, fz_device *, fz_text *, const fz_matrix *, int accumulate);
+ void (*clip_stroke_text)(fz_context *, fz_device *, fz_text *, fz_stroke_state *, const fz_matrix *);
+ void (*ignore_text)(fz_context *, fz_device *, fz_text *, 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_context *, fz_device *, fz_shade *shd, const fz_matrix *ctm, float alpha);
+ void (*fill_image)(fz_context *, fz_device *, fz_image *img, const fz_matrix *ctm, float alpha);
+ void (*fill_image_mask)(fz_context *, fz_device *, fz_image *img, const fz_matrix *ctm, fz_colorspace *, float *color, float alpha);
+ void (*clip_image_mask)(fz_context *, fz_device *, fz_image *img, const fz_rect *rect, const fz_matrix *ctm);
- 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_context *, fz_device *);
- void (*pop_clip)(fz_device *);
+ void (*begin_mask)(fz_context *, fz_device *, const fz_rect *, int luminosity, fz_colorspace *, float *bc);
+ void (*end_mask)(fz_context *, fz_device *);
+ void (*begin_group)(fz_context *, fz_device *, const fz_rect *, int isolated, int knockout, int blendmode, float alpha);
+ void (*end_group)(fz_context *, 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 (*begin_tile)(fz_context *, fz_device *, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id);
+ void (*end_tile)(fz_context *, fz_device *);
int error_depth;
char errmess[256];
@@ -143,37 +139,36 @@ struct fz_device_s
fz_rect scissor_accumulator;
};
-void fz_rebind_device(fz_device *dev, fz_context *ctx);
-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);
+void fz_begin_page(fz_context *ctx, fz_device *dev, const fz_rect *rect, const fz_matrix *ctm);
+void fz_end_page(fz_context *ctx, fz_device *dev);
+void fz_fill_path(fz_context *ctx, 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_context *ctx, 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_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm);
+void fz_clip_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm);
+void fz_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
+void fz_stroke_text(fz_context *ctx, 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_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate);
+void fz_clip_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm);
+void fz_ignore_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm);
+void fz_pop_clip(fz_context *ctx, fz_device *dev);
+void fz_fill_shade(fz_context *ctx, fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha);
+void fz_fill_image(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha);
+void fz_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha);
+void fz_clip_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm);
+void fz_begin_mask(fz_context *ctx, fz_device *dev, const fz_rect *area, int luminosity, fz_colorspace *colorspace, float *bc);
+void fz_end_mask(fz_context *ctx, fz_device *dev);
+void fz_begin_group(fz_context *ctx, fz_device *dev, const fz_rect *area, int isolated, int knockout, int blendmode, float alpha);
+void fz_end_group(fz_context *ctx, fz_device *dev);
+void fz_begin_tile(fz_context *ctx, 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_context *ctx, 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_context *ctx, fz_device *dev);
+
+void *fz_new_device(fz_context *ctx, int size);
/*
- fz_free_device: Free a devices of any type and its resources.
+ fz_drop_device: Free a devices of any type and its resources.
*/
-void fz_free_device(fz_device *dev);
+void fz_drop_device(fz_context *ctx, fz_device *dev);
/*
fz_enable_device_hints : Enable hints in a device.
@@ -185,7 +180,7 @@ void fz_free_device(fz_device *dev);
to tell it to ignore shadings. For this you would enable the
FZ_IGNORE_SHADE hint.
*/
-void fz_enable_device_hints(fz_device *dev, int hints);
+void fz_enable_device_hints(fz_context *ctx, fz_device *dev, int hints);
/*
fz_disable_device_hints : Disable hints in a device.
@@ -197,7 +192,7 @@ void fz_enable_device_hints(fz_device *dev, int hints);
enable the capturing of image data too. For this you would disable
the FZ_IGNORE_IMAGE hint.
*/
-void fz_disable_device_hints(fz_device *dev, int hints);
+void fz_disable_device_hints(fz_context *ctx, fz_device *dev, int hints);
enum
{
@@ -304,7 +299,7 @@ fz_device *fz_new_test_device(fz_context *ctx, int *is_color, float threshold);
for how to obtain a pixmap. The pixmap is not cleared by the
draw device, see fz_clear_pixmap* for how to clear it prior to
calling fz_new_draw_device. Free the device by calling
- fz_free_device.
+ fz_drop_device.
*/
fz_device *fz_new_draw_device(fz_context *ctx, fz_pixmap *dest);
@@ -315,7 +310,7 @@ fz_device *fz_new_draw_device(fz_context *ctx, fz_pixmap *dest);
for how to obtain a pixmap. The pixmap is not cleared by the
draw device, see fz_clear_pixmap* for how to clear it prior to
calling fz_new_draw_device. Free the device by calling
- fz_free_device.
+ fz_drop_device.
clip: Bounding box to restrict any marking operations of the
draw device.
diff --git a/include/mupdf/fitz/display-list.h b/include/mupdf/fitz/display-list.h
index 080ca5b5..85346624 100644
--- a/include/mupdf/fitz/display-list.h
+++ b/include/mupdf/fitz/display-list.h
@@ -40,7 +40,7 @@ fz_display_list *fz_new_display_list(fz_context *ctx);
display list can later be reused to render a page many times
without having to re-interpret the page from the document file
for each rendering. Once the device is no longer needed, free
- it with fz_free_device.
+ it with fz_drop_device.
list: A display list that the list device takes ownership of.
*/
@@ -71,7 +71,7 @@ fz_device *fz_new_list_device(fz_context *ctx, fz_display_list *list);
progress information back to the caller. The fields inside
cookie are continually updated while the page is being run.
*/
-void fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *ctm, const fz_rect *area, fz_cookie *cookie);
+void fz_run_display_list(fz_context *ctx, fz_display_list *list, fz_device *dev, const fz_matrix *ctm, const fz_rect *area, fz_cookie *cookie);
/*
fz_keep_display_list: Keep a reference to a display list.
diff --git a/include/mupdf/fitz/document.h b/include/mupdf/fitz/document.h
index c6df79bb..d19b3661 100644
--- a/include/mupdf/fitz/document.h
+++ b/include/mupdf/fitz/document.h
@@ -20,28 +20,44 @@ typedef struct fz_annot_s fz_annot;
// TODO: move out of this interface (it's pdf specific)
typedef struct fz_write_options_s fz_write_options;
-typedef void (fz_document_close_fn)(fz_document *doc);
-typedef int (fz_document_needs_password_fn)(fz_document *doc);
-typedef int (fz_document_authenticate_password_fn)(fz_document *doc, const char *password);
-typedef fz_outline *(fz_document_load_outline_fn)(fz_document *doc);
-typedef void (fz_document_layout_fn)(fz_document *doc, float w, float h, float em);
-typedef int (fz_document_count_pages_fn)(fz_document *doc);
-typedef fz_page *(fz_document_load_page_fn)(fz_document *doc, int number);
-typedef fz_link *(fz_document_load_links_fn)(fz_document *doc, fz_page *page);
-typedef fz_rect *(fz_document_bound_page_fn)(fz_document *doc, fz_page *page, fz_rect *);
-typedef void (fz_document_run_page_contents_fn)(fz_document *doc, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
-typedef void (fz_document_run_annot_fn)(fz_document *doc, fz_page *page, fz_annot *annot, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
-typedef void (fz_document_free_page_fn)(fz_document *doc, fz_page *page);
-typedef int (fz_document_meta_fn)(fz_document *doc, int key, void *ptr, int size);
-typedef fz_transition *(fz_document_page_presentation_fn)(fz_document *doc, fz_page *page, float *duration);
-typedef fz_annot *(fz_document_first_annot_fn)(fz_document *doc, fz_page *page);
-typedef fz_annot *(fz_document_next_annot_fn)(fz_document *doc, fz_annot *annot);
-typedef fz_rect *(fz_document_bound_annot_fn)(fz_document *doc, fz_annot *annot, fz_rect *rect);
-typedef void (fz_document_write_fn)(fz_document *doc, char *filename, fz_write_options *opts);
-typedef void (fz_document_rebind_fn)(fz_document *doc, fz_context *ctx);
+typedef void (fz_document_close_fn)(fz_context *ctx, fz_document *doc);
+typedef int (fz_document_needs_password_fn)(fz_context *ctx, fz_document *doc);
+typedef int (fz_document_authenticate_password_fn)(fz_context *ctx, fz_document *doc, const char *password);
+typedef fz_outline *(fz_document_load_outline_fn)(fz_context *ctx, fz_document *doc);
+typedef void (fz_document_layout_fn)(fz_context *ctx, fz_document *doc, float w, float h, float em);
+typedef int (fz_document_count_pages_fn)(fz_context *ctx, fz_document *doc);
+typedef fz_page *(fz_document_load_page_fn)(fz_context *ctx, fz_document *doc, int number);
+typedef int (fz_document_meta_fn)(fz_context *ctx, fz_document *doc, int key, void *ptr, int size);
+typedef void (fz_document_write_fn)(fz_context *ctx, fz_document *doc, char *filename, fz_write_options *opts);
+
+typedef fz_link *(fz_page_load_links_fn)(fz_context *ctx, fz_page *page);
+typedef fz_rect *(fz_page_bound_page_fn)(fz_context *ctx, fz_page *page, fz_rect *);
+typedef void (fz_page_run_page_contents_fn)(fz_context *ctx, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
+typedef void (fz_page_drop_page_imp_fn)(fz_context *ctx, fz_page *page);
+typedef fz_transition *(fz_page_page_presentation_fn)(fz_context *ctx, fz_page *page, float *duration);
+
+typedef fz_annot *(fz_page_first_annot_fn)(fz_context *ctx, fz_page *page);
+typedef fz_annot *(fz_page_next_annot_fn)(fz_context *ctx, fz_page *page, fz_annot *annot);
+typedef fz_rect *(fz_page_bound_annot_fn)(fz_context *ctx, fz_page *page, fz_annot *annot, fz_rect *rect);
+typedef void (fz_page_run_annot_fn)(fz_context *ctx, fz_page *page, fz_annot *annot, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
+
+struct fz_page_s
+{
+ int refs;
+ fz_page_drop_page_imp_fn *drop_page_imp;
+ fz_page_bound_page_fn *bound_page;
+ fz_page_run_page_contents_fn *run_page_contents;
+ fz_page_load_links_fn *load_links;
+ fz_page_first_annot_fn *first_annot;
+ fz_page_next_annot_fn *next_annot;
+ fz_page_bound_annot_fn *bound_annot;
+ fz_page_run_annot_fn *run_annot;
+ fz_page_page_presentation_fn *page_presentation;
+};
struct fz_document_s
{
+ int refs;
fz_document_close_fn *close;
fz_document_needs_password_fn *needs_password;
fz_document_authenticate_password_fn *authenticate_password;
@@ -49,18 +65,8 @@ struct fz_document_s
fz_document_layout_fn *layout;
fz_document_count_pages_fn *count_pages;
fz_document_load_page_fn *load_page;
- fz_document_load_links_fn *load_links;
- fz_document_bound_page_fn *bound_page;
- fz_document_run_page_contents_fn *run_page_contents;
- fz_document_run_annot_fn *run_annot;
- fz_document_free_page_fn *free_page;
fz_document_meta_fn *meta;
- fz_document_page_presentation_fn *page_presentation;
- fz_document_first_annot_fn *first_annot;
- fz_document_next_annot_fn *next_annot;
- fz_document_bound_annot_fn *bound_annot;
fz_document_write_fn *write;
- fz_document_rebind_fn *rebind;
};
typedef fz_document *(fz_document_open_fn)(fz_context *ctx, const char *filename);
@@ -115,14 +121,22 @@ fz_document *fz_open_document(fz_context *ctx, const char *filename);
fz_document *fz_open_document_with_stream(fz_context *ctx, const char *magic, fz_stream *stream);
/*
- fz_close_document: Close and free an open document.
+ fz_new_document: Create and initialize a document struct.
+*/
+void *fz_new_document(fz_context *ctx, int size);
+
+/*
+ fz_drop_document: Release an open document.
The resource store in the context associated with fz_document
- is emptied, and any allocations for the document are freed.
+ is emptied, and any allocations for the document are freed when
+ the last reference is dropped.
Does not throw exceptions.
*/
-void fz_close_document(fz_document *doc);
+void fz_drop_document(fz_context *ctx, fz_document *doc);
+
+fz_document *fz_keep_document(fz_context *ctx, fz_document *doc);
/*
fz_needs_password: Check if a document is encrypted with a
@@ -130,7 +144,7 @@ void fz_close_document(fz_document *doc);
Does not throw exceptions.
*/
-int fz_needs_password(fz_document *doc);
+int fz_needs_password(fz_context *ctx, fz_document *doc);
/*
fz_authenticate_password: Test if the given password can
@@ -142,14 +156,14 @@ int fz_needs_password(fz_document *doc);
Does not throw exceptions.
*/
-int fz_authenticate_password(fz_document *doc, const char *password);
+int fz_authenticate_password(fz_context *ctx, fz_document *doc, const char *password);
/*
fz_load_outline: Load the hierarchical document outline.
- Should be freed by fz_free_outline.
+ Should be freed by fz_drop_outline.
*/
-fz_outline *fz_load_outline(fz_document *doc);
+fz_outline *fz_load_outline(fz_context *ctx, fz_document *doc);
/*
fz_layout_document: Layout reflowable document types.
@@ -157,25 +171,25 @@ fz_outline *fz_load_outline(fz_document *doc);
w, h: Page size in points.
em: Default font size in points.
*/
-void fz_layout_document(fz_document *doc, float w, float h, float em);
+void fz_layout_document(fz_context *ctx, fz_document *doc, float w, float h, float em);
/*
fz_count_pages: Return the number of pages in document
May return 0 for documents with no pages.
*/
-int fz_count_pages(fz_document *doc);
+int fz_count_pages(fz_context *ctx, fz_document *doc);
/*
fz_load_page: Load a page.
After fz_load_page is it possible to retrieve the size of the
page using fz_bound_page, or to render the page using
- fz_run_page_*. Free the page by calling fz_free_page.
+ fz_run_page_*. Free the page by calling fz_drop_page.
number: page number, 0 is the first page of the document.
*/
-fz_page *fz_load_page(fz_document *doc, int number);
+fz_page *fz_load_page(fz_context *ctx, fz_document *doc, int number);
/*
fz_load_links: Load the list of links for a page.
@@ -187,14 +201,19 @@ fz_page *fz_load_page(fz_document *doc, int number);
page: Page obtained from fz_load_page.
*/
-fz_link *fz_load_links(fz_document *doc, fz_page *page);
+fz_link *fz_load_links(fz_context *ctx, fz_page *page);
+
+/*
+ fz_new_page: Create and initialize a page struct.
+*/
+void *fz_new_page(fz_context *ctx, int size);
/*
fz_bound_page: Determine the size of a page at 72 dpi.
Does not throw exceptions.
*/
-fz_rect *fz_bound_page(fz_document *doc, fz_page *page, fz_rect *rect);
+fz_rect *fz_bound_page(fz_context *ctx, fz_page *page, fz_rect *rect);
/*
fz_run_page: Run a page through a device.
@@ -215,7 +234,7 @@ fz_rect *fz_bound_page(fz_document *doc, fz_page *page, fz_rect *rect);
fields inside cookie are continually updated while the page is
rendering.
*/
-void fz_run_page(fz_document *doc, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
+void fz_run_page(fz_context *ctx, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
/*
fz_run_page_contents: Run a page through a device. Just the main
@@ -237,7 +256,7 @@ void fz_run_page(fz_document *doc, fz_page *page, fz_device *dev, const fz_matri
fields inside cookie are continually updated while the page is
rendering.
*/
-void fz_run_page_contents(fz_document *doc, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
+void fz_run_page_contents(fz_context *ctx, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
/*
fz_run_annot: Run an annotation through a device.
@@ -260,14 +279,14 @@ void fz_run_page_contents(fz_document *doc, fz_page *page, fz_device *dev, const
fields inside cookie are continually updated while the page is
rendering.
*/
-void fz_run_annot(fz_document *doc, fz_page *page, fz_annot *annot, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
+void fz_run_annot(fz_context *ctx, fz_page *page, fz_annot *annot, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
/*
- fz_free_page: Free a loaded page.
+ fz_drop_page: Free a loaded page.
Does not throw exceptions.
*/
-void fz_free_page(fz_document *doc, fz_page *page);
+void fz_drop_page(fz_context *ctx, fz_page *page);
/*
fz_page_presentation: Get the presentation details for a given page.
@@ -280,8 +299,6 @@ void fz_free_page(fz_document *doc, fz_page *page);
Does not throw exceptions.
*/
-fz_transition *fz_page_presentation(fz_document *doc, fz_page *page, float *duration);
-
-void fz_rebind_document(fz_document *doc, fz_context *ctx);
+fz_transition *fz_page_presentation(fz_context *ctx, fz_page *page, float *duration);
#endif
diff --git a/include/mupdf/fitz/filter.h b/include/mupdf/fitz/filter.h
index d8a6729f..f200d8c1 100644
--- a/include/mupdf/fitz/filter.h
+++ b/include/mupdf/fitz/filter.h
@@ -9,25 +9,25 @@
typedef struct fz_jbig2_globals_s fz_jbig2_globals;
-fz_stream *fz_open_copy(fz_stream *chain);
-fz_stream *fz_open_null(fz_stream *chain, int len, int offset);
+fz_stream *fz_open_copy(fz_context *ctx, fz_stream *chain);
+fz_stream *fz_open_null(fz_context *ctx, 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, int l2factor, fz_stream *jpegtables);
-fz_stream *fz_open_faxd(fz_stream *chain,
+void fz_concat_push(fz_context *ctx, fz_stream *concat, fz_stream *chain); /* Ownership of chain is passed in */
+fz_stream *fz_open_arc4(fz_context *ctx, fz_stream *chain, unsigned char *key, unsigned keylen);
+fz_stream *fz_open_aesd(fz_context *ctx, fz_stream *chain, unsigned char *key, unsigned keylen);
+fz_stream *fz_open_a85d(fz_context *ctx, fz_stream *chain);
+fz_stream *fz_open_ahxd(fz_context *ctx, fz_stream *chain);
+fz_stream *fz_open_rld(fz_context *ctx, fz_stream *chain);
+fz_stream *fz_open_dctd(fz_context *ctx, fz_stream *chain, int color_transform, int l2factor, fz_stream *jpegtables);
+fz_stream *fz_open_faxd(fz_context *ctx, 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, int window_bits);
-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_jbig2_globals *globals);
+fz_stream *fz_open_flated(fz_context *ctx, fz_stream *chain, int window_bits);
+fz_stream *fz_open_lzwd(fz_context *ctx, fz_stream *chain, int early_change);
+fz_stream *fz_open_predict(fz_context *ctx, fz_stream *chain, int predictor, int columns, int colors, int bpc);
+fz_stream *fz_open_jbig2d(fz_context *ctx, fz_stream *chain, fz_jbig2_globals *globals);
fz_jbig2_globals *fz_load_jbig2_globals(fz_context *ctx, unsigned char *data, int size);
-void fz_free_jbig2_globals_imp(fz_context *ctx, fz_storable *globals);
+void fz_drop_jbig2_globals_imp(fz_context *ctx, fz_storable *globals);
#endif
diff --git a/include/mupdf/fitz/font.h b/include/mupdf/fitz/font.h
index a36909d1..6c02bc60 100644
--- a/include/mupdf/fitz/font.h
+++ b/include/mupdf/fitz/font.h
@@ -46,8 +46,8 @@ struct fz_font_s
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, struct fz_device_s *dev, const fz_matrix *ctm, void *gstate, int nestedDepth);
- void (*t3freeres)(void *doc, void *resources);
+ void (*t3run)(fz_context *ctx, void *doc, void *resources, fz_buffer *contents, struct fz_device_s *dev, const fz_matrix *ctm, void *gstate, int nestedDepth);
+ void (*t3freeres)(fz_context *ctx, void *doc, void *resources);
fz_rect bbox; /* font bbox is used only for t3 fonts */
diff --git a/include/mupdf/fitz/function.h b/include/mupdf/fitz/function.h
index b623172c..005cef3f 100644
--- a/include/mupdf/fitz/function.h
+++ b/include/mupdf/fitz/function.h
@@ -15,9 +15,9 @@ typedef struct fz_function_s fz_function;
void fz_eval_function(fz_context *ctx, fz_function *func, const 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);
+unsigned int fz_function_size(fz_context *ctx, fz_function *func);
#ifndef NDEBUG
-void pdf_debug_function(fz_function *func);
+void pdf_debug_function(fz_context *ctx, fz_function *func);
#endif
enum
@@ -34,7 +34,7 @@ struct fz_function_s
int n; /* number of output values */
void (*evaluate)(fz_context *ctx, fz_function *func, const float *in, float *out);
#ifndef NDEBUG
- void (*debug)(fz_function *func);
+ void (*debug)(fz_context *ctx, fz_function *func);
#endif
};
diff --git a/include/mupdf/fitz/glyph-cache.h b/include/mupdf/fitz/glyph-cache.h
index 96413702..28fcf416 100644
--- a/include/mupdf/fitz/glyph-cache.h
+++ b/include/mupdf/fitz/glyph-cache.h
@@ -33,6 +33,6 @@ fz_pixmap *fz_render_stroked_glyph_pixmap(fz_context *ctx, fz_font*, int, fz_mat
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);
void fz_dump_glyph_cache_stats(fz_context *ctx);
-float fz_subpixel_adjust(fz_matrix *ctm, fz_matrix *subpix_ctm, unsigned char *qe, unsigned char *qf);
+float fz_subpixel_adjust(fz_context *ctx, fz_matrix *ctm, fz_matrix *subpix_ctm, unsigned char *qe, unsigned char *qf);
#endif
diff --git a/include/mupdf/fitz/hash.h b/include/mupdf/fitz/hash.h
index f70e9693..c56c9d13 100644
--- a/include/mupdf/fitz/hash.h
+++ b/include/mupdf/fitz/hash.h
@@ -12,7 +12,7 @@ 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_drop_hash(fz_context *ctx, fz_hash_table *table);
void *fz_hash_find(fz_context *ctx, fz_hash_table *table, const void *key);
void *fz_hash_insert(fz_context *ctx, fz_hash_table *table, const void *key, void *val);
diff --git a/include/mupdf/fitz/image.h b/include/mupdf/fitz/image.h
index 42b45508..3d40cb1d 100644
--- a/include/mupdf/fitz/image.h
+++ b/include/mupdf/fitz/image.h
@@ -57,7 +57,7 @@ fz_image *fz_new_image_from_pixmap(fz_context *ctx, fz_pixmap *pixmap, fz_image
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);
+void fz_drop_image_imp(fz_context *ctx, fz_storable *image);
fz_pixmap *fz_decomp_image_from_stream(fz_context *ctx, fz_stream *stm, fz_image *image, int indexed, int l2factor, int native_l2factor);
fz_pixmap *fz_expand_indexed_pixmap(fz_context *ctx, fz_pixmap *src);
@@ -93,4 +93,6 @@ void fz_load_jxr_info(fz_context *ctx, unsigned char *data, int size, int *w, in
int fz_load_tiff_subimage_count(fz_context *ctx, unsigned char *buf, int len);
fz_pixmap *fz_load_tiff_subimage(fz_context *ctx, unsigned char *buf, int len, int subimage);
+void fz_image_get_sanitised_res(fz_image *image, int *xres, int *yres);
+
#endif
diff --git a/include/mupdf/fitz/link.h b/include/mupdf/fitz/link.h
index 47648a4c..586a5aa2 100644
--- a/include/mupdf/fitz/link.h
+++ b/include/mupdf/fitz/link.h
@@ -173,6 +173,6 @@ fz_link *fz_keep_link(fz_context *ctx, fz_link *link);
*/
void fz_drop_link(fz_context *ctx, fz_link *link);
-void fz_free_link_dest(fz_context *ctx, fz_link_dest *dest);
+void fz_drop_link_dest(fz_context *ctx, fz_link_dest *dest);
#endif
diff --git a/include/mupdf/fitz/meta.h b/include/mupdf/fitz/meta.h
index 456d708d..8075c3c6 100644
--- a/include/mupdf/fitz/meta.h
+++ b/include/mupdf/fitz/meta.h
@@ -30,7 +30,7 @@
always means "unknown operation for this document". In general
FZ_META_OK should be used to indicate successful operation.
*/
-int fz_meta(fz_document *doc, int key, void *ptr, int size);
+int fz_meta(fz_context *ctx, fz_document *doc, int key, void *ptr, int size);
enum
{
diff --git a/include/mupdf/fitz/outline.h b/include/mupdf/fitz/outline.h
index 48718be7..6a3ca81a 100644
--- a/include/mupdf/fitz/outline.h
+++ b/include/mupdf/fitz/outline.h
@@ -55,12 +55,12 @@ void fz_print_outline_xml(fz_context *ctx, fz_output *out, fz_outline *outline);
void fz_print_outline(fz_context *ctx, fz_output *out, fz_outline *outline);
/*
- fz_free_outline: Free hierarchical outline.
+ fz_drop_outline: Free hierarchical outline.
Free an outline obtained from fz_load_outline.
Does not throw exceptions.
*/
-void fz_free_outline(fz_context *ctx, fz_outline *outline);
+void fz_drop_outline(fz_context *ctx, fz_outline *outline);
#endif
diff --git a/include/mupdf/fitz/output-pcl.h b/include/mupdf/fitz/output-pcl.h
index 215c3883..778b31fb 100644
--- a/include/mupdf/fitz/output-pcl.h
+++ b/include/mupdf/fitz/output-pcl.h
@@ -89,9 +89,9 @@ void fz_pcl_preset(fz_context *ctx, fz_pcl_options *opts, const char *preset);
*/
void fz_pcl_option(fz_context *ctx, fz_pcl_options *opts, const char *option, int val);
-void fz_output_pcl(fz_output *out, const fz_pixmap *pixmap, fz_pcl_options *pcl);
+void fz_output_pcl(fz_context *ctx, fz_output *out, const fz_pixmap *pixmap, fz_pcl_options *pcl);
-void fz_output_pcl_bitmap(fz_output *out, const fz_bitmap *bitmap, fz_pcl_options *pcl);
+void fz_output_pcl_bitmap(fz_context *ctx, fz_output *out, const fz_bitmap *bitmap, fz_pcl_options *pcl);
void fz_write_pcl(fz_context *ctx, fz_pixmap *pixmap, char *filename, int append, fz_pcl_options *pcl);
diff --git a/include/mupdf/fitz/output-png.h b/include/mupdf/fitz/output-png.h
index 55c9a3fa..63c167e9 100644
--- a/include/mupdf/fitz/output-png.h
+++ b/include/mupdf/fitz/output-png.h
@@ -20,7 +20,7 @@ void fz_write_png(fz_context *ctx, fz_pixmap *pixmap, char *filename, int saveal
/*
Output a pixmap to an output stream as a png.
*/
-void fz_output_png(fz_output *out, const fz_pixmap *pixmap, int savealpha);
+void fz_output_png(fz_context *ctx, fz_output *out, const fz_pixmap *pixmap, int savealpha);
/*
Get an image as a png in a buffer.
@@ -31,10 +31,8 @@ fz_buffer *fz_new_png_from_pixmap(fz_context *ctx, fz_pixmap *pixmap);
typedef struct fz_png_output_context_s fz_png_output_context;
-fz_png_output_context *fz_output_png_header(fz_output *out, int w, int h, int n, int savealpha);
-
-void fz_output_png_band(fz_output *out, int w, int h, int n, int band, int bandheight, unsigned char *samples, int savealpha, fz_png_output_context *poc);
-
-void fz_output_png_trailer(fz_output *out, fz_png_output_context *poc);
+fz_png_output_context *fz_output_png_header(fz_context *ctx, fz_output *out, int w, int h, int n, int savealpha);
+void fz_output_png_band(fz_context *ctx, fz_output *out, int w, int h, int n, int band, int bandheight, unsigned char *samples, int savealpha, fz_png_output_context *poc);
+void fz_output_png_trailer(fz_context *ctx, fz_output *out, fz_png_output_context *poc);
#endif
diff --git a/include/mupdf/fitz/output-pnm.h b/include/mupdf/fitz/output-pnm.h
index 0c949a68..54e8355c 100644
--- a/include/mupdf/fitz/output-pnm.h
+++ b/include/mupdf/fitz/output-pnm.h
@@ -14,8 +14,8 @@
*/
void fz_write_pnm(fz_context *ctx, fz_pixmap *pixmap, char *filename);
-void fz_output_pnm_header(fz_output *out, int w, int h, int n);
-void fz_output_pnm_band(fz_output *out, int w, int h, int n, int band, int bandheight, unsigned char *p);
+void fz_output_pnm_header(fz_context *ctx, fz_output *out, int w, int h, int n);
+void fz_output_pnm_band(fz_context *ctx, fz_output *out, int w, int h, int n, int band, int bandheight, unsigned char *p);
/*
fz_write_pam: Save a pixmap as a pam
@@ -24,8 +24,8 @@ void fz_output_pnm_band(fz_output *out, int w, int h, int n, int band, int bandh
*/
void fz_write_pam(fz_context *ctx, fz_pixmap *pixmap, char *filename, int savealpha);
-void fz_output_pam_header(fz_output *out, int w, int h, int n, int savealpha);
-void fz_output_pam_band(fz_output *out, int w, int h, int n, int band, int bandheight, unsigned char *sp, int savealpha);
+void fz_output_pam_header(fz_context *ctx, fz_output *out, int w, int h, int n, int savealpha);
+void fz_output_pam_band(fz_context *ctx, fz_output *out, int w, int h, int n, int band, int bandheight, unsigned char *sp, int savealpha);
/*
fz_write_pbm: Save a bitmap as a pbm
diff --git a/include/mupdf/fitz/output-pwg.h b/include/mupdf/fitz/output-pwg.h
index 6d5758e4..d2bb4a1f 100644
--- a/include/mupdf/fitz/output-pwg.h
+++ b/include/mupdf/fitz/output-pwg.h
@@ -78,21 +78,21 @@ void fz_write_pwg_bitmap(fz_context *ctx, fz_bitmap *bitmap, char *filename, int
/*
Output a pixmap to an output stream as a pwg raster.
*/
-void fz_output_pwg(fz_output *out, const fz_pixmap *pixmap, const fz_pwg_options *pwg);
+void fz_output_pwg(fz_context *ctx, fz_output *out, const fz_pixmap *pixmap, const fz_pwg_options *pwg);
/*
Output the file header to a pwg stream, ready for pages to follow it.
*/
-void fz_output_pwg_file_header(fz_output *out);
+void fz_output_pwg_file_header(fz_context *ctx, fz_output *out);
/*
Output a page to a pwg stream to follow a header, or other pages.
*/
-void fz_output_pwg_page(fz_output *out, const fz_pixmap *pixmap, const fz_pwg_options *pwg);
+void fz_output_pwg_page(fz_context *ctx, fz_output *out, const fz_pixmap *pixmap, const fz_pwg_options *pwg);
/*
Output a bitmap page to a pwg stream to follow a header, or other pages.
*/
-void fz_output_pwg_bitmap_page(fz_output *out, const fz_bitmap *bitmap, const fz_pwg_options *pwg);
+void fz_output_pwg_bitmap_page(fz_context *ctx, fz_output *out, const fz_bitmap *bitmap, const fz_pwg_options *pwg);
#endif
diff --git a/include/mupdf/fitz/output.h b/include/mupdf/fitz/output.h
index 5bbf3d92..ea87a2ff 100644
--- a/include/mupdf/fitz/output.h
+++ b/include/mupdf/fitz/output.h
@@ -11,21 +11,12 @@
*/
typedef struct fz_output_s fz_output;
-struct fz_output_s
-{
- fz_context *ctx;
- void *opaque;
- int (*printf)(fz_output *, const char *, va_list ap);
- int (*write)(fz_output *, const void *, int n);
- void (*close)(fz_output *);
-};
-
/*
fz_new_output_with_file: Open an output stream onto a FILE *.
The stream does NOT take ownership of the FILE *.
*/
-fz_output *fz_new_output_with_file(fz_context *, FILE *);
+fz_output *fz_new_output_with_file(fz_context *, FILE *, int close);
/*
fz_new_output_to_filename: Open an output stream to a filename.
@@ -42,35 +33,33 @@ fz_output *fz_new_output_with_buffer(fz_context *, fz_buffer *);
/*
fz_printf: fprintf equivalent for output streams.
*/
-int fz_printf(fz_output *, const char *, ...);
+int fz_printf(fz_context *, fz_output *, const char *, ...);
/*
fz_puts: fputs equivalent for output streams.
*/
-int fz_puts(fz_output *, const char *);
+int fz_puts(fz_context *, fz_output *, const char *);
/*
fz_write: fwrite equivalent for output streams.
*/
-int fz_write(fz_output *out, const void *data, int len);
+int fz_write(fz_context *, fz_output *out, const void *data, int len);
/*
fz_putc: putc equivalent for output streams.
*/
-void fz_putc(fz_output *out, char c);
+void fz_putc(fz_context *, fz_output *out, char c);
/*
- fz_close_output: Close a previously opened fz_output stream.
+ fz_drop_output: Close a previously opened fz_output stream.
Note: whether or not this closes the underlying output method is
method dependent. FILE * streams created by fz_new_output_with_file
are NOT closed.
*/
-void fz_close_output(fz_output *);
-
-void fz_rebind_output(fz_output *, fz_context *ctx);
+void fz_drop_output(fz_context *, fz_output *);
-static inline int fz_write_int32be(fz_output *out, int x)
+static inline int fz_write_int32be(fz_context *ctx, fz_output *out, int x)
{
char data[4];
@@ -79,18 +68,24 @@ static inline int fz_write_int32be(fz_output *out, int x)
data[2] = x>>8;
data[3] = x;
- return fz_write(out, data, 4);
+ return fz_write(ctx, out, data, 4);
}
static inline void
-fz_write_byte(fz_output *out, int x)
+fz_write_byte(fz_context *ctx, fz_output *out, int x)
{
char data = x;
- fz_write(out, &data, 1);
+ fz_write(ctx, out, &data, 1);
}
/*
+ fz_vfprintf: Our customised vfprintf routine. Same supported
+ format specifiers as for fz_vsnprintf.
+*/
+int fz_vfprintf(fz_context *ctx, FILE *file, const char *fmt, va_list ap);
+
+/*
fz_vsnprintf: Our customised vsnprintf routine. Takes %c, %d, %o, %s, %x, as usual.
Modifiers are not supported except for zero-padding ints (e.g. %02d, %03o, %04x, etc).
%f and %g both output in "as short as possible hopefully lossless non-exponent" form,
@@ -100,14 +95,6 @@ fz_write_byte(fz_output *out, int x)
%q and %( output escaped strings in C/PDF syntax.
*/
int fz_vsnprintf(char *buffer, int space, const char *fmt, va_list args);
-
-/*
- fz_vfprintf: Our customised vfprintf routine. Same supported
- format specifiers as for fz_vsnprintf.
-*/
-int fz_vfprintf(fz_context *ctx, FILE *file, const char *fmt, va_list ap);
-
-
int fz_snprintf(char *buffer, int space, const char *fmt, ...);
#endif
diff --git a/include/mupdf/fitz/path.h b/include/mupdf/fitz/path.h
index 9b32b8d3..23dc0838 100644
--- a/include/mupdf/fitz/path.h
+++ b/include/mupdf/fitz/path.h
@@ -43,6 +43,7 @@ typedef enum fz_linejoin_e
struct fz_path_s
{
+ int refs;
int cmd_len, cmd_cap;
unsigned char *cmds;
int coord_len, coord_cap;
@@ -65,6 +66,10 @@ struct fz_stroke_state_s
};
fz_path *fz_new_path(fz_context *ctx);
+fz_path *fz_keep_path(fz_context *ctx, fz_path *path);
+void fz_drop_path(fz_context *ctx, fz_path *path);
+void fz_trim_path(fz_context *ctx, fz_path *path);
+
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);
@@ -72,14 +77,11 @@ 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_rect *fz_adjust_rect_for_stroke(fz_context *ctx, fz_rect *r, const fz_stroke_state *stroke, const fz_matrix *ctm);
extern const fz_stroke_state fz_default_stroke_state;
diff --git a/include/mupdf/fitz/pixmap.h b/include/mupdf/fitz/pixmap.h
index 800effd0..d169ea8e 100644
--- a/include/mupdf/fitz/pixmap.h
+++ b/include/mupdf/fitz/pixmap.h
@@ -207,7 +207,7 @@ void fz_tint_pixmap(fz_context *ctx, fz_pixmap *pix, int r, int g, int b);
Does not throw exceptions.
*/
-void fz_invert_pixmap_rect(fz_pixmap *image, const fz_irect *rect);
+void fz_invert_pixmap_rect(fz_context *ctx, fz_pixmap *image, const fz_irect *rect);
/*
fz_gamma_pixmap: Apply gamma correction to a pixmap. All components
@@ -267,8 +267,7 @@ void fz_convert_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src);
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.
+ If non-zero the buffer will be freed along with the the pixmap.
*/
struct fz_pixmap_s
{
@@ -281,7 +280,7 @@ struct fz_pixmap_s
int free_samples;
};
-void fz_free_pixmap_imp(fz_context *ctx, fz_storable *pix);
+void fz_drop_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);
@@ -293,21 +292,21 @@ fz_pixmap *fz_scale_pixmap(fz_context *ctx, fz_pixmap *src, float x, float y, fl
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);
+void fz_drop_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);
-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_decode_tile(fz_context *ctx, fz_pixmap *pix, float *decode);
+void fz_decode_indexed_tile(fz_context *ctx, fz_pixmap *pix, float *decode, int maxval);
+void fz_unpack_tile(fz_context *ctx, fz_pixmap *dst, unsigned char * restrict src, int n, int depth, int stride, int scale);
/*
fz_md5_pixmap: Return the md5 digest for a pixmap
*/
-void fz_md5_pixmap(fz_pixmap *pixmap, unsigned char digest[16]);
+void fz_md5_pixmap(fz_context *ctx, fz_pixmap *pixmap, unsigned char digest[16]);
fz_pixmap *fz_new_pixmap_from_8bpp_data(fz_context *ctx, int x, int y, int w, int h, unsigned char *sp, int span);
fz_pixmap *fz_new_pixmap_from_1bpp_data(fz_context *ctx, int x, int y, int w, int h, unsigned char *sp, int span);
diff --git a/include/mupdf/fitz/shade.h b/include/mupdf/fitz/shade.h
index 3cd43bd7..55e8767b 100644
--- a/include/mupdf/fitz/shade.h
+++ b/include/mupdf/fitz/shade.h
@@ -74,7 +74,7 @@ struct fz_shade_s
fz_shade *fz_keep_shade(fz_context *ctx, fz_shade *shade);
void fz_drop_shade(fz_context *ctx, fz_shade *shade);
-void fz_free_shade_imp(fz_context *ctx, fz_storable *shade);
+void fz_drop_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);
@@ -90,19 +90,8 @@ struct fz_vertex_s
float c[FZ_MAX_COLORS];
};
-typedef struct fz_mesh_processor_s fz_mesh_processor;
-
-typedef void (fz_mesh_prepare_fn)(void *arg, fz_vertex *v, const float *c);
-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_prepare_fn *prepare;
- fz_mesh_process_fn *process;
- void *process_arg;
- int ncomp;
-};
+typedef void (fz_mesh_prepare_fn)(fz_context *ctx, void *arg, fz_vertex *v, const float *c);
+typedef void (fz_mesh_process_fn)(fz_context *ctx, void *arg, fz_vertex *av, fz_vertex *bv, fz_vertex *cv);
void fz_process_mesh(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm,
fz_mesh_prepare_fn *prepare, fz_mesh_process_fn *process, void *process_arg);
diff --git a/include/mupdf/fitz/store.h b/include/mupdf/fitz/store.h
index f954e3b8..49e3cc17 100644
--- a/include/mupdf/fitz/store.h
+++ b/include/mupdf/fitz/store.h
@@ -27,16 +27,16 @@
typedef struct fz_storable_s fz_storable;
-typedef void (fz_store_free_fn)(fz_context *, fz_storable *);
+typedef void (fz_store_drop_fn)(fz_context *, fz_storable *);
struct fz_storable_s {
int refs;
- fz_store_free_fn *free;
+ fz_store_drop_fn *drop;
};
-#define FZ_INIT_STORABLE(S_,RC,FREE) \
+#define FZ_INIT_STORABLE(S_,RC,DROP) \
do { fz_storable *S = &(S_)->storable; S->refs = (RC); \
- S->free = (FREE); \
+ S->drop = (DROP); \
} while (0)
void *fz_keep_storable(fz_context *, fz_storable *);
@@ -62,7 +62,7 @@ typedef struct fz_store_hash_s fz_store_hash;
struct fz_store_hash_s
{
- fz_store_free_fn *free;
+ fz_store_drop_fn *drop;
union
{
struct
@@ -88,12 +88,12 @@ typedef struct fz_store_type_s fz_store_type;
struct fz_store_type_s
{
- int (*make_hash_key)(fz_store_hash *, void *);
+ int (*make_hash_key)(fz_context *ctx, fz_store_hash *, void *);
void *(*keep_key)(fz_context *,void *);
void (*drop_key)(fz_context *,void *);
- int (*cmp_key)(void *, void *);
+ int (*cmp_key)(fz_context *ctx, void *, void *);
#ifndef NDEBUG
- void (*debug)(FILE *, void *);
+ void (*debug)(fz_context *ctx, FILE *, void *);
#endif
};
@@ -138,7 +138,7 @@ void *fz_store_item(fz_context *ctx, void *key, void *val, unsigned int itemsize
/*
fz_find_item: Find an item within the store.
- free: The function used to free the value (to ensure we get a value
+ drop: 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.
@@ -148,21 +148,21 @@ void *fz_store_item(fz_context *ctx, void *key, void *val, unsigned int itemsize
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);
+void *fz_find_item(fz_context *ctx, fz_store_drop_fn *drop, 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
+ drop: 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);
+void fz_remove_item(fz_context *ctx, fz_store_drop_fn *drop, void *key, fz_store_type *type);
/*
fz_empty_store: Evict everything from the store.
diff --git a/include/mupdf/fitz/stream.h b/include/mupdf/fitz/stream.h
index fb3ef932..610192c6 100644
--- a/include/mupdf/fitz/stream.h
+++ b/include/mupdf/fitz/stream.h
@@ -10,7 +10,7 @@
directions.
Streams are reference counted, so references must be dropped
- by a call to fz_close.
+ by a call to fz_drop_stream.
Only the data between rp and wp is valid.
*/
@@ -88,10 +88,10 @@ fz_stream *fz_open_buffer(fz_context *ctx, fz_buffer *buf);
Returns pointer to newly created stream. May throw exceptions on
failure to allocate.
*/
-fz_stream *fz_open_leecher(fz_stream *chain, fz_buffer *buf);
+fz_stream *fz_open_leecher(fz_context *ctx, fz_stream *chain, fz_buffer *buf);
/*
- fz_close: Close an open stream.
+ fz_drop_stream: Close an open stream.
Drops a reference for the stream. Once no references remain
the stream will be closed, as will any file descriptor the
@@ -99,12 +99,12 @@ fz_stream *fz_open_leecher(fz_stream *chain, fz_buffer *buf);
Does not throw exceptions.
*/
-void fz_close(fz_stream *stm);
+void fz_drop_stream(fz_context *ctx, fz_stream *stm);
/*
fz_tell: return the current reading position within a stream
*/
-int fz_tell(fz_stream *stm);
+int fz_tell(fz_context *ctx, fz_stream *stm);
/*
fz_seek: Seek within a stream.
@@ -115,7 +115,7 @@ int fz_tell(fz_stream *stm);
whence: From where the offset is measured (see fseek).
*/
-void fz_seek(fz_stream *stm, int offset, int whence);
+void fz_seek(fz_context *ctx, fz_stream *stm, int offset, int whence);
/*
fz_read: Read from a stream into a given data block.
@@ -128,7 +128,7 @@ void fz_seek(fz_stream *stm, int offset, int whence);
Returns the number of bytes read. May throw exceptions.
*/
-int fz_read(fz_stream *stm, unsigned char *data, int len);
+int fz_read(fz_context *ctx, fz_stream *stm, unsigned char *data, int len);
/*
fz_read_all: Read all of a stream into a buffer.
@@ -140,7 +140,7 @@ int fz_read(fz_stream *stm, unsigned char *data, int len);
Returns a buffer created from reading from the stream. May throw
exceptions on failure to allocate.
*/
-fz_buffer *fz_read_all(fz_stream *stm, int initial);
+fz_buffer *fz_read_all(fz_context *ctx, fz_stream *stm, int initial);
/*
fz_read_file: Read all the contents of a file into a buffer.
@@ -153,19 +153,15 @@ enum
FZ_STREAM_META_LENGTH = 2
};
-int fz_stream_meta(fz_stream *stm, int key, int size, void *ptr);
+int fz_stream_meta(fz_context *ctx, fz_stream *stm, int key, int size, void *ptr);
-void fz_rebind_stream(fz_stream *stm, fz_context *ctx);
-
-typedef int (fz_stream_next_fn)(fz_stream *stm, int max);
+typedef int (fz_stream_next_fn)(fz_context *ctx, fz_stream *stm, int max);
typedef void (fz_stream_close_fn)(fz_context *ctx, void *state);
-typedef void (fz_stream_seek_fn)(fz_stream *stm, int offset, int whence);
-typedef int (fz_stream_meta_fn)(fz_stream *stm, int key, int size, void *ptr);
-typedef fz_stream *(fz_stream_rebind_fn)(fz_stream *stm);
+typedef void (fz_stream_seek_fn)(fz_context *ctx, fz_stream *stm, int offset, int whence);
+typedef int (fz_stream_meta_fn)(fz_context *ctx, fz_stream *stm, int key, int size, void *ptr);
struct fz_stream_s
{
- fz_context *ctx;
int refs;
int error;
int eof;
@@ -178,15 +174,11 @@ struct fz_stream_s
fz_stream_close_fn *close;
fz_stream_seek_fn *seek;
fz_stream_meta_fn *meta;
- fz_stream_rebind_fn *rebind;
};
-fz_stream *fz_new_stream(fz_context *ctx,
- void *state,
- fz_stream_next_fn *next,
- fz_stream_close_fn *close,
- fz_stream_rebind_fn *rebind);
-fz_stream *fz_keep_stream(fz_stream *stm);
+fz_stream *fz_new_stream(fz_context *ctx, void *state, fz_stream_next_fn *next, fz_stream_close_fn *close);
+
+fz_stream *fz_keep_stream(fz_context *ctx, fz_stream *stm);
/*
fz_read_best: Attempt to read a stream into a buffer. If truncated
@@ -201,9 +193,9 @@ fz_stream *fz_keep_stream(fz_stream *stm);
Returns a buffer created from reading from the stream.
*/
-fz_buffer *fz_read_best(fz_stream *stm, int initial, int *truncated);
+fz_buffer *fz_read_best(fz_context *ctx, fz_stream *stm, int initial, int *truncated);
-void fz_read_line(fz_stream *stm, char *buf, int max);
+void fz_read_line(fz_context *ctx, fz_stream *stm, char *buf, int max);
/*
fz_available: Ask how many bytes are available immediately from
@@ -220,21 +212,21 @@ void fz_read_line(fz_stream *stm, char *buf, int max);
if we have hit EOF. The number of bytes returned here need have
no relation to max (could be larger, could be smaller).
*/
-static inline int fz_available(fz_stream *stm, int max)
+static inline int fz_available(fz_context *ctx, fz_stream *stm, int max)
{
int len = stm->wp - stm->rp;
int c = EOF;
if (len)
return len;
- fz_try(stm->ctx)
+ fz_try(ctx)
{
- c = stm->next(stm, max);
+ c = stm->next(ctx, stm, max);
}
- fz_catch(stm->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(stm->ctx, FZ_ERROR_TRYLATER);
- fz_warn(stm->ctx, "read error; treating as end of file");
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "read error; treating as end of file");
stm->error = 1;
c = EOF;
}
@@ -247,20 +239,20 @@ static inline int fz_available(fz_stream *stm, int max)
return stm->wp - stm->rp;
}
-static inline int fz_read_byte(fz_stream *stm)
+static inline int fz_read_byte(fz_context *ctx, fz_stream *stm)
{
int c = EOF;
if (stm->rp != stm->wp)
return *stm->rp++;
- fz_try(stm->ctx)
+ fz_try(ctx)
{
- c = stm->next(stm, 1);
+ c = stm->next(ctx, stm, 1);
}
- fz_catch(stm->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(stm->ctx, FZ_ERROR_TRYLATER);
- fz_warn(stm->ctx, "read error; treating as end of file");
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "read error; treating as end of file");
stm->error = 1;
c = EOF;
}
@@ -269,36 +261,36 @@ static inline int fz_read_byte(fz_stream *stm)
return c;
}
-static inline int fz_peek_byte(fz_stream *stm)
+static inline int fz_peek_byte(fz_context *ctx, fz_stream *stm)
{
int c;
if (stm->rp != stm->wp)
return *stm->rp;
- c = stm->next(stm, 1);
+ c = stm->next(ctx, stm, 1);
if (c != EOF)
stm->rp--;
return c;
}
-static inline void fz_unread_byte(fz_stream *stm)
+static inline void fz_unread_byte(fz_context *ctx, fz_stream *stm)
{
stm->rp--;
}
-static inline int fz_is_eof(fz_stream *stm)
+static inline int fz_is_eof(fz_context *ctx, fz_stream *stm)
{
if (stm->rp == stm->wp)
{
if (stm->eof)
return 1;
- return fz_peek_byte(stm) == EOF;
+ return fz_peek_byte(ctx, stm) == EOF;
}
return 0;
}
-static inline unsigned int fz_read_bits(fz_stream *stm, int n)
+static inline unsigned int fz_read_bits(fz_context *ctx, fz_stream *stm, int n)
{
unsigned int x;
@@ -315,13 +307,13 @@ static inline unsigned int fz_read_bits(fz_stream *stm, int n)
while (n > 8)
{
- x = (x << 8) | fz_read_byte(stm);
+ x = (x << 8) | fz_read_byte(ctx, stm);
n -= 8;
}
if (n > 0)
{
- stm->bits = fz_read_byte(stm);
+ stm->bits = fz_read_byte(ctx, stm);
stm->avail = 8 - n;
x = (x << n) | (stm->bits >> stm->avail);
}
@@ -330,14 +322,14 @@ static inline unsigned int fz_read_bits(fz_stream *stm, int n)
return x;
}
-static inline void fz_sync_bits(fz_stream *stm)
+static inline void fz_sync_bits(fz_context *ctx, fz_stream *stm)
{
stm->avail = 0;
}
-static inline int fz_is_eof_bits(fz_stream *stm)
+static inline int fz_is_eof_bits(fz_context *ctx, fz_stream *stm)
{
- return fz_is_eof(stm) && (stm->avail == 0 || stm->bits == EOF);
+ return fz_is_eof(ctx, stm) && (stm->avail == 0 || stm->bits == EOF);
}
#endif
diff --git a/include/mupdf/fitz/structured-text.h b/include/mupdf/fitz/structured-text.h
index f325bf21..df34a678 100644
--- a/include/mupdf/fitz/structured-text.h
+++ b/include/mupdf/fitz/structured-text.h
@@ -176,7 +176,7 @@ struct fz_char_and_box_s
fz_rect bbox;
};
-fz_char_and_box *fz_text_char_at(fz_char_and_box *cab, fz_text_page *page, int idx);
+fz_char_and_box *fz_text_char_at(fz_context *ctx, fz_char_and_box *cab, fz_text_page *page, int idx);
/*
fz_text_char_bbox: Return the bbox of a text char. Calculated from
@@ -192,7 +192,7 @@ fz_char_and_box *fz_text_char_at(fz_char_and_box *cab, fz_text_page *page, int i
Does not throw exceptions
*/
-fz_rect *fz_text_char_bbox(fz_rect *bbox, fz_text_span *span, int idx);
+fz_rect *fz_text_char_bbox(fz_context *ctx, fz_rect *bbox, fz_text_span *span, int idx);
/*
fz_new_text_sheet: Create an empty style sheet.
@@ -202,7 +202,7 @@ fz_rect *fz_text_char_bbox(fz_rect *bbox, fz_text_span *span, int idx);
is used.
*/
fz_text_sheet *fz_new_text_sheet(fz_context *ctx);
-void fz_free_text_sheet(fz_context *ctx, fz_text_sheet *sheet);
+void fz_drop_text_sheet(fz_context *ctx, fz_text_sheet *sheet);
/*
fz_new_text_page: Create an empty text page.
@@ -211,7 +211,7 @@ void fz_free_text_sheet(fz_context *ctx, fz_text_sheet *sheet);
lines and spans of text on the page.
*/
fz_text_page *fz_new_text_page(fz_context *ctx);
-void fz_free_text_page(fz_context *ctx, fz_text_page *page);
+void fz_drop_text_page(fz_context *ctx, fz_text_page *page);
void fz_analyze_text(fz_context *ctx, fz_text_sheet *sheet, fz_text_page *page);
diff --git a/include/mupdf/fitz/text.h b/include/mupdf/fitz/text.h
index 13cc02ab..eb2ad12e 100644
--- a/include/mupdf/fitz/text.h
+++ b/include/mupdf/fitz/text.h
@@ -30,6 +30,7 @@ struct fz_text_item_s
struct fz_text_s
{
+ int refs;
fz_font *font;
fz_matrix trm;
int wmode;
@@ -38,10 +39,11 @@ struct fz_text_s
};
fz_text *fz_new_text(fz_context *ctx, fz_font *face, const fz_matrix *trm, int wmode);
+fz_text *fz_keep_text(fz_context *ctx, fz_text *text);
+void fz_drop_text(fz_context *ctx, fz_text *text);
+
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*);
#endif
diff --git a/include/mupdf/fitz/transition.h b/include/mupdf/fitz/transition.h
index 3c778528..65d170d5 100644
--- a/include/mupdf/fitz/transition.h
+++ b/include/mupdf/fitz/transition.h
@@ -49,6 +49,6 @@ struct fz_transition_s
Returns 1 if successfully generated a frame.
*/
-int fz_generate_transition(fz_pixmap *tpix, fz_pixmap *opix, fz_pixmap *npix, int time, fz_transition *trans);
+int fz_generate_transition(fz_context *ctx, fz_pixmap *tpix, fz_pixmap *opix, fz_pixmap *npix, int time, fz_transition *trans);
#endif
diff --git a/include/mupdf/fitz/tree.h b/include/mupdf/fitz/tree.h
index f2cc4848..0b299e27 100644
--- a/include/mupdf/fitz/tree.h
+++ b/include/mupdf/fitz/tree.h
@@ -17,7 +17,7 @@ void *fz_tree_lookup(fz_context *ctx, fz_tree *node, const char *key);
*/
fz_tree *fz_tree_insert(fz_context *ctx, fz_tree *root, const char *key, void *value);
-void fz_free_tree(fz_context *ctx, fz_tree *node, void (*freefunc)(fz_context *ctx, void *value));
+void fz_drop_tree(fz_context *ctx, fz_tree *node, void (*dropfunc)(fz_context *ctx, void *value));
void fz_debug_tree(fz_context *ctx, fz_tree *root);
diff --git a/include/mupdf/fitz/unzip.h b/include/mupdf/fitz/unzip.h
index dd9fb856..b19ffbd9 100644
--- a/include/mupdf/fitz/unzip.h
+++ b/include/mupdf/fitz/unzip.h
@@ -14,9 +14,7 @@ fz_archive *fz_open_archive_with_stream(fz_context *ctx, fz_stream *file);
int fz_has_archive_entry(fz_context *ctx, fz_archive *zip, const char *name);
fz_stream *fz_open_archive_entry(fz_context *ctx, fz_archive *zip, const char *entry);
fz_buffer *fz_read_archive_entry(fz_context *ctx, fz_archive *zip, const char *entry);
-void fz_close_archive(fz_context *ctx, fz_archive *ar);
-
-void fz_rebind_archive(fz_archive *zip, fz_context *ctx);
+void fz_drop_archive(fz_context *ctx, fz_archive *ar);
int fz_count_archive_entries(fz_context *ctx, fz_archive *zip);
const char *fz_list_archive_entry(fz_context *ctx, fz_archive *zip, int idx);
diff --git a/include/mupdf/fitz/write-document.h b/include/mupdf/fitz/write-document.h
index 56b9ef76..82cd2f5d 100644
--- a/include/mupdf/fitz/write-document.h
+++ b/include/mupdf/fitz/write-document.h
@@ -53,6 +53,6 @@ enum
May throw exceptions.
*/
-void fz_write_document(fz_document *doc, char *filename, fz_write_options *opts);
+void fz_write_document(fz_context *ctx, fz_document *doc, char *filename, fz_write_options *opts);
#endif
diff --git a/include/mupdf/fitz/xml.h b/include/mupdf/fitz/xml.h
index 8006fa07..7e226f71 100644
--- a/include/mupdf/fitz/xml.h
+++ b/include/mupdf/fitz/xml.h
@@ -60,9 +60,9 @@ char *fz_xml_att(fz_xml *item, const char *att);
char *fz_xml_text(fz_xml *item);
/*
- fz_free_xml: Free the XML node and all its children and siblings.
+ fz_drop_xml: Free the XML node and all its children and siblings.
*/
-void fz_free_xml(fz_context *doc, fz_xml *item);
+void fz_drop_xml(fz_context *doc, fz_xml *item);
/*
fz_detach_xml: Detach a node from the tree, unlinking it from its parent.
diff --git a/include/mupdf/html.h b/include/mupdf/html.h
index 86fea924..8003b83d 100644
--- a/include/mupdf/html.h
+++ b/include/mupdf/html.h
@@ -165,7 +165,7 @@ struct fz_html_flow_s
fz_css_rule *fz_parse_css(fz_context *ctx, fz_css_rule *chain, const char *source, const char *file);
fz_css_property *fz_parse_css_properties(fz_context *ctx, const char *source);
-void fz_free_css(fz_context *ctx, fz_css_rule *rule);
+void fz_drop_css(fz_context *ctx, fz_css_rule *rule);
void fz_match_css(fz_context *ctx, fz_css_match *match, fz_css_rule *rule, fz_xml *node);
@@ -179,11 +179,11 @@ float fz_from_css_number_scale(fz_css_number number, float scale, float em, floa
fz_html_font_set *fz_new_html_font_set(fz_context *ctx);
fz_font *fz_load_html_font(fz_context *ctx, fz_html_font_set *set,
const char *family, const char *variant, const char *style, const char *weight);
-void fz_free_html_font_set(fz_context *ctx, fz_html_font_set *htx);
+void fz_drop_html_font_set(fz_context *ctx, fz_html_font_set *htx);
fz_html *fz_parse_html(fz_context *ctx, fz_html_font_set *htx, fz_archive *zip, const char *base_uri, fz_buffer *buf, const char *user_css);
void fz_layout_html(fz_context *ctx, fz_html *box, float w, float h, float em);
void fz_draw_html(fz_context *ctx, fz_html *box, float page_top, float page_bot, fz_device *dev, const fz_matrix *ctm);
-void fz_free_html(fz_context *ctx, fz_html *box);
+void fz_drop_html(fz_context *ctx, fz_html *box);
#endif
diff --git a/include/mupdf/img.h b/include/mupdf/img.h
deleted file mode 100644
index 4c10b0d3..00000000
--- a/include/mupdf/img.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef MUIMAGE_H
-#define MUIMAGE_H
-
-#include "mupdf/fitz.h"
-
-typedef struct image_document_s image_document;
-typedef struct image_page_s image_page;
-
-/*
- image_open_document: Open a document.
-
- Open a document for reading so the library is able to locate
- objects and pages inside the file.
-
- The returned image_document should be used when calling most
- other functions. Note that it wraps the context, so those
- functions implicitly get access to the global state in
- context.
-
- filename: a path to a file as it would be given to open(2).
-*/
-image_document *image_open_document(fz_context *ctx, const char *filename);
-
-/*
- image_open_document_with_stream: Opens a document.
-
- Same as image_open_document, but takes a stream instead of a
- filename to locate the document to open. Increments the
- reference count of the stream. See fz_open_file,
- fz_open_file_w or fz_open_fd for opening a stream, and
- fz_close for closing an open stream.
-*/
-image_document *image_open_document_with_stream(fz_context *ctx, fz_stream *file);
-
-/*
- image_close_document: Closes and frees an opened document.
-
- The resource store in the context associated with image_document
- is emptied.
-
- Does not throw exceptions.
-*/
-void image_close_document(image_document *doc);
-
-int image_count_pages(image_document *doc);
-image_page *image_load_page(image_document *doc, int number);
-fz_rect *image_bound_page(image_document *doc, image_page *page, fz_rect *rect);
-void image_free_page(image_document *doc, image_page *page);
-void image_run_page(image_document *doc, image_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie);
-
-#endif
diff --git a/include/mupdf/pdf/annot.h b/include/mupdf/pdf/annot.h
index e3243186..a6959f32 100644
--- a/include/mupdf/pdf/annot.h
+++ b/include/mupdf/pdf/annot.h
@@ -20,26 +20,26 @@ enum
Does not throw exceptions.
*/
-pdf_annot *pdf_first_annot(pdf_document *doc, pdf_page *page);
+pdf_annot *pdf_first_annot(fz_context *ctx, pdf_page *page);
/*
pdf_next_annot: Return the next annotation on a page.
Does not throw exceptions.
*/
-pdf_annot *pdf_next_annot(pdf_document *doc, pdf_annot *annot);
+pdf_annot *pdf_next_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot);
/*
pdf_bound_annot: Return the rectangle for an annotation on a page.
Does not throw exceptions.
*/
-fz_rect *pdf_bound_annot(pdf_document *doc, pdf_annot *annot, fz_rect *rect);
+fz_rect *pdf_bound_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot, fz_rect *rect);
/*
pdf_annot_type: Return the type of an annotation
*/
-fz_annot_type pdf_annot_type(pdf_annot *annot);
+fz_annot_type pdf_annot_type(fz_context *ctx, pdf_annot *annot);
/*
pdf_run_annot: Interpret an annotation and render it on a device.
@@ -53,7 +53,7 @@ fz_annot_type pdf_annot_type(pdf_annot *annot);
ctm: A transformation matrix applied to the objects on the page,
e.g. to scale or rotate the page contents as desired.
*/
-void pdf_run_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie);
+void pdf_run_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie);
struct pdf_annot_s
{
@@ -70,69 +70,69 @@ struct pdf_annot_s
int widget_type;
};
-fz_link_dest pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, 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_dest pdf_parse_link_dest(fz_context *ctx, pdf_document *doc, fz_link_kind kind, pdf_obj *dest);
+fz_link_dest pdf_parse_action(fz_context *ctx, pdf_document *doc, pdf_obj *action);
+pdf_obj *pdf_lookup_dest(fz_context *ctx, pdf_document *doc, pdf_obj *needle);
+pdf_obj *pdf_lookup_name(fz_context *ctx, pdf_document *doc, char *which, pdf_obj *needle);
+pdf_obj *pdf_load_name_tree(fz_context *ctx, pdf_document *doc, char *which);
-fz_link *pdf_load_link_annots(pdf_document *, pdf_obj *annots, const fz_matrix *page_ctm);
+fz_link *pdf_load_link_annots(fz_context *ctx, pdf_document *, pdf_obj *annots, const fz_matrix *page_ctm);
-void pdf_transform_annot(pdf_annot *annot);
-void pdf_load_annots(pdf_document *, pdf_page *page, pdf_obj *annots);
-void pdf_update_annot(pdf_document *, pdf_annot *annot);
-void pdf_free_annot(fz_context *ctx, pdf_annot *link);
+void pdf_transform_annot(fz_context *ctx, pdf_annot *annot);
+void pdf_load_annots(fz_context *ctx, pdf_document *, pdf_page *page, pdf_obj *annots);
+void pdf_update_annot(fz_context *ctx, pdf_document *, pdf_annot *annot);
+void pdf_drop_annot(fz_context *ctx, pdf_annot *link);
/*
pdf_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);
+pdf_annot *pdf_create_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_annot_type type);
/*
pdf_delete_annot: delete an annotation
*/
-void pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot);
+void pdf_delete_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot);
/*
pdf_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_annot_quadpoints(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *qp, int n);
/*
pdf_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_annot_list(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *pts, int *counts, int ncount, float color[3], float thickness);
/*
pdf_set_text_annot_position: set the position on page for a text (sticky note) annotation.
*/
-void pdf_set_text_annot_position(pdf_document *doc, pdf_annot *annot, fz_point pt);
+void pdf_set_text_annot_position(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point pt);
/*
pdf_set_annot_contents: set the contents of an annotation.
*/
-void pdf_set_annot_contents(pdf_document *doc, pdf_annot *annot, char *text);
+void pdf_set_annot_contents(fz_context *ctx, pdf_document *doc, pdf_annot *annot, char *text);
/*
pdf_annot_contents: return the contents of an annotation.
*/
-char *pdf_annot_contents(pdf_document *doc, pdf_annot *annot);
+char *pdf_annot_contents(fz_context *ctx, pdf_document *doc, pdf_annot *annot);
/*
pdf_set_free_text_details: set the position, text, font and color for a free text annotation.
Only base 14 fonts are supported and are specified by name.
*/
-void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *pos, char *text, char *font_name, float font_size, float color[3]);
+void pdf_set_free_text_details(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *pos, char *text, char *font_name, float font_size, float color[3]);
-fz_annot_type pdf_annot_obj_type(pdf_obj *obj);
+fz_annot_type pdf_annot_obj_type(fz_context *ctx, 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_annot *pdf_poll_changed_annot(fz_context *ctx, pdf_document *idoc, pdf_page *page);
#endif
diff --git a/include/mupdf/pdf/appearance.h b/include/mupdf/pdf/appearance.h
index 3cdfb103..ddf64516 100644
--- a/include/mupdf/pdf/appearance.h
+++ b/include/mupdf/pdf/appearance.h
@@ -13,30 +13,30 @@ void pdf_da_info_fin(fz_context *ctx, pdf_da_info *di);
void pdf_parse_da(fz_context *ctx, char *da, pdf_da_info *di);
void pdf_fzbuf_print_da(fz_context *ctx, fz_buffer *fzbuf, pdf_da_info *di);
-void pdf_update_text_appearance(pdf_document *doc, pdf_obj *obj, char *eventValue);
-void pdf_update_combobox_appearance(pdf_document *doc, pdf_obj *obj);
-void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj);
-void pdf_update_text_markup_appearance(pdf_document *doc, pdf_annot *annot, fz_annot_type type);
-void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot);
-void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot);
+void pdf_update_text_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *eventValue);
+void pdf_update_combobox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
+void pdf_update_pushbutton_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
+void pdf_update_text_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_annot_type type);
+void pdf_update_ink_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot);
+void pdf_update_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot);
/*
pdf_update_free_text_annot_appearance: update the appearance stream for a free text
annotation, basing it on the annoations rectangle and contents.
*/
-void pdf_update_free_text_annot_appearance(pdf_document *doc, pdf_annot *annot);
+void pdf_update_free_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot);
/*
pdf_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);
+void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_rect *rect, fz_display_list *disp_list);
/*
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);
+void pdf_set_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, float color[3], float alpha, float line_thickness, float line_height);
-void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *name, char *dn, char *date);
+void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, char *name, char *dn, char *date);
#endif
diff --git a/include/mupdf/pdf/cmap.h b/include/mupdf/pdf/cmap.h
index b4080b8e..e17ebbaa 100644
--- a/include/mupdf/pdf/cmap.h
+++ b/include/mupdf/pdf/cmap.h
@@ -58,7 +58,7 @@ struct pdf_cmap_s
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);
+void pdf_drop_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);
@@ -79,7 +79,7 @@ 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);
+pdf_cmap *pdf_load_embedded_cmap(fz_context *ctx, pdf_document *doc, pdf_obj *ref);
#ifndef NDEBUG
void pdf_print_cmap(fz_context *ctx, pdf_cmap *cmap);
diff --git a/include/mupdf/pdf/crypt.h b/include/mupdf/pdf/crypt.h
index 9e3c4c94..30a74ec0 100644
--- a/include/mupdf/pdf/crypt.h
+++ b/include/mupdf/pdf/crypt.h
@@ -6,21 +6,21 @@
*/
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_drop_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);
+fz_stream *pdf_open_crypt(fz_context *ctx, fz_stream *chain, pdf_crypt *crypt, int num, int gen);
+fz_stream *pdf_open_crypt_with_filter(fz_context *ctx, 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);
+int pdf_crypt_version(fz_context *ctx, pdf_document *doc);
+int pdf_crypt_revision(fz_context *ctx, pdf_document *doc);
+char *pdf_crypt_method(fz_context *ctx, pdf_document *doc);
+int pdf_crypt_length(fz_context *ctx, pdf_document *doc);
+unsigned char *pdf_crypt_key(fz_context *ctx, pdf_document *doc);
#ifndef NDEBUG
-void pdf_print_crypt(pdf_crypt *crypt);
+void pdf_print_crypt(fz_context *ctx, pdf_crypt *crypt);
#endif
typedef struct pdf_designated_name_s
@@ -33,33 +33,33 @@ typedef struct pdf_designated_name_s
}
pdf_designated_name;
-void pdf_free_designated_name(pdf_designated_name *dn);
+void pdf_drop_designated_name(fz_context *ctx, pdf_designated_name *dn);
pdf_signer *pdf_read_pfx(fz_context *ctx, const char *sigfile, const char *password);
-pdf_signer *pdf_keep_signer(pdf_signer *signer);
-void pdf_drop_signer(pdf_signer *signer);
-pdf_designated_name *pdf_signer_designated_name(pdf_signer *signer);
-void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer);
+pdf_signer *pdf_keep_signer(fz_context *ctx, pdf_signer *signer);
+void pdf_drop_signer(fz_context *ctx, pdf_signer *signer);
+pdf_designated_name *pdf_signer_designated_name(fz_context *ctx, pdf_signer *signer);
+void pdf_write_digest(fz_context *ctx, pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer);
/*
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]);
+int pdf_signature_widget_byte_range(fz_context *ctx, 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);
+int pdf_signature_widget_contents(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char **contents);
/*
pdf_check_signature: check a signature's certificate chain and digest
*/
-int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize);
+int pdf_check_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize);
/*
pdf_sign_signature: sign a signature form field
*/
-void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password);
+void pdf_sign_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password);
#endif
diff --git a/include/mupdf/pdf/document.h b/include/mupdf/pdf/document.h
index c9851a47..f8fc23ca 100644
--- a/include/mupdf/pdf/document.h
+++ b/include/mupdf/pdf/document.h
@@ -21,7 +21,6 @@ enum
struct pdf_lexbuf_s
{
- fz_context *ctx;
int size;
int base_size;
int len;
@@ -54,7 +53,7 @@ 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);
+typedef void (pdf_doc_event_cb)(fz_context *ctx, pdf_document *doc, pdf_doc_event *event, void *data);
/*
pdf_open_document: Open a PDF document.
@@ -82,7 +81,7 @@ pdf_document *pdf_open_document(fz_context *ctx, const char *filename);
filename to locate the PDF document to open. Increments the
reference count of the stream. See fz_open_file,
fz_open_file_w or fz_open_fd for opening a stream, and
- fz_close for closing an open stream.
+ fz_drop_stream for closing an open stream.
*/
pdf_document *pdf_open_document_with_stream(fz_context *ctx, fz_stream *file);
@@ -97,16 +96,16 @@ pdf_document *pdf_open_document_no_run_with_stream(fz_context *ctx, fz_stream *f
Does not throw exceptions.
*/
-void pdf_close_document(pdf_document *doc);
+void pdf_close_document(fz_context *ctx, pdf_document *doc);
/*
pdf_specific: down-cast an fz_document to a pdf_document.
Returns NULL if underlying document is not PDF
*/
-pdf_document *pdf_specifics(fz_document *doc);
+pdf_document *pdf_specifics(fz_context *ctx, fz_document *doc);
-int pdf_needs_password(pdf_document *doc);
-int pdf_authenticate_password(pdf_document *doc, const char *pw);
+int pdf_needs_password(fz_context *ctx, pdf_document *doc);
+int pdf_authenticate_password(fz_context *ctx, pdf_document *doc, const char *pw);
enum
{
@@ -121,14 +120,14 @@ enum
PDF_DEFAULT_PERM_FLAGS = 0xfffc
};
-int pdf_has_permission(pdf_document *doc, int p);
+int pdf_has_permission(fz_context *ctx, pdf_document *doc, int p);
/*
Metadata interface.
*/
-int pdf_meta(pdf_document *doc, int key, void *ptr, int size);
+int pdf_meta(fz_context *ctx, pdf_document *doc, int key, void *ptr, int size);
-fz_outline *pdf_load_outline(pdf_document *doc);
+fz_outline *pdf_load_outline(fz_context *ctx, pdf_document *doc);
typedef struct pdf_ocg_entry_s pdf_ocg_entry;
@@ -160,24 +159,13 @@ struct pdf_ocg_descriptor_s
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);
+void pdf_update_page(fz_context *ctx, pdf_document *doc, pdf_page *page);
/*
Determine whether changes have been made since the
document was opened or last saved.
*/
-int pdf_has_unsaved_changes(pdf_document *doc);
-
-typedef struct pdf_obj_read_state_s pdf_obj_read_state;
-
-struct pdf_obj_read_state_s
-{
- int offset;
- int num;
- int numofs;
- int gen;
- int genofs;
-};
+int pdf_has_unsaved_changes(fz_context *ctx, pdf_document *doc);
typedef struct pdf_signer_s pdf_signer;
@@ -200,7 +188,6 @@ struct pdf_document_s
{
fz_document super;
- fz_context *ctx;
fz_stream *file;
int version;
@@ -213,6 +200,7 @@ struct pdf_document_s
int max_xref_len;
int num_xref_sections;
pdf_xref *xref_sections;
+ int *xref_index;
int xref_altered;
int freeze_updates;
int has_xref_streams;
@@ -279,7 +267,7 @@ struct pdf_document_s
int dirty;
pdf_unsaved_sig *unsaved_sigs;
- void (*update_appearance)(pdf_document *doc, pdf_annot *annot);
+ void (*update_appearance)(fz_context *ctx, pdf_document *doc, pdf_annot *annot);
pdf_doc_event_cb *event_cb;
void *event_cb_data;
@@ -298,17 +286,17 @@ struct pdf_document_s
*/
pdf_document *pdf_create_document(fz_context *ctx);
-pdf_page *pdf_create_page(pdf_document *doc, fz_rect rect, int res, int rotate);
+pdf_page *pdf_create_page(fz_context *ctx, pdf_document *doc, fz_rect rect, int res, int rotate);
-void pdf_insert_page(pdf_document *doc, pdf_page *page, int at);
+void pdf_insert_page(fz_context *ctx, pdf_document *doc, pdf_page *page, int at);
-void pdf_delete_page(pdf_document *doc, int number);
+void pdf_delete_page(fz_context *ctx, pdf_document *doc, int number);
-void pdf_delete_page_range(pdf_document *doc, int start, int end);
+void pdf_delete_page_range(fz_context *ctx, pdf_document *doc, int start, int end);
-fz_device *pdf_page_write(pdf_document *doc, pdf_page *page);
+fz_device *pdf_page_write(fz_context *ctx, pdf_document *doc, pdf_page *page);
-void pdf_finish_edit(pdf_document *doc);
+void pdf_finish_edit(fz_context *ctx, pdf_document *doc);
int pdf_recognize(fz_context *doc, const char *magic);
diff --git a/include/mupdf/pdf/event.h b/include/mupdf/pdf/event.h
index c2adf057..6e16ab33 100644
--- a/include/mupdf/pdf/event.h
+++ b/include/mupdf/pdf/event.h
@@ -57,7 +57,7 @@ void pdf_init_ui_pointer_event(pdf_ui_event *event, int type, float x, float y);
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);
+int pdf_pass_event(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event);
struct pdf_doc_event_s
{
@@ -79,7 +79,7 @@ enum
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);
+void pdf_set_doc_event_callback(fz_context *ctx, pdf_document *doc, pdf_doc_event_cb *event_cb, void *data);
/*
The various types of document events
@@ -141,13 +141,13 @@ enum
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_alert_event *pdf_access_alert_event(fz_context *ctx, 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);
+char *pdf_access_exec_menu_item_event(fz_context *ctx, pdf_doc_event *event);
/*
pdf_submit_event: details of a submit event. The app should submit
@@ -167,7 +167,7 @@ typedef struct
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_submit_event *pdf_access_submit_event(fz_context *ctx, pdf_doc_event *event);
/*
pdf_launch_url_event: details of a launch-url event. The app should
@@ -184,7 +184,7 @@ typedef struct
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_launch_url_event *pdf_access_launch_url_event(fz_context *ctx, pdf_doc_event *event);
/*
pdf_mail_doc_event: details of a mail_doc event. The app should save
@@ -204,13 +204,13 @@ typedef struct
/*
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);
+pdf_mail_doc_event *pdf_access_mail_doc_event(fz_context *ctx, pdf_doc_event *event);
+
+void pdf_event_issue_alert(fz_context *ctx, pdf_document *doc, pdf_alert_event *event);
+void pdf_event_issue_print(fz_context *ctx, pdf_document *doc);
+void pdf_event_issue_exec_menu_item(fz_context *ctx, pdf_document *doc, char *item);
+void pdf_event_issue_exec_dialog(fz_context *ctx, pdf_document *doc);
+void pdf_event_issue_launch_url(fz_context *ctx, pdf_document *doc, char *url, int new_frame);
+void pdf_event_issue_mail_doc(fz_context *ctx, pdf_document *doc, pdf_mail_doc_event *event);
#endif
diff --git a/include/mupdf/pdf/field.h b/include/mupdf/pdf/field.h
index f0aa70ff..272e14be 100644
--- a/include/mupdf/pdf/field.h
+++ b/include/mupdf/pdf/field.h
@@ -33,23 +33,23 @@ enum
Ff_CommitOnSelCHange = 1 << (27-1),
};
-char *pdf_get_string_or_stream(pdf_document *doc, pdf_obj *obj);
-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);
-void pdf_set_field_type(pdf_document *doc, pdf_obj *obj, int type);
-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);
-void pdf_signature_set_value(pdf_document *doc, pdf_obj *field, pdf_signer *signer);
-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);
+char *pdf_get_string_or_stream(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
+pdf_obj *pdf_get_inheritable(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *key);
+int pdf_get_field_flags(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
+int pdf_field_type(fz_context *ctx, pdf_document *doc, pdf_obj *field);
+void pdf_set_field_type(fz_context *ctx, pdf_document *doc, pdf_obj *obj, int type);
+char *pdf_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *field);
+int pdf_field_set_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text);
+char *pdf_field_border_style(fz_context *ctx, pdf_document *doc, pdf_obj *field);
+void pdf_field_set_border_style(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text);
+void pdf_field_set_button_caption(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text);
+void pdf_field_set_fill_color(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_obj *col);
+void pdf_field_set_text_color(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_obj *col);
+void pdf_signature_set_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_signer *signer);
+int pdf_field_display(fz_context *ctx, pdf_document *doc, pdf_obj *field);
+char *pdf_field_name(fz_context *ctx, pdf_document *doc, pdf_obj *field);
+void pdf_field_set_display(fz_context *ctx, pdf_document *doc, pdf_obj *field, int d);
+pdf_obj *pdf_lookup_field(fz_context *ctx, pdf_obj *form, char *name);
+void pdf_field_reset(fz_context *ctx, pdf_document *doc, pdf_obj *field);
#endif
diff --git a/include/mupdf/pdf/font.h b/include/mupdf/pdf/font.h
index c1576483..7697053f 100644
--- a/include/mupdf/pdf/font.h
+++ b/include/mupdf/pdf/font.h
@@ -99,18 +99,18 @@ 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);
+void pdf_load_to_unicode(fz_context *ctx, 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(const 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, int wmode, unsigned int *len, int *index);
+unsigned char *pdf_lookup_builtin_font(fz_context *ctx, const char *name, unsigned int *len);
+unsigned char *pdf_lookup_substitute_font(fz_context *ctx, int mono, int serif, int bold, int italic, unsigned int *len);
+unsigned char *pdf_lookup_substitute_cjk_font(fz_context *ctx, int ros, int serif, int wmode, unsigned int *len, int *index);
-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_load_hail_mary_font(pdf_document *doc);
+pdf_font_desc *pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *obj);
+void pdf_load_type3_glyphs(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, int nestedDepth);
+pdf_font_desc *pdf_load_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *obj, int nestedDepth);
+pdf_font_desc *pdf_load_hail_mary_font(fz_context *ctx, pdf_document *doc);
pdf_font_desc *pdf_new_font_desc(fz_context *ctx);
pdf_font_desc *pdf_keep_font(fz_context *ctx, pdf_font_desc *fontdesc);
@@ -123,6 +123,6 @@ void pdf_print_font(fz_context *ctx, pdf_font_desc *fontdesc);
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);
-void pdf_run_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nestedDepth);
+void pdf_run_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nestedDepth);
#endif
diff --git a/include/mupdf/pdf/javascript.h b/include/mupdf/pdf/javascript.h
index ba8af4d6..a9a9213a 100644
--- a/include/mupdf/pdf/javascript.h
+++ b/include/mupdf/pdf/javascript.h
@@ -8,9 +8,9 @@ typedef struct pdf_js_event_s
int rc;
} pdf_js_event;
-void pdf_enable_js(pdf_document *doc);
-void pdf_disable_js(pdf_document *doc);
-int pdf_js_supported(pdf_document *doc);
+void pdf_enable_js(fz_context *ctx, pdf_document *doc);
+void pdf_disable_js(fz_context *ctx, pdf_document *doc);
+int pdf_js_supported(fz_context *ctx, pdf_document *doc);
void pdf_js_setup_event(pdf_js *js, pdf_js_event *e);
pdf_js_event *pdf_js_get_event(pdf_js *js);
diff --git a/include/mupdf/pdf/object.h b/include/mupdf/pdf/object.h
index c8417224..bcb4ab56 100644
--- a/include/mupdf/pdf/object.h
+++ b/include/mupdf/pdf/object.h
@@ -11,92 +11,92 @@ typedef struct pdf_document_s pdf_document;
typedef struct pdf_obj_s pdf_obj;
-pdf_obj *pdf_new_null(pdf_document *doc);
-pdf_obj *pdf_new_bool(pdf_document *doc, int b);
-pdf_obj *pdf_new_int(pdf_document *doc, int i);
-pdf_obj *pdf_new_real(pdf_document *doc, float f);
-pdf_obj *pdf_new_name(pdf_document *doc, const char *str);
-pdf_obj *pdf_new_string(pdf_document *doc, const char *str, int len);
-pdf_obj *pdf_new_indirect(pdf_document *doc, int num, int gen);
-pdf_obj *pdf_new_array(pdf_document *doc, int initialcap);
-pdf_obj *pdf_new_dict(pdf_document *doc, int initialcap);
-pdf_obj *pdf_new_rect(pdf_document *doc, const fz_rect *rect);
-pdf_obj *pdf_new_matrix(pdf_document *doc, const fz_matrix *mtx);
-pdf_obj *pdf_copy_array(pdf_obj *array);
-pdf_obj *pdf_copy_dict(pdf_obj *dict);
-
-pdf_obj *pdf_new_obj_from_str(pdf_document *doc, const char *src);
-
-pdf_obj *pdf_keep_obj(pdf_obj *obj);
-void pdf_drop_obj(pdf_obj *obj);
+pdf_obj *pdf_new_null(fz_context *ctx, pdf_document *doc);
+pdf_obj *pdf_new_bool(fz_context *ctx, pdf_document *doc, int b);
+pdf_obj *pdf_new_int(fz_context *ctx, pdf_document *doc, int i);
+pdf_obj *pdf_new_real(fz_context *ctx, pdf_document *doc, float f);
+pdf_obj *pdf_new_name(fz_context *ctx, pdf_document *doc, const char *str);
+pdf_obj *pdf_new_string(fz_context *ctx, pdf_document *doc, const char *str, int len);
+pdf_obj *pdf_new_indirect(fz_context *ctx, pdf_document *doc, int num, int gen);
+pdf_obj *pdf_new_array(fz_context *ctx, pdf_document *doc, int initialcap);
+pdf_obj *pdf_new_dict(fz_context *ctx, pdf_document *doc, int initialcap);
+pdf_obj *pdf_new_rect(fz_context *ctx, pdf_document *doc, const fz_rect *rect);
+pdf_obj *pdf_new_matrix(fz_context *ctx, pdf_document *doc, const fz_matrix *mtx);
+pdf_obj *pdf_copy_array(fz_context *ctx, pdf_obj *array);
+pdf_obj *pdf_copy_dict(fz_context *ctx, pdf_obj *dict);
+
+pdf_obj *pdf_new_obj_from_str(fz_context *ctx, pdf_document *doc, const char *src);
+
+pdf_obj *pdf_keep_obj(fz_context *ctx, pdf_obj *obj);
+void pdf_drop_obj(fz_context *ctx, pdf_obj *obj);
/* type queries */
-int pdf_is_null(pdf_obj *obj);
-int pdf_is_bool(pdf_obj *obj);
-int pdf_is_int(pdf_obj *obj);
-int pdf_is_real(pdf_obj *obj);
-int pdf_is_number(pdf_obj *obj);
-int pdf_is_name(pdf_obj *obj);
-int pdf_is_string(pdf_obj *obj);
-int pdf_is_array(pdf_obj *obj);
-int pdf_is_dict(pdf_obj *obj);
-int pdf_is_indirect(pdf_obj *obj);
-int pdf_is_stream(pdf_document *doc, int num, int gen);
-
-int pdf_objcmp(pdf_obj *a, pdf_obj *b);
+int pdf_is_null(fz_context *ctx, pdf_obj *obj);
+int pdf_is_bool(fz_context *ctx, pdf_obj *obj);
+int pdf_is_int(fz_context *ctx, pdf_obj *obj);
+int pdf_is_real(fz_context *ctx, pdf_obj *obj);
+int pdf_is_number(fz_context *ctx, pdf_obj *obj);
+int pdf_is_name(fz_context *ctx, pdf_obj *obj);
+int pdf_is_string(fz_context *ctx, pdf_obj *obj);
+int pdf_is_array(fz_context *ctx, pdf_obj *obj);
+int pdf_is_dict(fz_context *ctx, pdf_obj *obj);
+int pdf_is_indirect(fz_context *ctx, pdf_obj *obj);
+int pdf_is_stream(fz_context *ctx, pdf_document *doc, int num, int gen);
+
+int pdf_objcmp(fz_context *ctx, pdf_obj *a, pdf_obj *b);
/* obj marking and unmarking functions - to avoid infinite recursions. */
-int pdf_obj_marked(pdf_obj *obj);
-int pdf_mark_obj(pdf_obj *obj);
-void pdf_unmark_obj(pdf_obj *obj);
+int pdf_obj_marked(fz_context *ctx, pdf_obj *obj);
+int pdf_mark_obj(fz_context *ctx, pdf_obj *obj);
+void pdf_unmark_obj(fz_context *ctx, pdf_obj *obj);
/* obj memo functions - allows us to secretly remember "a memo" (a bool) in
* an object, and to read back whether there was a memo, and if so, what it
* was. */
-void pdf_set_obj_memo(pdf_obj *obj, int memo);
-int pdf_obj_memo(pdf_obj *obj, int *memo);
+void pdf_set_obj_memo(fz_context *ctx, pdf_obj *obj, int memo);
+int pdf_obj_memo(fz_context *ctx, pdf_obj *obj, int *memo);
/* obj dirty bit support. */
-int pdf_obj_is_dirty(pdf_obj *obj);
-void pdf_dirty_obj(pdf_obj *obj);
-void pdf_clean_obj(pdf_obj *obj);
+int pdf_obj_is_dirty(fz_context *ctx, pdf_obj *obj);
+void pdf_dirty_obj(fz_context *ctx, pdf_obj *obj);
+void pdf_clean_obj(fz_context *ctx, pdf_obj *obj);
/* safe, silent failure, no error reporting on type mismatches */
-int pdf_to_bool(pdf_obj *obj);
-int pdf_to_int(pdf_obj *obj);
-float pdf_to_real(pdf_obj *obj);
-char *pdf_to_name(pdf_obj *obj);
-char *pdf_to_str_buf(pdf_obj *obj);
-pdf_obj *pdf_to_dict(pdf_obj *obj);
-int pdf_to_str_len(pdf_obj *obj);
-int pdf_to_num(pdf_obj *obj);
-int pdf_to_gen(pdf_obj *obj);
-
-int pdf_array_len(pdf_obj *array);
-pdf_obj *pdf_array_get(pdf_obj *array, int i);
-void pdf_array_put(pdf_obj *array, int i, pdf_obj *obj);
-void pdf_array_push(pdf_obj *array, pdf_obj *obj);
-void pdf_array_push_drop(pdf_obj *array, pdf_obj *obj);
-void pdf_array_insert(pdf_obj *array, pdf_obj *obj, int index);
-void pdf_array_insert_drop(pdf_obj *array, pdf_obj *obj, int index);
-void pdf_array_delete(pdf_obj *array, int index);
-int pdf_array_contains(pdf_obj *array, pdf_obj *obj);
-
-int pdf_dict_len(pdf_obj *dict);
-pdf_obj *pdf_dict_get_key(pdf_obj *dict, int idx);
-pdf_obj *pdf_dict_get_val(pdf_obj *dict, int idx);
-pdf_obj *pdf_dict_get(pdf_obj *dict, pdf_obj *key);
-pdf_obj *pdf_dict_gets(pdf_obj *dict, const char *key);
-pdf_obj *pdf_dict_getp(pdf_obj *dict, const char *key);
-pdf_obj *pdf_dict_getsa(pdf_obj *dict, const char *key, const char *abbrev);
-void pdf_dict_put(pdf_obj *dict, pdf_obj *key, pdf_obj *val);
-void pdf_dict_puts(pdf_obj *dict, const char *key, pdf_obj *val);
-void pdf_dict_puts_drop(pdf_obj *dict, const char *key, pdf_obj *val);
-void pdf_dict_putp(pdf_obj *dict, const char *key, pdf_obj *val);
-void pdf_dict_putp_drop(pdf_obj *dict, const char *key, pdf_obj *val);
-void pdf_dict_del(pdf_obj *dict, pdf_obj *key);
-void pdf_dict_dels(pdf_obj *dict, const char *key);
-void pdf_sort_dict(pdf_obj *dict);
+int pdf_to_bool(fz_context *ctx, pdf_obj *obj);
+int pdf_to_int(fz_context *ctx, pdf_obj *obj);
+float pdf_to_real(fz_context *ctx, pdf_obj *obj);
+char *pdf_to_name(fz_context *ctx, pdf_obj *obj);
+char *pdf_to_str_buf(fz_context *ctx, pdf_obj *obj);
+pdf_obj *pdf_to_dict(fz_context *ctx, pdf_obj *obj);
+int pdf_to_str_len(fz_context *ctx, pdf_obj *obj);
+int pdf_to_num(fz_context *ctx, pdf_obj *obj);
+int pdf_to_gen(fz_context *ctx, pdf_obj *obj);
+
+int pdf_array_len(fz_context *ctx, pdf_obj *array);
+pdf_obj *pdf_array_get(fz_context *ctx, pdf_obj *array, int i);
+void pdf_array_put(fz_context *ctx, pdf_obj *array, int i, pdf_obj *obj);
+void pdf_array_push(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
+void pdf_array_push_drop(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
+void pdf_array_insert(fz_context *ctx, pdf_obj *array, pdf_obj *obj, int index);
+void pdf_array_insert_drop(fz_context *ctx, pdf_obj *array, pdf_obj *obj, int index);
+void pdf_array_delete(fz_context *ctx, pdf_obj *array, int index);
+int pdf_array_contains(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
+
+int pdf_dict_len(fz_context *ctx, pdf_obj *dict);
+pdf_obj *pdf_dict_get_key(fz_context *ctx, pdf_obj *dict, int idx);
+pdf_obj *pdf_dict_get_val(fz_context *ctx, pdf_obj *dict, int idx);
+pdf_obj *pdf_dict_get(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
+pdf_obj *pdf_dict_gets(fz_context *ctx, pdf_obj *dict, const char *key);
+pdf_obj *pdf_dict_getp(fz_context *ctx, pdf_obj *dict, const char *key);
+pdf_obj *pdf_dict_getsa(fz_context *ctx, pdf_obj *dict, const char *key, const char *abbrev);
+void pdf_dict_put(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val);
+void pdf_dict_puts(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val);
+void pdf_dict_puts_drop(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val);
+void pdf_dict_putp(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val);
+void pdf_dict_putp_drop(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val);
+void pdf_dict_del(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
+void pdf_dict_dels(fz_context *ctx, pdf_obj *dict, const char *key);
+void pdf_sort_dict(fz_context *ctx, pdf_obj *dict);
/*
Recurse through the object structure setting the node's parent_num to num.
@@ -104,32 +104,32 @@ void pdf_sort_dict(pdf_obj *dict);
The whole containing hierarchy is moved to the incremental xref section, so
to be later written out as an incremental file update.
*/
-void pdf_set_obj_parent(pdf_obj *obj, int num);
+void pdf_set_obj_parent(fz_context *ctx, pdf_obj *obj, int num);
-int pdf_obj_refs(pdf_obj *ref);
+int pdf_obj_refs(fz_context *ctx, pdf_obj *ref);
-int pdf_obj_parent_num(pdf_obj *obj);
+int pdf_obj_parent_num(fz_context *ctx, pdf_obj *obj);
-int pdf_sprint_obj(char *s, int n, pdf_obj *obj, int tight);
-int pdf_fprint_obj(FILE *fp, pdf_obj *obj, int tight);
-int pdf_output_obj(fz_output *out, pdf_obj *obj, int tight);
+int pdf_sprint_obj(fz_context *ctx, char *s, int n, pdf_obj *obj, int tight);
+int pdf_fprint_obj(fz_context *ctx, FILE *fp, pdf_obj *obj, int tight);
+int pdf_output_obj(fz_context *ctx, fz_output *out, pdf_obj *obj, int tight);
#ifndef NDEBUG
-void pdf_print_obj(pdf_obj *obj);
-void pdf_print_ref(pdf_obj *obj);
+void pdf_print_obj(fz_context *ctx, pdf_obj *obj);
+void pdf_print_ref(fz_context *ctx, pdf_obj *obj);
#endif
-char *pdf_to_utf8(pdf_document *doc, pdf_obj *src);
-unsigned short *pdf_to_ucs2(pdf_document *doc, pdf_obj *src);
-pdf_obj *pdf_to_utf8_name(pdf_document *doc, pdf_obj *src);
-char *pdf_from_ucs2(pdf_document *doc, unsigned short *str);
-void pdf_to_ucs2_buf(unsigned short *buffer, pdf_obj *src);
+char *pdf_to_utf8(fz_context *ctx, pdf_document *doc, pdf_obj *src);
+unsigned short *pdf_to_ucs2(fz_context *ctx, pdf_document *doc, pdf_obj *src);
+pdf_obj *pdf_to_utf8_name(fz_context *ctx, pdf_document *doc, pdf_obj *src);
+char *pdf_from_ucs2(fz_context *ctx, pdf_document *doc, unsigned short *str);
+void pdf_to_ucs2_buf(fz_context *ctx, unsigned short *buffer, pdf_obj *src);
fz_rect *pdf_to_rect(fz_context *ctx, pdf_obj *array, fz_rect *rect);
fz_matrix *pdf_to_matrix(fz_context *ctx, pdf_obj *array, fz_matrix *mat);
-pdf_document *pdf_get_indirect_document(pdf_obj *obj);
-void pdf_set_str_len(pdf_obj *obj, int newlen);
-void pdf_set_int(pdf_obj *obj, int i);
+pdf_document *pdf_get_indirect_document(fz_context *ctx, pdf_obj *obj);
+void pdf_set_str_len(fz_context *ctx, pdf_obj *obj, int newlen);
+void pdf_set_int(fz_context *ctx, pdf_obj *obj, int i);
#endif
diff --git a/include/mupdf/pdf/output-pdf.h b/include/mupdf/pdf/output-pdf.h
index fe7e4b5a..c823b201 100644
--- a/include/mupdf/pdf/output-pdf.h
+++ b/include/mupdf/pdf/output-pdf.h
@@ -6,13 +6,13 @@
new pdf content. WARNING: this device is work in progress. It doesn't
currently support all rendering cases.
*/
-fz_device *pdf_new_pdf_device(pdf_document *doc, pdf_obj *contents, pdf_obj *resources, const fz_matrix *ctm);
+fz_device *pdf_new_pdf_device(fz_context *ctx, pdf_document *doc, pdf_obj *contents, pdf_obj *resources, const fz_matrix *ctm);
/*
pdf_write_document: Write out the document to a file with all changes finalised.
*/
-void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *opts);
+void pdf_write_document(fz_context *ctx, pdf_document *doc, char *filename, fz_write_options *opts);
-void pdf_localise_page_resources(pdf_document *doc);
+void pdf_localise_page_resources(fz_context *ctx, pdf_document *doc);
#endif
diff --git a/include/mupdf/pdf/page.h b/include/mupdf/pdf/page.h
index c1b690b6..ab4a8ce3 100644
--- a/include/mupdf/pdf/page.h
+++ b/include/mupdf/pdf/page.h
@@ -1,9 +1,9 @@
#ifndef MUPDF_PDF_PAGE_H
#define MUPDF_PDF_PAGE_H
-int pdf_lookup_page_number(pdf_document *doc, pdf_obj *pageobj);
-int pdf_count_pages(pdf_document *doc);
-pdf_obj *pdf_lookup_page_obj(pdf_document *doc, int needle);
+int pdf_lookup_page_number(fz_context *ctx, pdf_document *doc, pdf_obj *pageobj);
+int pdf_count_pages(fz_context *ctx, pdf_document *doc);
+pdf_obj *pdf_lookup_page_obj(fz_context *ctx, pdf_document *doc, int needle);
/*
pdf_load_page: Load a page and its resources.
@@ -15,9 +15,9 @@ pdf_obj *pdf_lookup_page_obj(pdf_document *doc, int needle);
number: page number, where 0 is the first page of the document.
*/
-pdf_page *pdf_load_page(pdf_document *doc, int number);
+pdf_page *pdf_load_page(fz_context *ctx, pdf_document *doc, int number);
-fz_link *pdf_load_links(pdf_document *doc, pdf_page *page);
+fz_link *pdf_load_links(fz_context *ctx, pdf_page *page);
/*
pdf_bound_page: Determine the size of a page.
@@ -29,14 +29,7 @@ fz_link *pdf_load_links(pdf_document *doc, pdf_page *page);
Does not throw exceptions.
*/
-fz_rect *pdf_bound_page(pdf_document *doc, pdf_page *page, fz_rect *);
-
-/*
- pdf_free_page: Frees a page and its resources.
-
- Does not throw exceptions.
-*/
-void pdf_free_page(pdf_document *doc, pdf_page *page);
+fz_rect *pdf_bound_page(fz_context *ctx, pdf_page *page, fz_rect *);
/*
pdf_run_page: Interpret a loaded page and render it on a device.
@@ -48,7 +41,7 @@ void pdf_free_page(pdf_document *doc, pdf_page *page);
ctm: A transformation matrix applied to the objects on the page,
e.g. to scale or rotate the page contents as desired.
*/
-void pdf_run_page(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie);
+void pdf_run_page(fz_context *ctx, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie);
/*
pdf_run_page: Interpret a loaded page and render it on a device.
@@ -63,7 +56,7 @@ void pdf_run_page(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_ma
cookie: A pointer to an optional fz_cookie structure that can be used
to track progress, collect errors etc.
*/
-void pdf_run_page_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie);
+void pdf_run_page_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie);
/*
pdf_run_page_contents: Interpret a loaded page and render it on a device.
@@ -76,7 +69,7 @@ void pdf_run_page_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev,
ctm: A transformation matrix applied to the objects on the page,
e.g. to scale or rotate the page contents as desired.
*/
-void pdf_run_page_contents(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie);
+void pdf_run_page_contents(fz_context *ctx, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie);
/*
pdf_clean_page_contents: Clean a loaded pages rendering operations.
@@ -92,12 +85,12 @@ void pdf_run_page_contents(pdf_document *doc, pdf_page *page, fz_device *dev, co
cookie: A pointer to an optional fz_cookie structure that can be used
to track progress, collect errors etc.
*/
-void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cookie);
+void pdf_clean_page_contents(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_cookie *cookie);
/*
Presentation interface.
*/
-fz_transition *pdf_page_presentation(pdf_document *doc, pdf_page *page, float *duration);
+fz_transition *pdf_page_presentation(fz_context *ctx, pdf_page *page, float *duration);
/*
* Page tree, pages and related objects
@@ -105,6 +98,9 @@ fz_transition *pdf_page_presentation(pdf_document *doc, pdf_page *page, float *d
struct pdf_page_s
{
+ fz_page super;
+ pdf_document *doc;
+
fz_matrix ctm; /* calculated from mediabox and rotate */
fz_rect mediabox;
int rotate;
diff --git a/include/mupdf/pdf/parse.h b/include/mupdf/pdf/parse.h
index 625ebfca..23584029 100644
--- a/include/mupdf/pdf/parse.h
+++ b/include/mupdf/pdf/parse.h
@@ -20,16 +20,16 @@ typedef enum
} pdf_token;
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);
+void pdf_lexbuf_fin(fz_context *ctx, pdf_lexbuf *lexbuf);
+ptrdiff_t pdf_lexbuf_grow(fz_context *ctx, pdf_lexbuf *lexbuf);
-pdf_token pdf_lex(fz_stream *f, pdf_lexbuf *lexbuf);
-pdf_token pdf_lex_no_string(fz_stream *f, pdf_lexbuf *lexbuf);
+pdf_token pdf_lex(fz_context *ctx, fz_stream *f, pdf_lexbuf *lexbuf);
+pdf_token pdf_lex_no_string(fz_context *ctx, 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, int *try_repair);
+pdf_obj *pdf_parse_array(fz_context *ctx, pdf_document *doc, fz_stream *f, pdf_lexbuf *buf);
+pdf_obj *pdf_parse_dict(fz_context *ctx, pdf_document *doc, fz_stream *f, pdf_lexbuf *buf);
+pdf_obj *pdf_parse_stm_obj(fz_context *ctx, pdf_document *doc, fz_stream *f, pdf_lexbuf *buf);
+pdf_obj *pdf_parse_ind_obj(fz_context *ctx, pdf_document *doc, fz_stream *f, pdf_lexbuf *buf, int *num, int *gen, int *stm_ofs, int *try_repair);
/*
pdf_print_token: print a lexed token to a buffer, growing if necessary
diff --git a/include/mupdf/pdf/resource.h b/include/mupdf/pdf/resource.h
index 0b090705..fb542f59 100644
--- a/include/mupdf/pdf/resource.h
+++ b/include/mupdf/pdf/resource.h
@@ -5,24 +5,24 @@
* 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);
+void *pdf_find_item(fz_context *ctx, fz_store_drop_fn *drop, pdf_obj *key);
+void pdf_remove_item(fz_context *ctx, fz_store_drop_fn *drop, pdf_obj *key);
/*
* Functions, Colorspaces, Shadings and Images
*/
-fz_function *pdf_load_function(pdf_document *doc, pdf_obj *ref, int in, int out);
+fz_function *pdf_load_function(fz_context *ctx, pdf_document *doc, pdf_obj *ref, int in, int out);
-fz_colorspace *pdf_load_colorspace(pdf_document *doc, pdf_obj *obj);
-int pdf_is_tint_colorspace(fz_colorspace *cs);
+fz_colorspace *pdf_load_colorspace(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
+int pdf_is_tint_colorspace(fz_context *ctx, fz_colorspace *cs);
-fz_shade *pdf_load_shading(pdf_document *doc, pdf_obj *obj);
+fz_shade *pdf_load_shading(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
-fz_image *pdf_load_inline_image(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file);
+fz_image *pdf_load_inline_image(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file);
int pdf_is_jpx_image(fz_context *ctx, pdf_obj *dict);
-fz_image *pdf_load_image(pdf_document *doc, pdf_obj *obj);
+fz_image *pdf_load_image(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
/*
* Pattern
@@ -42,7 +42,7 @@ struct pdf_pattern_s
pdf_obj *contents;
};
-pdf_pattern *pdf_load_pattern(pdf_document *doc, pdf_obj *obj);
+pdf_pattern *pdf_load_pattern(fz_context *ctx, 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);
@@ -67,12 +67,12 @@ struct pdf_xobject_s
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_load_xobject(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
+pdf_obj *pdf_new_xobject(fz_context *ctx, 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 *doc, pdf_xobject *form, fz_buffer *buffer);
+void pdf_update_xobject_contents(fz_context *ctx, pdf_document *doc, pdf_xobject *form, fz_buffer *buffer);
-void pdf_update_appearance(pdf_document *doc, pdf_annot *annot);
+void pdf_update_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot);
#endif
diff --git a/include/mupdf/pdf/widget.h b/include/mupdf/pdf/widget.h
index 9f2745cc..45441e55 100644
--- a/include/mupdf/pdf/widget.h
+++ b/include/mupdf/pdf/widget.h
@@ -37,22 +37,22 @@ enum
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_widget *pdf_focused_widget(fz_context *ctx, pdf_document *doc);
/*
pdf_first_widget: get first widget when enumerating
*/
-pdf_widget *pdf_first_widget(pdf_document *doc, pdf_page *page);
+pdf_widget *pdf_first_widget(fz_context *ctx, pdf_document *doc, pdf_page *page);
/*
pdf_next_widget: get next widget when enumerating
*/
-pdf_widget *pdf_next_widget(pdf_widget *previous);
+pdf_widget *pdf_next_widget(fz_context *ctx, pdf_widget *previous);
/*
pdf_create_widget: create a new widget of a specific type
*/
-pdf_widget *pdf_create_widget(pdf_document *doc, pdf_page *page, int type, char *fieldname);
+pdf_widget *pdf_create_widget(fz_context *ctx, pdf_document *doc, pdf_page *page, int type, char *fieldname);
/*
pdf_widget_get_type: find out the type of a widget.
@@ -60,37 +60,37 @@ pdf_widget *pdf_create_widget(pdf_document *doc, pdf_page *page, int type, char
The type determines what widget subclass the widget
can safely be cast to.
*/
-int pdf_widget_get_type(pdf_widget *widget);
+int pdf_widget_get_type(fz_context *ctx, pdf_widget *widget);
/*
pdf_bound_widget: get the bounding box of a widget.
*/
-fz_rect *pdf_bound_widget(pdf_widget *widget, fz_rect *);
+fz_rect *pdf_bound_widget(fz_context *ctx, 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);
+char *pdf_text_widget_text(fz_context *ctx, 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);
+int pdf_text_widget_max_len(fz_context *ctx, 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);
+int pdf_text_widget_content_type(fz_context *ctx, 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);
+int pdf_text_widget_set_text(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *text);
/*
pdf_choice_widget_options: get the list of options for a list
@@ -98,13 +98,13 @@ int pdf_text_widget_set_text(pdf_document *doc, pdf_widget *tw, char *text);
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[]);
+int pdf_choice_widget_options(fz_context *ctx, 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);
+int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_widget *tw);
/*
pdf_choice_widget_value: get the value of a choice widget.
@@ -113,13 +113,13 @@ int pdf_choice_widget_is_multiselect(pdf_document *doc, pdf_widget *tw);
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[]);
+int pdf_choice_widget_value(fz_context *ctx, 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[]);
+void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, char *opts[]);
#endif
diff --git a/include/mupdf/pdf/xref.h b/include/mupdf/pdf/xref.h
index 70826314..c41b0291 100644
--- a/include/mupdf/pdf/xref.h
+++ b/include/mupdf/pdf/xref.h
@@ -4,17 +4,17 @@
/*
pdf_create_object: Allocate a slot in the xref table and return a fresh unused object number.
*/
-int pdf_create_object(pdf_document *doc);
+int pdf_create_object(fz_context *ctx, pdf_document *doc);
/*
pdf_delete_object: Remove object from xref table, marking the slot as free.
*/
-void pdf_delete_object(pdf_document *doc, int num);
+void pdf_delete_object(fz_context *ctx, pdf_document *doc, int num);
/*
pdf_update_object: Replace object in xref table with the passed in object.
*/
-void pdf_update_object(pdf_document *doc, int num, pdf_obj *obj);
+void pdf_update_object(fz_context *ctx, pdf_document *doc, int num, pdf_obj *obj);
/*
pdf_update_stream: Replace stream contents for object in xref table with the passed in buffer.
@@ -24,7 +24,7 @@ void pdf_update_object(pdf_document *doc, int num, pdf_obj *obj);
the stream dictionary. If storing deflated data, make sure to set the
/Filter value to /FlateDecode.
*/
-void pdf_update_stream(pdf_document *doc, int num, fz_buffer *buf);
+void pdf_update_stream(fz_context *ctx, pdf_document *doc, int num, fz_buffer *buf);
/*
* xref and object / stream api
@@ -66,48 +66,48 @@ struct pdf_xref_s
pdf_obj *pre_repair_trailer;
};
-void pdf_cache_object(pdf_document *doc, int num, int gen);
+pdf_xref_entry *pdf_cache_object(fz_context *ctx, pdf_document *doc, int num, int gen);
-int pdf_count_objects(pdf_document *doc);
-pdf_obj *pdf_resolve_indirect(pdf_obj *ref);
-pdf_obj *pdf_load_object(pdf_document *doc, int num, int gen);
+int pdf_count_objects(fz_context *ctx, pdf_document *doc);
+pdf_obj *pdf_resolve_indirect(fz_context *ctx, pdf_obj *ref);
+pdf_obj *pdf_load_object(fz_context *ctx, pdf_document *doc, int num, int gen);
-fz_buffer *pdf_load_raw_stream(pdf_document *doc, int num, int gen);
-fz_buffer *pdf_load_stream(pdf_document *doc, int num, int gen);
-fz_stream *pdf_open_raw_stream(pdf_document *doc, int num, int gen);
-fz_stream *pdf_open_stream(pdf_document *doc, int num, int gen);
+fz_buffer *pdf_load_raw_stream(fz_context *ctx, pdf_document *doc, int num, int gen);
+fz_buffer *pdf_load_stream(fz_context *ctx, pdf_document *doc, int num, int gen);
+fz_stream *pdf_open_raw_stream(fz_context *ctx, pdf_document *doc, int num, int gen);
+fz_stream *pdf_open_stream(fz_context *ctx, 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);
-void pdf_load_compressed_inline_image(pdf_document *doc, pdf_obj *dict, int length, fz_stream *cstm, int indexed, fz_image *image);
-fz_stream *pdf_open_stream_with_offset(pdf_document *doc, int num, int gen, pdf_obj *dict, int stm_ofs);
+fz_stream *pdf_open_inline_stream(fz_context *ctx, pdf_document *doc, pdf_obj *stmobj, int length, fz_stream *chain, fz_compression_params *params);
+fz_compressed_buffer *pdf_load_compressed_stream(fz_context *ctx, pdf_document *doc, int num, int gen);
+void pdf_load_compressed_inline_image(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int length, fz_stream *cstm, int indexed, fz_image *image);
+fz_stream *pdf_open_stream_with_offset(fz_context *ctx, 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 *doc, 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_xref_ensure_incremental_object(pdf_document *doc, int num);
-int pdf_xref_is_incremental(pdf_document *doc, int num);
-
-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_ensure_solid_xref(pdf_document *doc, int num);
-void pdf_mark_xref(pdf_document *doc);
-void pdf_clear_xref(pdf_document *doc);
-void pdf_clear_xref_to_mark(pdf_document *doc);
-
-int pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, pdf_obj **encrypt, pdf_obj **id, pdf_obj **page, int *tmpofs);
-
-pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum);
-
-void pdf_print_xref(pdf_document *);
+fz_stream *pdf_open_contents_stream(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
+fz_buffer *pdf_load_raw_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen);
+fz_buffer *pdf_load_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, int *truncated);
+fz_stream *pdf_open_raw_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen);
+
+pdf_obj *pdf_trailer(fz_context *ctx, pdf_document *doc);
+void pdf_set_populating_xref_trailer(fz_context *ctx, pdf_document *doc, pdf_obj *trailer);
+int pdf_xref_len(fz_context *ctx, pdf_document *doc);
+pdf_xref_entry *pdf_get_populating_xref_entry(fz_context *ctx, pdf_document *doc, int i);
+pdf_xref_entry *pdf_get_xref_entry(fz_context *ctx, pdf_document *doc, int i);
+void pdf_replace_xref(fz_context *ctx, pdf_document *doc, pdf_xref_entry *entries, int n);
+void pdf_xref_ensure_incremental_object(fz_context *ctx, pdf_document *doc, int num);
+int pdf_xref_is_incremental(fz_context *ctx, pdf_document *doc, int num);
+
+void pdf_repair_xref(fz_context *ctx, pdf_document *doc);
+void pdf_repair_obj_stms(fz_context *ctx, pdf_document *doc);
+pdf_obj *pdf_new_ref(fz_context *ctx, pdf_document *doc, pdf_obj *obj);
+void pdf_ensure_solid_xref(fz_context *ctx, pdf_document *doc, int num);
+void pdf_mark_xref(fz_context *ctx, pdf_document *doc);
+void pdf_clear_xref(fz_context *ctx, pdf_document *doc);
+void pdf_clear_xref_to_mark(fz_context *ctx, pdf_document *doc);
+
+int pdf_repair_obj(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, pdf_obj **encrypt, pdf_obj **id, pdf_obj **page, int *tmpofs);
+
+pdf_obj *pdf_progressive_advance(fz_context *ctx, pdf_document *doc, int pagenum);
+
+void pdf_print_xref(fz_context *ctx, pdf_document *);
#endif
diff --git a/include/mupdf/tiff.h b/include/mupdf/tiff.h
deleted file mode 100644
index 1304e4b2..00000000
--- a/include/mupdf/tiff.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef MUPDF_TIFF_H
-#define MUPDF_TIFF_H
-
-#include "mupdf/fitz.h"
-
-typedef struct tiff_document_s tiff_document;
-typedef struct tiff_page_s tiff_page;
-
-/*
- tiff_open_document: Open a document.
-
- Open a document for reading so the library is able to locate
- objects and pages inside the file.
-
- The returned tiff_document should be used when calling most
- other functions. Note that it wraps the context, so those
- functions implicitly get access to the global state in
- context.
-
- filename: a path to a file as it would be given to open(2).
-*/
-tiff_document *tiff_open_document(fz_context *ctx, const char *filename);
-
-/*
- tiff_open_document_with_stream: Opens a document.
-
- Same as tiff_open_document, but takes a stream instead of a
- filename to locate the document to open. Increments the
- reference count of the stream. See fz_open_file,
- fz_open_file_w or fz_open_fd for opening a stream, and
- fz_close for closing an open stream.
-*/
-tiff_document *tiff_open_document_with_stream(fz_context *ctx, fz_stream *file);
-
-/*
- tiff_close_document: Closes and frees an opened document.
-
- The resource store in the context associated with tiff_document
- is emptied.
-
- Does not throw exceptions.
-*/
-void tiff_close_document(tiff_document *doc);
-
-int tiff_count_pages(tiff_document *doc);
-tiff_page *tiff_load_page(tiff_document *doc, int number);
-fz_rect *tiff_bound_page(tiff_document *doc, tiff_page *page, fz_rect *rect);
-void tiff_free_page(tiff_document *doc, tiff_page *page);
-void tiff_run_page(tiff_document *doc, tiff_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie);
-
-#endif
diff --git a/include/mupdf/xps.h b/include/mupdf/xps.h
index 48574931..13c8eea0 100644
--- a/include/mupdf/xps.h
+++ b/include/mupdf/xps.h
@@ -28,7 +28,7 @@ xps_document *xps_open_document(fz_context *ctx, const char *filename);
filename to locate the document to open. Increments the
reference count of the stream. See fz_open_file,
fz_open_file_w or fz_open_fd for opening a stream, and
- fz_close for closing an open stream.
+ fz_drop_stream for closing an open stream.
*/
xps_document *xps_open_document_with_stream(fz_context *ctx, fz_stream *file);
@@ -40,16 +40,12 @@ xps_document *xps_open_document_with_stream(fz_context *ctx, fz_stream *file);
Does not throw exceptions.
*/
-void xps_close_document(xps_document *doc);
+void xps_close_document(fz_context *ctx, xps_document *doc);
-int xps_count_pages(xps_document *doc);
-xps_page *xps_load_page(xps_document *doc, int number);
-fz_rect *xps_bound_page(xps_document *doc, xps_page *page, fz_rect *rect);
-void xps_run_page(xps_document *doc, xps_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie);
-fz_link *xps_load_links(xps_document *doc, xps_page *page);
-void xps_free_page(xps_document *doc, xps_page *page);
-
-fz_outline *xps_load_outline(xps_document *doc);
+int xps_count_pages(fz_context *ctx, xps_document *doc);
+xps_page *xps_load_page(fz_context *ctx, xps_document *doc, int number);
+fz_outline *xps_load_outline(fz_context *ctx, xps_document *doc);
+void xps_run_page(fz_context *ctx, xps_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie);
/* xps-internal.h */
@@ -58,9 +54,9 @@ fz_outline *xps_load_outline(xps_document *doc);
*/
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);
+void xps_resolve_url(fz_context *ctx, xps_document *doc, char *output, char *base_uri, char *path, int output_size);
+int xps_url_is_remote(fz_context *ctx, xps_document *doc, char *path);
+char *xps_parse_point(fz_context *ctx, xps_document *doc, char *s_in, float *x, float *y);
/*
* Container parts.
@@ -75,15 +71,16 @@ struct xps_part_s
unsigned char *data;
};
-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);
+int xps_has_part(fz_context *ctx, xps_document *doc, char *partname);
+xps_part *xps_read_part(fz_context *ctx, xps_document *doc, char *partname);
+void xps_drop_part(fz_context *ctx, xps_document *doc, xps_part *part);
/*
* Document structure.
*/
typedef struct xps_fixdoc_s xps_fixdoc;
+typedef struct xps_fixpage_s xps_fixpage;
typedef struct xps_target_s xps_target;
struct xps_fixdoc_s
@@ -93,16 +90,23 @@ struct xps_fixdoc_s
xps_fixdoc *next;
};
-struct xps_page_s
+struct xps_fixpage_s
{
char *name;
int number;
int width;
int height;
- fz_xml *root;
int links_resolved;
fz_link *links;
- xps_page *next;
+ xps_fixpage *next;
+};
+
+struct xps_page_s
+{
+ fz_page super;
+ xps_document *doc;
+ xps_fixpage *fix;
+ fz_xml *root;
};
struct xps_target_s
@@ -112,12 +116,12 @@ struct xps_target_s
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);
+void xps_read_page_list(fz_context *ctx, xps_document *doc);
+void xps_print_page_list(fz_context *ctx, xps_document *doc);
+void xps_drop_page_list(fz_context *ctx, 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);
+int xps_lookup_link_target(fz_context *ctx, xps_document *doc, char *target_uri);
+void xps_add_link(fz_context *ctx, xps_document *doc, const fz_rect *area, char *base_uri, char *target_uri);
/*
* Images, fonts, and colorspaces.
@@ -144,12 +148,12 @@ 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_measure_font_glyph(fz_context *ctx, xps_document *doc, fz_font *font, int gid, xps_glyph_metrics *mtx);
-void xps_print_path(xps_document *doc);
+void xps_print_path(fz_context *ctx, 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);
+void xps_parse_color(fz_context *ctx, xps_document *doc, char *base_uri, char *hexstring, fz_colorspace **csp, float *samples);
+void xps_set_color(fz_context *ctx, xps_document *doc, fz_colorspace *colorspace, float *samples);
/*
* Resource dictionaries.
@@ -167,41 +171,41 @@ struct xps_resource_s
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);
+xps_resource * xps_parse_resource_dictionary(fz_context *ctx, xps_document *doc, char *base_uri, fz_xml *root);
+void xps_drop_resource_dictionary(fz_context *ctx, xps_document *doc, xps_resource *dict);
+void xps_resolve_resource_reference(fz_context *ctx, xps_document *doc, xps_resource *dict, char **attp, fz_xml **tagp, char **urip);
-void xps_print_resource_dictionary(xps_resource *dict);
+void xps_print_resource_dictionary(fz_context *ctx, xps_document *doc, 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_fixed_page(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, xps_page *page);
+void xps_parse_canvas(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_path(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_glyphs(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_solid_color_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_image_brush(fz_context *ctx, 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(fz_context *ctx, 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(fz_context *ctx, 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(fz_context *ctx, 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_tiling_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *root, void(*func)(fz_context *ctx, 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_parse_matrix_transform(fz_context *ctx, xps_document *doc, fz_xml *root, fz_matrix *matrix);
+void xps_parse_render_transform(fz_context *ctx, xps_document *doc, char *text, fz_matrix *matrix);
+void xps_parse_rectangle(fz_context *ctx, 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_begin_opacity(fz_context *ctx, 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(fz_context *ctx, 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_parse_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node);
+void xps_parse_element(fz_context *ctx, 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);
+void xps_clip(fz_context *ctx, 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);
+fz_xml *xps_lookup_alternate_content(fz_context *ctx, xps_document *doc, fz_xml *node);
/*
* The interpreter context.
@@ -220,14 +224,13 @@ struct xps_entry_s
struct xps_document_s
{
fz_document super;
- fz_context *ctx;
fz_archive *zip;
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 */
+ xps_fixpage *first_page; /* first page of document */
+ xps_fixpage *last_page; /* last page of document */
int page_count;
xps_target *target; /* link targets */
@@ -248,11 +251,11 @@ struct xps_document_s
float alpha;
/* Current device */
- fz_cookie *cookie;
fz_device *dev;
+ fz_cookie *cookie;
/* Current page we are loading */
- xps_page *current_page;
+ xps_fixpage *current_page;
};
#endif
diff --git a/platform/android/jni/mupdf.c b/platform/android/jni/mupdf.c
index 21c7bbb5..5e6506be 100644
--- a/platform/android/jni/mupdf.c
+++ b/platform/android/jni/mupdf.c
@@ -137,7 +137,7 @@ static void drop_page_cache(globals *glo, page_cache *pc)
pc->page_list = NULL;
fz_drop_display_list(ctx, pc->annot_list);
pc->annot_list = NULL;
- fz_free_page(doc, pc->page);
+ fz_free_page(ctx, pc->page);
pc->page = NULL;
drop_changed_rects(ctx, &pc->changed_rects);
drop_changed_rects(ctx, &pc->hq_changed_rects);
@@ -180,27 +180,28 @@ static void show_alert(globals *glo, pdf_alert_event *alert)
pthread_mutex_unlock(&glo->fin_lock2);
}
-static void event_cb(pdf_doc_event *event, void *data)
+static void event_cb(fz_context *ctx, pdf_document *doc, pdf_doc_event *event, void *data)
{
globals *glo = (globals *)data;
switch (event->type)
{
case PDF_DOCUMENT_EVENT_ALERT:
- show_alert(glo, pdf_access_alert_event(event));
+ show_alert(glo, pdf_access_alert_event(ctx, event));
break;
}
}
static void alerts_init(globals *glo)
{
- pdf_document *idoc = pdf_specifics(glo->doc);
+ fz_context *ctx = glo->ctx;
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
if (!idoc || glo->alerts_initialised)
return;
if (idoc)
- pdf_enable_js(idoc);
+ pdf_enable_js(ctx, idoc);
glo->alerts_active = 0;
glo->alert_request = 0;
@@ -211,20 +212,21 @@ static void alerts_init(globals *glo)
pthread_cond_init(&glo->alert_request_cond, NULL);
pthread_cond_init(&glo->alert_reply_cond, NULL);
- pdf_set_doc_event_callback(idoc, event_cb, glo);
+ pdf_set_doc_event_callback(ctx, idoc, event_cb, glo);
LOGT("alert_init");
glo->alerts_initialised = 1;
}
static void alerts_fin(globals *glo)
{
- pdf_document *idoc = pdf_specifics(glo->doc);
+ fz_context *ctx = glo->ctx;
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
if (!glo->alerts_initialised)
return;
LOGT("Enter alerts_fin");
if (idoc)
- pdf_set_doc_event_callback(idoc, NULL, NULL);
+ pdf_set_doc_event_callback(ctx, idoc, NULL, NULL);
// Set alerts_active false and wake up show_alert and waitForAlertInternal,
pthread_mutex_lock(&glo->alert_lock);
@@ -330,9 +332,9 @@ JNI_FN(MuPDFCore_openFile)(JNIEnv * env, jobject thiz, jstring jfilename)
fz_catch(ctx)
{
LOGE("Failed: %s", ctx->error->message);
- fz_close_document(glo->doc);
+ fz_drop_document(ctx, glo->doc);
glo->doc = NULL;
- fz_free_context(ctx);
+ fz_drop_context(ctx);
glo->ctx = NULL;
free(glo);
glo = NULL;
@@ -350,7 +352,7 @@ typedef struct buffer_state_s
}
buffer_state;
-static int bufferStreamNext(fz_stream *stream, int max)
+static int bufferStreamNext(fz_context *ctx, fz_stream *stream, int max)
{
buffer_state *bs = (buffer_state *)stream->state;
globals *glo = bs->globals;
@@ -382,7 +384,7 @@ static void bufferStreamClose(fz_context *ctx, void *state)
fz_free(ctx, state);
}
-static void bufferStreamSeek(fz_stream *stream, int offset, int whence)
+static void bufferStreamSeek(fz_context *ctx, fz_stream *stream, int offset, int whence)
{
buffer_state *bs = (buffer_state *)stream->state;
globals *glo = bs->globals;
@@ -459,7 +461,7 @@ JNI_FN(MuPDFCore_openBuffer)(JNIEnv * env, jobject thiz, jstring jmagic)
{
bs = fz_malloc_struct(ctx, buffer_state);
bs->globals = glo;
- stream = fz_new_stream(ctx, bs, bufferStreamNext, bufferStreamClose, NULL);
+ stream = fz_new_stream(ctx, bs, bufferStreamNext, bufferStreamClose);
stream->seek = bufferStreamSeek;
glo->colorspace = fz_device_rgb(ctx);
@@ -479,14 +481,14 @@ JNI_FN(MuPDFCore_openBuffer)(JNIEnv * env, jobject thiz, jstring jmagic)
}
fz_always(ctx)
{
- fz_close(stream);
+ fz_drop_stream(ctx, stream);
}
fz_catch(ctx)
{
LOGE("Failed: %s", ctx->error->message);
- fz_close_document(glo->doc);
+ fz_drop_document(ctx, glo->doc);
glo->doc = NULL;
- fz_free_context(ctx);
+ fz_drop_context(ctx);
glo->ctx = NULL;
free(glo);
glo = NULL;
@@ -506,7 +508,7 @@ JNI_FN(MuPDFCore_countPagesInternal)(JNIEnv *env, jobject thiz)
fz_try(ctx)
{
- count = fz_count_pages(glo->doc);
+ count = fz_count_pages(ctx, glo->doc);
}
fz_catch(ctx)
{
@@ -520,8 +522,9 @@ JNI_FN(MuPDFCore_fileFormatInternal)(JNIEnv * env, jobject thiz)
{
char info[64];
globals *glo = get_globals(env, thiz);
+ fz_context *ctx = glo->ctx;
- fz_meta(glo->doc, FZ_META_FORMAT_INFO, info, sizeof(info));
+ fz_meta(ctx, glo->doc, FZ_META_FORMAT_INFO, info, sizeof(info));
return (*env)->NewStringUTF(env, info);
}
@@ -533,11 +536,12 @@ JNI_FN(MuPDFCore_isUnencryptedPDFInternal)(JNIEnv * env, jobject thiz)
if (glo == NULL)
return JNI_FALSE;
- pdf_document *idoc = pdf_specifics(glo->doc);
+ fz_context *ctx = glo->ctx;
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
if (idoc == NULL)
return JNI_FALSE; // Not a PDF
- int cryptVer = pdf_crypt_version(idoc);
+ int cryptVer = pdf_crypt_version(ctx, idoc);
return (cryptVer == 0) ? JNI_TRUE : JNI_FALSE;
}
@@ -600,9 +604,9 @@ JNI_FN(MuPDFCore_gotoPageInternal)(JNIEnv *env, jobject thiz, int page)
{
fz_rect rect;
LOGI("Load page %d", pc->number);
- pc->page = fz_load_page(glo->doc, pc->number);
+ pc->page = fz_load_page(ctx, glo->doc, pc->number);
zoom = glo->resolution / 72;
- fz_bound_page(glo->doc, pc->page, &pc->media_box);
+ fz_bound_page(ctx, pc->page, &pc->media_box);
fz_scale(&ctm, zoom, zoom);
rect = pc->media_box;
fz_round_rect(&bbox, fz_transform_rect(&rect, &ctm));
@@ -635,25 +639,27 @@ JNIEXPORT jboolean JNICALL
JNI_FN(MuPDFCore_javascriptSupported)(JNIEnv *env, jobject thiz)
{
globals *glo = get_globals(env, thiz);
- pdf_document *idoc = pdf_specifics(glo->doc);
- return pdf_js_supported(idoc);
+ fz_context *ctx = glo->ctx;
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
+ return pdf_js_supported(ctx, idoc);
}
static void update_changed_rects(globals *glo, page_cache *pc, pdf_document *idoc)
{
+ fz_context *ctx = glo->ctx;
fz_annot *annot;
- pdf_update_page(idoc, (pdf_page *)pc->page);
- while ((annot = (fz_annot *)pdf_poll_changed_annot(idoc, (pdf_page *)pc->page)) != NULL)
+ pdf_update_page(ctx, idoc, (pdf_page *)pc->page);
+ while ((annot = (fz_annot *)pdf_poll_changed_annot(ctx, idoc, (pdf_page *)pc->page)) != NULL)
{
/* FIXME: We bound the annot twice here */
rect_node *node = fz_malloc_struct(glo->ctx, rect_node);
- fz_bound_annot(glo->doc, annot, &node->rect);
+ fz_bound_annot(ctx, pc->page, annot, &node->rect);
node->next = pc->changed_rects;
pc->changed_rects = node;
node = fz_malloc_struct(glo->ctx, rect_node);
- fz_bound_annot(glo->doc, annot, &node->rect);
+ fz_bound_annot(ctx, pc->page, annot, &node->rect);
node->next = pc->hq_changed_rects;
pc->hq_changed_rects = node;
}
@@ -712,7 +718,7 @@ JNI_FN(MuPDFCore_drawPage)(JNIEnv *env, jobject thiz, jobject bitmap,
fz_try(ctx)
{
fz_irect pixbbox;
- pdf_document *idoc = pdf_specifics(doc);
+ pdf_document *idoc = pdf_specifics(ctx, doc);
if (idoc)
{
@@ -729,8 +735,8 @@ JNI_FN(MuPDFCore_drawPage)(JNIEnv *env, jobject thiz, jobject bitmap,
/* Render to list */
pc->page_list = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, pc->page_list);
- fz_run_page_contents(doc, pc->page, dev, &fz_identity, cookie);
- fz_free_device(dev);
+ fz_run_page_contents(ctx, pc->page, dev, &fz_identity, cookie);
+ fz_drop_device(ctx, dev);
dev = NULL;
if (cookie != NULL && cookie->abort)
{
@@ -744,9 +750,9 @@ JNI_FN(MuPDFCore_drawPage)(JNIEnv *env, jobject thiz, jobject bitmap,
fz_annot *annot;
pc->annot_list = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, pc->annot_list);
- for (annot = fz_first_annot(doc, pc->page); annot; annot = fz_next_annot(doc, annot))
- fz_run_annot(doc, pc->page, annot, dev, &fz_identity, cookie);
- fz_free_device(dev);
+ for (annot = fz_first_annot(ctx, pc->page); annot; annot = fz_next_annot(ctx, pc->page, annot))
+ fz_run_annot(ctx, pc->page, annot, dev, &fz_identity, cookie);
+ fz_drop_device(ctx, dev);
dev = NULL;
if (cookie != NULL && cookie->abort)
{
@@ -793,12 +799,12 @@ JNI_FN(MuPDFCore_drawPage)(JNIEnv *env, jobject thiz, jobject bitmap,
for (i=0; i<100;i++) {
#endif
if (pc->page_list)
- fz_run_display_list(pc->page_list, dev, &ctm, &rect, cookie);
+ fz_run_display_list(ctx, pc->page_list, dev, &ctm, &rect, cookie);
if (cookie != NULL && cookie->abort)
fz_throw(ctx, FZ_ERROR_GENERIC, "Render aborted");
if (pc->annot_list)
- fz_run_display_list(pc->annot_list, dev, &ctm, &rect, cookie);
+ fz_run_display_list(ctx, pc->annot_list, dev, &ctm, &rect, cookie);
if (cookie != NULL && cookie->abort)
fz_throw(ctx, FZ_ERROR_GENERIC, "Render aborted");
@@ -808,14 +814,14 @@ JNI_FN(MuPDFCore_drawPage)(JNIEnv *env, jobject thiz, jobject bitmap,
LOGI("100 renders in %d (%d per sec)", time, CLOCKS_PER_SEC);
}
#endif
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
dev = NULL;
fz_drop_pixmap(ctx, pix);
LOGI("Rendered");
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
dev = NULL;
}
fz_catch(ctx)
@@ -884,7 +890,7 @@ JNI_FN(MuPDFCore_updatePageInternal)(JNIEnv *env, jobject thiz, jobject bitmap,
return JNI_FN(MuPDFCore_drawPage)(env, thiz, bitmap, pageW, pageH, patchX, patchY, patchW, patchH, (jlong)(intptr_t)cookie);
}
- idoc = pdf_specifics(doc);
+ idoc = pdf_specifics(ctx, doc);
fz_var(pix);
fz_var(dev);
@@ -927,8 +933,8 @@ JNI_FN(MuPDFCore_updatePageInternal)(JNIEnv *env, jobject thiz, jobject bitmap,
/* Render to list */
pc->page_list = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, pc->page_list);
- fz_run_page_contents(doc, pc->page, dev, &fz_identity, cookie);
- fz_free_device(dev);
+ fz_run_page_contents(ctx, pc->page, dev, &fz_identity, cookie);
+ fz_drop_device(ctx, dev);
dev = NULL;
if (cookie != NULL && cookie->abort)
{
@@ -941,9 +947,9 @@ JNI_FN(MuPDFCore_updatePageInternal)(JNIEnv *env, jobject thiz, jobject bitmap,
if (pc->annot_list == NULL) {
pc->annot_list = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, pc->annot_list);
- for (annot = fz_first_annot(doc, pc->page); annot; annot = fz_next_annot(doc, annot))
- fz_run_annot(doc, pc->page, annot, dev, &fz_identity, cookie);
- fz_free_device(dev);
+ for (annot = fz_first_annot(ctx, pc->page); annot; annot = fz_next_annot(ctx, pc->page, annot))
+ fz_run_annot(ctx, pc->page, annot, dev, &fz_identity, cookie);
+ fz_drop_device(ctx, dev);
dev = NULL;
if (cookie != NULL && cookie->abort)
{
@@ -990,16 +996,16 @@ JNI_FN(MuPDFCore_updatePageInternal)(JNIEnv *env, jobject thiz, jobject bitmap,
fz_clear_pixmap_rect_with_value(ctx, pix, 0xff, &abox);
dev = fz_new_draw_device_with_bbox(ctx, pix, &abox);
if (pc->page_list)
- fz_run_display_list(pc->page_list, dev, &ctm, &arect, cookie);
+ fz_run_display_list(ctx, pc->page_list, dev, &ctm, &arect, cookie);
if (cookie != NULL && cookie->abort)
fz_throw(ctx, FZ_ERROR_GENERIC, "Render aborted");
if (pc->annot_list)
- fz_run_display_list(pc->annot_list, dev, &ctm, &arect, cookie);
+ fz_run_display_list(ctx, pc->annot_list, dev, &ctm, &arect, cookie);
if (cookie != NULL && cookie->abort)
fz_throw(ctx, FZ_ERROR_GENERIC, "Render aborted");
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
dev = NULL;
}
}
@@ -1012,7 +1018,7 @@ JNI_FN(MuPDFCore_updatePageInternal)(JNIEnv *env, jobject thiz, jobject bitmap,
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
dev = NULL;
}
fz_catch(ctx)
@@ -1027,17 +1033,17 @@ JNI_FN(MuPDFCore_updatePageInternal)(JNIEnv *env, jobject thiz, jobject bitmap,
}
static int
-charat(fz_text_page *page, int idx)
+charat(fz_context *ctx, fz_text_page *page, int idx)
{
fz_char_and_box cab;
- return fz_text_char_at(&cab, page, idx)->c;
+ return fz_text_char_at(ctx, &cab, page, idx)->c;
}
static fz_rect
-bboxcharat(fz_text_page *page, int idx)
+bboxcharat(fz_context *ctx, fz_text_page *page, int idx)
{
fz_char_and_box cab;
- return fz_text_char_at(&cab, page, idx)->bbox;
+ return fz_text_char_at(ctx, &cab, page, idx)->bbox;
}
static int
@@ -1120,8 +1126,9 @@ JNIEXPORT jboolean JNICALL
JNI_FN(MuPDFCore_needsPasswordInternal)(JNIEnv * env, jobject thiz)
{
globals *glo = get_globals(env, thiz);
+ fz_context *ctx = glo->ctx;
- return fz_needs_password(glo->doc) ? JNI_TRUE : JNI_FALSE;
+ return fz_needs_password(ctx, glo->doc) ? JNI_TRUE : JNI_FALSE;
}
JNIEXPORT jboolean JNICALL
@@ -1130,12 +1137,13 @@ JNI_FN(MuPDFCore_authenticatePasswordInternal)(JNIEnv *env, jobject thiz, jstrin
const char *pw;
int result;
globals *glo = get_globals(env, thiz);
+ fz_context *ctx = glo->ctx;
pw = (*env)->GetStringUTFChars(env, password, NULL);
if (pw == NULL)
return JNI_FALSE;
- result = fz_authenticate_password(glo->doc, (char *)pw);
+ result = fz_authenticate_password(ctx, glo->doc, (char *)pw);
(*env)->ReleaseStringUTFChars(env, password, pw);
return result;
}
@@ -1144,9 +1152,10 @@ JNIEXPORT jboolean JNICALL
JNI_FN(MuPDFCore_hasOutlineInternal)(JNIEnv * env, jobject thiz)
{
globals *glo = get_globals(env, thiz);
- fz_outline *outline = fz_load_outline(glo->doc);
+ fz_context *ctx = glo->ctx;
+ fz_outline *outline = fz_load_outline(ctx, glo->doc);
- fz_free_outline(glo->ctx, outline);
+ fz_drop_outline(glo->ctx, outline);
return (outline == NULL) ? JNI_FALSE : JNI_TRUE;
}
@@ -1160,6 +1169,7 @@ JNI_FN(MuPDFCore_getOutlineInternal)(JNIEnv * env, jobject thiz)
fz_outline *outline;
int nItems;
globals *glo = get_globals(env, thiz);
+ fz_context *ctx = glo->ctx;
jobjectArray ret;
olClass = (*env)->FindClass(env, PACKAGENAME "/OutlineItem");
@@ -1167,7 +1177,7 @@ JNI_FN(MuPDFCore_getOutlineInternal)(JNIEnv * env, jobject thiz)
ctor = (*env)->GetMethodID(env, olClass, "<init>", "(ILjava/lang/String;I)V");
if (ctor == NULL) return NULL;
- outline = fz_load_outline(glo->doc);
+ outline = fz_load_outline(ctx, glo->doc);
nItems = countOutlineItems(outline);
arr = (*env)->NewObjectArray(env,
@@ -1179,7 +1189,7 @@ JNI_FN(MuPDFCore_getOutlineInternal)(JNIEnv * env, jobject thiz)
ret = fillInOutlineItems(env, olClass, ctor, arr, 0, outline, 0) > 0
? arr
:NULL;
- fz_free_outline(glo->ctx, outline);
+ fz_drop_outline(glo->ctx, outline);
return ret;
}
@@ -1226,17 +1236,17 @@ JNI_FN(MuPDFCore_searchPage)(JNIEnv * env, jobject thiz, jstring jtext)
sheet = fz_new_text_sheet(ctx);
text = fz_new_text_page(ctx);
dev = fz_new_text_device(ctx, sheet, text);
- fz_run_page(doc, pc->page, dev, &ctm, NULL);
- fz_free_device(dev);
+ fz_run_page(ctx, pc->page, dev, &ctm, NULL);
+ fz_drop_device(ctx, dev);
dev = NULL;
hit_count = fz_search_text_page(ctx, text, str, glo->hit_bbox, MAX_SEARCH_HITS);
}
fz_always(ctx)
{
- fz_free_text_page(ctx, text);
- fz_free_text_sheet(ctx, sheet);
- fz_free_device(dev);
+ fz_drop_text_page(ctx, text);
+ fz_drop_text_sheet(ctx, sheet);
+ fz_drop_device(ctx, dev);
}
fz_catch(ctx)
{
@@ -1316,8 +1326,8 @@ JNI_FN(MuPDFCore_text)(JNIEnv * env, jobject thiz)
sheet = fz_new_text_sheet(ctx);
text = fz_new_text_page(ctx);
dev = fz_new_text_device(ctx, sheet, text);
- fz_run_page(doc, pc->page, dev, &ctm, NULL);
- fz_free_device(dev);
+ fz_run_page(ctx, pc->page, dev, &ctm, NULL);
+ fz_drop_device(ctx, dev);
dev = NULL;
barr = (*env)->NewObjectArray(env, text->len, textBlockClass, NULL);
@@ -1356,7 +1366,7 @@ JNI_FN(MuPDFCore_text)(JNIEnv * env, jobject thiz)
{
fz_text_char *ch = &span->text[c];
fz_rect bbox;
- fz_text_char_bbox(&bbox, span, c);
+ fz_text_char_bbox(ctx, &bbox, span, c);
jobject cobj = (*env)->NewObject(env, textCharClass, ctor, bbox.x0, bbox.y0, bbox.x1, bbox.y1, ch->c);
if (cobj == NULL) fz_throw(ctx, FZ_ERROR_GENERIC, "NewObjectfailed");
@@ -1378,9 +1388,9 @@ JNI_FN(MuPDFCore_text)(JNIEnv * env, jobject thiz)
}
fz_always(ctx)
{
- fz_free_text_page(ctx, text);
- fz_free_text_sheet(ctx, sheet);
- fz_free_device(dev);
+ fz_drop_text_page(ctx, text);
+ fz_drop_text_sheet(ctx, sheet);
+ fz_drop_device(ctx, dev);
}
fz_catch(ctx)
{
@@ -1424,31 +1434,31 @@ JNI_FN(MuPDFCore_textAsHtml)(JNIEnv * env, jobject thiz)
sheet = fz_new_text_sheet(ctx);
text = fz_new_text_page(ctx);
dev = fz_new_text_device(ctx, sheet, text);
- fz_run_page(doc, pc->page, dev, &ctm, NULL);
- fz_free_device(dev);
+ fz_run_page(ctx, pc->page, dev, &ctm, NULL);
+ fz_drop_device(ctx, dev);
dev = NULL;
fz_analyze_text(ctx, sheet, text);
buf = fz_new_buffer(ctx, 256);
out = fz_new_output_with_buffer(ctx, buf);
- fz_printf(out, "<html>\n");
- fz_printf(out, "<style>\n");
- fz_printf(out, "body{margin:0;}\n");
- fz_printf(out, "div.page{background-color:white;}\n");
- fz_printf(out, "div.block{margin:0pt;padding:0pt;}\n");
- fz_printf(out, "div.metaline{display:table;width:100%%}\n");
- fz_printf(out, "div.line{display:table-row;}\n");
- fz_printf(out, "div.cell{display:table-cell;padding-left:0.25em;padding-right:0.25em}\n");
- //fz_printf(out, "p{margin:0;padding:0;}\n");
- fz_printf(out, "</style>\n");
- fz_printf(out, "<body style=\"margin:0\"><div style=\"padding:10px\" id=\"content\">");
+ fz_printf(ctx, out, "<html>\n");
+ fz_printf(ctx, out, "<style>\n");
+ fz_printf(ctx, out, "body{margin:0;}\n");
+ fz_printf(ctx, out, "div.page{background-color:white;}\n");
+ fz_printf(ctx, out, "div.block{margin:0pt;padding:0pt;}\n");
+ fz_printf(ctx, out, "div.metaline{display:table;width:100%%}\n");
+ fz_printf(ctx, out, "div.line{display:table-row;}\n");
+ fz_printf(ctx, out, "div.cell{display:table-cell;padding-left:0.25em;padding-right:0.25em}\n");
+ //fz_printf(ctx, out, "p{margin:0;padding:0;}\n");
+ fz_printf(ctx, out, "</style>\n");
+ fz_printf(ctx, out, "<body style=\"margin:0\"><div style=\"padding:10px\" id=\"content\">");
fz_print_text_page_html(ctx, out, text);
- fz_printf(out, "</div></body>\n");
- fz_printf(out, "<style>\n");
+ fz_printf(ctx, out, "</div></body>\n");
+ fz_printf(ctx, out, "<style>\n");
fz_print_text_sheet(ctx, out, sheet);
- fz_printf(out, "</style>\n</html>\n");
- fz_close_output(out);
+ fz_printf(ctx, out, "</style>\n</html>\n");
+ fz_drop_output(ctx, out);
out = NULL;
bArray = (*env)->NewByteArray(env, buf->len);
@@ -1459,10 +1469,10 @@ JNI_FN(MuPDFCore_textAsHtml)(JNIEnv * env, jobject thiz)
}
fz_always(ctx)
{
- fz_free_text_page(ctx, text);
- fz_free_text_sheet(ctx, sheet);
- fz_free_device(dev);
- fz_close_output(out);
+ fz_drop_text_page(ctx, text);
+ fz_drop_text_sheet(ctx, sheet);
+ fz_drop_device(ctx, dev);
+ fz_drop_output(ctx, out);
fz_drop_buffer(ctx, buf);
}
fz_catch(ctx)
@@ -1484,7 +1494,7 @@ JNI_FN(MuPDFCore_addMarkupAnnotationInternal)(JNIEnv * env, jobject thiz, jobjec
globals *glo = get_globals(env, thiz);
fz_context *ctx = glo->ctx;
fz_document *doc = glo->doc;
- pdf_document *idoc = pdf_specifics(doc);
+ pdf_document *idoc = pdf_specifics(ctx, doc);
page_cache *pc = &glo->pages[glo->current];
jclass pt_cls;
jfieldID x_fid, y_fid;
@@ -1556,10 +1566,10 @@ JNI_FN(MuPDFCore_addMarkupAnnotationInternal)(JNIEnv * env, jobject thiz, jobjec
fz_transform_point(&pts[i], &ctm);
}
- annot = (fz_annot *)pdf_create_annot(idoc, (pdf_page *)pc->page, type);
+ annot = (fz_annot *)pdf_create_annot(ctx, idoc, (pdf_page *)pc->page, type);
- pdf_set_markup_annot_quadpoints(idoc, (pdf_annot *)annot, pts, n);
- pdf_set_markup_appearance(idoc, (pdf_annot *)annot, color, alpha, line_thickness, line_height);
+ pdf_set_markup_annot_quadpoints(ctx, idoc, (pdf_annot *)annot, pts, n);
+ pdf_set_markup_appearance(ctx, idoc, (pdf_annot *)annot, color, alpha, line_thickness, line_height);
dump_annotation_display_lists(glo);
}
@@ -1583,7 +1593,7 @@ JNI_FN(MuPDFCore_addInkAnnotationInternal)(JNIEnv * env, jobject thiz, jobjectAr
globals *glo = get_globals(env, thiz);
fz_context *ctx = glo->ctx;
fz_document *doc = glo->doc;
- pdf_document *idoc = pdf_specifics(doc);
+ pdf_document *idoc = pdf_specifics(ctx, doc);
page_cache *pc = &glo->pages[glo->current];
jclass pt_cls;
jfieldID x_fid, y_fid;
@@ -1651,9 +1661,9 @@ JNI_FN(MuPDFCore_addInkAnnotationInternal)(JNIEnv * env, jobject thiz, jobjectAr
(*env)->DeleteLocalRef(env, arc);
}
- annot = (fz_annot *)pdf_create_annot(idoc, (pdf_page *)pc->page, FZ_ANNOT_INK);
+ annot = (fz_annot *)pdf_create_annot(ctx, idoc, (pdf_page *)pc->page, FZ_ANNOT_INK);
- pdf_set_ink_annot_list(idoc, (pdf_annot *)annot, pts, counts, n, color, INK_THICKNESS);
+ pdf_set_ink_annot_list(ctx, idoc, (pdf_annot *)annot, pts, counts, n, color, INK_THICKNESS);
dump_annotation_display_lists(glo);
}
@@ -1678,7 +1688,7 @@ JNI_FN(MuPDFCore_deleteAnnotationInternal)(JNIEnv * env, jobject thiz, int annot
globals *glo = get_globals(env, thiz);
fz_context *ctx = glo->ctx;
fz_document *doc = glo->doc;
- pdf_document *idoc = pdf_specifics(doc);
+ pdf_document *idoc = pdf_specifics(ctx, doc);
page_cache *pc = &glo->pages[glo->current];
fz_annot *annot;
int i;
@@ -1688,13 +1698,13 @@ JNI_FN(MuPDFCore_deleteAnnotationInternal)(JNIEnv * env, jobject thiz, int annot
fz_try(ctx)
{
- annot = fz_first_annot(glo->doc, pc->page);
+ annot = fz_first_annot(ctx, pc->page);
for (i = 0; i < annot_index && annot; i++)
- annot = fz_next_annot(glo->doc, annot);
+ annot = fz_next_annot(ctx, pc->page, annot);
if (annot)
{
- pdf_delete_annot(idoc, (pdf_page *)pc->page, (pdf_annot *)annot);
+ pdf_delete_annot(ctx, idoc, (pdf_page *)pc->page, (pdf_annot *)annot);
dump_annotation_display_lists(glo);
}
}
@@ -1718,7 +1728,7 @@ static void close_doc(globals *glo)
alerts_fin(glo);
- fz_close_document(glo->doc);
+ fz_drop_document(glo->ctx, glo->doc);
glo->doc = NULL;
}
@@ -1733,7 +1743,7 @@ JNI_FN(MuPDFCore_destroying)(JNIEnv * env, jobject thiz)
fz_free(glo->ctx, glo->current_path);
glo->current_path = NULL;
close_doc(glo);
- fz_free_context(glo->ctx);
+ fz_drop_context(glo->ctx);
glo->ctx = NULL;
free(glo);
#ifdef MEMENTO
@@ -1795,7 +1805,7 @@ JNI_FN(MuPDFCore_getPageLinksInternal)(JNIEnv * env, jobject thiz, int pageNumbe
zoom = glo->resolution / 72;
fz_scale(&ctm, zoom, zoom);
- list = fz_load_links(glo->doc, pc->page);
+ list = fz_load_links(glo->ctx, pc->page);
count = 0;
for (link = list; link; link = link->next)
{
@@ -1883,6 +1893,7 @@ JNI_FN(MuPDFCore_getWidgetAreasInternal)(JNIEnv * env, jobject thiz, int pageNum
globals *glo = get_globals(env, thiz);
if (glo == NULL)
return NULL;
+ fz_context *ctx = glo->ctx;
rectFClass = (*env)->FindClass(env, "android/graphics/RectF");
if (rectFClass == NULL) return NULL;
@@ -1894,7 +1905,7 @@ JNI_FN(MuPDFCore_getWidgetAreasInternal)(JNIEnv * env, jobject thiz, int pageNum
if (pc->number != pageNumber || pc->page == NULL)
return NULL;
- idoc = pdf_specifics(glo->doc);
+ idoc = pdf_specifics(ctx, glo->doc);
if (idoc == NULL)
return NULL;
@@ -1902,17 +1913,17 @@ JNI_FN(MuPDFCore_getWidgetAreasInternal)(JNIEnv * env, jobject thiz, int pageNum
fz_scale(&ctm, zoom, zoom);
count = 0;
- for (widget = pdf_first_widget(idoc, (pdf_page *)pc->page); widget; widget = pdf_next_widget(widget))
+ for (widget = pdf_first_widget(ctx, idoc, (pdf_page *)pc->page); widget; widget = pdf_next_widget(ctx, widget))
count ++;
arr = (*env)->NewObjectArray(env, count, rectFClass, NULL);
if (arr == NULL) return NULL;
count = 0;
- for (widget = pdf_first_widget(idoc, (pdf_page *)pc->page); widget; widget = pdf_next_widget(widget))
+ for (widget = pdf_first_widget(ctx, idoc, (pdf_page *)pc->page); widget; widget = pdf_next_widget(ctx, widget))
{
fz_rect rect;
- pdf_bound_widget(widget, &rect);
+ pdf_bound_widget(ctx, widget, &rect);
fz_transform_rect(&rect, &ctm);
rectF = (*env)->NewObject(env, rectFClass, ctor,
@@ -1942,6 +1953,7 @@ JNI_FN(MuPDFCore_getAnnotationsInternal)(JNIEnv * env, jobject thiz, int pageNum
globals *glo = get_globals(env, thiz);
if (glo == NULL)
return NULL;
+ fz_context *ctx = glo->ctx;
annotClass = (*env)->FindClass(env, PACKAGENAME "/Annotation");
if (annotClass == NULL) return NULL;
@@ -1957,18 +1969,18 @@ JNI_FN(MuPDFCore_getAnnotationsInternal)(JNIEnv * env, jobject thiz, int pageNum
fz_scale(&ctm, zoom, zoom);
count = 0;
- for (annot = fz_first_annot(glo->doc, pc->page); annot; annot = fz_next_annot(glo->doc, annot))
+ for (annot = fz_first_annot(ctx, pc->page); annot; annot = fz_next_annot(ctx, pc->page, annot))
count ++;
arr = (*env)->NewObjectArray(env, count, annotClass, NULL);
if (arr == NULL) return NULL;
count = 0;
- for (annot = fz_first_annot(glo->doc, pc->page); annot; annot = fz_next_annot(glo->doc, annot))
+ for (annot = fz_first_annot(ctx, pc->page); annot; annot = fz_next_annot(ctx, pc->page, annot))
{
fz_rect rect;
- fz_annot_type type = pdf_annot_type((pdf_annot *)annot);
- fz_bound_annot(glo->doc, annot, &rect);
+ fz_annot_type type = pdf_annot_type(ctx, (pdf_annot *)annot);
+ fz_bound_annot(ctx, pc->page, annot, &rect);
fz_transform_rect(&rect, &ctm);
jannot = (*env)->NewObject(env, annotClass, ctor,
@@ -1989,7 +2001,7 @@ JNI_FN(MuPDFCore_passClickEventInternal)(JNIEnv * env, jobject thiz, int pageNum
globals *glo = get_globals(env, thiz);
fz_context *ctx = glo->ctx;
fz_matrix ctm;
- pdf_document *idoc = pdf_specifics(glo->doc);
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
float zoom;
fz_point p;
pdf_ui_event event;
@@ -2021,9 +2033,9 @@ JNI_FN(MuPDFCore_passClickEventInternal)(JNIEnv * env, jobject thiz, int pageNum
event.etype = PDF_EVENT_TYPE_POINTER;
event.event.pointer.pt = p;
event.event.pointer.ptype = PDF_POINTER_DOWN;
- changed = pdf_pass_event(idoc, (pdf_page *)pc->page, &event);
+ changed = pdf_pass_event(ctx, idoc, (pdf_page *)pc->page, &event);
event.event.pointer.ptype = PDF_POINTER_UP;
- changed |= pdf_pass_event(idoc, (pdf_page *)pc->page, &event);
+ changed |= pdf_pass_event(ctx, idoc, (pdf_page *)pc->page, &event);
if (changed) {
dump_annotation_display_lists(glo);
}
@@ -2045,14 +2057,14 @@ JNI_FN(MuPDFCore_getFocusedWidgetTextInternal)(JNIEnv * env, jobject thiz)
fz_try(ctx)
{
- pdf_document *idoc = pdf_specifics(glo->doc);
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
if (idoc)
{
- pdf_widget *focus = pdf_focused_widget(idoc);
+ pdf_widget *focus = pdf_focused_widget(ctx, idoc);
if (focus)
- text = pdf_text_widget_text(idoc, focus);
+ text = pdf_text_widget_text(ctx, idoc, focus);
}
}
fz_catch(ctx)
@@ -2080,15 +2092,15 @@ JNI_FN(MuPDFCore_setFocusedWidgetTextInternal)(JNIEnv * env, jobject thiz, jstri
fz_try(ctx)
{
- pdf_document *idoc = pdf_specifics(glo->doc);
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
if (idoc)
{
- pdf_widget *focus = pdf_focused_widget(idoc);
+ pdf_widget *focus = pdf_focused_widget(ctx, idoc);
if (focus)
{
- result = pdf_text_widget_set_text(idoc, focus, (char *)text);
+ result = pdf_text_widget_set_text(ctx, idoc, focus, (char *)text);
dump_annotation_display_lists(glo);
}
}
@@ -2108,7 +2120,7 @@ JNI_FN(MuPDFCore_getFocusedWidgetChoiceOptions)(JNIEnv * env, jobject thiz)
{
globals *glo = get_globals(env, thiz);
fz_context *ctx = glo->ctx;
- pdf_document *idoc = pdf_specifics(glo->doc);
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
pdf_widget *focus;
int type;
int nopts, i;
@@ -2119,20 +2131,20 @@ JNI_FN(MuPDFCore_getFocusedWidgetChoiceOptions)(JNIEnv * env, jobject thiz)
if (idoc == NULL)
return NULL;
- focus = pdf_focused_widget(idoc);
+ focus = pdf_focused_widget(ctx, idoc);
if (focus == NULL)
return NULL;
- type = pdf_widget_get_type(focus);
+ type = pdf_widget_get_type(ctx, focus);
if (type != PDF_WIDGET_TYPE_LISTBOX && type != PDF_WIDGET_TYPE_COMBOBOX)
return NULL;
fz_var(opts);
fz_try(ctx)
{
- nopts = pdf_choice_widget_options(idoc, focus, NULL);
+ nopts = pdf_choice_widget_options(ctx, idoc, focus, NULL);
opts = fz_malloc(ctx, nopts * sizeof(*opts));
- (void)pdf_choice_widget_options(idoc, focus, opts);
+ (void)pdf_choice_widget_options(ctx, idoc, focus, opts);
}
fz_catch(ctx)
{
@@ -2164,7 +2176,7 @@ JNI_FN(MuPDFCore_getFocusedWidgetChoiceSelected)(JNIEnv * env, jobject thiz)
{
globals *glo = get_globals(env, thiz);
fz_context *ctx = glo->ctx;
- pdf_document *idoc = pdf_specifics(glo->doc);
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
pdf_widget *focus;
int type;
int nsel, i;
@@ -2175,20 +2187,20 @@ JNI_FN(MuPDFCore_getFocusedWidgetChoiceSelected)(JNIEnv * env, jobject thiz)
if (idoc == NULL)
return NULL;
- focus = pdf_focused_widget(idoc);
+ focus = pdf_focused_widget(ctx, idoc);
if (focus == NULL)
return NULL;
- type = pdf_widget_get_type(focus);
+ type = pdf_widget_get_type(ctx, focus);
if (type != PDF_WIDGET_TYPE_LISTBOX && type != PDF_WIDGET_TYPE_COMBOBOX)
return NULL;
fz_var(sel);
fz_try(ctx)
{
- nsel = pdf_choice_widget_value(idoc, focus, NULL);
+ nsel = pdf_choice_widget_value(ctx, idoc, focus, NULL);
sel = fz_malloc(ctx, nsel * sizeof(*sel));
- (void)pdf_choice_widget_value(idoc, focus, sel);
+ (void)pdf_choice_widget_value(ctx, idoc, focus, sel);
}
fz_catch(ctx)
{
@@ -2220,7 +2232,7 @@ JNI_FN(MuPDFCore_setFocusedWidgetChoiceSelectedInternal)(JNIEnv * env, jobject t
{
globals *glo = get_globals(env, thiz);
fz_context *ctx = glo->ctx;
- pdf_document *idoc = pdf_specifics(glo->doc);
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
pdf_widget *focus;
int type;
int nsel, i;
@@ -2230,11 +2242,11 @@ JNI_FN(MuPDFCore_setFocusedWidgetChoiceSelectedInternal)(JNIEnv * env, jobject t
if (idoc == NULL)
return;
- focus = pdf_focused_widget(idoc);
+ focus = pdf_focused_widget(ctx, idoc);
if (focus == NULL)
return;
- type = pdf_widget_get_type(focus);
+ type = pdf_widget_get_type(ctx, focus);
if (type != PDF_WIDGET_TYPE_LISTBOX && type != PDF_WIDGET_TYPE_COMBOBOX)
return;
@@ -2258,7 +2270,7 @@ JNI_FN(MuPDFCore_setFocusedWidgetChoiceSelectedInternal)(JNIEnv * env, jobject t
fz_try(ctx)
{
- pdf_choice_widget_set_value(idoc, focus, nsel, sel);
+ pdf_choice_widget_set_value(ctx, idoc, focus, nsel, sel);
dump_annotation_display_lists(glo);
}
fz_catch(ctx)
@@ -2277,18 +2289,19 @@ JNIEXPORT int JNICALL
JNI_FN(MuPDFCore_getFocusedWidgetTypeInternal)(JNIEnv * env, jobject thiz)
{
globals *glo = get_globals(env, thiz);
- pdf_document *idoc = pdf_specifics(glo->doc);
+ fz_context *ctx = glo->ctx;
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
pdf_widget *focus;
- if (idoc == NULL)
+ if (ctx, idoc == NULL)
return NONE;
- focus = pdf_focused_widget(idoc);
+ focus = pdf_focused_widget(ctx, idoc);
if (focus == NULL)
return NONE;
- switch (pdf_widget_get_type(focus))
+ switch (pdf_widget_get_type(ctx, focus))
{
case PDF_WIDGET_TYPE_TEXT: return TEXT;
case PDF_WIDGET_TYPE_LISTBOX: return LISTBOX;
@@ -2311,13 +2324,14 @@ JNIEXPORT int JNICALL
JNI_FN(MuPDFCore_getFocusedWidgetSignatureState)(JNIEnv * env, jobject thiz)
{
globals *glo = get_globals(env, thiz);
- pdf_document *idoc = pdf_specifics(glo->doc);
+ fz_context *ctx = glo->ctx;
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
pdf_widget *focus;
- if (idoc == NULL)
+ if (ctx, idoc == NULL)
return Signature_NoSupport;
- focus = pdf_focused_widget(idoc);
+ focus = pdf_focused_widget(ctx, idoc);
if (focus == NULL)
return Signature_NoSupport;
@@ -2325,26 +2339,27 @@ JNI_FN(MuPDFCore_getFocusedWidgetSignatureState)(JNIEnv * env, jobject thiz)
if (!pdf_signatures_supported())
return Signature_NoSupport;
- return pdf_dict_gets(((pdf_annot *)focus)->obj, "V") ? Signature_Signed : Signature_Unsigned;
+ return pdf_dict_gets(ctx, ((pdf_annot *)focus)->obj, "V") ? Signature_Signed : Signature_Unsigned;
}
JNIEXPORT jstring JNICALL
JNI_FN(MuPDFCore_checkFocusedSignatureInternal)(JNIEnv * env, jobject thiz)
{
globals *glo = get_globals(env, thiz);
- pdf_document *idoc = pdf_specifics(glo->doc);
+ fz_context *ctx = glo->ctx;
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
pdf_widget *focus;
char ebuf[256] = "Failed";
if (idoc == NULL)
goto exit;
- focus = pdf_focused_widget(idoc);
+ focus = pdf_focused_widget(ctx, idoc);
if (focus == NULL)
goto exit;
- if (pdf_check_signature(idoc, focus, glo->current_path, ebuf, sizeof(ebuf)))
+ if (pdf_check_signature(ctx, idoc, focus, glo->current_path, ebuf, sizeof(ebuf)))
{
strcpy(ebuf, "Signature is valid");
}
@@ -2358,7 +2373,7 @@ JNI_FN(MuPDFCore_signFocusedSignatureInternal)(JNIEnv * env, jobject thiz, jstri
{
globals *glo = get_globals(env, thiz);
fz_context *ctx = glo->ctx;
- pdf_document *idoc = pdf_specifics(glo->doc);
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
pdf_widget *focus;
const char *keyfile;
const char *password;
@@ -2367,7 +2382,7 @@ JNI_FN(MuPDFCore_signFocusedSignatureInternal)(JNIEnv * env, jobject thiz, jstri
if (idoc == NULL)
return JNI_FALSE;
- focus = pdf_focused_widget(idoc);
+ focus = pdf_focused_widget(ctx, idoc);
if (focus == NULL)
return JNI_FALSE;
@@ -2380,7 +2395,7 @@ JNI_FN(MuPDFCore_signFocusedSignatureInternal)(JNIEnv * env, jobject thiz, jstri
fz_var(res);
fz_try(ctx)
{
- pdf_sign_signature(idoc, focus, keyfile, password);
+ pdf_sign_signature(ctx, idoc, focus, keyfile, password);
dump_annotation_display_lists(glo);
res = JNI_TRUE;
}
@@ -2521,9 +2536,10 @@ JNIEXPORT jboolean JNICALL
JNI_FN(MuPDFCore_hasChangesInternal)(JNIEnv * env, jobject thiz)
{
globals *glo = get_globals(env, thiz);
- pdf_document *idoc = pdf_specifics(glo->doc);
+ fz_context *ctx = glo->ctx;
+ pdf_document *idoc = pdf_specifics(ctx, glo->doc);
- return (idoc && pdf_has_unsaved_changes(idoc)) ? JNI_TRUE : JNI_FALSE;
+ return (idoc && pdf_has_unsaved_changes(ctx, idoc)) ? JNI_TRUE : JNI_FALSE;
}
static char *tmp_path(char *path)
@@ -2593,7 +2609,7 @@ JNI_FN(MuPDFCore_saveInternal)(JNIEnv * env, jobject thiz)
if (!err)
{
- fz_write_document(glo->doc, tmp, &opts);
+ fz_write_document(ctx, glo->doc, tmp, &opts);
written = 1;
}
}
diff --git a/platform/android/src/com/artifex/mupdfdemo/ReaderView.java b/platform/android/src/com/artifex/mupdfdemo/ReaderView.java
index e27f0bbf..07eb6824 100644
--- a/platform/android/src/com/artifex/mupdfdemo/ReaderView.java
+++ b/platform/android/src/com/artifex/mupdfdemo/ReaderView.java
@@ -408,7 +408,7 @@ public class ReaderView
}
break;
case MOVING_DOWN:
- if (HORIZONTAL_SCROLLING && bounds.bottom <= 0) {
+ if (!HORIZONTAL_SCROLLING && bounds.bottom <= 0) {
// Fling off to the bottom bring previous view onto screen
View vr = mChildViews.get(mCurrent-1);
diff --git a/platform/ios/Classes/MuDocRef.m b/platform/ios/Classes/MuDocRef.m
index bd2b87c0..44337dc0 100644
--- a/platform/ios/Classes/MuDocRef.m
+++ b/platform/ios/Classes/MuDocRef.m
@@ -33,7 +33,7 @@
if (self)
{
if (doc != NULL)
- fz_close_document(doc);
+ fz_drop_document(doc);
[self release];
self = nil;
}
@@ -46,7 +46,7 @@
{
__block fz_document *block_doc = doc;
dispatch_async(queue, ^{
- fz_close_document(block_doc);
+ fz_drop_document(block_doc);
});
[super dealloc];
}
diff --git a/platform/ios/Classes/MuDocumentController.m b/platform/ios/Classes/MuDocumentController.m
index 3c0391a8..01d8221c 100644
--- a/platform/ios/Classes/MuDocumentController.m
+++ b/platform/ios/Classes/MuDocumentController.m
@@ -183,7 +183,7 @@ static void saveDoc(char *current_path, fz_document *doc)
outline = [[MuOutlineController alloc] initWithTarget: self titles: titles pages: pages];
[titles release];
[pages release];
- fz_free_outline(ctx, root);
+ fz_drop_outline(ctx, root);
}
return self;
diff --git a/platform/ios/Classes/MuPageViewNormal.m b/platform/ios/Classes/MuPageViewNormal.m
index 3c461a00..5e115ea0 100644
--- a/platform/ios/Classes/MuPageViewNormal.m
+++ b/platform/ios/Classes/MuPageViewNormal.m
@@ -78,7 +78,7 @@ static NSArray *enumerateWords(fz_document *doc, fz_page *page)
text = fz_new_text_page(ctx);
dev = fz_new_text_device(ctx, sheet, text);
fz_run_page(doc, page, dev, &fz_identity, NULL);
- fz_free_device(dev);
+ fz_drop_device(dev);
dev = NULL;
for (b = 0; b < text->len; b++)
@@ -138,9 +138,9 @@ static NSArray *enumerateWords(fz_document *doc, fz_page *page)
}
fz_always(ctx);
{
- fz_free_text_page(ctx, text);
- fz_free_text_sheet(ctx, sheet);
- fz_free_device(dev);
+ fz_drop_text_page(ctx, text);
+ fz_drop_text_sheet(ctx, sheet);
+ fz_drop_device(dev);
}
fz_catch(ctx)
{
@@ -383,7 +383,7 @@ static fz_display_list *create_page_list(fz_document *doc, fz_page *page)
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(dev);
}
fz_catch(ctx)
{
@@ -413,7 +413,7 @@ static fz_display_list *create_annot_list(fz_document *doc, fz_page *page)
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(dev);
}
fz_catch(ctx)
{
@@ -461,7 +461,7 @@ static fz_pixmap *renderPixmap(fz_document *doc, fz_display_list *page_list, fz_
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(dev);
}
fz_catch(ctx)
{
@@ -563,7 +563,7 @@ static void updatePixmap(fz_document *doc, fz_display_list *page_list, fz_displa
dev = fz_new_draw_device_with_bbox(ctx, pixmap, &abox);
fz_run_display_list(page_list, dev, &ctm, &arect, NULL);
fz_run_display_list(annot_list, dev, &ctm, &arect, NULL);
- fz_free_device(dev);
+ fz_drop_device(dev);
dev = NULL;
}
rlist = rlist->next;
@@ -571,7 +571,7 @@ static void updatePixmap(fz_document *doc, fz_display_list *page_list, fz_displa
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(dev);
}
fz_catch(ctx)
{
diff --git a/platform/ios/Classes/MuPageViewReflow.m b/platform/ios/Classes/MuPageViewReflow.m
index bc0e2c79..a9716df5 100644
--- a/platform/ios/Classes/MuPageViewReflow.m
+++ b/platform/ios/Classes/MuPageViewReflow.m
@@ -27,7 +27,7 @@ NSString *textAsHtml(fz_document *doc, int pageNum)
dev = fz_new_text_device(ctx, sheet, text);
page = fz_load_page(doc, pageNum);
fz_run_page(doc, page, dev, &ctm, NULL);
- fz_free_device(dev);
+ fz_drop_device(dev);
dev = NULL;
fz_analyze_text(ctx, sheet, text);
@@ -57,9 +57,9 @@ NSString *textAsHtml(fz_document *doc, int pageNum)
}
fz_always(ctx)
{
- fz_free_text_page(ctx, text);
- fz_free_text_sheet(ctx, sheet);
- fz_free_device(dev);
+ fz_drop_text_page(ctx, text);
+ fz_drop_text_sheet(ctx, sheet);
+ fz_drop_device(dev);
fz_close_output(out);
fz_drop_buffer(ctx, buf);
fz_free_page(doc, page);
diff --git a/platform/ios/Classes/MuPrintPageRenderer.m b/platform/ios/Classes/MuPrintPageRenderer.m
index 36f66ee9..9408a6e3 100644
--- a/platform/ios/Classes/MuPrintPageRenderer.m
+++ b/platform/ios/Classes/MuPrintPageRenderer.m
@@ -114,7 +114,7 @@ static void renderPage(fz_document *doc, fz_page *page, fz_pixmap *pix, fz_matri
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(dev);
}
fz_catch(ctx)
{
diff --git a/platform/ios/common.m b/platform/ios/common.m
index f4a1676d..6ca320e9 100644
--- a/platform/ios/common.m
+++ b/platform/ios/common.m
@@ -25,12 +25,12 @@ int search_page(fz_document *doc, int number, char *needle, fz_cookie *cookie)
fz_text_page *text = fz_new_text_page(ctx);
fz_device *dev = fz_new_text_device(ctx, sheet, text);
fz_run_page(doc, page, dev, &fz_identity, cookie);
- fz_free_device(dev);
+ fz_drop_device(dev);
hit_count = fz_search_text_page(ctx, text, needle, hit_bbox, nelem(hit_bbox));
- fz_free_text_page(ctx, text);
- fz_free_text_sheet(ctx, sheet);
+ fz_drop_text_page(ctx, text);
+ fz_drop_text_sheet(ctx, sheet);
fz_free_page(doc, page);
return hit_count;
diff --git a/platform/win32/generate.bat b/platform/win32/generate.bat
index 934dec4b..f47e2c56 100644
--- a/platform/win32/generate.bat
+++ b/platform/win32/generate.bat
@@ -15,7 +15,6 @@ if not exist cquote.exe goto usage
if not exist bin2hex.exe goto usage
if not exist generated/gen_font_base14.h fontdump.exe generated/gen_font_base14.h resources/fonts/urw/*.cff
-if not exist generated/gen_font_droid.h fontdump.exe generated/gen_font_droid.h resources/fonts/droid/DroidSans.ttf resources/fonts/droid/DroidSansMono.ttf
if not exist generated/gen_font_cjk.h fontdump.exe generated/gen_font_cjk.h resources/fonts/droid/DroidSansFallback.ttc
if not exist generated/gen_font_cjk_full.h fontdump.exe generated/gen_font_cjk_full.h resources/fonts/droid/DroidSansFallbackFull.ttc
diff --git a/platform/win32/libmupdf.vcproj b/platform/win32/libmupdf.vcproj
index 438be2b1..2ef2d5c9 100644
--- a/platform/win32/libmupdf.vcproj
+++ b/platform/win32/libmupdf.vcproj
@@ -337,6 +337,14 @@
RelativePath="..\..\source\cbz\mucbz.c"
>
</File>
+ <File
+ RelativePath="..\..\source\cbz\muimg.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\source\cbz\mutiff.c"
+ >
+ </File>
</Filter>
<Filter
Name="xps"
@@ -723,14 +731,6 @@
</File>
</Filter>
<Filter
- Name="img"
- >
- <File
- RelativePath="..\..\source\img\muimage.c"
- >
- </File>
- </Filter>
- <Filter
Name="pdf"
>
<File
@@ -938,18 +938,10 @@
Name="!include"
>
<File
- RelativePath="..\..\include\mupdf\cbz.h"
- >
- </File>
- <File
RelativePath="..\..\include\mupdf\fitz.h"
>
</File>
<File
- RelativePath="..\..\include\mupdf\img.h"
- >
- </File>
- <File
RelativePath="..\..\include\mupdf\memento.h"
>
</File>
@@ -1202,14 +1194,6 @@
</File>
</Filter>
</Filter>
- <Filter
- Name="tiff"
- >
- <File
- RelativePath="..\..\source\tiff\mutiff.c"
- >
- </File>
- </Filter>
</Files>
<Globals>
</Globals>
diff --git a/platform/windows/gsprint.vcxproj b/platform/windows/gsprint.vcxproj
new file mode 100644
index 00000000..c191599d
--- /dev/null
+++ b/platform/windows/gsprint.vcxproj
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{09FE8E75-9952-44E7-95F8-E8D74707FBA1}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>gsprint</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v120</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v120</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v120</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v120</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ <OutDir>$(SolutionDir)\gsview\bin\$(Configuration)\</OutDir>
+ <IntDir>$(Platform)\$(Configuration)\</IntDir>
+ <TargetName>$(ProjectName)32</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>true</LinkIncremental>
+ <OutDir>$(SolutionDir)\gsview\bin\$(Configuration)\</OutDir>
+ <TargetName>$(ProjectName)64</TargetName>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ <TargetName>$(ProjectName)32</TargetName>
+ <OutDir>$(SolutionDir)\gsview\bin\$(Configuration)\</OutDir>
+ <IntDir>$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>$(SolutionDir)\gsview\bin\$(Configuration)\</OutDir>
+ <TargetName>$(ProjectName)64</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;GSPRINT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;GSPRINT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;GSPRINT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;GSPRINT_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ </ClCompile>
+ <Link>
+ <SubSystem>Windows</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <Text Include="ReadMe.txt" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="gsprint\gsprint.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="gsprint\dllmain.cpp" />
+ <ClCompile Include="gsprint\gsprint.cpp" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/platform/windows/gsprint/dllmain.cpp b/platform/windows/gsprint/dllmain.cpp
new file mode 100644
index 00000000..bfaa6519
--- /dev/null
+++ b/platform/windows/gsprint/dllmain.cpp
@@ -0,0 +1,19 @@
+// dllmain.cpp : Defines the entry point for the DLL application.
+#include <windows.h>
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+ DWORD ul_reason_for_call,
+ LPVOID lpReserved
+ )
+{
+ switch (ul_reason_for_call)
+ {
+ case DLL_PROCESS_ATTACH:
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ case DLL_PROCESS_DETACH:
+ break;
+ }
+ return TRUE;
+}
+
diff --git a/platform/windows/gsprint/gsprint.cpp b/platform/windows/gsprint/gsprint.cpp
new file mode 100644
index 00000000..4f4a3924
--- /dev/null
+++ b/platform/windows/gsprint/gsprint.cpp
@@ -0,0 +1,73 @@
+// gsprint.cpp : Defines the exported functions for the DLL application.
+//
+#include "gsprint.h"
+#include "stdlib.h"
+
+#define FAIL -1
+
+/* Code to handle the special device properties window as well as make sure
+ * that the values are maintained when we leave */
+SYMBOL_DECLSPEC int __stdcall ShowPropertiesDialog(void *hptr, void *printername, bool show_win)
+{
+ HWND hWnd = (HWND)hptr;
+ HANDLE hPrinter = NULL;
+ LPDEVMODE pDevMode;
+ DWORD dwNeeded, dwRet;
+ wchar_t *output = NULL;
+
+ int lenA = lstrlenA((char*)printername);
+ int lenW = ::MultiByteToWideChar(CP_ACP, 0, (char*)printername, lenA, NULL, 0);
+ if (lenW > 0)
+ {
+ output = new wchar_t[lenW + 1];
+ if (output == NULL)
+ return -1;
+ ::MultiByteToWideChar(CP_ACP, 0, (char*)printername, lenA, output, lenW);
+ output[lenW] = 0;
+ }
+ else
+ return FAIL;
+
+ if (!OpenPrinter(output, &hPrinter, NULL))
+ {
+ delete[] output;
+ return FAIL;
+ }
+
+ /* First get the size needed */
+ dwNeeded = DocumentProperties(hWnd, hPrinter, output, NULL, NULL, 0);
+ pDevMode = (LPDEVMODE)malloc(dwNeeded);
+ if (pDevMode == NULL)
+ {
+ delete[] output;
+ ClosePrinter(hPrinter);
+ return FAIL;
+ }
+
+ /* Now actually get the DEVMODE data. DM_IN_PROMPT brings up the window.
+ * DM_OUT_BUFFER ensures that we get the values that have been set */
+ DWORD fMode = DM_OUT_BUFFER;
+ if (show_win)
+ fMode = fMode | DM_IN_PROMPT;
+
+ dwRet = DocumentProperties(hWnd, hPrinter, output, pDevMode, NULL, fMode);
+ if (dwRet != IDOK)
+ {
+ delete[] output;
+ ClosePrinter(hPrinter);
+ free(pDevMode);
+ return FAIL;
+ }
+
+ /* This is the secret to ensure that the DEVMODE settings are saved. Fun
+ * finding this bit of information in the MS literature */
+ PRINTER_INFO_9 new_info;
+ new_info.pDevMode = pDevMode;
+ SetPrinter(hPrinter, 9, (LPBYTE)&new_info, 0);
+
+ /* Clean up */
+ free(pDevMode);
+ delete[] output;
+ ClosePrinter(hPrinter);
+ return 0;
+}
diff --git a/platform/windows/gsprint/gsprint.h b/platform/windows/gsprint/gsprint.h
new file mode 100644
index 00000000..cfc2c7b3
--- /dev/null
+++ b/platform/windows/gsprint/gsprint.h
@@ -0,0 +1,12 @@
+#include <windows.h>
+#include <winspool.h>
+
+#ifdef __cplusplus
+#define EXTERNC extern "C"
+#else
+#define EXTERNC
+#endif
+
+#define SYMBOL_DECLSPEC __declspec(dllexport)
+
+EXTERN_C SYMBOL_DECLSPEC int __stdcall ShowPropertiesDialog(void *ctx, void *printername, bool show_win);
diff --git a/platform/windows/gsview/Install32/Install32.vdproj b/platform/windows/gsview/Install32/Install32.vdproj
deleted file mode 100644
index 4fecfe14..00000000
--- a/platform/windows/gsview/Install32/Install32.vdproj
+++ /dev/null
@@ -1,1225 +0,0 @@
-"DeployProject"
-{
-"VSVersion" = "3:800"
-"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
-"IsWebType" = "8:FALSE"
-"ProjectName" = "8:Install32"
-"LanguageId" = "3:1033"
-"CodePage" = "3:1252"
-"UILanguageId" = "3:1033"
-"SccProjectName" = "8:"
-"SccLocalPath" = "8:"
-"SccAuxPath" = "8:"
-"SccProvider" = "8:"
- "Hierarchy"
- {
- "Entry"
- {
- "MsmKey" = "8:_016DC0AD4FFB4399B8519ACA84400E23"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_14D6D6CD543648468701A0FE8D5A2463"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_1F1881EE52A84F49A62D42DE7E4D9D24"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_200E66532F6140579FA9390D6F7CC178"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_2684CEAF38794D53AF9D906A7F8D677C"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_389C02C6991141428A41BC2459A55E76"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_4826B6F3283A4770935083729B0777B2"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_4879181DB5BD4512A8A1790BC22435A0"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_791D64A55F0847788638D3FCDD1802DD"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_87036B53E422457DBCA496540B818802"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_A62B07FE876C4ACBBE7DEF7A219A570E"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_B2090A11BD04495DACDA72D4E5D72B7E"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_UNDEFINED"
- "OwnerKey" = "8:_4879181DB5BD4512A8A1790BC22435A0"
- "MsmSig" = "8:_UNDEFINED"
- }
- }
- "Configurations"
- {
- "Debug"
- {
- "DisplayName" = "8:Debug"
- "IsDebugOnly" = "11:TRUE"
- "IsReleaseOnly" = "11:FALSE"
- "OutputFilename" = "8:Debug\\Install32.msi"
- "PackageFilesAs" = "3:2"
- "PackageFileSize" = "3:-2147483648"
- "CabType" = "3:1"
- "Compression" = "3:2"
- "SignOutput" = "11:FALSE"
- "CertificateFile" = "8:"
- "PrivateKeyFile" = "8:"
- "TimeStampServer" = "8:"
- "InstallerBootstrapper" = "3:2"
- "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
- {
- "Enabled" = "11:TRUE"
- "PromptEnabled" = "11:TRUE"
- "PrerequisitesLocation" = "2:1"
- "Url" = "8:"
- "ComponentsUrl" = "8:"
- }
- }
- "Release"
- {
- "DisplayName" = "8:Release"
- "IsDebugOnly" = "11:FALSE"
- "IsReleaseOnly" = "11:TRUE"
- "OutputFilename" = "8:Release\\Install32.msi"
- "PackageFilesAs" = "3:2"
- "PackageFileSize" = "3:-2147483648"
- "CabType" = "3:1"
- "Compression" = "3:2"
- "SignOutput" = "11:FALSE"
- "CertificateFile" = "8:"
- "PrivateKeyFile" = "8:"
- "TimeStampServer" = "8:"
- "InstallerBootstrapper" = "3:2"
- "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
- {
- "Enabled" = "11:TRUE"
- "PromptEnabled" = "11:TRUE"
- "PrerequisitesLocation" = "2:1"
- "Url" = "8:"
- "ComponentsUrl" = "8:"
- "Items"
- {
- "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.5"
- {
- "Name" = "8:Microsoft .NET Framework 4.5 (x86 and x64)"
- "ProductCode" = "8:.NETFramework,Version=v4.5"
- }
- }
- }
- }
- }
- "Deployable"
- {
- "CustomAction"
- {
- }
- "DefaultFeature"
- {
- "Name" = "8:DefaultFeature"
- "Title" = "8:"
- "Description" = "8:"
- }
- "ExternalPersistence"
- {
- "LaunchCondition"
- {
- "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_3D4E37C6DF874A34821259A8B423B24C"
- {
- "Name" = "8:.NET Framework"
- "Message" = "8:[VSDNETMSG]"
- "FrameworkVersion" = "8:.NETFramework,Version=v4.5"
- "AllowLaterVersions" = "11:FALSE"
- "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=395269"
- }
- }
- }
- "File"
- {
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_016DC0AD4FFB4399B8519ACA84400E23"
- {
- "SourcePath" = "8:..\\Resources\\pagePNG.ico"
- "TargetName" = "8:pagePNG.ico"
- "Tag" = "8:"
- "Folder" = "8:_F28BDA152FBB403EAF109B8E144140A8"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_14D6D6CD543648468701A0FE8D5A2463"
- {
- "SourcePath" = "8:..\\Resources\\pageCBZ.ico"
- "TargetName" = "8:pageCBZ.ico"
- "Tag" = "8:"
- "Folder" = "8:_F28BDA152FBB403EAF109B8E144140A8"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1F1881EE52A84F49A62D42DE7E4D9D24"
- {
- "SourcePath" = "8:..\\Resources\\pageEPS.ico"
- "TargetName" = "8:pageEPS.ico"
- "Tag" = "8:"
- "Folder" = "8:_F28BDA152FBB403EAF109B8E144140A8"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_200E66532F6140579FA9390D6F7CC178"
- {
- "SourcePath" = "8:..\\Resources\\pagePDF.ico"
- "TargetName" = "8:pagePDF.ico"
- "Tag" = "8:"
- "Folder" = "8:_F28BDA152FBB403EAF109B8E144140A8"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2684CEAF38794D53AF9D906A7F8D677C"
- {
- "SourcePath" = "8:..\\Resources\\pagePS.ico"
- "TargetName" = "8:pagePS.ico"
- "Tag" = "8:"
- "Folder" = "8:_F28BDA152FBB403EAF109B8E144140A8"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_389C02C6991141428A41BC2459A55E76"
- {
- "SourcePath" = "8:..\\Resources\\pageOXPS.ico"
- "TargetName" = "8:pageOXPS.ico"
- "Tag" = "8:"
- "Folder" = "8:_F28BDA152FBB403EAF109B8E144140A8"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4826B6F3283A4770935083729B0777B2"
- {
- "SourcePath" = "8:..\\Resources\\pageJPG.ico"
- "TargetName" = "8:pageJPG.ico"
- "Tag" = "8:"
- "Folder" = "8:_F28BDA152FBB403EAF109B8E144140A8"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4879181DB5BD4512A8A1790BC22435A0"
- {
- "AssemblyRegister" = "3:1"
- "AssemblyIsInGAC" = "11:FALSE"
- "AssemblyAsmDisplayName" = "8:gsview, Version=6.0.0.0, Culture=neutral, processorArchitecture=MSIL"
- "ScatterAssemblies"
- {
- }
- "SourcePath" = "8:..\\bin\\Release\\gsview.exe"
- "TargetName" = "8:"
- "Tag" = "8:"
- "Folder" = "8:_F115E751BD3842299C96BA6F8A5B0F40"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_791D64A55F0847788638D3FCDD1802DD"
- {
- "SourcePath" = "8:..\\Resources\\pageXPS.ico"
- "TargetName" = "8:pageXPS.ico"
- "Tag" = "8:"
- "Folder" = "8:_F28BDA152FBB403EAF109B8E144140A8"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_87036B53E422457DBCA496540B818802"
- {
- "SourcePath" = "8:..\\bin\\Release\\mupdfnet32.dll"
- "TargetName" = "8:mupdfnet32.dll"
- "Tag" = "8:"
- "Folder" = "8:_F115E751BD3842299C96BA6F8A5B0F40"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A62B07FE876C4ACBBE7DEF7A219A570E"
- {
- "SourcePath" = "8:..\\gsview.visualelementsmanifest.xml"
- "TargetName" = "8:gsview.visualelementsmanifest.xml"
- "Tag" = "8:"
- "Folder" = "8:_F115E751BD3842299C96BA6F8A5B0F40"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B2090A11BD04495DACDA72D4E5D72B7E"
- {
- "SourcePath" = "8:..\\gslib\\gsdll32.dll"
- "TargetName" = "8:gsdll32.dll"
- "Tag" = "8:"
- "Folder" = "8:_F115E751BD3842299C96BA6F8A5B0F40"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- }
- "FileType"
- {
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_12B01738B600492AA1C8D89AD0821413"
- {
- "Name" = "8:CDisplay ZIP Archived Comic Book file"
- "Description" = "8:CDisplay ZIP Archived Comic Book file"
- "Extensions" = "8:cbz"
- "MIME" = "8:"
- "Icon" = "8:_14D6D6CD543648468701A0FE8D5A2463"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_4879181DB5BD4512A8A1790BC22435A0"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_33B319EC439B40E38BD09902607AFE0B"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_13D929725BF0460F823C23414FB2F0A1"
- {
- "Name" = "8:Open XPS Document"
- "Description" = "8:Open XPS Document"
- "Extensions" = "8:oxps"
- "MIME" = "8:"
- "Icon" = "8:_389C02C6991141428A41BC2459A55E76"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_4879181DB5BD4512A8A1790BC22435A0"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_02319B3587ED4701B20BE6C84D578514"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_65F612197D8D450C8AC251D615131D21"
- {
- "Name" = "8:PostScript File"
- "Description" = "8:PostScript File"
- "Extensions" = "8:ps"
- "MIME" = "8:"
- "Icon" = "8:_2684CEAF38794D53AF9D906A7F8D677C"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_4879181DB5BD4512A8A1790BC22435A0"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_1CC8050B2F6146E6A1F7C71C12ACB66E"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_69F979C4C92C4C348E8001B157A92FED"
- {
- "Name" = "8:EPS File"
- "Description" = "8:EPS File"
- "Extensions" = "8:eps"
- "MIME" = "8:"
- "Icon" = "8:_1F1881EE52A84F49A62D42DE7E4D9D24"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_4879181DB5BD4512A8A1790BC22435A0"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_EA00D9AD05ED40BE82A6F8CF37AA21EE"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_A5691CEB907F4D66A3FE718B4FF65E8D"
- {
- "Name" = "8:PNG image"
- "Description" = "8:PNG image"
- "Extensions" = "8:png"
- "MIME" = "8:"
- "Icon" = "8:_016DC0AD4FFB4399B8519ACA84400E23"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_4879181DB5BD4512A8A1790BC22435A0"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_95A3859E50134298ACEA0E1EACA47513"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_CD91C7FED2C94607AC5CFB7F6571A963"
- {
- "Name" = "8:XPS Document"
- "Description" = "8:XPS Document"
- "Extensions" = "8:xps"
- "MIME" = "8:"
- "Icon" = "8:_791D64A55F0847788638D3FCDD1802DD"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_4879181DB5BD4512A8A1790BC22435A0"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_C39CD59228F345E48878777D30252120"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_EA8DCA7319A3441EA0A8F07F20C7EC71"
- {
- "Name" = "8:JPEG image"
- "Description" = "8:JPEG image"
- "Extensions" = "8:jpeg"
- "MIME" = "8:"
- "Icon" = "8:_4826B6F3283A4770935083729B0777B2"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_4879181DB5BD4512A8A1790BC22435A0"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_90799BABA05F49D6AB9D093411DD157E"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_EA91006930CC4A349642A7F0AD319AA4"
- {
- "Name" = "8:PDF"
- "Description" = "8:PDF"
- "Extensions" = "8:pdf"
- "MIME" = "8:"
- "Icon" = "8:_200E66532F6140579FA9390D6F7CC178"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_4879181DB5BD4512A8A1790BC22435A0"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_D9041E3AC16C43E4AF1822F9103B24D6"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- }
- "Folder"
- {
- "{1525181F-901A-416C-8A58-119130FE478E}:_05287FF94E284ACF9E55AD5BF0AF82E6"
- {
- "Name" = "8:#1919"
- "AlwaysCreate" = "11:FALSE"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Property" = "8:ProgramMenuFolder"
- "Folders"
- {
- "{9EF0B969-E518-4E46-987F-47570745A589}:_8ADA7142ADE14DFFA878A5107FE5C304"
- {
- "Name" = "8:Artifex Software"
- "AlwaysCreate" = "11:FALSE"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Property" = "8:_AF85737E4DAA4E318495768F54D7F0AF"
- "Folders"
- {
- }
- }
- }
- }
- "{1525181F-901A-416C-8A58-119130FE478E}:_74B5607A82364A9E8F63FA435CF2C5FA"
- {
- "Name" = "8:#1916"
- "AlwaysCreate" = "11:FALSE"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Property" = "8:DesktopFolder"
- "Folders"
- {
- }
- }
- "{3C67513D-01DD-4637-8A68-80971EB9504F}:_F115E751BD3842299C96BA6F8A5B0F40"
- {
- "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]"
- "Name" = "8:#1925"
- "AlwaysCreate" = "11:FALSE"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Property" = "8:TARGETDIR"
- "Folders"
- {
- "{9EF0B969-E518-4E46-987F-47570745A589}:_F28BDA152FBB403EAF109B8E144140A8"
- {
- "Name" = "8:Resources"
- "AlwaysCreate" = "11:FALSE"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Property" = "8:_76594C33BABA488DBC160B0B115E0F1B"
- "Folders"
- {
- }
- }
- }
- }
- }
- "LaunchCondition"
- {
- }
- "Locator"
- {
- }
- "MsiBootstrapper"
- {
- "LangId" = "3:1033"
- "RequiresElevation" = "11:FALSE"
- }
- "Product"
- {
- "Name" = "8:Microsoft Visual Studio"
- "ProductName" = "8:GSview 6.0"
- "ProductCode" = "8:{BB8C85F6-5B3C-4163-9B55-6B07E747E947}"
- "PackageCode" = "8:{85959242-0814-4BFE-8891-EE46ADB397D6}"
- "UpgradeCode" = "8:{00F5E049-7C22-449F-9879-A4D6A7634B7E}"
- "AspNetVersion" = "8:4.0.30319.0"
- "RestartWWWService" = "11:FALSE"
- "RemovePreviousVersions" = "11:TRUE"
- "DetectNewerInstalledVersion" = "11:TRUE"
- "InstallAllUsers" = "11:TRUE"
- "ProductVersion" = "8:6.0.0"
- "Manufacturer" = "8:Artifex Software"
- "ARPHELPTELEPHONE" = "8:"
- "ARPHELPLINK" = "8:http://www.artifex.com"
- "Title" = "8:Install GSview 6.0 x86"
- "Subject" = "8:"
- "ARPCONTACT" = "8:Artifex Software"
- "Keywords" = "8:"
- "ARPCOMMENTS" = "8:Install GSview 6.0 for x86"
- "ARPURLINFOABOUT" = "8:http://www.artifex.com"
- "ARPPRODUCTICON" = "8:"
- "ARPIconIndex" = "3:0"
- "SearchPath" = "8:"
- "UseSystemSearchPath" = "11:TRUE"
- "TargetPlatform" = "3:0"
- "PreBuildEvent" = "8:"
- "PostBuildEvent" = "8:"
- "RunPostBuildEvent" = "3:0"
- }
- "Registry"
- {
- "HKLM"
- {
- "Keys"
- {
- "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_233AE572F5BA48D1A577D7F88DE5C94E"
- {
- "Name" = "8:Software"
- "Condition" = "8:"
- "AlwaysCreate" = "11:FALSE"
- "DeleteAtUninstall" = "11:FALSE"
- "Transitive" = "11:FALSE"
- "Keys"
- {
- "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_75350EE0EC77414B82CAB14EAF87F8AA"
- {
- "Name" = "8:[Manufacturer]"
- "Condition" = "8:"
- "AlwaysCreate" = "11:FALSE"
- "DeleteAtUninstall" = "11:FALSE"
- "Transitive" = "11:FALSE"
- "Keys"
- {
- }
- "Values"
- {
- }
- }
- }
- "Values"
- {
- }
- }
- }
- }
- "HKCU"
- {
- "Keys"
- {
- "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_18E520707B824ADE8636026ABE055101"
- {
- "Name" = "8:Software"
- "Condition" = "8:"
- "AlwaysCreate" = "11:FALSE"
- "DeleteAtUninstall" = "11:FALSE"
- "Transitive" = "11:FALSE"
- "Keys"
- {
- "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_07D3F609B0F0416CB43A58C33358E4B5"
- {
- "Name" = "8:[Manufacturer]"
- "Condition" = "8:"
- "AlwaysCreate" = "11:FALSE"
- "DeleteAtUninstall" = "11:FALSE"
- "Transitive" = "11:FALSE"
- "Keys"
- {
- }
- "Values"
- {
- }
- }
- }
- "Values"
- {
- }
- }
- }
- }
- "HKCR"
- {
- "Keys"
- {
- }
- }
- "HKU"
- {
- "Keys"
- {
- }
- }
- "HKPU"
- {
- "Keys"
- {
- }
- }
- }
- "Sequences"
- {
- }
- "Shortcut"
- {
- "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_027434B1EED34DEF86F7CF3635B5FD30"
- {
- "Name" = "8:GSView 6.0"
- "Arguments" = "8:"
- "Description" = "8:"
- "ShowCmd" = "3:1"
- "IconIndex" = "3:32512"
- "Transitive" = "11:FALSE"
- "Target" = "8:_4879181DB5BD4512A8A1790BC22435A0"
- "Folder" = "8:_8ADA7142ADE14DFFA878A5107FE5C304"
- "WorkingFolder" = "8:_F115E751BD3842299C96BA6F8A5B0F40"
- "Icon" = "8:_4879181DB5BD4512A8A1790BC22435A0"
- "Feature" = "8:"
- }
- }
- "UserInterface"
- {
- "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_1F01AD235CE94923AAD616EC2F3B2101"
- {
- "UseDynamicProperties" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
- }
- "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_332E71C0C4E14EB9950570071C650B0B"
- {
- "Name" = "8:#1902"
- "Sequence" = "3:2"
- "Attributes" = "3:3"
- "Dialogs"
- {
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_20E5387842C44457BF0F53E5E053BADA"
- {
- "Sequence" = "3:100"
- "DisplayName" = "8:Finished"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- }
- }
- "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_50F65640B6CC47C882EDDB10C3EA355C"
- {
- "Name" = "8:#1902"
- "Sequence" = "3:1"
- "Attributes" = "3:3"
- "Dialogs"
- {
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_C0FA7EB2C0E949D99D49ED30340AD678"
- {
- "Sequence" = "3:100"
- "DisplayName" = "8:Finished"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- "UpdateText"
- {
- "Name" = "8:UpdateText"
- "DisplayName" = "8:#1058"
- "Description" = "8:#1158"
- "Type" = "3:15"
- "ContextData" = "8:"
- "Attributes" = "3:0"
- "Setting" = "3:1"
- "Value" = "8:#1258"
- "DefaultValue" = "8:#1258"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- }
- }
- "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_8B3DB474F8184537ABFC9E001FAD6796"
- {
- "UseDynamicProperties" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
- }
- "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_90A48D00803D4600A3A0587F503DF240"
- {
- "Name" = "8:#1901"
- "Sequence" = "3:1"
- "Attributes" = "3:2"
- "Dialogs"
- {
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_AC19A30ACDE24F4C9F6FC61008980022"
- {
- "Sequence" = "3:100"
- "DisplayName" = "8:Progress"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- "ShowProgress"
- {
- "Name" = "8:ShowProgress"
- "DisplayName" = "8:#1009"
- "Description" = "8:#1109"
- "Type" = "3:5"
- "ContextData" = "8:1;True=1;False=0"
- "Attributes" = "3:0"
- "Setting" = "3:0"
- "Value" = "3:1"
- "DefaultValue" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- }
- }
- "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_BF426D392BBE410FB49E79B38576061E"
- {
- "Name" = "8:#1901"
- "Sequence" = "3:2"
- "Attributes" = "3:2"
- "Dialogs"
- {
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_672D3C120E06497894B6A7787DB2AD1D"
- {
- "Sequence" = "3:100"
- "DisplayName" = "8:Progress"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- "ShowProgress"
- {
- "Name" = "8:ShowProgress"
- "DisplayName" = "8:#1009"
- "Description" = "8:#1109"
- "Type" = "3:5"
- "ContextData" = "8:1;True=1;False=0"
- "Attributes" = "3:0"
- "Setting" = "3:0"
- "Value" = "3:1"
- "DefaultValue" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- }
- }
- "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_ECDD7A4101B249C88A997FF923CC7009"
- {
- "Name" = "8:#1900"
- "Sequence" = "3:1"
- "Attributes" = "3:1"
- "Dialogs"
- {
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_51BA1897377D4A5D98ACE0E2EB251293"
- {
- "Sequence" = "3:300"
- "DisplayName" = "8:Confirm Installation"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_AC4CC79CCC9E47D59B61182471DE1D40"
- {
- "Sequence" = "3:100"
- "DisplayName" = "8:Welcome"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- "CopyrightWarning"
- {
- "Name" = "8:CopyrightWarning"
- "DisplayName" = "8:#1002"
- "Description" = "8:#1102"
- "Type" = "3:3"
- "ContextData" = "8:"
- "Attributes" = "3:0"
- "Setting" = "3:1"
- "Value" = "8:#1202"
- "DefaultValue" = "8:#1202"
- "UsePlugInResources" = "11:TRUE"
- }
- "Welcome"
- {
- "Name" = "8:Welcome"
- "DisplayName" = "8:#1003"
- "Description" = "8:#1103"
- "Type" = "3:3"
- "ContextData" = "8:"
- "Attributes" = "3:0"
- "Setting" = "3:1"
- "Value" = "8:#1203"
- "DefaultValue" = "8:#1203"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F1DD6CBB2F29447BB67A41DC327C2254"
- {
- "Sequence" = "3:200"
- "DisplayName" = "8:Installation Folder"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- "InstallAllUsersVisible"
- {
- "Name" = "8:InstallAllUsersVisible"
- "DisplayName" = "8:#1059"
- "Description" = "8:#1159"
- "Type" = "3:5"
- "ContextData" = "8:1;True=1;False=0"
- "Attributes" = "3:0"
- "Setting" = "3:0"
- "Value" = "3:1"
- "DefaultValue" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- }
- }
- "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F2A4ABF584D248E7812843F3F6D91F91"
- {
- "Name" = "8:#1900"
- "Sequence" = "3:2"
- "Attributes" = "3:1"
- "Dialogs"
- {
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2A85F1F786AB43EF820FA580E2689977"
- {
- "Sequence" = "3:100"
- "DisplayName" = "8:Welcome"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- "CopyrightWarning"
- {
- "Name" = "8:CopyrightWarning"
- "DisplayName" = "8:#1002"
- "Description" = "8:#1102"
- "Type" = "3:3"
- "ContextData" = "8:"
- "Attributes" = "3:0"
- "Setting" = "3:1"
- "Value" = "8:#1202"
- "DefaultValue" = "8:#1202"
- "UsePlugInResources" = "11:TRUE"
- }
- "Welcome"
- {
- "Name" = "8:Welcome"
- "DisplayName" = "8:#1003"
- "Description" = "8:#1103"
- "Type" = "3:3"
- "ContextData" = "8:"
- "Attributes" = "3:0"
- "Setting" = "3:1"
- "Value" = "8:#1203"
- "DefaultValue" = "8:#1203"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E63962ADBAE3438ABDEFC6290FFF9B71"
- {
- "Sequence" = "3:200"
- "DisplayName" = "8:Installation Folder"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FD25300108814F51958E9811E0EF375D"
- {
- "Sequence" = "3:300"
- "DisplayName" = "8:Confirm Installation"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- }
- }
- }
- "MergeModule"
- {
- }
- "ProjectOutput"
- {
- }
- }
-}
diff --git a/platform/windows/gsview/Install64/Install64.vdproj b/platform/windows/gsview/Install64/Install64.vdproj
deleted file mode 100644
index faef7562..00000000
--- a/platform/windows/gsview/Install64/Install64.vdproj
+++ /dev/null
@@ -1,1238 +0,0 @@
-"DeployProject"
-{
-"VSVersion" = "3:800"
-"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
-"IsWebType" = "8:FALSE"
-"ProjectName" = "8:Install64"
-"LanguageId" = "3:1033"
-"CodePage" = "3:1252"
-"UILanguageId" = "3:1033"
-"SccProjectName" = "8:"
-"SccLocalPath" = "8:"
-"SccAuxPath" = "8:"
-"SccProvider" = "8:"
- "Hierarchy"
- {
- "Entry"
- {
- "MsmKey" = "8:_0BD3A92E2F2F40A3B601C2CF21584C48"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_157FB597E59745DFAD45AE54F232D39D"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_1BF4736955034DCEBB4B7C53AEFECA2A"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_28423EA654C8488A8F59859D947164F4"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_372F38F3347F4E0491FA521F236BA54C"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_44A71C9401B94929A3DF6828309FE684"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_6724F24524E24AA1907957AF0812BD09"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_9F16FF3C56C249B58F3F64B821ABBF97"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_AB1B21BC24164EF4929937FE8C3ED270"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_BC8D174211B84DE6968562ECF0A0443B"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_C11D0300BF42444AA9362921375DF910"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_D300E715CB524AF1AE46CE9EB3ED67C8"
- "OwnerKey" = "8:_UNDEFINED"
- "MsmSig" = "8:_UNDEFINED"
- }
- "Entry"
- {
- "MsmKey" = "8:_UNDEFINED"
- "OwnerKey" = "8:_44A71C9401B94929A3DF6828309FE684"
- "MsmSig" = "8:_UNDEFINED"
- }
- }
- "Configurations"
- {
- "Debug"
- {
- "DisplayName" = "8:Debug"
- "IsDebugOnly" = "11:TRUE"
- "IsReleaseOnly" = "11:FALSE"
- "OutputFilename" = "8:Debug\\Install64.msi"
- "PackageFilesAs" = "3:2"
- "PackageFileSize" = "3:-2147483648"
- "CabType" = "3:1"
- "Compression" = "3:2"
- "SignOutput" = "11:FALSE"
- "CertificateFile" = "8:"
- "PrivateKeyFile" = "8:"
- "TimeStampServer" = "8:"
- "InstallerBootstrapper" = "3:2"
- "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
- {
- "Enabled" = "11:TRUE"
- "PromptEnabled" = "11:TRUE"
- "PrerequisitesLocation" = "2:1"
- "Url" = "8:"
- "ComponentsUrl" = "8:"
- "Items"
- {
- "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.5"
- {
- "Name" = "8:Microsoft .NET Framework 4.5 (x86 and x64)"
- "ProductCode" = "8:.NETFramework,Version=v4.5"
- }
- }
- }
- }
- "Release"
- {
- "DisplayName" = "8:Release"
- "IsDebugOnly" = "11:FALSE"
- "IsReleaseOnly" = "11:TRUE"
- "OutputFilename" = "8:Release\\Install64.msi"
- "PackageFilesAs" = "3:2"
- "PackageFileSize" = "3:-2147483648"
- "CabType" = "3:1"
- "Compression" = "3:2"
- "SignOutput" = "11:FALSE"
- "CertificateFile" = "8:"
- "PrivateKeyFile" = "8:"
- "TimeStampServer" = "8:"
- "InstallerBootstrapper" = "3:2"
- "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
- {
- "Enabled" = "11:TRUE"
- "PromptEnabled" = "11:TRUE"
- "PrerequisitesLocation" = "2:1"
- "Url" = "8:"
- "ComponentsUrl" = "8:"
- "Items"
- {
- "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.5"
- {
- "Name" = "8:Microsoft .NET Framework 4.5 (x86 and x64)"
- "ProductCode" = "8:.NETFramework,Version=v4.5"
- }
- }
- }
- }
- }
- "Deployable"
- {
- "CustomAction"
- {
- }
- "DefaultFeature"
- {
- "Name" = "8:DefaultFeature"
- "Title" = "8:"
- "Description" = "8:"
- }
- "ExternalPersistence"
- {
- "LaunchCondition"
- {
- "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_D0F5C30769F1419B8C1834A6F984A56F"
- {
- "Name" = "8:.NET Framework"
- "Message" = "8:[VSDNETMSG]"
- "FrameworkVersion" = "8:.NETFramework,Version=v4.5"
- "AllowLaterVersions" = "11:FALSE"
- "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=395269"
- }
- }
- }
- "File"
- {
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_0BD3A92E2F2F40A3B601C2CF21584C48"
- {
- "SourcePath" = "8:..\\Resources\\pageEPS.ico"
- "TargetName" = "8:pageEPS.ico"
- "Tag" = "8:"
- "Folder" = "8:_52FA2F218E56408DA37ABFD7E103994C"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_157FB597E59745DFAD45AE54F232D39D"
- {
- "SourcePath" = "8:..\\Resources\\pageXPS.ico"
- "TargetName" = "8:pageXPS.ico"
- "Tag" = "8:"
- "Folder" = "8:_52FA2F218E56408DA37ABFD7E103994C"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1BF4736955034DCEBB4B7C53AEFECA2A"
- {
- "SourcePath" = "8:..\\gslib\\gsdll64.dll"
- "TargetName" = "8:gsdll64.dll"
- "Tag" = "8:"
- "Folder" = "8:_CDB2B40979C34EBAA8A815DA144BF441"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_28423EA654C8488A8F59859D947164F4"
- {
- "SourcePath" = "8:..\\Resources\\pageOXPS.ico"
- "TargetName" = "8:pageOXPS.ico"
- "Tag" = "8:"
- "Folder" = "8:_52FA2F218E56408DA37ABFD7E103994C"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_372F38F3347F4E0491FA521F236BA54C"
- {
- "SourcePath" = "8:..\\bin\\Release\\mupdfnet64.dll"
- "TargetName" = "8:mupdfnet64.dll"
- "Tag" = "8:"
- "Folder" = "8:_CDB2B40979C34EBAA8A815DA144BF441"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_44A71C9401B94929A3DF6828309FE684"
- {
- "AssemblyRegister" = "3:1"
- "AssemblyIsInGAC" = "11:FALSE"
- "AssemblyAsmDisplayName" = "8:gsview, Version=6.0.0.0, Culture=neutral, processorArchitecture=MSIL"
- "ScatterAssemblies"
- {
- "_44A71C9401B94929A3DF6828309FE684"
- {
- "Name" = "8:gsview.exe"
- "Attributes" = "3:512"
- }
- }
- "SourcePath" = "8:..\\bin\\Release\\gsview.exe"
- "TargetName" = "8:"
- "Tag" = "8:"
- "Folder" = "8:_CDB2B40979C34EBAA8A815DA144BF441"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_6724F24524E24AA1907957AF0812BD09"
- {
- "SourcePath" = "8:..\\Resources\\pagePS.ico"
- "TargetName" = "8:pagePS.ico"
- "Tag" = "8:"
- "Folder" = "8:_52FA2F218E56408DA37ABFD7E103994C"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_9F16FF3C56C249B58F3F64B821ABBF97"
- {
- "SourcePath" = "8:..\\Resources\\pageCBZ.ico"
- "TargetName" = "8:pageCBZ.ico"
- "Tag" = "8:"
- "Folder" = "8:_52FA2F218E56408DA37ABFD7E103994C"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_AB1B21BC24164EF4929937FE8C3ED270"
- {
- "SourcePath" = "8:..\\Resources\\pagePDF.ico"
- "TargetName" = "8:pagePDF.ico"
- "Tag" = "8:"
- "Folder" = "8:_52FA2F218E56408DA37ABFD7E103994C"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_BC8D174211B84DE6968562ECF0A0443B"
- {
- "SourcePath" = "8:..\\gsview.visualelementsmanifest.xml"
- "TargetName" = "8:gsview.visualelementsmanifest.xml"
- "Tag" = "8:"
- "Folder" = "8:_CDB2B40979C34EBAA8A815DA144BF441"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C11D0300BF42444AA9362921375DF910"
- {
- "SourcePath" = "8:..\\Resources\\pagePNG.ico"
- "TargetName" = "8:pagePNG.ico"
- "Tag" = "8:"
- "Folder" = "8:_52FA2F218E56408DA37ABFD7E103994C"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_D300E715CB524AF1AE46CE9EB3ED67C8"
- {
- "SourcePath" = "8:..\\Resources\\pageJPG.ico"
- "TargetName" = "8:pageJPG.ico"
- "Tag" = "8:"
- "Folder" = "8:_52FA2F218E56408DA37ABFD7E103994C"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Vital" = "11:TRUE"
- "ReadOnly" = "11:FALSE"
- "Hidden" = "11:FALSE"
- "System" = "11:FALSE"
- "Permanent" = "11:FALSE"
- "SharedLegacy" = "11:FALSE"
- "PackageAs" = "3:1"
- "Register" = "3:1"
- "Exclude" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "IsolateTo" = "8:"
- }
- }
- "FileType"
- {
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_11428E8F96C54BA3900AF3407233AAC0"
- {
- "Name" = "8:PostScript File"
- "Description" = "8:PostScript File"
- "Extensions" = "8:ps"
- "MIME" = "8:"
- "Icon" = "8:_6724F24524E24AA1907957AF0812BD09"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_44A71C9401B94929A3DF6828309FE684"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_8E3935BB44F543D5B0E48ACB12FF306D"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_5C233C0E4937479FB108F39E16FABDE6"
- {
- "Name" = "8:CDisplay ZIP Archived Comic Book file"
- "Description" = "8:CDisplay ZIP Archived Comic Book file"
- "Extensions" = "8:cbz"
- "MIME" = "8:"
- "Icon" = "8:_9F16FF3C56C249B58F3F64B821ABBF97"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_44A71C9401B94929A3DF6828309FE684"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_8D3603F262824461A9EA284DBB30D575"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_61007590E6A24BA1A769A064AC2AC094"
- {
- "Name" = "8:JPEG image"
- "Description" = "8:JPEG image"
- "Extensions" = "8:jpeg"
- "MIME" = "8:"
- "Icon" = "8:_D300E715CB524AF1AE46CE9EB3ED67C8"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_44A71C9401B94929A3DF6828309FE684"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_0E6BD260F46C4A89891F1D0A7029A6EF"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_962DBD1C82974C33960B863AB9E1FC9F"
- {
- "Name" = "8:Open XPS Document"
- "Description" = "8:Open XPS Document"
- "Extensions" = "8:oxps"
- "MIME" = "8:"
- "Icon" = "8:_28423EA654C8488A8F59859D947164F4"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_44A71C9401B94929A3DF6828309FE684"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_6B19B65AF043423897A64F9129571FE9"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_A59FDC99A2564A0089516522926CE6C3"
- {
- "Name" = "8:PNG image"
- "Description" = "8:PNG image"
- "Extensions" = "8:png"
- "MIME" = "8:"
- "Icon" = "8:_C11D0300BF42444AA9362921375DF910"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_44A71C9401B94929A3DF6828309FE684"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_948A77318E904662886D34BDC0BCFE0E"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_A8D59D004BB94148B529FD692DDC5460"
- {
- "Name" = "8:XPS Document"
- "Description" = "8:XPS Document"
- "Extensions" = "8:xps"
- "MIME" = "8:"
- "Icon" = "8:_157FB597E59745DFAD45AE54F232D39D"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_44A71C9401B94929A3DF6828309FE684"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_A9ABA43924574B7A992B78537E7F2FB7"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_A8EDD49D509A4974B971BF4FBD093455"
- {
- "Name" = "8:PDF"
- "Description" = "8:PDF"
- "Extensions" = "8:pdf"
- "MIME" = "8:"
- "Icon" = "8:_AB1B21BC24164EF4929937FE8C3ED270"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_44A71C9401B94929A3DF6828309FE684"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_9396BB7A2A2841B0890D2DB6A6360F4E"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- "{5EB83D71-FA18-4901-BE56-DE22E13CC478}:_AA94DC1A560A4224A9410A3EAAB34D77"
- {
- "Name" = "8:EPS File"
- "Description" = "8:EPS File"
- "Extensions" = "8:eps"
- "MIME" = "8:"
- "Icon" = "8:_0BD3A92E2F2F40A3B601C2CF21584C48"
- "IconIndex" = "3:0"
- "Command"
- {
- "Command" = "8:_44A71C9401B94929A3DF6828309FE684"
- }
- "Verbs"
- {
- "{95C0C507-CBF0-42B8-B119-07219E384A4A}:_BAFA7BE3B6AF4D9283D623A69D266E9B"
- {
- "Command" = "8:&Open"
- "Verb" = "8:open"
- "Arguments" = "8:\"%1\""
- "Order" = "3:0"
- }
- }
- }
- }
- "Folder"
- {
- "{1525181F-901A-416C-8A58-119130FE478E}:_A2CF2A9B6D384F768C297CC789FBB997"
- {
- "Name" = "8:#1916"
- "AlwaysCreate" = "11:FALSE"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Property" = "8:DesktopFolder"
- "Folders"
- {
- }
- }
- "{1525181F-901A-416C-8A58-119130FE478E}:_BE3A2AB1B2C04D7AB9F691ADFDCA6EE1"
- {
- "Name" = "8:#1919"
- "AlwaysCreate" = "11:TRUE"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Property" = "8:ProgramMenuFolder"
- "Folders"
- {
- "{9EF0B969-E518-4E46-987F-47570745A589}:_EAE10184B82B40399A965598BE4C92BC"
- {
- "Name" = "8:Artifex Software"
- "AlwaysCreate" = "11:FALSE"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Property" = "8:_6289816925F64FEEA99AF2712A31DF22"
- "Folders"
- {
- }
- }
- }
- }
- "{3C67513D-01DD-4637-8A68-80971EB9504F}:_CDB2B40979C34EBAA8A815DA144BF441"
- {
- "DefaultLocation" = "8:[ProgramFiles64Folder][Manufacturer]\\[ProductName]"
- "Name" = "8:#1925"
- "AlwaysCreate" = "11:FALSE"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Property" = "8:TARGETDIR"
- "Folders"
- {
- "{9EF0B969-E518-4E46-987F-47570745A589}:_52FA2F218E56408DA37ABFD7E103994C"
- {
- "Name" = "8:Resources"
- "AlwaysCreate" = "11:FALSE"
- "Condition" = "8:"
- "Transitive" = "11:FALSE"
- "Property" = "8:_0E795A41F6474AC8ACB9997020B3421A"
- "Folders"
- {
- }
- }
- }
- }
- }
- "LaunchCondition"
- {
- }
- "Locator"
- {
- }
- "MsiBootstrapper"
- {
- "LangId" = "3:1033"
- "RequiresElevation" = "11:FALSE"
- }
- "Product"
- {
- "Name" = "8:Microsoft Visual Studio"
- "ProductName" = "8:GSview 6.0"
- "ProductCode" = "8:{A22596C0-BCF4-46F9-9CF2-1C66E8588C30}"
- "PackageCode" = "8:{980224C0-59E3-4811-81F5-6EF5D4BA2270}"
- "UpgradeCode" = "8:{B494B7A2-738F-4F9D-87F4-31830A16FB76}"
- "AspNetVersion" = "8:4.0.30319.0"
- "RestartWWWService" = "11:FALSE"
- "RemovePreviousVersions" = "11:TRUE"
- "DetectNewerInstalledVersion" = "11:TRUE"
- "InstallAllUsers" = "11:TRUE"
- "ProductVersion" = "8:6.0.0"
- "Manufacturer" = "8:Artifex Software"
- "ARPHELPTELEPHONE" = "8:"
- "ARPHELPLINK" = "8:http://www.artifex.com"
- "Title" = "8:Install GSview 6.0 x64"
- "Subject" = "8:"
- "ARPCONTACT" = "8:Artifex Software"
- "Keywords" = "8:"
- "ARPCOMMENTS" = "8:Install GSview 6.0 for x64"
- "ARPURLINFOABOUT" = "8:http://www.artifex.com"
- "ARPPRODUCTICON" = "8:_44A71C9401B94929A3DF6828309FE684"
- "ARPIconIndex" = "3:32512"
- "SearchPath" = "8:"
- "UseSystemSearchPath" = "11:TRUE"
- "TargetPlatform" = "3:1"
- "PreBuildEvent" = "8:"
- "PostBuildEvent" = "8:"
- "RunPostBuildEvent" = "3:0"
- }
- "Registry"
- {
- "HKLM"
- {
- "Keys"
- {
- "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1E605C0AD6C1431799974106D953AE68"
- {
- "Name" = "8:Software"
- "Condition" = "8:"
- "AlwaysCreate" = "11:FALSE"
- "DeleteAtUninstall" = "11:FALSE"
- "Transitive" = "11:FALSE"
- "Keys"
- {
- "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_22F6F34C883A4B46B3D926048627ECB6"
- {
- "Name" = "8:[Manufacturer]"
- "Condition" = "8:"
- "AlwaysCreate" = "11:FALSE"
- "DeleteAtUninstall" = "11:FALSE"
- "Transitive" = "11:FALSE"
- "Keys"
- {
- }
- "Values"
- {
- }
- }
- }
- "Values"
- {
- }
- }
- }
- }
- "HKCU"
- {
- "Keys"
- {
- "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C1C61CD1AF1A4D718391EC0C924CCEDC"
- {
- "Name" = "8:Software"
- "Condition" = "8:"
- "AlwaysCreate" = "11:FALSE"
- "DeleteAtUninstall" = "11:FALSE"
- "Transitive" = "11:FALSE"
- "Keys"
- {
- "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_78C4B8465B114416A32C1313FA510012"
- {
- "Name" = "8:[Manufacturer]"
- "Condition" = "8:"
- "AlwaysCreate" = "11:FALSE"
- "DeleteAtUninstall" = "11:FALSE"
- "Transitive" = "11:FALSE"
- "Keys"
- {
- }
- "Values"
- {
- }
- }
- }
- "Values"
- {
- }
- }
- }
- }
- "HKCR"
- {
- "Keys"
- {
- }
- }
- "HKU"
- {
- "Keys"
- {
- }
- }
- "HKPU"
- {
- "Keys"
- {
- }
- }
- }
- "Sequences"
- {
- }
- "Shortcut"
- {
- "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_DD3E47DAFCAA48ED9A8A02F3B29E888E"
- {
- "Name" = "8:GSView 6.0"
- "Arguments" = "8:"
- "Description" = "8:"
- "ShowCmd" = "3:1"
- "IconIndex" = "3:32512"
- "Transitive" = "11:FALSE"
- "Target" = "8:_44A71C9401B94929A3DF6828309FE684"
- "Folder" = "8:_EAE10184B82B40399A965598BE4C92BC"
- "WorkingFolder" = "8:_CDB2B40979C34EBAA8A815DA144BF441"
- "Icon" = "8:_44A71C9401B94929A3DF6828309FE684"
- "Feature" = "8:"
- }
- }
- "UserInterface"
- {
- "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_84D62A451A39423FB4CBFBF0B05992AE"
- {
- "Name" = "8:#1901"
- "Sequence" = "3:2"
- "Attributes" = "3:2"
- "Dialogs"
- {
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_91A9D42868164E8A8F4197F300F1B9D8"
- {
- "Sequence" = "3:100"
- "DisplayName" = "8:Progress"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- "ShowProgress"
- {
- "Name" = "8:ShowProgress"
- "DisplayName" = "8:#1009"
- "Description" = "8:#1109"
- "Type" = "3:5"
- "ContextData" = "8:1;True=1;False=0"
- "Attributes" = "3:0"
- "Setting" = "3:0"
- "Value" = "3:1"
- "DefaultValue" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- }
- }
- "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_8A4A575119DD460AA6774C08CB4BA465"
- {
- "Name" = "8:#1901"
- "Sequence" = "3:1"
- "Attributes" = "3:2"
- "Dialogs"
- {
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_44BF62E80B0E4B2DA3C75D4B8B3D11EB"
- {
- "Sequence" = "3:100"
- "DisplayName" = "8:Progress"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- "ShowProgress"
- {
- "Name" = "8:ShowProgress"
- "DisplayName" = "8:#1009"
- "Description" = "8:#1109"
- "Type" = "3:5"
- "ContextData" = "8:1;True=1;False=0"
- "Attributes" = "3:0"
- "Setting" = "3:0"
- "Value" = "3:1"
- "DefaultValue" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- }
- }
- "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_914CB62F95114045827D6FD18322AE3C"
- {
- "Name" = "8:#1900"
- "Sequence" = "3:2"
- "Attributes" = "3:1"
- "Dialogs"
- {
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_1A397F336F944DEAB35C08D6CEA5FE2A"
- {
- "Sequence" = "3:300"
- "DisplayName" = "8:Confirm Installation"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_5A2C0AE1AE7D4D17B87F0474E7424544"
- {
- "Sequence" = "3:100"
- "DisplayName" = "8:Welcome"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- "CopyrightWarning"
- {
- "Name" = "8:CopyrightWarning"
- "DisplayName" = "8:#1002"
- "Description" = "8:#1102"
- "Type" = "3:3"
- "ContextData" = "8:"
- "Attributes" = "3:0"
- "Setting" = "3:1"
- "Value" = "8:#1202"
- "DefaultValue" = "8:#1202"
- "UsePlugInResources" = "11:TRUE"
- }
- "Welcome"
- {
- "Name" = "8:Welcome"
- "DisplayName" = "8:#1003"
- "Description" = "8:#1103"
- "Type" = "3:3"
- "ContextData" = "8:"
- "Attributes" = "3:0"
- "Setting" = "3:1"
- "Value" = "8:#1203"
- "DefaultValue" = "8:#1203"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FFE13B0235424B189193B4E4F400CB78"
- {
- "Sequence" = "3:200"
- "DisplayName" = "8:Installation Folder"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- }
- }
- "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_BC4637BE7ED7492A9359C01A9E29ACDC"
- {
- "UseDynamicProperties" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
- }
- "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_C0B167A59DF14DA9A4170111D28C6057"
- {
- "UseDynamicProperties" = "11:FALSE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
- }
- "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_C71BEB46A03841F0A26B15DC40628CE8"
- {
- "Name" = "8:#1902"
- "Sequence" = "3:2"
- "Attributes" = "3:3"
- "Dialogs"
- {
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E843264C683A45A5B80393D60A1EA3EB"
- {
- "Sequence" = "3:100"
- "DisplayName" = "8:Finished"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- }
- }
- "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_DD9DE969B7A74DAC8E617049CE2C3AC1"
- {
- "Name" = "8:#1900"
- "Sequence" = "3:1"
- "Attributes" = "3:1"
- "Dialogs"
- {
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A7B7CDCFC5904E1D9128AA5B88FE3583"
- {
- "Sequence" = "3:200"
- "DisplayName" = "8:Installation Folder"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- "InstallAllUsersVisible"
- {
- "Name" = "8:InstallAllUsersVisible"
- "DisplayName" = "8:#1059"
- "Description" = "8:#1159"
- "Type" = "3:5"
- "ContextData" = "8:1;True=1;False=0"
- "Attributes" = "3:0"
- "Setting" = "3:0"
- "Value" = "3:1"
- "DefaultValue" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_BC68E9D5B9714365AD5E43D2BD52B953"
- {
- "Sequence" = "3:300"
- "DisplayName" = "8:Confirm Installation"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D4358EB6E55E497193888CAFBDD4F2C9"
- {
- "Sequence" = "3:100"
- "DisplayName" = "8:Welcome"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:0"
- "UsePlugInResources" = "11:TRUE"
- }
- "CopyrightWarning"
- {
- "Name" = "8:CopyrightWarning"
- "DisplayName" = "8:#1002"
- "Description" = "8:#1102"
- "Type" = "3:3"
- "ContextData" = "8:"
- "Attributes" = "3:0"
- "Setting" = "3:1"
- "Value" = "8:#1202"
- "DefaultValue" = "8:#1202"
- "UsePlugInResources" = "11:TRUE"
- }
- "Welcome"
- {
- "Name" = "8:Welcome"
- "DisplayName" = "8:#1003"
- "Description" = "8:#1103"
- "Type" = "3:3"
- "ContextData" = "8:"
- "Attributes" = "3:0"
- "Setting" = "3:1"
- "Value" = "8:#1203"
- "DefaultValue" = "8:#1203"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- }
- }
- "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F3C1167A3B7748BCB1C893E82BBED76A"
- {
- "Name" = "8:#1902"
- "Sequence" = "3:1"
- "Attributes" = "3:3"
- "Dialogs"
- {
- "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_9313CCEC27A04A03B8010FCEC3B1BEC1"
- {
- "Sequence" = "3:100"
- "DisplayName" = "8:Finished"
- "UseDynamicProperties" = "11:TRUE"
- "IsDependency" = "11:FALSE"
- "SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
- "Properties"
- {
- "BannerBitmap"
- {
- "Name" = "8:BannerBitmap"
- "DisplayName" = "8:#1001"
- "Description" = "8:#1101"
- "Type" = "3:8"
- "ContextData" = "8:Bitmap"
- "Attributes" = "3:4"
- "Setting" = "3:1"
- "UsePlugInResources" = "11:TRUE"
- }
- "UpdateText"
- {
- "Name" = "8:UpdateText"
- "DisplayName" = "8:#1058"
- "Description" = "8:#1158"
- "Type" = "3:15"
- "ContextData" = "8:"
- "Attributes" = "3:0"
- "Setting" = "3:1"
- "Value" = "8:#1258"
- "DefaultValue" = "8:#1258"
- "UsePlugInResources" = "11:TRUE"
- }
- }
- }
- }
- }
- }
- "MergeModule"
- {
- }
- "ProjectOutput"
- {
- }
- }
-}
diff --git a/platform/windows/gsview/LICENSE b/platform/windows/gsview/LICENSE
new file mode 100644
index 00000000..4fd64b19
--- /dev/null
+++ b/platform/windows/gsview/LICENSE
@@ -0,0 +1,66 @@
+This End User License Agreement (“Agreement”) is a legal agreement between ARTIFEX SOFTWARE INC., a California corporation with its principal place of business as 7 Mt. Lassen Drive, A-134, San Rafael, California 94903 (“Artifex”) and you (either an individual or an entity, as identified in your invoice regarding the use of Artifex's software for which you have purchased a license, including any documentation that may be included in the software (together, the “Software”).
+
+
+Grant of License.
+
+Subject to the restrictions herein, and payment of the applicable license fees, Artifex hereby grants to you the personal, nontransferable, non-exclusive right to use the Software, for internal purposes only. You may use the Software as follows, depending on the licenses you have ordered as reflected in your invoice:
+
+• Individual License. You may use the Software, on only one computer, and only by one user, at a time. You may not store the Software on a server that enables access via multiple computers.
+
+• Multiple Licenses. One user may use one copy of the Software for each license you have purchased. You may make a reasonable number of copies to support such use.
+
+• Site License. All of your employees located at a particular site, as indicated in your invoice, may use the Software via computers located at that site, provided the employee’s primary office is at that site. For clarity, a computer will be considered on-site when a user accesses the Software via that computer, even if the Software is being served from offsite servers, and even if the users access their primary computers via virtualization or remote access.
+
+• Enterprise License. All your employees may use the Software regardless of the number of copies or locations.
+
+
+Copyright.
+
+The Software is licensed to you, not sold. All copies of the Software are the property of Artifex. Artifex reserves all intellectual property rights in the Software. The Software is protected by United States copyright and other intellectual property laws and international treaty provisions. Therefore, you may not use, copy, modify or distribute the Software without authorization. You may make a reasonable number of copies of the Software solely for backup or archival purposes.
+
+
+Restrictions.
+
+You may not rent, lease, or loan the Software. You may not reverse engineer, decompile, or disassemble the Software, except to the extent the foregoing restriction is prohibited by applicable law. You may not modify, or create derivative works based upon the Software. You many not use the Software to make its functionality available to others, such as via software-as-a-service offerings. If you make any copy of the Software, you must retain all copyright and other intellectual property notices.
+
+
+Open Source Licensing.
+
+Artifex may offer versions of the Software under open source licenses such as the Affero General Public License 3.0. This Agreement will not vitiate any rights you may have separately under such open source licenses.
+
+Termination.
+
+You may terminate the license granted in this Agreement by so advising Artifex in writing. The license granted in this Agreement will terminate automatically upon any violation by you of its terms or conditions. Upon termination of the license, you must destroy all your copies of the Software.
+
+
+Updates.
+
+The right to receive support or updates to the Software may be subject to additional terms, conditions or charges. Please contact Artifex for additional information about maintenance and support programs. To the extent you are provided updates, revisions, or new versions of the Software, this Agreement will govern them and they will be considered part of the Software hereunder, unless you and Artifex agree to a new license agreement covering them.
+
+
+NO WARRANTIES.
+
+YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO MEET YOUR NEEDS. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, ARTIFEX DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. SOME STATES DO NOT ALLOW LIMITATIONS ON IMPLIED WARRANTIES, SO THE ABOVE LIMITATION MAY NOT APPLY TO YOU.
+
+
+NO LIABILITY FOR CONSEQUENTIAL DAMAGES.
+
+IN NO EVENT WILL ARTIFEX OR ITS SUPPLIERS OR LICENSORS BE LIABLE FOR ANY CONSEQUENTIAL, INCIDENTAL, OR INDIRECT DAMAGES (INCLUDING WITHOUT LIMITATION DAMAGES FOR LOSS OF BUSINESS PROFITS OR BUSINESS INTERRUPTION) ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE, EVEN IF SUCH PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN NO EVENT WILL ARTIFEX OR ITS SUPPLIERS OR LICENSORS BE LIABLE FOR MORE THAN THE AMOUNT ACTUALLY PAID BY YOU TO ARTIFEX FOR THE SOFTWARE. BECAUSE SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO YOU.
+
+
+U.S. Government-Restricted Rights.
+
+The Software and accompanying documentation are deemed to be "commercial computer Software" and "commercial computer Software documentation," respectively, pursuant to DFAR Section 227.7202 and FAR Section 12.212(b), as applicable. Any use, modification, reproduction release, performance, display or disclosure of the Software and accompanying documentation, and any derivative works thereof, by the U.S. Government will be governed solely by the terms of this Agreement.
+
+
+Export Restrictions.
+
+You may not download, export, or re-export the Software (a) into, or to a national or resident of, any country to which the United States has embargoed goods, or (b) to anyone on the United States Treasury Department's list of Specially Designated Nationals or the U.S. Commerce Department's Table of Deny Orders. By downloading or using the Software, you are representing and warranting that you are not located in, under the control of, or a national or resident of any such country or on any such list.
+
+
+General.
+
+This Agreement is governed by the laws of the United States and the State of California, without reference to conflict of laws principles. Any dispute between you and Artifex arising out of or relating to this Agreement will be subject to the exclusive venue and jurisdiction of the state and federal courts located in Marin County, California. This Agreement is the entire agreement between you and Artifex and supersedes any prior agreements relating thereto. If any provision of this Agreement is held invalid, the remainder of this Agreement will continue in full force and effect and the invalid provision will be reformed and enforced to reflect the original intent of the parties.
+
+
+Should you have any questions concerning this Agreement, or if you desire to contact Artifex for any reason, please contact: miles.jones@artifex.com
diff --git a/platform/windows/gsview/MainWindow.xaml b/platform/windows/gsview/MainWindow.xaml
index 10d126bb..37ae3e1e 100644
--- a/platform/windows/gsview/MainWindow.xaml
+++ b/platform/windows/gsview/MainWindow.xaml
@@ -192,7 +192,7 @@
<MenuItem Header="Page Conversions..." Click="ConvertClick" x:Name="xaml_conversions">
</MenuItem>
<Separator />
- <MenuItem Header="Print..." Command="Print" InputGestureText="Ctrl+P" x:Name="xaml_print">
+ <MenuItem Header="Print..." Command="Print" InputGestureText="Ctrl+P" x:Name="xaml_print_menu">
<MenuItem.Icon>
<Image Source="Resources/printer.ico" />
</MenuItem.Icon>
diff --git a/platform/windows/gsview/MainWindow.xaml.cs b/platform/windows/gsview/MainWindow.xaml.cs
index 6e6ee855..0ca822e9 100644
--- a/platform/windows/gsview/MainWindow.xaml.cs
+++ b/platform/windows/gsview/MainWindow.xaml.cs
@@ -21,6 +21,9 @@ using System.Printing;
using System.Windows.Markup;
using System.Runtime.InteropServices;
using Microsoft.Win32; /* For registry */
+using System.Reflection;
+using System.Diagnostics;
+
public enum AA_t
{
@@ -153,6 +156,7 @@ static class Constants
public const int SCROLL_EDGE_BUFFER = 90;
public const int VERT_SCROLL_STEP = 48;
public const int PAGE_MARGIN = 1;
+ public const int MAX_PRINT_PREVIEW_LENGTH = 250;
}
public static class DocumentTypes
@@ -205,6 +209,15 @@ namespace gsview
public int num_rects;
}
+ public struct printPreviewPage_t
+ {
+ public Byte[] bitmap;
+ public int width;
+ public int height;
+ public double width_inches;
+ public double height_inches;
+ }
+
public struct textSelectInfo_t
{
public int pagenum;
@@ -282,6 +295,7 @@ namespace gsview
List<DocPage> m_thumbnails;
List<List<RectList>> m_page_link_list = null;
IList<RectList> m_text_list;
+ DocPage m_PrintPreviewPage;
public List<LinesText> m_lineptrs = null;
public List<BlocksText> m_textptrs = null;
List<Boolean> m_textset = null;
@@ -304,16 +318,19 @@ namespace gsview
String m_origfile;
private gsprint m_ghostprint = null;
bool m_isXPS;
+ bool m_isImage;
gsOutput m_gsoutput;
Convert m_convertwin;
PageExtractSave m_extractwin;
Password m_password = null;
+ PrintControl m_printcontrol = null;
String m_currpassword = null;
BackgroundWorker m_thumbworker = null;
BackgroundWorker m_textsearch = null;
BackgroundWorker m_linksearch = null;
BackgroundWorker m_openfile = null;
BackgroundWorker m_initrender = null;
+ BackgroundWorker m_printerpreview = null;
BackgroundWorker m_copytext = null;
String m_document_type;
Info m_infowindow;
@@ -349,6 +366,7 @@ namespace gsview
{
m_docPages = new Pages();
m_thumbnails = new List<DocPage>();
+ m_PrintPreviewPage = new DocPage();
m_lineptrs = new List<LinesText>();
m_textptrs = new List<BlocksText>();
m_textset = new List<Boolean>();
@@ -426,6 +444,8 @@ namespace gsview
m_gsoutput.RealWindowClosing();
if (m_outputintents != null)
m_outputintents.RealWindowClosing();
+ if (m_printcontrol != null)
+ m_printcontrol.RealWindowClosing();
}
else
{
@@ -433,6 +453,8 @@ namespace gsview
m_gsoutput.Hide();
if (m_outputintents != null)
m_outputintents.Hide();
+ if (m_printcontrol != null)
+ m_printcontrol.Hide();
}
}
@@ -493,7 +515,7 @@ namespace gsview
xaml_extractselection.IsEnabled = false;
xaml_conversions.IsEnabled = false;
xaml_gsmessage.IsEnabled = false;
- xaml_print.IsEnabled = false;
+ xaml_print_menu.IsEnabled = false;
xaml_view.IsEnabled = false;
xaml_edit.IsEnabled = false;
}
@@ -558,6 +580,7 @@ namespace gsview
m_links_on = false;
m_doczoom = 1.0;
m_isXPS = false;
+ m_isImage = false;
//xaml_CancelThumb.IsEnabled = true;
m_currpage = 0;
m_ignorescrollchange = false;
@@ -579,12 +602,23 @@ namespace gsview
return result;
}
+ private String GetVersion()
+ {
+ Assembly assembly = Assembly.GetExecutingAssembly();
+ FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
+ String vers = fileVersionInfo.ProductVersion;
+ String[] parts = vers.Split('.');
+ String simple_vers = parts[0] + '.' + parts[1];
+ return simple_vers;
+ }
+
/* Initialize from registry */
private void InitFromRegistry()
{
RegistryKey key = Registry.CurrentUser.CreateSubKey("Software");
RegistryKey keyA = key.CreateSubKey("Artifex Software");
- RegistryKey keygs = keyA.CreateSubKey("GSview 6.0");
+ String vers = GetVersion();
+ RegistryKey keygs = keyA.CreateSubKey("gsview " + vers);
String filepath = null;
Int32 page;
AA_t aa = AA_t.HIGH;
@@ -622,7 +656,8 @@ namespace gsview
RegistryKey key = Registry.CurrentUser.CreateSubKey("Software");
RegistryKey keyA = key.CreateSubKey("Artifex Software");
- RegistryKey keygs = keyA.CreateSubKey("GSview 6.0");
+ String vers = GetVersion();
+ RegistryKey keygs = keyA.CreateSubKey("gsview " + vers);
if (m_origfile != null && (m_document_type == DocumentTypes.PS ||
m_document_type == DocumentTypes.EPS))
@@ -707,6 +742,13 @@ namespace gsview
if (m_password != null && m_password.IsActive)
m_password.Close();
+ if (m_printcontrol != null && m_printcontrol.IsActive)
+ m_printcontrol.Close();
+
+ /* Release the print control regardless of it being opened.
+ We don't want previous documents pages in the preview */
+ m_printcontrol = null;
+
if (m_infowindow != null && m_infowindow.IsActive)
m_infowindow.Close();
@@ -794,6 +836,9 @@ namespace gsview
/* Set if this is already xps for printing */
if (extension.ToUpper() == ".XPS" || extension.ToUpper() == ".OXPS")
m_isXPS = true;
+ if (extension.ToUpper() == ".CBZ" || extension.ToUpper() == ".PNG" ||
+ extension.ToUpper() == ".JPG")
+ m_isImage = true;
OpenFile2(FileName);
}
@@ -980,11 +1025,25 @@ namespace gsview
xaml_extractselection.IsEnabled = true;
xaml_conversions.IsEnabled = true;
xaml_gsmessage.IsEnabled = true;
- xaml_print.IsEnabled = true;
+ xaml_print_menu.IsEnabled = true;
xaml_view.IsEnabled = true;
xaml_edit.IsEnabled = true;
- if (m_isXPS)
+ if (m_isXPS || m_isImage)
DisabletoPDF();
+ if (m_isImage)
+ {
+ xaml_Print.IsEnabled = false;
+ xaml_print_menu.IsEnabled = false;
+ xaml_Print.Opacity = 0.5;
+ xaml_print_menu.Opacity = 0.5;
+ }
+ else
+ {
+ xaml_Print.IsEnabled = true;
+ xaml_print_menu.IsEnabled = true;
+ xaml_Print.Opacity = 1.0;
+ xaml_print_menu.Opacity = 1.0;
+ }
xaml_OpenProgressGrid.Visibility = System.Windows.Visibility.Collapsed;
xaml_VerticalScroll.Visibility = System.Windows.Visibility.Visible;
xaml_VerticalScroll.Value = 0;
@@ -1743,47 +1802,40 @@ namespace gsview
if (!m_file_open)
return;
- /* If file is already xps then gs need not do this */
- if (!m_isXPS)
+ if (m_printcontrol == null)
{
- xaml_DistillProgress.Value = 0;
- if (m_ghostscript.CreateXPS(m_currfile, Constants.DEFAULT_GS_RES, m_num_pages) == gsStatus.GS_BUSY)
- {
- ShowMessage(NotifyType_t.MESS_STATUS, "GS currently busy");
- return;
- }
- else
- {
- /* Right now this is not possible to cancel due to the way
- * that gs is run for xpswrite from pdf */
- xaml_CancelDistill.Visibility = System.Windows.Visibility.Collapsed;
- xaml_DistillName.Text = "Convert to XPS";
- xaml_DistillName.FontWeight = FontWeights.Bold;
- xaml_DistillGrid.Visibility = System.Windows.Visibility.Visible;
- }
+ m_printcontrol = new PrintControl(m_num_pages, m_currpage);
+ m_printcontrol.PrintDiagUpdatePreview += new PrintControl.PrintDiagCallBackPreview(PrintDiagUpdatePreview);
+ m_printcontrol.PrintDiagPrint += new PrintControl.PrintDiagCallBackPrint(PrintDiagPrint);
+ m_printcontrol.PrintDLLProblemMain += new PrintControl.PrintDLLProblem(gsDLL);
+ m_printcontrol.Activate();
+ m_printcontrol.Show(); /* Makes it modal */
+ PrintDiagEventArgs args = new PrintDiagEventArgs(0);
+ PrintDiagUpdatePreview(null, args);
}
else
- PrintXPS(m_currfile);
+ m_printcontrol.Show();
+ return;
}
private void PrintXPS(String file)
{
gsprint ghostprint = new gsprint();
- System.Windows.Controls.PrintDialog pDialog = ghostprint.GetPrintDialog();
- if (pDialog == null)
- return;
/* We have to create the XPS document on a different thread */
XpsDocument xpsDocument = new XpsDocument(file, FileAccess.Read);
FixedDocumentSequence fixedDocSeq = xpsDocument.GetFixedDocumentSequence();
- PrintQueue printQueue = pDialog.PrintQueue;
+ System.Windows.Size temp = new Size(200, 200);
+ fixedDocSeq.DocumentPaginator.PageSize = temp;
+
+ PrintQueue printq = m_printcontrol.m_selectedPrinter;
m_ghostprint = ghostprint;
xaml_PrintGrid.Visibility = System.Windows.Visibility.Visible;
xaml_PrintProgress.Value = 0;
- ghostprint.Print(printQueue, fixedDocSeq);
+ ghostprint.Print(printq, fixedDocSeq, m_printcontrol);
}
private void PrintProgress(object printHelper, gsPrintEventArgs Information)
@@ -1963,7 +2015,7 @@ namespace gsview
private void ExtractPages(object sender, RoutedEventArgs e)
{
- if (!m_init_done || m_isXPS)
+ if (!m_init_done || m_isXPS || m_isImage)
return;
if (m_extractwin == null || !m_extractwin.IsActive)
@@ -4902,5 +4954,105 @@ namespace gsview
m_showannot = false;
RenderRange(m_currpage, false, zoom_t.NO_ZOOM, 0);
}
+
+ /* Print preview rendering and control */
+ private void RenderPrintPreview(object sender, DoWorkEventArgs e)
+ {
+ BackgroundWorker worker = sender as BackgroundWorker;
+ List<object> genericlist = e.Argument as List<object>;
+ int k = (int)genericlist[0];
+ int desiredMax = Constants.MAX_PRINT_PREVIEW_LENGTH;
+
+ Point ras_size;
+ double scale_factor = 1.0;
+ Byte[] bitmap;
+ BlocksText charlist;
+ status_t code;
+ Annotate_t annot;
+
+ if (ComputePageSize(k, scale_factor, out ras_size) == status_t.S_ISOK)
+ {
+ /* Adjust the scale factor to ensure max length is set as desired */
+ int maxSize = Math.Max((int)ras_size.X, (int)ras_size.Y);
+ scale_factor = (double)desiredMax / (double)maxSize;
+ ComputePageSize(k, scale_factor, out ras_size);
+ printPreviewPage_t result;
+
+ try
+ {
+ bitmap = new byte[(int)ras_size.X * (int)ras_size.Y * 4];
+ code = (status_t)mu_doc.RenderPage(k, bitmap, (int)ras_size.X,
+ (int)ras_size.Y, scale_factor, false, true,
+ false, out charlist, m_showannot, out annot);
+ result.width = (int)ras_size.X;
+ result.height = (int)ras_size.Y;
+ result.bitmap = bitmap;
+ ComputePageSize(k, 1.0, out ras_size);
+ result.height_inches = ras_size.Y / 72.0;
+ result.width_inches = ras_size.X / 72.0;
+ e.Result = result;
+ }
+ catch (OutOfMemoryException em)
+ {
+ Console.WriteLine("Memory allocation failed print preview page " + k + em.Message + "\n");
+ }
+ }
+ }
+
+ private void RenderPrintPreviewCompleted(object sender, RunWorkerCompletedEventArgs e)
+ {
+ BitmapSource BitMapSrc;
+ printPreviewPage_t Result = (printPreviewPage_t)e.Result;
+
+ int stride = Result.width * 4;
+ BitMapSrc = BitmapSource.Create(Result.width, Result.height,
+ 72, 72, PixelFormats.Pbgra32, BitmapPalettes.Halftone256, Result.bitmap, stride);
+
+ m_printcontrol.SetImage(BitMapSrc, Result.height_inches, Result.width_inches);
+ }
+
+ private bool PrintDiagUpdatePreview(object PrintDiag, PrintDiagEventArgs args)
+ {
+ try
+ {
+ m_printerpreview = new BackgroundWorker();
+ m_printerpreview.WorkerReportsProgress = false;
+ m_printerpreview.WorkerSupportsCancellation = false;
+ m_printerpreview.DoWork += new DoWorkEventHandler(RenderPrintPreview);
+ m_printerpreview.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RenderPrintPreviewCompleted);
+ var arguments = new List<object>();
+ arguments.Add(args.m_page);
+ m_printerpreview.RunWorkerAsync(arguments);
+ }
+ catch (OutOfMemoryException e)
+ {
+ Console.WriteLine("Memory allocation failed during printpreview render\n");
+ ShowMessage(NotifyType_t.MESS_ERROR, "Out of memory: " + e.Message);
+ }
+ return true;
+ }
+
+ private void PrintDiagPrint(object PrintDiag)
+ {
+ /* If file is already xps then gs need not do this */
+ if (!m_isXPS)
+ {
+ xaml_DistillProgress.Value = 0;
+ if (m_ghostscript.CreateXPS(m_currfile, Constants.DEFAULT_GS_RES, m_num_pages, m_printcontrol) == gsStatus.GS_BUSY)
+ {
+ ShowMessage(NotifyType_t.MESS_STATUS, "GS currently busy");
+ return;
+ }
+ else
+ {
+ xaml_CancelDistill.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_DistillName.Text = "Convert to XPS";
+ xaml_DistillName.FontWeight = FontWeights.Bold;
+ xaml_DistillGrid.Visibility = System.Windows.Visibility.Visible;
+ }
+ }
+ else
+ PrintXPS(m_currfile);
+ }
}
} \ No newline at end of file
diff --git a/platform/windows/gsview/PrintControl.xaml b/platform/windows/gsview/PrintControl.xaml
new file mode 100644
index 00000000..e89fe8b4
--- /dev/null
+++ b/platform/windows/gsview/PrintControl.xaml
@@ -0,0 +1,247 @@
+<Window x:Class="gsview.PrintControl"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ Title="gsview print" Height="650" Width="653"
+ SizeToContent="WidthAndHeight" ResizeMode="NoResize">
+
+
+ <Window.Resources>
+ <Style x:Key="MySimpleScrollBar" TargetType="{x:Type ScrollBar}">
+ <Setter Property="Stylus.IsFlicksEnabled" Value="false"/>
+ <Setter Property="Width" Value="Auto"/>
+ <Setter Property="MinHeight" Value="30"/>
+ <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="{x:Type ScrollBar}">
+ <Border BorderThickness="1" BorderBrush="Gray">
+ <Grid Margin="2">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition/>
+ <ColumnDefinition />
+ </Grid.ColumnDefinitions>
+ <TextBox VerticalAlignment="Center" FontSize="12" MinWidth="25" Text="{Binding Value, RelativeSource={RelativeSource TemplatedParent}}"/>
+ <Grid Grid.Column="1" x:Name="GridRoot" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Background="{TemplateBinding Background}">
+ <Grid.RowDefinitions>
+ <RowDefinition MaxHeight="18"/>
+ <RowDefinition Height="0.00001*"/>
+ <RowDefinition MaxHeight="18"/>
+ </Grid.RowDefinitions>
+ <RepeatButton x:Name="DecreaseRepeat" Command="ScrollBar.LineDownCommand" Focusable="False">
+ <Grid>
+ <Path x:Name="DecreaseArrow" Stroke="{TemplateBinding Foreground}" StrokeThickness="1" Data="M 0 4 L 8 4 L 4 0 Z"/>
+ </Grid>
+ </RepeatButton>
+ <RepeatButton Grid.Row="2" x:Name="IncreaseRepeat" Command="ScrollBar.LineUpCommand" Focusable="False">
+ <Grid>
+ <Path x:Name="IncreaseArrow" Stroke="{TemplateBinding Foreground}" StrokeThickness="1" Data="M 0 0 L 4 4 L 8 0 Z"/>
+ </Grid>
+ </RepeatButton>
+ </Grid>
+ </Grid>
+ </Border>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+ </Window.Resources>
+
+ <DockPanel Background="WhiteSmoke" LastChildFill="False" Margin="0,0,0,0">
+ <GroupBox Header="Printer" Height="100" Width="500" DockPanel.Dock="Top" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="15,15,0,0">
+ <Grid Background="WhiteSmoke" Visibility="Visible" >
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="*" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+ <Grid Grid.Column="0" Grid.Row="0" Background="WhiteSmoke">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="30" />
+ <RowDefinition Height="30" />
+ </Grid.RowDefinitions>
+ <TextBox Grid.Column="0" Grid.Row="0" Text="Name:" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" VerticalAlignment="Center"/>
+ <TextBox Grid.Column="0" Grid.Row="1" Text="Status:" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" VerticalAlignment="Center"/>
+ </Grid>
+ <Grid Grid.Column="1" Grid.Row="0" Background="WhiteSmoke">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="30" />
+ <RowDefinition Height="30" />
+ </Grid.RowDefinitions>
+ <ComboBox Grid.Column="0" Grid.Row="0" x:Name="xaml_selPrinter" SelectionChanged="selPrinterChanged" Width="225" HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Center" >
+ <ComboBox.ItemTemplate>
+ <DataTemplate>
+ <StackPanel Orientation="Horizontal">
+ <TextBlock FontSize="11" FontFamily="Segoe UI" Text="{Binding Name}" />
+ </StackPanel>
+ </DataTemplate>
+ </ComboBox.ItemTemplate>
+ </ComboBox>
+ <TextBox Grid.Column="0" Grid.Row="1" x:Name="xaml_Status" FontSize="12" FontFamily="Segoe UI" Text="" Margin="105,92,497,301" Background="WhiteSmoke" BorderThickness="0"/>
+ </Grid>
+ <Grid Grid.Column="2" Grid.Row="0" Background="WhiteSmoke">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="30" />
+ </Grid.RowDefinitions>
+ <Button Grid.Column="0" Grid.Row="0" Content="Properties" FontSize="12" FontFamily="Segoe UI" HorizontalAlignment="Center" Margin="0, 0, 30, 0" VerticalAlignment="Center" Width="75" Click="ShowProperties"/>
+ </Grid>
+ </Grid>
+ </GroupBox>
+ <Grid DockPanel.Dock="Left" Background="WhiteSmoke" Visibility="Visible">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+ <GroupBox Grid.Column="0" Grid.Row="0" Header="Print Range" Height="150" Width="250" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="15,15,0,0">
+ <Grid Background="WhiteSmoke" Visibility="Visible" >
+ <Grid.RowDefinitions>
+ <RowDefinition Height="30" />
+ <RowDefinition Height="30" />
+ <RowDefinition Height="30" />
+ <RowDefinition Height="30" />
+ </Grid.RowDefinitions>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="90" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+ <RadioButton Grid.Column="0" Grid.Row="0" Name="xaml_rbAll" VerticalAlignment="Center" GroupName="PageRange" Checked="AllPages">All</RadioButton>
+ <RadioButton Grid.Column="0" Grid.Row="1" Name="xaml_rbCurrent" VerticalAlignment="Center" GroupName="PageRange" Checked="CurrentPage">Current page</RadioButton>
+ <RadioButton Grid.Column="0" Grid.Row="2" Name="xaml_rbPages" VerticalAlignment="Center" GroupName="PageRange" Checked="PageRange">Pages</RadioButton>
+
+ <TextBox x:Name="xaml_pagerange" Grid.Column="1" Grid.Row="2" Width="100" Height="20" VerticalScrollBarVisibility="Hidden" HorizontalAlignment="Left"
+ HorizontalScrollBarVisibility="Hidden" VerticalAlignment="Center" FontSize="12" FontFamily="Segoe UI" Margin="0,0,0,0" PreviewKeyDown="PageNumberEnter"/>
+
+ <TextBox x:Name="xaml_invalid" Grid.Column="1" Grid.Row="1" Width="Auto" Height="Auto" VerticalScrollBarVisibility="Hidden" HorizontalAlignment="Center" Background="WhiteSmoke" Visibility="Collapsed"
+ HorizontalScrollBarVisibility="Hidden" VerticalAlignment="Center" Foreground="Red" Text="Invalid Range! (3-5, 7) e.g." FontSize="12" FontFamily="Segoe UI" Margin="0,0,0,0" PreviewKeyDown="PageNumberEnter"/>
+
+
+ <TextBox Grid.Column="0" Grid.Row="3" VerticalAlignment="Center" Text="Subset:" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0"/>
+ <ComboBox Grid.Column="1" Grid.Row="3" x:Name="xaml_Subset" SelectionChanged="Subset_SelectionChanged" Width="140" Height="Auto" VerticalAlignment="Center" HorizontalAlignment="Left">
+ <ComboBoxItem Name="all" FontSize="11" FontFamily="Segoe UI">All pages in range</ComboBoxItem>
+ <ComboBoxItem Name="odd" FontSize="11" FontFamily="Segoe UI">Odd pages only</ComboBoxItem>
+ <ComboBoxItem Name="even" FontSize="11" FontFamily="Segoe UI">Even pages only</ComboBoxItem>
+ </ComboBox>
+ </Grid>
+ </GroupBox>
+
+ <GroupBox Grid.Column="0" Grid.Row="1" Header="Page Handling" Height="90" Width="250" Margin="15,15,0,0" DockPanel.Dock="Left" HorizontalAlignment="Center" VerticalAlignment="Center" >
+ <Grid Background="WhiteSmoke" Visibility="Visible" Height="103" VerticalAlignment="Top">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="90" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+ <TextBox Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" Text="Copies:" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" />
+ <ScrollBar Grid.Column="1" Grid.Row="0" x:Name="xaml_Copies" HorizontalAlignment="Left" Style="{DynamicResource MySimpleScrollBar}" VerticalAlignment="Top" Value="1" Maximum="999" SmallChange="1" Height="15" ValueChanged="xaml_Copies_ValueChanged"/>
+ <CheckBox x:Name="xaml_autofit" Grid.Column="0" Grid.Row="2" Content="Auto-Fit" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Checked="AutoFit_Checked" Unchecked="AutoFit_Unchecked" Grid.ColumnSpan="2"/>
+ </Grid>
+ </GroupBox>
+ </Grid>
+
+
+ <GroupBox Header="Preview" Height="450" Width="350" DockPanel.Dock="Right" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,15,15,0">
+ <Grid Background="WhiteSmoke" Visibility="Visible" >
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="*" />
+ <RowDefinition Height="40" />
+ <RowDefinition Height="40" />
+ <RowDefinition Height="40" />
+ <RowDefinition Height="40" />
+ </Grid.RowDefinitions>
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="*" />
+ </Grid.ColumnDefinitions>
+ <Canvas x:Name="xaml_TopArrowCanvas" Grid.Row="0" Grid.Column="1" VerticalAlignment="Bottom" HorizontalAlignment="Left" Margin="0,0,0,25" Height="0" Width="0" Visibility="Collapsed">
+ <Grid Background="WhiteSmoke" HorizontalAlignment="Center">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="*" />
+ <RowDefinition Height="*" />
+ </Grid.RowDefinitions>
+ <Line x:Name="xaml_topsize" Grid.Row="1" Y1="0" X1="0" X2="100" Y2="0" Stroke="Black" StrokeThickness="1"/>
+ <Line x:Name="xaml_topleftbottomarrow" Grid.Row="1" Y1="0" X1="0" X2="7" Y2="7" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_toplefttoparrow" Grid.Row="1" Y1="0" X1="0" X2="7" Y2="-7" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_toprighttoparrow" Grid.Row="1" Y1="-7" X1="93" X2="100" Y2="0" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_toprightbottomarrow" Grid.Row="1" Y1="7" X1="93" X2="100" Y2="0" Stroke="Black" StrokeThickness="1" />
+ <TextBlock x:Name="xaml_topsizevalue" Text="100" Grid.Row="0" HorizontalAlignment="Center"/>
+ </Grid>
+ </Canvas>
+
+ <Canvas x:Name="xaml_LeftArrowCanvas" Grid.Row="1" Grid.Column="0" Height="Auto" Width="40" VerticalAlignment="Top" HorizontalAlignment="Center" Visibility="Collapsed">
+ <Grid Background="WhiteSmoke" VerticalAlignment="Top" HorizontalAlignment="Center">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="*" />
+ <ColumnDefinition Width="*" />
+ </Grid.ColumnDefinitions>
+ <Line x:Name="xaml_leftsize" Grid.Column="1" Y1="0" X1="0" X2="0" Y2="100" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_lefttopleft" Grid.Column="1" Y1="0" X1="0" X2="-7" Y2="7" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_lefttopright" Grid.Column="1" Y1="0" X1="0" X2="7" Y2="7" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_leftbottomleft" Grid.Column="1" Y1="93" X1="-7" X2="0" Y2="100" Stroke="Black" StrokeThickness="1" />
+ <Line x:Name="xaml_leftbottomright" Grid.Column="1" Y1="93" X1="7" X2="0" Y2="100" Stroke="Black" StrokeThickness="1" />
+ <TextBlock x:Name="xaml_leftsizevalue" Text="100" Grid.Column="0" VerticalAlignment="Center" Margin="0,0,10,0"/>
+ </Grid>
+ </Canvas>
+
+ <!-- Draw the white paper full size white -->
+ <Rectangle x:Name="xaml_PreviewPaper" Visibility="Collapsed" Fill="White" Grid.Column="1" Grid.Row="1" Height="0" Width="0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
+
+ <!-- Draw the whole image -->
+ <Rectangle x:Name="xaml_PreviewImageRect" Visibility="Collapsed" Stroke="Red" Grid.Column="1" Grid.Row="1" Height="0" Width="0" VerticalAlignment="Top" HorizontalAlignment="Left">
+ <Rectangle.Fill>
+ <ImageBrush x:Name="xaml_ImagePreview">
+ </ImageBrush>
+ </Rectangle.Fill>
+ </Rectangle>
+
+ <!-- Draw the gray shade over it -->
+ <Rectangle x:Name="xaml_PreviewGrayRect" Visibility="Collapsed" Stroke="Green" Fill="#7f7f7f7f" Grid.Column="1" Grid.Row="1" Height="0" Width="0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
+
+ <!-- Redraw with clipping -->
+ <Rectangle x:Name="xaml_PreviewImageRectClip" Visibility="Collapsed" Stroke="Blue" Grid.Column="1" Grid.Row="1" Height="0" Width="0" VerticalAlignment="Top" HorizontalAlignment="Left">
+ <Rectangle.Fill>
+ <ImageBrush x:Name="xaml_ImagePreviewClip">
+ </ImageBrush>
+ </Rectangle.Fill>
+ <Rectangle.Clip>
+ <RectangleGeometry x:Name="xaml_ImagePreviewClipGeom" Rect="0 0 50 100"/>
+ </Rectangle.Clip>
+ </Rectangle>
+
+ <!-- Draw the final full black bounding rect for the paper-->
+ <Rectangle x:Name="xaml_PreviewPaperOuterRect" Stroke="Black" Fill="#00000000" Grid.Column="1" Grid.Row="1" Height="0" Width="0" VerticalAlignment="Top" HorizontalAlignment="Left"/>
+
+ <Grid Grid.Column="1" Grid.Row="2" Height="Auto">
+ <Grid.RowDefinitions>
+ <RowDefinition Height="Auto" />
+ <RowDefinition Height="Auto" />
+ </Grid.RowDefinitions>
+ <TextBox Visibility="Collapsed" x:Name="xaml_pagesize" Grid.Column="0" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" Height="16" Width="Auto" />
+ <TextBox Visibility="Collapsed" x:Name="xaml_docsize" Grid.Column="0" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" Height="16" Width="Auto" />
+ </Grid>
+
+ <TextBox x:Name="xaml_pagecount" Grid.Column="0" Grid.Row="3" VerticalAlignment="Center" HorizontalAlignment="Right" Text="1/1" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" Height="16" Margin="0,12" Width="Auto" />
+ <Slider x:Name="xaml_pageslider" IsSnapToTickEnabled="True" Grid.Column="1" Grid.Row="3" Maximum="100" VerticalAlignment="Center" Margin="15,11,36,11" Height="18" PreviewMouseUp="PageSelect_DragCompleted"/>
+ <TextBox Grid.Column="0" Grid.Row="4" VerticalAlignment="Center" HorizontalAlignment="Right" Text="Units:" FontSize="12" FontFamily="Segoe UI" Background="WhiteSmoke" BorderThickness="0" Height="16" Margin="0,12" Width="Auto" />
+ <Grid Grid.Column="1" Grid.Row="4">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+ <RadioButton Grid.Column="0" Grid.Row="0" Name="xaml_inches" VerticalAlignment="Center" GroupName="units" Checked="Inches" Margin="5,0,0,0">inches</RadioButton>
+ <RadioButton Grid.Column="1" Grid.Row="0" Name="xaml_cm" VerticalAlignment="Center" GroupName="units" Checked="Centimeters" Margin="5,0,0,0">cm</RadioButton>
+ </Grid>
+ <Grid Background="WhiteSmoke" Grid.Column="1" Grid.Row="5" Visibility="Visible" Margin="0, 0, 0, 0" HorizontalAlignment="Center">
+ <Grid.ColumnDefinitions>
+ <ColumnDefinition Width="Auto" />
+ <ColumnDefinition Width="Auto" />
+ </Grid.ColumnDefinitions>
+ <Button Grid.Column="0" Grid.Row="0" Content="OK" FontSize="12" FontFamily="Segoe UI" HorizontalAlignment="Center" VerticalAlignment="Center" Width="74" Click="ClickOK" Margin="20,0,0,0"/>
+ <Button Grid.Column="1" Grid.Row="0" Content="Cancel" FontSize="12" FontFamily="Segoe UI" HorizontalAlignment="Center" VerticalAlignment="Center" Width="74" Click="ClickCancel" Margin="40,0,0,0"/>
+ </Grid>
+ </Grid>
+ </GroupBox>
+ </DockPanel>
+</Window>
diff --git a/platform/windows/gsview/PrintControl.xaml.cs b/platform/windows/gsview/PrintControl.xaml.cs
new file mode 100644
index 00000000..c24fad17
--- /dev/null
+++ b/platform/windows/gsview/PrintControl.xaml.cs
@@ -0,0 +1,697 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+using System.Printing;
+using System.Drawing.Printing;
+using System.Runtime.InteropServices;
+using System.Windows.Interop;
+using System.Text.RegularExpressions;
+
+namespace gsview
+{
+ /// <summary>
+ /// Interaction logic for PrintControl.xaml
+ /// </summary>
+ ///
+
+ static class NATIVEWIN
+ {
+ public const int IDOK = 1;
+ public const int IDCANCEL = 2;
+ public const int DM_OUT_BUFFER = 2;
+ public const int DM_IN_BUFFER = 8;
+ public const int DM_IN_PROMPT = 4;
+ public const int DM_ORIENTATION = 1;
+ public const int DM_PAPERSIZE = 2;
+ public const int DM_PAPERLENGTH = 4;
+ public const int DM_WIDTH = 8;
+ public const int DMORIENT_PORTRAIT = 1;
+ public const int DMORIENT_LANDSCAPE = 2;
+ }
+
+ public enum PrintPages_t
+ {
+ RANGE = 2,
+ CURRENT = 1,
+ ALL = 0
+ }
+
+ public enum PageSubset_t
+ {
+ ALL = 0,
+ ODD = 1,
+ EVEN = 2
+ }
+
+ public enum PageScale_t
+ {
+ NONE = 0,
+ FIT = 1,
+ }
+
+ public enum Units_t
+ {
+ INCHES = 0,
+ CM = 1
+ }
+
+ public class PrintDiagEventArgs : EventArgs
+ {
+ public int m_page;
+
+ public PrintDiagEventArgs(int page)
+ {
+ m_page = page;
+ }
+ }
+
+ public class PrintRanges
+ {
+ public List<bool> ToPrint;
+ public bool HasEvens;
+ public bool HasOdds;
+ public int NumberPages;
+
+ public PrintRanges(int number_pages)
+ {
+ ToPrint = new List<bool>(number_pages);
+ NumberPages = 0;
+ HasEvens = false;
+ HasOdds = false;
+ }
+
+ public void InitRange(Match match)
+ {
+ NumberPages = 0;
+ HasEvens = false;
+ HasOdds = false;
+
+ for (int k = 0; k < ToPrint.Count; k++)
+ {
+ if (CheckValue(match, k))
+ {
+ NumberPages = NumberPages + 1;
+ ToPrint[k] = true;
+ if ((k+1) % 2 != 0)
+ HasOdds = true;
+ else
+ HasEvens = true;
+ }
+ else
+ ToPrint[k] = false;
+ }
+ }
+
+ private bool CheckValue(Match match, int k)
+ {
+ return false;
+ }
+ }
+
+ public partial class PrintControl : Window
+ {
+ private LocalPrintServer m_printServer;
+ public PrintQueue m_selectedPrinter = null;
+ String m_status;
+ PrintPages_t m_pages_setting;
+ PageSubset_t m_page_subset;
+ public double m_page_scale;
+ Units_t m_units;
+ int m_numpages;
+ int m_currpage;
+ PrintCapabilities m_printcap;
+ public PageSettings m_pagedetails;
+ TranslateTransform m_trans_pap;
+ TranslateTransform m_trans_doc;
+ double m_doc_height;
+ double m_doc_width;
+ public bool m_isrotated;
+ PrintRanges m_range_pages;
+ public int m_numcopies;
+ bool m_initdone;
+ bool m_is64bit;
+
+ /* Callback to main to get preview images */
+ internal delegate bool PrintDiagCallBackPreview(object gsObject, PrintDiagEventArgs info);
+ internal event PrintDiagCallBackPreview PrintDiagUpdatePreview;
+ /* Callback to perform printing */
+ internal delegate void PrintDiagCallBackPrint(object gsObject);
+ internal event PrintDiagCallBackPrint PrintDiagPrint;
+ /* Callback to report problems */
+ internal delegate void PrintDLLProblem(object gsObject, String mess);
+ internal event PrintDLLProblem PrintDLLProblemMain;
+
+ /* Helper for displaying the custom printer dialog settings */
+ #region DLLInterface
+ [DllImport("gsprint64.dll", EntryPoint = "ShowPropertiesDialog", CharSet = CharSet.Ansi,
+ CallingConvention = CallingConvention.StdCall)]
+ private static extern int ShowPropertiesDialog64(IntPtr hwnd, IntPtr printername, bool show_diag );
+ [DllImport("gsprint32.dll", EntryPoint = "ShowPropertiesDialog", CharSet = CharSet.Ansi,
+ CallingConvention = CallingConvention.StdCall)]
+ private static extern int ShowPropertiesDialog32(IntPtr hwnd, IntPtr printername, bool show_diag);
+
+ #endregion DLLInterface
+
+ #region DLLErrorCatch
+ /* In case the DLL is not found we need to wrap the methods up with
+ * a try/catch. Also select 32 or 64 bit DLL at this time. This
+ * C# code is compiled as ANYCPU type */
+ private int tc_ShowPropertiesDialog(IntPtr hwnd, IntPtr printername, bool show_prop)
+ {
+ int code;
+
+ try
+ {
+ if (m_is64bit)
+ code = ShowPropertiesDialog64(hwnd, printername, show_prop);
+ else
+ code = ShowPropertiesDialog32(hwnd, printername, show_prop);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String output = "DllNotFoundException: gsprint DLL not found";
+ PrintDLLProblemMain(this, output);
+ return -1;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String output = "BadImageFormatException: Incorrect gsprint DLL";
+ PrintDLLProblemMain(this, output);
+ return -1;
+ }
+ return code;
+ }
+ #endregion DLLErrorCatch
+
+ /* Populate the printers */
+ private void InitPrinterList()
+ {
+ PrintQueueCollection printQueuesOnLocalServer =
+ m_printServer.GetPrintQueues(new[] {EnumeratedPrintQueueTypes.Local, EnumeratedPrintQueueTypes.Connections});
+
+ this.xaml_selPrinter.ItemsSource = printQueuesOnLocalServer;
+ if (m_selectedPrinter != null)
+ {
+ foreach (PrintQueue pq in printQueuesOnLocalServer)
+ {
+ if (pq.FullName == m_selectedPrinter.FullName)
+ {
+ this.xaml_selPrinter.SelectedItem = pq;
+ break;
+ }
+ }
+ }
+ }
+
+ /* Initialize */
+ public PrintControl(int num_pages, int curr_page)
+ {
+ PrinterSettings ps = new PrinterSettings();
+
+ this.Closing += new System.ComponentModel.CancelEventHandler(FakeWindowClosing);
+ InitializeComponent();
+ m_printServer = new LocalPrintServer();
+ m_selectedPrinter = LocalPrintServer.GetDefaultPrintQueue();
+ InitPrinterList();
+ ps.PrinterName = m_selectedPrinter.FullName;
+ m_pagedetails = ps.DefaultPageSettings;
+
+
+ xaml_rbAll.IsChecked = true;
+ m_pages_setting = PrintPages_t.ALL;
+ m_page_subset = PageSubset_t.ALL;
+ xaml_Subset.SelectedIndex = (int) m_page_subset;
+
+ xaml_autofit.IsChecked = false;
+
+ xaml_inches.IsChecked = true;
+ m_units = Units_t.INCHES;
+
+ m_currpage = curr_page;
+ m_numpages = num_pages;
+ xaml_pagecount.Text = "1/" + num_pages;
+ xaml_pageslider.Maximum = num_pages - 1;
+
+ m_printcap = m_selectedPrinter.GetPrintCapabilities();
+
+ m_trans_pap = new TranslateTransform(0, 0);
+ m_trans_doc = new TranslateTransform(0, 0);
+ m_isrotated = false;
+
+ /* Data range case */
+ m_range_pages = new PrintRanges(m_numpages);
+ m_page_scale = 1.0;
+
+ m_numcopies = 1;
+ m_initdone = false;
+ m_is64bit = Environment.Is64BitOperatingSystem &&
+ Environment.Is64BitProcess;
+ }
+
+ void FakeWindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
+ {
+ e.Cancel = true;
+ this.Hide();
+ }
+
+ public void RealWindowClosing()
+ {
+ this.Closing -= new System.ComponentModel.CancelEventHandler(FakeWindowClosing);
+ this.Close();
+ }
+
+ /* Displays and updates the custom printer dialog settings. One can
+ * either do this with pinvoke of the various commands in winspool or
+ * go ahead and handle it in our own dll, which is what I decided to
+ * do. */
+ private void ShowProperties(object sender, RoutedEventArgs e)
+ {
+ PrinterChanged(true);
+ }
+
+ private void PrinterChanged(bool show_prop)
+ {
+ if (m_selectedPrinter != null)
+ {
+ var ptrNameGC = new GCHandle();
+ var temp = System.Text.Encoding.UTF8.GetBytes(m_selectedPrinter.FullName.ToCharArray());
+ ptrNameGC = GCHandle.Alloc(temp, GCHandleType.Pinned);
+ int res = tc_ShowPropertiesDialog(new WindowInteropHelper(this).Handle, ptrNameGC.AddrOfPinnedObject(), show_prop);
+ ptrNameGC.Free();
+ if (res >= 0)
+ {
+ PrinterSettings ps = new PrinterSettings();
+ ps.PrinterName = m_selectedPrinter.FullName;
+ m_pagedetails = ps.DefaultPageSettings;
+ UpdateView();
+ }
+ }
+ }
+
+ /* Printer selection changed */
+ private void selPrinterChanged(object sender, SelectionChangedEventArgs e)
+ {
+ m_selectedPrinter = this.xaml_selPrinter.SelectedItem as PrintQueue;
+ GetPrinterStatus();
+ if (m_initdone)
+ PrinterChanged(false);
+ }
+
+ /* Printer Status */
+ private void GetPrinterStatus()
+ {
+ if (m_selectedPrinter.IsBusy)
+ m_status = "Busy";
+ else if (m_selectedPrinter.IsNotAvailable)
+ m_status = "Not Available";
+ else if (m_selectedPrinter.IsOffline)
+ m_status = "Offline";
+ else if (m_selectedPrinter.IsOutOfMemory)
+ m_status = "Out Of Memory";
+ else if (m_selectedPrinter.IsOutOfPaper)
+ m_status = "Out Of Paper";
+ else if (m_selectedPrinter.IsOutputBinFull)
+ m_status = "Output Bin Full";
+ else if (m_selectedPrinter.IsPaperJammed)
+ m_status = "Paper Jam";
+ else if (m_selectedPrinter.IsPaused)
+ m_status = "Paused";
+ else if (m_selectedPrinter.IsPendingDeletion)
+ m_status = "Paused";
+ else if (m_selectedPrinter.IsPrinting)
+ m_status = "Printing";
+ else if (m_selectedPrinter.IsProcessing)
+ m_status = "Processing";
+ else if (m_selectedPrinter.IsWaiting)
+ m_status = "Waiting";
+ else if (m_selectedPrinter.IsWarmingUp)
+ m_status = "Warming Up";
+ else
+ m_status = "Ready";
+ xaml_Status.Text = m_status;
+ }
+
+ private void Subset_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ /* On current page, only All is allowed */
+ m_page_subset = (PageSubset_t) xaml_Subset.SelectedIndex;
+ if (m_pages_setting == PrintPages_t.CURRENT &&
+ m_page_subset != PageSubset_t.ALL)
+ xaml_Subset.SelectedIndex = (int) PageSubset_t.ALL;
+
+ /* Only one page, can't use even */
+ if (m_pages_setting == PrintPages_t.ALL &&
+ m_page_subset == PageSubset_t.EVEN &&
+ m_numpages == 1)
+ xaml_Subset.SelectedIndex = (int)PageSubset_t.ALL;
+ }
+
+ private void AllPages(object sender, RoutedEventArgs e)
+ {
+ xaml_invalid.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_pageslider.Maximum = m_numpages - 1;
+ xaml_pageslider.Value = m_currpage;
+ xaml_pagecount.Text = (m_currpage + 1) + "/" + m_numpages;
+ m_pages_setting = PrintPages_t.ALL;
+ }
+
+ private void CurrentPage(object sender, RoutedEventArgs e)
+ {
+ xaml_invalid.Visibility = System.Windows.Visibility.Collapsed;
+ m_pages_setting = PrintPages_t.CURRENT;
+ xaml_pagecount.Text = "1/1";
+ xaml_pageslider.Maximum = 0;
+ xaml_pageslider.Value = 0;
+ PrintDiagEventArgs info = new PrintDiagEventArgs(m_currpage);
+ PrintDiagUpdatePreview(this, info);
+ }
+
+ private void PageRange(object sender, RoutedEventArgs e)
+ {
+ xaml_invalid.Visibility = System.Windows.Visibility.Collapsed;
+ m_pages_setting = PrintPages_t.RANGE;
+ }
+
+ private void UpdateScaleInfo()
+ {
+ /*
+ if (m_page_scale_type == PageScale_t.NONE)
+ {
+ double temp_width_doc = Math.Truncate(m_doc_width * 100.0) / 100.0;
+ double temp_height_doc = Math.Truncate(m_doc_height * 100.0) / 100.0;
+ double temp_width_page = m_pagedetails.Bounds.Width / 100;
+ double temp_height_page = m_pagedetails.Bounds.Height / 100;
+
+ if (m_units == Units_t.CM)
+ {
+ temp_height_doc = (Math.Truncate(temp_height_doc * 2.54 * 100) / 100.0);
+ temp_width_doc = (Math.Truncate(temp_width_doc * 2.54 * 100) / 100.0);
+ temp_height_page = (Math.Truncate(temp_height_page * 2.54 * 100) / 100.0);
+ temp_width_page = (Math.Truncate(temp_width_page * 2.54 * 100) / 100.0);
+ }
+ xaml_pagesize.Text = "Paper:\t\t" + temp_width_page + " x " + temp_height_page;
+ xaml_docsize.Text = "Document:\t" + temp_width_doc + " x " + temp_height_doc; ;
+ xaml_pagesize.Visibility = System.Windows.Visibility.Visible;
+ xaml_docsize.Visibility = System.Windows.Visibility.Visible;
+ }
+ else
+ {
+ xaml_pagesize.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_docsize.Visibility = System.Windows.Visibility.Collapsed;
+ }
+ * */
+ }
+
+ private void Inches(object sender, RoutedEventArgs e)
+ {
+ m_units = Units_t.INCHES;
+ UpdateUnits();
+ UpdateScaleInfo();
+ }
+
+ private void Centimeters(object sender, RoutedEventArgs e)
+ {
+ m_units = Units_t.CM;
+ UpdateUnits();
+ UpdateScaleInfo();
+ }
+
+ public void SetImage(BitmapSource image_in, double doc_height_in,
+ double doc_width_in)
+ {
+ xaml_PreviewImageRect.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_PreviewGrayRect.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_PreviewPaper.Visibility = System.Windows.Visibility.Collapsed;
+
+ m_doc_width = doc_width_in;
+ m_doc_height = doc_height_in;
+ xaml_ImagePreview.ImageSource = image_in;
+ xaml_ImagePreviewClip.ImageSource = image_in;
+
+ UpdateView();
+ }
+
+ private void UpdateView()
+ {
+ /* For our display we compute the page size as well as the paper size */
+ /* The max length sets our scaling of each component */
+ /* We then determine if any additional scaling is needed or translation
+ * based upon the settings of m_page_scale_type as well as the autofit
+ * and scale setting */
+ double page_height = m_pagedetails.Bounds.Height;
+ double page_width = m_pagedetails.Bounds.Width;
+ double doc_height = m_doc_height * 100;
+ double doc_width = m_doc_width * 100;
+ bool autofit = (xaml_autofit.IsChecked == true);
+ bool center;
+ /* bool center = (xaml_center.IsChecked == true); */
+ double scale_height;
+ double scale_width;
+ double max_scale;
+ double doc_offset_x = 0;
+ double doc_offset_y = 0;
+ double pap_offset_x = 0;
+ double pap_offset_y = 0;
+ Rect clip_rect;
+
+ center = autofit; /* I may separate these later */
+ m_page_scale = 1.0;
+ m_isrotated = false;
+ if (autofit &&
+ ((m_pagedetails.Bounds.Height > m_pagedetails.Bounds.Width && doc_height < doc_width) ||
+ (m_pagedetails.Bounds.Height < m_pagedetails.Bounds.Width && doc_height > doc_width)))
+ {
+ page_width = m_pagedetails.Bounds.Height;
+ page_height = m_pagedetails.Bounds.Width;
+ m_isrotated = true;
+ }
+
+ /* Scale page data if needed. */
+
+ if (xaml_autofit.IsChecked == true)
+ {
+ scale_height = page_height / doc_height;
+ scale_width = page_width / doc_width;
+ max_scale = Math.Min(scale_height, scale_width);
+
+ /* Adjust the doc size to fit in the page */
+ doc_height = doc_height * max_scale;
+ doc_width = doc_width * max_scale;
+ m_page_scale = max_scale;
+ }
+
+ /* Now figure out our preview scaling to ensure everything fits
+ * in the display window */
+ double max_height = Math.Max(doc_height, page_height);
+ double max_width = Math.Max(doc_width, page_width);
+ double max_length = Math.Max(max_height, max_width);
+ double previewscale = (double)Constants.MAX_PRINT_PREVIEW_LENGTH / max_length;
+
+ /* Adjust size of everything */
+ doc_height = doc_height * previewscale;
+ doc_width = doc_width * previewscale;
+ page_height = page_height * previewscale;
+ page_width = page_width * previewscale;
+
+ xaml_PreviewImageRect.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_PreviewGrayRect.Visibility = System.Windows.Visibility.Collapsed;
+ xaml_PreviewPaper.Visibility = System.Windows.Visibility.Collapsed;
+
+ /* Compute any offsets if needed due to centering */
+ if (center)
+ {
+ if (doc_height > page_height)
+ pap_offset_y = (doc_height - page_height) / 2.0;
+ else
+ doc_offset_y = (page_height - doc_height) / 2.0;
+ if (doc_width > page_width)
+ pap_offset_x = (doc_width - page_width) / 2.0;
+ else
+ doc_offset_x = (page_width - doc_width) / 2.0;
+ }
+
+ double offset_y = 0;
+
+ if (!autofit)
+ offset_y = doc_height - page_height;
+
+ /* See if the paper needs to translate */
+ if (page_height < doc_height)
+ m_trans_pap = new TranslateTransform(pap_offset_x, pap_offset_y + offset_y);
+ else
+ m_trans_pap = new TranslateTransform(pap_offset_x, pap_offset_y);
+
+ /* See if the doc needs to translate */
+ if (page_height > doc_height)
+ m_trans_doc = new TranslateTransform(doc_offset_x, doc_offset_y - offset_y);
+ else
+ m_trans_doc = new TranslateTransform(doc_offset_x, doc_offset_y);
+
+ /* Page black outer rect */
+ xaml_PreviewPaperOuterRect.RenderTransform = m_trans_pap;
+ xaml_PreviewPaperOuterRect.Height = page_height;
+ xaml_PreviewPaperOuterRect.Width = page_width;
+ xaml_PreviewPaperOuterRect.Visibility = System.Windows.Visibility.Visible;
+
+ /* Paper white fill */
+ xaml_PreviewPaper.RenderTransform = m_trans_pap;
+ xaml_PreviewPaper.Height = page_height;
+ xaml_PreviewPaper.Width = page_width;
+ xaml_PreviewPaper.Visibility = System.Windows.Visibility.Visible;
+
+ /* The image */
+ xaml_PreviewImageRect.RenderTransform = m_trans_doc;
+ xaml_PreviewImageRect.Height = doc_height;
+ xaml_PreviewImageRect.Width = doc_width;
+ xaml_PreviewImageRect.Visibility = System.Windows.Visibility.Visible;
+
+ /* The gray fill (not visible) */
+ xaml_PreviewGrayRect.RenderTransform = m_trans_doc;
+ xaml_PreviewGrayRect.Height = doc_height;
+ xaml_PreviewGrayRect.Width = doc_width;
+ xaml_PreviewGrayRect.Visibility = System.Windows.Visibility.Visible;
+
+ /* The visible portion */
+ xaml_PreviewImageRectClip.RenderTransform = m_trans_doc;
+ xaml_PreviewImageRectClip.Height = doc_height;
+ xaml_PreviewImageRectClip.Width = doc_width;
+ clip_rect = new Rect(pap_offset_x, pap_offset_y + offset_y, page_width, page_height);
+ xaml_ImagePreviewClipGeom.Rect = clip_rect;
+ xaml_PreviewImageRectClip.Visibility = System.Windows.Visibility.Visible;
+ UpdateSizes();
+ UpdateScaleInfo();
+ m_initdone = true;
+ }
+
+ private void PageSelect_DragCompleted(object sender, MouseButtonEventArgs e)
+ {
+ if (m_pages_setting == PrintPages_t.CURRENT)
+ return;
+
+ /* Get the current page view */
+ int page = (int) xaml_pageslider.Value;
+ PrintDiagEventArgs info = new PrintDiagEventArgs(page);
+ PrintDiagUpdatePreview(this, info);
+ page = page + 1;
+ xaml_pagecount.Text = page + "/" + m_numpages;
+ }
+
+ private void AdjustPageSize()
+ {
+ m_printcap = m_selectedPrinter.GetPrintCapabilities();
+ }
+
+ private void UpdateSizes()
+ {
+ xaml_TopArrowCanvas.RenderTransform = new TranslateTransform(m_trans_pap.X, 0);
+ xaml_topsize.X2 = xaml_PreviewPaper.Width;
+ xaml_toprighttoparrow.X1 = xaml_PreviewPaper.Width - 7;
+ xaml_toprighttoparrow.X2 = xaml_PreviewPaper.Width;
+ xaml_toprightbottomarrow.X1 = xaml_PreviewPaper.Width - 7;
+ xaml_toprightbottomarrow.X2 = xaml_PreviewPaper.Width;
+
+ xaml_LeftArrowCanvas.RenderTransform = new TranslateTransform(0, m_trans_pap.Y);
+ xaml_leftsize.Y2 = xaml_PreviewPaper.Height;
+ xaml_leftbottomleft.Y1 = xaml_PreviewPaper.Height - 7;
+ xaml_leftbottomleft.Y2 = xaml_PreviewPaper.Height;
+ xaml_leftbottomright.Y1 = xaml_PreviewPaper.Height - 7;
+ xaml_leftbottomright.Y2 = xaml_PreviewPaper.Height;
+
+ xaml_LeftArrowCanvas.Visibility = System.Windows.Visibility.Visible;
+ xaml_TopArrowCanvas.Visibility = System.Windows.Visibility.Visible;
+
+ UpdateUnits();
+ }
+
+ private void UpdateUnits()
+ {
+
+ double valHeight = m_pagedetails.Bounds.Height;
+ double valWidth = m_pagedetails.Bounds.Width;
+
+ if (m_units == Units_t.INCHES)
+ {
+ if (m_isrotated)
+ {
+ xaml_topsizevalue.Text = (Math.Truncate(valHeight) / 100.0).ToString();
+ xaml_leftsizevalue.Text = (Math.Truncate(valWidth) / 100.0).ToString();
+ }
+ else
+ {
+ xaml_leftsizevalue.Text = (Math.Truncate(valHeight) / 100.0).ToString();
+ xaml_topsizevalue.Text = (Math.Truncate(valWidth) / 100.0).ToString();
+ }
+ }
+ else
+ {
+ if (m_isrotated)
+ {
+ xaml_topsizevalue.Text = (Math.Truncate(valHeight * 2.54) / 100.0).ToString();
+ xaml_leftsizevalue.Text = (Math.Truncate(valWidth * 2.54) / 100.0).ToString();
+ }
+ else
+ {
+ xaml_leftsizevalue.Text = (Math.Truncate(valHeight * 2.54) / 100.0).ToString();
+ xaml_topsizevalue.Text = (Math.Truncate(valWidth * 2.54) / 100.0).ToString();
+ }
+ }
+ }
+
+ private void PageNumberEnter(object sender, KeyEventArgs e)
+ {
+ if (e.Key == Key.Return)
+ {
+ e.Handled = true;
+ string desired_page = xaml_pagerange.Text;
+
+ Regex rangePattern = new Regex(@"^\s*\d+\s*(\-\s*\d+\s*)?(\,\s*\d+\s*(\-\s*\d+\s*)?)*$");
+
+ Match m = rangePattern.Match(desired_page);
+ if (!m.Success)
+ xaml_invalid.Visibility = System.Windows.Visibility.Visible;
+ else
+ {
+ xaml_invalid.Visibility = System.Windows.Visibility.Collapsed;
+ }
+ }
+ }
+
+ private void ClickOK(object sender, RoutedEventArgs e)
+ {
+ PrintDiagPrint(this);
+ this.Hide();
+ }
+
+ private void ClickCancel(object sender, RoutedEventArgs e)
+ {
+ this.Hide();
+ }
+
+ private void xaml_Copies_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
+ {
+ m_numcopies = (int) e.NewValue;
+ }
+
+ private void AutoFit_Checked(object sender, RoutedEventArgs e)
+ {
+ UpdateView();
+ }
+
+ private void AutoFit_Unchecked(object sender, RoutedEventArgs e)
+ {
+ UpdateView();
+ }
+ }
+}
diff --git a/platform/windows/gsview/ghostsharp.cs b/platform/windows/gsview/ghostsharp.cs
index 168ce476..099239e9 100644
--- a/platform/windows/gsview/ghostsharp.cs
+++ b/platform/windows/gsview/ghostsharp.cs
@@ -1047,10 +1047,10 @@ namespace gsview
return RunGhostscript(gsparams);
}
- public gsStatus CreateXPS(String fileName, int resolution, int num_pages)
+ public gsStatus CreateXPS(String fileName, int resolution, int num_pages,
+ PrintControl printsettings)
{
gsParams_t gsparams = new gsParams_t();
-
gsparams.init_file = null;
gsparams.init_string = null;
gsparams.device = gsDevice_t.xpswrite;
@@ -1065,6 +1065,19 @@ namespace gsview
gsparams.firstpage = -1;
gsparams.lastpage = -1;
gsparams.currpage = -1;
+
+ if (printsettings != null)
+ {
+ double paperheight = printsettings.m_pagedetails.PaperSize.Height;
+ double paperwidth = printsettings.m_pagedetails.PaperSize.Width;
+ double width = paperwidth * 72.0 / 100.0;
+ double height = paperheight * 72.0 / 100.0;
+ String temp = " -dDEVICEWIDTHPOINTS=" + width + " -dDEVICEHEIGHTPOINTS=" + height + " -dFIXEDMEDIA";
+ /* Scale and translate and rotate if needed */
+ if (printsettings.xaml_autofit.IsChecked == true)
+ temp = temp + " -dFitPage";
+ gsparams.options = gsparams.options + temp;
+ }
return RunGhostscript(gsparams);
}
diff --git a/platform/windows/gsview/gsprint.cs b/platform/windows/gsview/gsprint.cs
index 27976bc0..7d7c68fd 100644
--- a/platform/windows/gsview/gsprint.cs
+++ b/platform/windows/gsview/gsprint.cs
@@ -10,6 +10,7 @@ using System.Windows.Media;
using System.Windows.Xps;
using System.Windows.Xps.Packaging;
using System.Windows.Xps.Serialization;
+using System.Drawing.Printing;
namespace gsview
{
@@ -74,8 +75,8 @@ namespace gsview
PrintDialog dlg = new PrintDialog();
/* Current page and page ranges is going to require a little work */
dlg.PageRangeSelection = PageRangeSelection.AllPages;
- //dlg.UserPageRangeEnabled = true;
- //dlg.CurrentPageEnabled = true;
+ dlg.UserPageRangeEnabled = true;
+ dlg.CurrentPageEnabled = true;
dlg.SelectedPagesEnabled = false;
m_busy = false;
if (dlg.ShowDialog() == true)
@@ -84,30 +85,71 @@ namespace gsview
}
/* Main print entry point */
- public void Print(PrintQueue queu, FixedDocumentSequence fixdoc)
+ public void Print(PrintQueue queu, FixedDocumentSequence fixdoc, PrintControl printcontrol)
{
- XpsDocumentWriter docwrite = GetDocWriter(queu);
-
+ XpsDocumentWriter docwrite;
+ PrintTicket Ticket = SetUpTicket(queu, printcontrol, fixdoc);
+ docwrite = GetDocWriter(queu);
m_busy = true;
+#if DISABLED_FOR_NOW
docwrite.WritingPrintTicketRequired +=
- new WritingPrintTicketRequiredEventHandler(PrintTicket);
- PrintPages(docwrite, fixdoc);
+ new WritingPrintTicketRequiredEventHandler(PrintTicket);
+#endif
+ PrintPages(docwrite, fixdoc, Ticket);
+ }
+
+ /* Set up the print ticket */
+ private PrintTicket SetUpTicket(PrintQueue queue, PrintControl printcontrol, FixedDocumentSequence fixdoc)
+ {
+ PrintTicket Ticket = new PrintTicket();
+
+ PageMediaSizeName name = PaperKindToPageMediaSize(printcontrol.m_pagedetails.PaperSize.Kind);
+ PageMediaSize mediasize = new PageMediaSize(name, printcontrol.m_pagedetails.PaperSize.Width, printcontrol.m_pagedetails.PaperSize.Height);
+
+ /* Media size */
+ Ticket.PageMediaSize = mediasize;
+ /* Scale to fit */
+ Ticket.PageScalingFactor = (int)Math.Round(printcontrol.m_page_scale * 100.0);
+
+ System.Windows.Size page_size = new System.Windows.Size(mediasize.Width.Value, mediasize.Height.Value);
+ DocumentPaginator paginator = fixdoc.DocumentPaginator;
+ paginator.PageSize = page_size;
+
+ /* Copy Count */
+ Ticket.CopyCount = printcontrol.m_numcopies;
+
+ /* Orientation */
+ if (printcontrol.m_isrotated)
+ if (printcontrol.m_pagedetails.Landscape)
+ Ticket.PageOrientation = PageOrientation.Portrait;
+ else
+ Ticket.PageOrientation = PageOrientation.Landscape;
+ else
+ if (printcontrol.m_pagedetails.Landscape)
+ Ticket.PageOrientation = PageOrientation.Landscape;
+ else
+ Ticket.PageOrientation = PageOrientation.Portrait;
+
+ System.Printing.ValidationResult result = queue.MergeAndValidatePrintTicket(queue.UserPrintTicket, Ticket);
+ queue.UserPrintTicket = result.ValidatedPrintTicket;
+ queue.Commit();
+ return result.ValidatedPrintTicket;
}
/* Send it */
- private void PrintPages(XpsDocumentWriter xpsdw, FixedDocumentSequence fixdoc)
+ private void PrintPages(XpsDocumentWriter xpsdw, FixedDocumentSequence fixdoc, PrintTicket Ticket)
{
m_docWriter = xpsdw;
xpsdw.WritingCompleted +=
new WritingCompletedEventHandler(AsyncCompleted);
xpsdw.WritingProgressChanged +=
new WritingProgressChangedEventHandler(AsyncProgress);
- xpsdw.WriteAsync(fixdoc);
+ xpsdw.WriteAsync(fixdoc, Ticket);
}
public void CancelAsync()
{
- /* ick. This does not work in windows 8. causes crash */
+ /* ick. This does not work in windows 8. causes crash. */
/* https://connect.microsoft.com/VisualStudio/feedback/details/778145/xpsdocumentwriter-cancelasync-cause-crash-in-win8 */
m_docWriter.CancelAsync();
}
@@ -142,26 +184,269 @@ namespace gsview
PrintUpdate(this, info);
}
}
-
+#if DISABLED_FOR_NOW
/* Print ticket handling. You can customize for PrintTicketLevel at
- FixedDocumentSequencePrintTicket, FixedDocumentPrintTicket,
- or FixedPagePrintTicket. We may want to play around with this some */
+ FixedDocumentSequencePrintTicket, FixedDocumentPrintTicket,
+ or FixedPagePrintTicket. We may want to play around with this some */
private void PrintTicket(Object sender, WritingPrintTicketRequiredEventArgs e)
{
if (e.CurrentPrintTicketLevel ==
PrintTicketLevel.FixedDocumentSequencePrintTicket)
{
PrintTicket pts = new PrintTicket();
- pts.PageOrientation = PageOrientation.Portrait;
e.CurrentPrintTicket = pts;
}
}
-
+#endif
/* Create the document write */
private XpsDocumentWriter GetDocWriter(PrintQueue pq)
{
XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
return xpsdw;
}
+
+ /* Two paths for designating printing = a pain in the ass.*/
+ static PageMediaSizeName PaperKindToPageMediaSize(PaperKind paperKind)
+ {
+ switch (paperKind)
+ {
+ case PaperKind.Custom:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Letter:
+ return PageMediaSizeName.NorthAmericaLetter;
+ case PaperKind.Legal:
+ return PageMediaSizeName.NorthAmericaLegal;
+ case PaperKind.A4:
+ return PageMediaSizeName.ISOA4;
+ case PaperKind.CSheet:
+ return PageMediaSizeName.NorthAmericaCSheet;
+ case PaperKind.DSheet:
+ return PageMediaSizeName.NorthAmericaDSheet;
+ case PaperKind.ESheet:
+ return PageMediaSizeName.NorthAmericaESheet;
+ case PaperKind.LetterSmall:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Tabloid:
+ return PageMediaSizeName.NorthAmericaTabloid;
+ case PaperKind.Ledger:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Statement:
+ return PageMediaSizeName.NorthAmericaStatement;
+ case PaperKind.Executive:
+ return PageMediaSizeName.NorthAmericaExecutive;
+ case PaperKind.A3:
+ return PageMediaSizeName.ISOA3;
+ case PaperKind.A4Small:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.A5:
+ return PageMediaSizeName.ISOA5;
+ case PaperKind.B4:
+ return PageMediaSizeName.ISOB4;
+ case PaperKind.B5:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Folio:
+ return PageMediaSizeName.OtherMetricFolio;
+ case PaperKind.Quarto:
+ return PageMediaSizeName.NorthAmericaQuarto;
+ case PaperKind.Standard10x14:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Standard11x17:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Note:
+ return PageMediaSizeName.NorthAmericaNote;
+ case PaperKind.Number9Envelope:
+ return PageMediaSizeName.NorthAmericaNumber9Envelope;
+ case PaperKind.Number10Envelope:
+ return PageMediaSizeName.NorthAmericaNumber10Envelope;
+ case PaperKind.Number11Envelope:
+ return PageMediaSizeName.NorthAmericaNumber11Envelope;
+ case PaperKind.Number12Envelope:
+ return PageMediaSizeName.NorthAmericaNumber12Envelope;
+ case PaperKind.Number14Envelope:
+ return PageMediaSizeName.NorthAmericaNumber14Envelope;
+ case PaperKind.DLEnvelope:
+ return PageMediaSizeName.ISODLEnvelope;
+ case PaperKind.C5Envelope:
+ return PageMediaSizeName.ISOC5Envelope;
+ case PaperKind.C3Envelope:
+ return PageMediaSizeName.ISOC3Envelope;
+ case PaperKind.C4Envelope:
+ return PageMediaSizeName.ISOC4Envelope;
+ case PaperKind.C6Envelope:
+ return PageMediaSizeName.ISOC6Envelope;
+ case PaperKind.C65Envelope:
+ return PageMediaSizeName.ISOC6C5Envelope;
+ case PaperKind.B4Envelope:
+ return PageMediaSizeName.ISOB4Envelope;
+ case PaperKind.B5Envelope:
+ return PageMediaSizeName.ISOB5Envelope;
+ case PaperKind.B6Envelope:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.ItalyEnvelope:
+ return PageMediaSizeName.OtherMetricItalianEnvelope;
+ case PaperKind.MonarchEnvelope:
+ return PageMediaSizeName.NorthAmericaMonarchEnvelope;
+ case PaperKind.PersonalEnvelope:
+ return PageMediaSizeName.NorthAmericaPersonalEnvelope;
+ case PaperKind.USStandardFanfold:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.GermanStandardFanfold:
+ return PageMediaSizeName.NorthAmericaGermanStandardFanfold;
+ case PaperKind.GermanLegalFanfold:
+ return PageMediaSizeName.NorthAmericaGermanLegalFanfold;
+ case PaperKind.IsoB4:
+ return PageMediaSizeName.ISOB4;
+ case PaperKind.JapanesePostcard:
+ return PageMediaSizeName.JapanHagakiPostcard;
+ case PaperKind.Standard9x11:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Standard10x11:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.Standard15x11:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.InviteEnvelope:
+ return PageMediaSizeName.OtherMetricInviteEnvelope;
+ case PaperKind.LetterExtra:
+ return PageMediaSizeName.NorthAmericaLetterExtra;
+ case PaperKind.LegalExtra:
+ return PageMediaSizeName.NorthAmericaLegalExtra;
+ case PaperKind.TabloidExtra:
+ return PageMediaSizeName.NorthAmericaTabloidExtra;
+ case PaperKind.A4Extra:
+ return PageMediaSizeName.ISOA4Extra;
+ case PaperKind.LetterTransverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.A4Transverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.LetterExtraTransverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.APlus:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.BPlus:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.LetterPlus:
+ return PageMediaSizeName.NorthAmericaLetterPlus;
+ case PaperKind.A4Plus:
+ return PageMediaSizeName.OtherMetricA4Plus;
+ case PaperKind.A5Transverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.B5Transverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.A3Extra:
+ return PageMediaSizeName.ISOA3Extra;
+ case PaperKind.A5Extra:
+ return PageMediaSizeName.ISOA5Extra;
+ case PaperKind.B5Extra:
+ return PageMediaSizeName.ISOB5Extra;
+ case PaperKind.A2:
+ return PageMediaSizeName.ISOA2;
+ case PaperKind.A3Transverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.A3ExtraTransverse:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.JapaneseDoublePostcard:
+ return PageMediaSizeName.JapanDoubleHagakiPostcard;
+ case PaperKind.A6:
+ return PageMediaSizeName.ISOA6;
+ case PaperKind.JapaneseEnvelopeKakuNumber2:
+ return PageMediaSizeName.JapanKaku2Envelope;
+ case PaperKind.JapaneseEnvelopeKakuNumber3:
+ return PageMediaSizeName.JapanKaku3Envelope;
+ case PaperKind.JapaneseEnvelopeChouNumber3:
+ return PageMediaSizeName.JapanChou3Envelope;
+ case PaperKind.JapaneseEnvelopeChouNumber4:
+ return PageMediaSizeName.JapanChou4Envelope;
+ case PaperKind.LetterRotated:
+ return PageMediaSizeName.NorthAmericaLetterRotated;
+ case PaperKind.A3Rotated:
+ return PageMediaSizeName.ISOA3Rotated;
+ case PaperKind.A4Rotated:
+ return PageMediaSizeName.ISOA4Rotated;
+ case PaperKind.A5Rotated:
+ return PageMediaSizeName.ISOA5Rotated;
+ case PaperKind.B4JisRotated:
+ return PageMediaSizeName.JISB4Rotated;
+ case PaperKind.B5JisRotated:
+ return PageMediaSizeName.JISB5Rotated;
+ case PaperKind.JapanesePostcardRotated:
+ return PageMediaSizeName.JapanHagakiPostcardRotated;
+ case PaperKind.JapaneseDoublePostcardRotated:
+ return PageMediaSizeName.JapanHagakiPostcardRotated;
+ case PaperKind.A6Rotated:
+ return PageMediaSizeName.ISOA6Rotated;
+ case PaperKind.JapaneseEnvelopeKakuNumber2Rotated:
+ return PageMediaSizeName.JapanKaku2EnvelopeRotated;
+ case PaperKind.JapaneseEnvelopeKakuNumber3Rotated:
+ return PageMediaSizeName.JapanKaku3EnvelopeRotated;
+ case PaperKind.JapaneseEnvelopeChouNumber3Rotated:
+ return PageMediaSizeName.JapanChou3EnvelopeRotated;
+ case PaperKind.JapaneseEnvelopeChouNumber4Rotated:
+ return PageMediaSizeName.JapanChou4EnvelopeRotated;
+ case PaperKind.B6Jis:
+ return PageMediaSizeName.JISB6;
+ case PaperKind.B6JisRotated:
+ return PageMediaSizeName.JISB6Rotated;
+ case PaperKind.Standard12x11:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.JapaneseEnvelopeYouNumber4:
+ return PageMediaSizeName.JapanYou4Envelope;
+ case PaperKind.JapaneseEnvelopeYouNumber4Rotated:
+ return PageMediaSizeName.JapanYou4EnvelopeRotated;
+ case PaperKind.Prc16K:
+ return PageMediaSizeName.PRC16K;
+ case PaperKind.Prc32K:
+ return PageMediaSizeName.PRC32K;
+ case PaperKind.Prc32KBig:
+ return PageMediaSizeName.PRC32KBig;
+ case PaperKind.PrcEnvelopeNumber1:
+ return PageMediaSizeName.PRC1Envelope;
+ case PaperKind.PrcEnvelopeNumber2:
+ return PageMediaSizeName.PRC2Envelope;
+ case PaperKind.PrcEnvelopeNumber3:
+ return PageMediaSizeName.PRC3Envelope;
+ case PaperKind.PrcEnvelopeNumber4:
+ return PageMediaSizeName.PRC4Envelope;
+ case PaperKind.PrcEnvelopeNumber5:
+ return PageMediaSizeName.PRC5Envelope;
+ case PaperKind.PrcEnvelopeNumber6:
+ return PageMediaSizeName.PRC6Envelope;
+ case PaperKind.PrcEnvelopeNumber7:
+ return PageMediaSizeName.PRC7Envelope;
+ case PaperKind.PrcEnvelopeNumber8:
+ return PageMediaSizeName.PRC8Envelope;
+ case PaperKind.PrcEnvelopeNumber9:
+ return PageMediaSizeName.PRC9Envelope;
+ case PaperKind.PrcEnvelopeNumber10:
+ return PageMediaSizeName.PRC10Envelope;
+ case PaperKind.Prc16KRotated:
+ return PageMediaSizeName.PRC16KRotated;
+ case PaperKind.Prc32KRotated:
+ return PageMediaSizeName.PRC32KRotated;
+ case PaperKind.Prc32KBigRotated:
+ return PageMediaSizeName.Unknown;
+ case PaperKind.PrcEnvelopeNumber1Rotated:
+ return PageMediaSizeName.PRC1EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber2Rotated:
+ return PageMediaSizeName.PRC2EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber3Rotated:
+ return PageMediaSizeName.PRC3EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber4Rotated:
+ return PageMediaSizeName.PRC4EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber5Rotated:
+ return PageMediaSizeName.PRC5EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber6Rotated:
+ return PageMediaSizeName.PRC6EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber7Rotated:
+ return PageMediaSizeName.PRC7EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber8Rotated:
+ return PageMediaSizeName.PRC8EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber9Rotated:
+ return PageMediaSizeName.PRC9EnvelopeRotated;
+ case PaperKind.PrcEnvelopeNumber10Rotated:
+ return PageMediaSizeName.PRC10EnvelopeRotated;
+ default:
+ throw new ArgumentOutOfRangeException("paperKind");
+ }
+ }
}
}
diff --git a/platform/windows/gsview/gsview.csproj b/platform/windows/gsview/gsview.csproj
index 31f40f51..b57c86f0 100644
--- a/platform/windows/gsview/gsview.csproj
+++ b/platform/windows/gsview/gsview.csproj
@@ -111,6 +111,9 @@
<Compile Include="Password.xaml.cs">
<DependentUpon>Password.xaml</DependentUpon>
</Compile>
+ <Compile Include="PrintControl.xaml.cs">
+ <DependentUpon>PrintControl.xaml</DependentUpon>
+ </Compile>
<Compile Include="RectList.cs" />
<Compile Include="Selection.xaml.cs">
<DependentUpon>Selection.xaml</DependentUpon>
@@ -163,6 +166,10 @@
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
+ <Page Include="PrintControl.xaml">
+ <SubType>Designer</SubType>
+ <Generator>MSBuild:Compile</Generator>
+ </Page>
<Page Include="Selection.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
diff --git a/platform/windows/gsview/mudocument.cs b/platform/windows/gsview/mudocument.cs
index 291a424e..e41de6e3 100644
--- a/platform/windows/gsview/mudocument.cs
+++ b/platform/windows/gsview/mudocument.cs
@@ -159,6 +159,11 @@ namespace gsview
private static extern IntPtr mCreateDisplayListText64(IntPtr ctx, int page_num,
ref int page_width, ref int page_height, ref IntPtr text, ref int length);
+ [DllImport("mupdfnet64.dll", EntryPoint = "mReleaseLists", CharSet = CharSet.Auto,
+ CallingConvention = CallingConvention.StdCall)]
+ private static extern void mReleaseLists64(IntPtr ctx, IntPtr dlist,
+ IntPtr annot_dlist);
+
[DllImport("mupdfnet64.dll", EntryPoint = "mRenderPageMT", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern int mRenderPageMT64(IntPtr ctx, IntPtr dlist,
@@ -308,6 +313,11 @@ namespace gsview
private static extern IntPtr mCreateDisplayListText32(IntPtr ctx, int page_num,
ref int page_width, ref int page_height, ref IntPtr text, ref int length);
+ [DllImport("mupdfnet32.dll", EntryPoint = "mReleaseLists", CharSet = CharSet.Auto,
+ CallingConvention = CallingConvention.StdCall)]
+ private static extern void mReleaseLists32(IntPtr ctx, IntPtr dlist,
+ IntPtr annot_dlist);
+
[DllImport("mupdfnet32.dll", EntryPoint = "mRenderPageMT", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern int mRenderPageMT32(IntPtr ctx, IntPtr dlist,
@@ -805,6 +815,33 @@ namespace gsview
return output;
}
+ private void tc_mReleaseLists(IntPtr ctx, IntPtr dlist, IntPtr annot_dlist)
+ {
+ int output;
+ try
+ {
+ if (is64bit)
+ mReleaseLists64(ctx, dlist, annot_dlist);
+ else
+ mReleaseLists32(ctx, dlist, annot_dlist);
+ }
+ catch (DllNotFoundException)
+ {
+ /* DLL not found */
+ String err = "DllNotFoundException: MuPDF DLL not found 16";
+ mupdfDLLProblemMain(this, err);
+ return;
+ }
+ catch (BadImageFormatException)
+ {
+ /* Using 32 bit with 64 or vice versa */
+ String err = "BadImageFormatException: Incorrect MuPDF DLL";
+ mupdfDLLProblemMain(this, err);
+ return;
+ }
+ return;
+ }
+
private int tc_mRenderPageMT(IntPtr ctx, IntPtr dlist, IntPtr annot_dlist,
int page_width, int page_height, Byte[] bmp_data, int bmp_width,
int bmp_height, double scale, bool flipy)
@@ -1375,7 +1412,15 @@ namespace gsview
textchars.Height = height;
textchars.Scale = 1.0;
textchars.Color = linecolor;
- textchars.character = System.Convert.ToChar(character).ToString();
+ try
+ {
+ textchars.character = System.Convert.ToChar(character).ToString();
+ }
+ catch (OverflowException)
+ {
+ textchars.character = " "; /* Something went wrong here. Use blank space */
+ Console.WriteLine("{0} is outside the range of the Char data type.", character);
+ }
blocks[kk].TextLines[jj].TextCharacters.Add(textchars);
}
}
@@ -1409,6 +1454,8 @@ namespace gsview
}
code = tc_mRenderPageMT(mu_object, dlist, annot_dlist, page_width,
page_height, bmp_data, bmp_width, bmp_height, scale, flipy);
+ /* We are done with the display lists */
+ tc_mReleaseLists(mu_object, dlist, annot_dlist);
}
else
{
diff --git a/platform/windows/gsview/nsis/gsview.nsi b/platform/windows/gsview/nsis/gsview.nsi
new file mode 100644
index 00000000..f2bba6e9
--- /dev/null
+++ b/platform/windows/gsview/nsis/gsview.nsi
@@ -0,0 +1,552 @@
+; Copyright (C) 2015 Artifex Software, Inc.
+; All Rights Reserved.
+;
+; This software is provided AS-IS with no warranty, either express or
+; implied.
+;
+; This software is distributed under license and may not be copied,
+; modified or distributed except as expressly authorized under the terms
+; of the license contained in the file LICENSE in this distribution.
+;
+; Refer to licensing information at http://www.artifex.com or contact
+; Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael,
+; CA 94903, U.S.A., +1(415)492-9861, for further information.
+;
+
+; This script should be compiled with :
+; makensis -NOCD nsis/gsview.nsi
+
+!ifndef TARGET
+!define TARGET gsview_setup
+!endif
+
+!ifndef VERSION
+!define VERSION 6.0
+!endif
+
+!ifndef PRODUCT_NAME
+!define PRODUCT_NAME gsview
+!endif
+
+SetCompressor /SOLID /FINAL lzma
+XPStyle on
+CRCCheck on
+
+!include "nsDialogs.nsh"
+; modern user interface
+!include "MUI2.nsh"
+; for logic marcos that occur at run time. Not compile time
+!include "LogicLib.nsh"
+; for detecting if running on x64 machine.
+!include "x64.nsh"
+
+; Macros for file association.
+; to make sure that we update the proper locations (user vs root for example
+; as well as changes needed for Windows 8.x)
+!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND TOAST SETDEFAULT
+ ; Backup the previously associated file class
+
+ ${If} ${SETDEFAULT} == "1"
+ ;DetailPrint "ReadRegStr HKCU Software\Classes\ $R0"
+ ReadRegStr $R0 HKCU "Software\Classes\.${EXT}" ""
+
+ ;DetailPrint "WriteRegStr of backup in HKCU"
+ WriteRegStr HKCU "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"
+
+ ;DetailPrint "WriteRegStr of fileclass in HKCU"
+ WriteRegStr HKCU "Software\Classes\.${EXT}" "" "${FILECLASS}"
+
+ ; If this key is present (as it in windows 8) then we need to do this to get the
+ ; proper file type icon rather than just the application icon for the file type.
+ ${If} ${TOAST} == '1'
+ WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts\" "${FILECLASS}_" 0
+ ${EndIf}
+ ${EndIf}
+
+ ; The icon mapping should not go in HKCR but in HKLM per MS best practices
+ WriteRegStr HKLM "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
+ WriteRegStr HKLM "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
+ WriteRegStr HKLM "Software\Classes\${FILECLASS}\shell" "" "open"
+ WriteRegStr HKLM "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
+ WriteRegStr HKLM "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}`
+!macroend
+
+!macro APP_UNASSOCIATE EXT FILECLASS TOAST
+ ; Get the previously associated file class
+ ReadRegStr $R0 HKCU "Software\Classes\.${EXT}" `${FILECLASS}_backup`
+ WriteRegStr HKCU "Software\Classes\.${EXT}" "" "$R0"
+
+ ; Delete backup value
+ DeleteRegValue HKCU "Software\Classes\.${EXT}" "${FILECLASS}_backup"
+
+ ; If this key is present (as it in windows 8) then attempt to clean up. System
+ ; seems to add in other entries here that I did not do depending upon what the
+ ; type of associations the user has done.
+ ${If} ${TOAST} == '1'
+ DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts\" "${FILECLASS}_"
+ ${EndIf}
+
+ ; Remove icon mapping
+ DeleteRegKey HKLM `Software\Classes\${FILECLASS}`
+!macroend
+
+; defines for use with SHChangeNotify
+!ifdef SHCNE_ASSOCCHANGED
+!undef SHCNE_ASSOCCHANGED
+!endif
+!define SHCNE_ASSOCCHANGED 0x08000000
+!ifdef SHCNF_FLUSH
+!undef SHCNF_FLUSH
+!endif
+!define SHCNF_FLUSH 0x1000
+
+!macro UPDATEFILEASSOC
+ System::Call "shell32::SHChangeNotify(i,i,i,i) (${SHCNE_ASSOCCHANGED}, ${SHCNF_FLUSH}, 0, 0)"
+!macroend
+
+!define MUI_FINISHPAGE_RUN "$INSTDIR\bin\gsview.exe"
+!define MUI_FINISHPAGE_LINK "Visit the Ghostscript web site"
+!define MUI_FINISHPAGE_LINK_LOCATION http://www.ghostscript.com/
+
+; Order of page appearance
+!insertmacro MUI_PAGE_WELCOME
+!insertmacro MUI_PAGE_LICENSE "LICENSE"
+!insertmacro MUI_PAGE_DIRECTORY
+Page custom fnc_association_Show fnc_association_Done
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+
+!insertmacro MUI_LANGUAGE "English"
+
+!searchparse /ignorecase /noerrors "${TARGET}" w WINTYPE
+!echo "Building ${WINTYPE}-bit installer"
+
+Name "gsview"
+OutFile "${TARGET}_${VERSION}.exe"
+Icon Resources\gsview_app.ico
+UninstallIcon Resources\gsview_app.ico
+
+; We need to have then run this as an adminstrator. Otherwise there are
+; issues with the icons for the various file types and getting the "Open With.."
+; items populated
+
+RequestExecutionLevel admin
+
+; Some default compiler settings (uncomment and change at will):
+; SetCompress auto ; (can be off or force)
+; SetDatablockOptimize on ; (can be off)
+; CRCCheck on ; (can be off)
+; AutoCloseWindow false ; (can be true for the window go away automatically at end)
+; ShowInstDetails hide ; (can be show to have them shown, or nevershow to disable)
+; SetDateSave off ; (can be on to have files restored to their orginal date)
+
+BrandingText "Artifex Software Inc."
+LicenseText "You must agree to this license before installing."
+LicenseData "LICENSE"
+
+; It is OK to use $PROGRAMFILES64 on x86
+; you can use $PROGRAMFILES64 for all platforms. It will go to default
+InstallDir "$PROGRAMFILES64\Artifex Software\gsview${VERSION}"
+
+DirText "Select the directory to install gsview in:"
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Association dialog: Partially created with CoolSoft NSIS Dialog Designer.
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+Var hCtl_association
+Var hCtl_association_jpg
+Var hCtl_association_png
+Var hCtl_association_xps
+Var hCtl_association_oxps
+Var hCtl_association_eps
+Var hCtl_association_ps
+Var hCtl_association_cbz
+Var hCtl_association_pdf
+Var jpg
+Var png
+Var xps
+Var oxps
+Var eps
+Var ps
+Var cbz
+Var pdf
+
+; dialog create function
+Function fnc_association_Create
+
+ ; === association (type: Dialog) ===
+ nsDialogs::Create 1018
+ Pop $hCtl_association
+ ${If} $hCtl_association == error
+ Abort
+ ${EndIf}
+ !insertmacro MUI_HEADER_TEXT "File Type Associations" "Select.."
+
+ ; === jpg (type: Checkbox) ===
+ ${NSD_CreateCheckbox} 192.2u 57.85u 78.99u 23.38u "jpg"
+ Pop $hCtl_association_jpg
+ ${NSD_Check} $hCtl_association_jpg
+
+ ; === png (type: Checkbox) ===
+ ${NSD_CreateCheckbox} 192.2u 43.69u 68.46u 14.77u "png"
+ Pop $hCtl_association_png
+ ${NSD_Check} $hCtl_association_png
+
+ ; === xps (type: Checkbox) ===
+ ${NSD_CreateCheckbox} 123.09u 45.54u 70.43u 11.69u "xps"
+ Pop $hCtl_association_xps
+ ${NSD_Check} $hCtl_association_xps
+
+ ; === oxps (type: Checkbox) ===
+ ${NSD_CreateCheckbox} 123.09u 57.85u 73.06u 23.38u "oxps"
+ Pop $hCtl_association_oxps
+ ${NSD_Check} $hCtl_association_oxps
+
+ ; === eps (type: Checkbox) ===
+ ${NSD_CreateCheckbox} 50.68u 80.62u 68.46u 14.77u "eps"
+ Pop $hCtl_association_eps
+ ${NSD_Check} $hCtl_association_eps
+
+ ; === ps (type: Checkbox) ===
+ ${NSD_CreateCheckbox} 50.68u 62.15u 62.53u 14.77u "ps"
+ Pop $hCtl_association_ps
+ ${NSD_Check} $hCtl_association_ps
+
+ ; === cbz (type: Checkbox) ===
+ ${NSD_CreateCheckbox} 192.2u 80.62u 68.46u 14.77u "cbz"
+ Pop $hCtl_association_cbz
+ ${NSD_Check} $hCtl_association_cbz
+
+ ; === pdf (type: Checkbox) ===
+ ${NSD_CreateCheckbox} 50.68u 43.69u 68.46u 14.77u "pdf"
+ Pop $hCtl_association_pdf
+ ${NSD_Check} $hCtl_association_pdf
+
+FunctionEnd
+
+; Association dialog show function
+Function fnc_association_Show
+ Call fnc_association_Create
+ nsDialogs::Show $hCtl_association
+FunctionEnd
+
+; Association dialog done function
+Function fnc_association_Done
+ ${NSD_GetState} $hCtl_association_jpg $0
+ ${If} $0 <> 0
+ StrCpy $jpg "1"
+ ${Else}
+ StrCpy $jpg "0"
+ ${EndIf}
+
+ ${NSD_GetState} $hCtl_association_xps $0
+ ${If} $0 <> 0
+ StrCpy $xps "1"
+ ${Else}
+ StrCpy $xps "0"
+ ${EndIf}
+
+ ${NSD_GetState} $hCtl_association_oxps $0
+ ${If} $0 <> 0
+ StrCpy $oxps "1"
+ ${Else}
+ StrCpy $oxps "0"
+ ${EndIf}
+
+ ${NSD_GetState} $hCtl_association_png $0
+ ${If} $0 <> 0
+ StrCpy $png "1"
+ ${Else}
+ StrCpy $png "0"
+ ${EndIf}
+
+ ${NSD_GetState} $hCtl_association_eps $0
+ ${If} $0 <> 0
+ StrCpy $eps "1"
+ ${Else}
+ StrCpy $eps "0"
+ ${EndIf}
+
+ ${NSD_GetState} $hCtl_association_ps $0
+ ${If} $0 <> 0
+ StrCpy $ps "1"
+ ${Else}
+ StrCpy $ps "0"
+ ${EndIf}
+
+ ${NSD_GetState} $hCtl_association_cbz $0
+ ${If} $0 <> 0
+ StrCpy $cbz "1"
+ ${Else}
+ StrCpy $cbz "0"
+ ${EndIf}
+
+ ${NSD_GetState} $hCtl_association_pdf $0
+ ${If} $0 <> 0
+ StrCpy $pdf "1"
+ ${Else}
+ StrCpy $pdf "0"
+ ${EndIf}
+
+FunctionEnd
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Main Install Section
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+Section "" ; (default section)
+
+ ; First check if we have the proper .net installed
+ Call CheckAndDownloadDotNet45
+
+ SetOutPath "$INSTDIR"
+ CreateDirectory "$INSTDIR\bin"
+ CreateDirectory "$INSTDIR\resources"
+ ; add files / whatever that need to be installed here.
+ ${If} ${RunningX64}
+ File /oname=bin\gsprint64.dll .\bin\Release\gsprint64.dll
+ File /oname=bin\mupdfnet64.dll .\bin\Release\mupdfnet64.dll
+ File /oname=bin\gsdll64.dll .\gslib\gsdll64.dll
+ ${Else}
+ File /oname=bin\gsprint32.dll .\bin\Release\gsprint32.dll
+ File /oname=bin\mupdfnet32.dll .\bin\Release\mupdfnet32.dll
+ File /oname=bin\gsdll32.dll .\gslib\gsdll32.dll
+ ${EndIf}
+ File /oname=bin\gsview.exe .\bin\Release\gsview.exe
+ File /oname=resources\pageCBZ.ico .\Resources\pageCBZ.ico
+ File /oname=resources\pageEPS.ico .\Resources\pageEPS.ico
+ File /oname=resources\pagePS.ico .\Resources\pagePS.ico
+ File /oname=resources\pagePDF.ico .\Resources\pagePDF.ico
+ File /oname=resources\pageXPS.ico .\Resources\pageXPS.ico
+ File /oname=resources\pageOXPS.ico .\Resources\pageOXPS.ico
+ File /oname=resources\pagePNG.ico .\Resources\pagePNG.ico
+ File /oname=resources\pageJPG.ico .\Resources\pageJPG.ico
+
+ ${If} ${RunningX64}
+ SetRegView 64
+ ${EndIf}
+ WriteRegStr HKEY_LOCAL_MACHINE "Software\Artifex Software\gsview\${VERSION}" "" "$INSTDIR"
+ WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\gsview ${VERSION}" "DisplayName" "gsview"
+ WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\gsview ${VERSION}" "UninstallString" '"$INSTDIR\uninstgsview.exe"'
+ WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\gsview ${VERSION}" "Publisher" "Artifex Software Inc."
+ WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\gsview ${VERSION}" "HelpLink" "http://www.ghostscript.com/"
+ WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\gsview ${VERSION}" "URLInfoAbout" "http://www.ghostscript.com/"
+ WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\gsview ${VERSION}" "DisplayVersion" "${VERSION}"
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\gsview ${VERSION}" "NoRepair" "1"
+
+ ; Check if Toast directory is present before doing the associations
+ StrCpy $0 0
+ StrCpy $2 0
+ ${Do}
+ EnumRegKey $1 HKCU Software\Microsoft\Windows\CurrentVersion $0
+ ${If} $1 == 'ApplicationAssociationToasts'
+ StrCpy $2 1
+ StrCpy $1 "" ; End it now as we have found the entry
+ ${EndIf}
+ IntOp $0 $0 + 1
+ ${LoopUntil} $1 == ""
+
+ ; The file associations
+ !insertmacro APP_ASSOCIATE "pdf" "gsview.pdf" "PDF Document" "$INSTDIR\resources\pagePDF.ico" "Open" "$INSTDIR\bin\gsview.exe $\"%1$\"" $2 $pdf
+ !insertmacro APP_ASSOCIATE "ps" "gsview.ps" "Postscript Document" "$INSTDIR\resources\pagePS.ico" "Open" "$INSTDIR\bin\gsview.exe $\"%1$\"" $2 $ps
+ !insertmacro APP_ASSOCIATE "xps" "gsview.xps" "XPS Document" "$INSTDIR\resources\pageXPS.ico" "Open" "$INSTDIR\bin\gsview.exe $\"%1$\"" $2 $xps
+ !insertmacro APP_ASSOCIATE "oxps" "gsview.oxps" "Open XPS Document" "$INSTDIR\resources\pageOXPS.ico" "Open" "$INSTDIR\bin\gsview.exe $\"%1$\"" $2 $oxps
+ !insertmacro APP_ASSOCIATE "cbz" "gsview.cbz" "CBZ Document" "$INSTDIR\resources\pageCBZ.ico" "Open" "$INSTDIR\bin\gsview.exe $\"%1$\"" $2 $cbz
+ !insertmacro APP_ASSOCIATE "jpg" "gsview.jpg" "JPG Image" "$INSTDIR\resources\pageJPG.ico" "Open" "$INSTDIR\bin\gsview.exe $\"%1$\"" $2 $jpg
+ !insertmacro APP_ASSOCIATE "png" "gsview.png" "PNG Image" "$INSTDIR\resources\pagePNG.ico" "Open" "$INSTDIR\bin\gsview.exe $\"%1$\"" $2 $png
+ !insertmacro APP_ASSOCIATE "eps" "gsview.eps" "Encapsulated Postscript" "$INSTDIR\resources\pageEPS.ico" "Open" "$INSTDIR\bin\gsview.exe $\"%1$\"" $2 $eps
+ !insertmacro UPDATEFILEASSOC
+
+ ; write out uninstaller
+ WriteUninstaller "$INSTDIR\uninstgsview.exe"
+SectionEnd ; end of default section
+
+Function .onInstSuccess
+ SetShellVarContext all
+ CreateDirectory "$SMPROGRAMS\gsview"
+ CreateShortCut "$SMPROGRAMS\gsview\gsview ${VERSION}.LNK" "$INSTDIR\bin\gsview.exe"
+ CreateShortCut "$SMPROGRAMS\gsview\Uninstall gsview ${VERSION}.LNK" "$INSTDIR\uninstgsview.exe"
+FunctionEnd
+
+Function .onInit
+ ; Again, check that we they are doing a run as administrator
+ UserInfo::GetAccountType
+ pop $0
+ ${If} $0 != "admin" ;Require admin rights
+ MessageBox mb_iconstop "Administrator rights required!"
+ SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
+ Quit
+ ${EndIf}
+
+ System::Call 'kernel32::CreateMutexA(i 0, i 0, t "GhostscriptInstaller") i .r1 ?e'
+ Pop $R0
+ StrCmp $R0 0 +3
+ MessageBox MB_OK "The gsview installer is already running." /SD IDOK
+ Abort
+FunctionEnd
+
+Function Un.onInit
+ ${If} ${RunningX64}
+ SetRegView 64
+ ${EndIf}
+FunctionEnd
+
+; begin uninstall settings/section
+UninstallText "This will uninstall gsview from your system"
+
+Section Uninstall
+ ; add delete commands to delete whatever files/registry keys/etc you installed here.
+ SetShellVarContext all
+ Delete "$SMPROGRAMS\gsview\gsview ${VERSION}.LNK"
+ Delete "$SMPROGRAMS\gsview\Uninstall gsview ${VERSION}.LNK"
+ RMDir "$SMPROGRAMS\gsview"
+ Delete "$INSTDIR\uninstgsview.exe"
+
+ ${If} ${RunningX64}
+ SetRegView 64
+ ${EndIf}
+ ; Check if Toast directory is present before doing the unassociations
+ StrCpy $0 0
+ StrCpy $2 0
+ ${Do}
+ EnumRegKey $1 HKCU Software\Microsoft\Windows\CurrentVersion $0
+ ${If} $1 == 'ApplicationAssociationToasts'
+ StrCpy $2 1
+ StrCpy $1 ""
+ ${EndIf}
+ IntOp $0 $0 + 1
+ ${LoopUntil} $1 == ""
+
+ !insertmacro APP_UNASSOCIATE "pdf" "gsview.pdf" $2
+ !insertmacro APP_UNASSOCIATE "ps" "gsview.ps" $2
+ !insertmacro APP_UNASSOCIATE "xps" "gsview.xps" $2
+ !insertmacro APP_UNASSOCIATE "oxps" "gsview.oxps" $2
+ !insertmacro APP_UNASSOCIATE "cbz" "gsview.cbz" $2
+ !insertmacro APP_UNASSOCIATE "jpg" "gsview.jpg" $2
+ !insertmacro APP_UNASSOCIATE "png" "gsview.png" $2
+
+ DeleteRegKey HKEY_CURRENT_USER "Software\Artifex Software\GSview ${Version}"
+
+ DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Artifex Software\gsview\${VERSION}"
+ DeleteRegKey HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\gsview ${VERSION}"
+ DeleteRegKey HKEY_LOCAL_MACHINE "Software\gsview\${VERSION}"
+ RMDir /r "$INSTDIR\doc"
+ Delete "$INSTDIR\bin\gsprint${WINTYPE}.dll"
+ Delete "$INSTDIR\bin\mupdfnet{WINTYPE}.dll"
+ Delete "$INSTDIR\bin\gsdll${WINTYPE}.dll"
+ Delete "$INSTDIR\bin\gsview.exe"
+ Delete "$INSTDIR\resources\pageCBZ.ico"
+ Delete "$INSTDIR\resources\pageEPS.ico"
+ Delete "$INSTDIR\resources\pageJPG.ico"
+ Delete "$INSTDIR\resources\pageOXPS.ico"
+ Delete "$INSTDIR\resources\pagePDF.ico"
+ Delete "$INSTDIR\resources\pagePS.ico"
+ Delete "$INSTDIR\resources\pageXPS.ico"
+ Delete "$INSTDIR\resources\pagePNG.ico"
+ RMDir "$INSTDIR\resources"
+ RMDir "$INSTDIR\bin"
+ RMDir "$INSTDIR"
+SectionEnd ; end of uninstall section
+
+; From http://nsis.sourceforge.net/Download_and_Install_dotNET_45
+Function CheckAndDownloadDotNet45
+ # Let's see if the user has the .NET Framework 4.5 installed on their system or not
+ # Remember: you need Vista SP2 or 7 SP1. It is built in to Windows 8, and not needed
+ # In case you're wondering, running this code on Windows 8 will correctly return is_equal
+ # or is_greater (maybe Microsoft releases .NET 4.5 SP1 for example)
+
+ # Set up our Variables
+ Var /GLOBAL dotNET45IsThere
+ Var /GLOBAL dotNET_CMD_LINE
+ Var /GLOBAL EXIT_CODE
+
+ # We are reading a version release DWORD that Microsoft says is the documented
+ # way to determine if .NET Framework 4.5 is installed
+ ReadRegDWORD $dotNET45IsThere HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Release"
+ IntCmp $dotNET45IsThere 378389 is_equal is_less is_greater
+
+ is_equal:
+ Goto done_compare_not_needed
+ is_greater:
+ # Useful if, for example, Microsoft releases .NET 4.5 SP1
+ # We want to be able to simply skip install since it's not
+ # needed on this system
+ Goto done_compare_not_needed
+ is_less:
+ Goto done_compare_needed
+
+ done_compare_needed:
+ #.NET Framework 4.5 install is *NEEDED*
+
+ # Microsoft Download Center EXE:
+ # Web Bootstrapper: http://go.microsoft.com/fwlink/?LinkId=225704
+ # Full Download: http://go.microsoft.com/fwlink/?LinkId=225702
+
+ # Setup looks for components\dotNET45Full.exe relative to the install EXE location
+ # This allows the installer to be placed on a USB stick (for computers without internet connections)
+ # If the .NET Framework 4.5 installer is *NOT* found, Setup will connect to Microsoft's website
+ # and download it for you
+
+ # Reboot Required with these Exit Codes:
+ # 1641 or 3010
+
+ # Command Line Switches:
+ # /showrmui /passive /norestart
+
+ # Silent Command Line Switches:
+ # /q /norestart
+
+ # Let's see if the user is doing a Silent install or not
+ IfSilent is_quiet is_not_quiet
+
+ is_quiet:
+ StrCpy $dotNET_CMD_LINE "/q /norestart"
+ Goto LookForLocalFile
+ is_not_quiet:
+ StrCpy $dotNET_CMD_LINE "/showrmui /passive /norestart"
+ Goto LookForLocalFile
+
+ LookForLocalFile:
+ # Let's see if the user stored the Full Installer
+ IfFileExists "$EXEPATH\components\dotNET45Full.exe" do_local_install do_network_install
+
+ do_local_install:
+ # .NET Framework found on the local disk. Use this copy
+ ExecWait '"$EXEPATH\components\dotNET45Full.exe" $dotNET_CMD_LINE' $EXIT_CODE
+ Goto is_reboot_requested
+ # Now, let's Download the .NET
+
+ do_network_install:
+ Var /GLOBAL dotNetDidDownload
+ NSISdl::download "http://go.microsoft.com/fwlink/?LinkId=225704" "$TEMP\dotNET45Web.exe" $dotNetDidDownload
+ StrCmp $dotNetDidDownload success fail
+
+ success:
+ ExecWait '"$TEMP\dotNET45Web.exe" $dotNET_CMD_LINE' $EXIT_CODE
+ Goto is_reboot_requested
+
+ fail:
+ MessageBox MB_OK|MB_ICONEXCLAMATION "Unable to download .NET Framework. ${PRODUCT_NAME} will be installed, but will not function without the Framework!"
+ Goto done_dotNET_function
+
+ # $EXIT_CODE contains the return codes. 1641 and 3010 means a Reboot has been requested
+ is_reboot_requested:
+ ${If} $EXIT_CODE = 1641
+ ${OrIf} $EXIT_CODE = 3010
+ SetRebootFlag true
+ ${EndIf}
+
+ done_compare_not_needed:
+ # Done dotNET Install
+ Goto done_dotNET_function
+
+ #exit the function
+ done_dotNET_function:
+
+ FunctionEnd
+; eof
diff --git a/platform/windows/libmupdf/libmupdf.vcxproj b/platform/windows/libmupdf/libmupdf.vcxproj
index bb4ef639..78df5e8d 100644
--- a/platform/windows/libmupdf/libmupdf.vcxproj
+++ b/platform/windows/libmupdf/libmupdf.vcxproj
@@ -115,7 +115,6 @@
<ClCompile Include="..\..\..\source\fitz\draw-path.c" />
<ClCompile Include="..\..\..\source\fitz\draw-scale-simple.c" />
<ClCompile Include="..\..\..\source\fitz\draw-unpack.c" />
- <ClCompile Include="..\..\..\source\fitz\dtoa.c" />
<ClCompile Include="..\..\..\source\fitz\error.c" />
<ClCompile Include="..\..\..\source\fitz\filter-basic.c" />
<ClCompile Include="..\..\..\source\fitz\filter-dct.c" />
@@ -126,6 +125,7 @@
<ClCompile Include="..\..\..\source\fitz\filter-lzw.c" />
<ClCompile Include="..\..\..\source\fitz\filter-predict.c" />
<ClCompile Include="..\..\..\source\fitz\font.c" />
+ <ClCompile Include="..\..\..\source\fitz\ftoa.c" />
<ClCompile Include="..\..\..\source\fitz\function.c" />
<ClCompile Include="..\..\..\source\fitz\geometry.c" />
<ClCompile Include="..\..\..\source\fitz\getopt.c" />
@@ -159,12 +159,14 @@
<ClCompile Include="..\..\..\source\fitz\stream-open.c" />
<ClCompile Include="..\..\..\source\fitz\stream-read.c" />
<ClCompile Include="..\..\..\source\fitz\string.c" />
+ <ClCompile Include="..\..\..\source\fitz\strtod.c" />
<ClCompile Include="..\..\..\source\fitz\svg-device.c" />
<ClCompile Include="..\..\..\source\fitz\text.c" />
<ClCompile Include="..\..\..\source\fitz\time.c" />
<ClCompile Include="..\..\..\source\fitz\trace-device.c" />
<ClCompile Include="..\..\..\source\fitz\transition.c" />
<ClCompile Include="..\..\..\source\fitz\ucdn.c" />
+ <ClCompile Include="..\..\..\source\fitz\unzip.c" />
<ClCompile Include="..\..\..\source\fitz\xml.c" />
<ClCompile Include="..\..\..\source\img\muimage.c" />
<ClCompile Include="..\..\..\source\pdf\pdf-annot.c" />
diff --git a/platform/windows/libmupdf/libmupdf.vcxproj.filters b/platform/windows/libmupdf/libmupdf.vcxproj.filters
index d90eb1d5..62f050df 100644
--- a/platform/windows/libmupdf/libmupdf.vcxproj.filters
+++ b/platform/windows/libmupdf/libmupdf.vcxproj.filters
@@ -635,7 +635,13 @@
<ClCompile Include="..\..\..\source\xps\xps-zip.c">
<Filter>xps</Filter>
</ClCompile>
- <ClCompile Include="..\..\..\source\fitz\dtoa.c">
+ <ClCompile Include="..\..\..\source\fitz\unzip.c">
+ <Filter>fitz</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\source\fitz\ftoa.c">
+ <Filter>fitz</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\source\fitz\strtod.c">
<Filter>fitz</Filter>
</ClCompile>
</ItemGroup>
diff --git a/platform/windows/libmupdf_winRT.vcxproj b/platform/windows/libmupdf_winRT.vcxproj
index 51037897..525a59d1 100644
--- a/platform/windows/libmupdf_winRT.vcxproj
+++ b/platform/windows/libmupdf_winRT.vcxproj
@@ -64,7 +64,6 @@
<ClCompile Include="..\..\source\fitz\draw-path.c" />
<ClCompile Include="..\..\source\fitz\draw-scale-simple.c" />
<ClCompile Include="..\..\source\fitz\draw-unpack.c" />
- <ClCompile Include="..\..\source\fitz\dtoa.c" />
<ClCompile Include="..\..\source\fitz\error.c" />
<ClCompile Include="..\..\source\fitz\filter-basic.c" />
<ClCompile Include="..\..\source\fitz\filter-dct.c" />
@@ -75,6 +74,7 @@
<ClCompile Include="..\..\source\fitz\filter-lzw.c" />
<ClCompile Include="..\..\source\fitz\filter-predict.c" />
<ClCompile Include="..\..\source\fitz\font.c" />
+ <ClCompile Include="..\..\source\fitz\ftoa.c" />
<ClCompile Include="..\..\source\fitz\function.c" />
<ClCompile Include="..\..\source\fitz\geometry.c" />
<ClCompile Include="..\..\source\fitz\getopt.c" />
@@ -108,12 +108,14 @@
<ClCompile Include="..\..\source\fitz\stream-open.c" />
<ClCompile Include="..\..\source\fitz\stream-read.c" />
<ClCompile Include="..\..\source\fitz\string.c" />
+ <ClCompile Include="..\..\source\fitz\strtod.c" />
<ClCompile Include="..\..\source\fitz\svg-device.c" />
<ClCompile Include="..\..\source\fitz\text.c" />
<ClCompile Include="..\..\source\fitz\time.c" />
<ClCompile Include="..\..\source\fitz\trace-device.c" />
<ClCompile Include="..\..\source\fitz\transition.c" />
<ClCompile Include="..\..\source\fitz\ucdn.c" />
+ <ClCompile Include="..\..\source\fitz\unzip.c" />
<ClCompile Include="..\..\source\fitz\xml.c" />
<ClCompile Include="..\..\source\img\muimage.c" />
<ClCompile Include="..\..\source\pdf\pdf-annot.c" />
diff --git a/platform/windows/libmupdf_winRT.vcxproj.filters b/platform/windows/libmupdf_winRT.vcxproj.filters
index b65301f4..86036ee8 100644
--- a/platform/windows/libmupdf_winRT.vcxproj.filters
+++ b/platform/windows/libmupdf_winRT.vcxproj.filters
@@ -429,10 +429,13 @@
<ClCompile Include="..\..\source\xps\xps-zip.c">
<Filter>xps</Filter>
</ClCompile>
+ <ClCompile Include="..\..\source\fitz\ftoa.c">
+ <Filter>fitz</Filter>
+ </ClCompile>
<ClCompile Include="..\..\source\fitz\strtod.c">
<Filter>fitz</Filter>
</ClCompile>
- <ClCompile Include="..\..\source\fitz\ftoa.c">
+ <ClCompile Include="..\..\source\fitz\unzip.c">
<Filter>fitz</Filter>
</ClCompile>
</ItemGroup>
diff --git a/platform/windows/mupdf.sln b/platform/windows/mupdf.sln
index 65818c0e..c38cde4c 100644
--- a/platform/windows/mupdf.sln
+++ b/platform/windows/mupdf.sln
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
-VisualStudioVersion = 12.0.21005.1
+VisualStudioVersion = 12.0.31101.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generated", "generated.vcxproj", "{A5053AA7-02E5-4903-B596-04F17AEB1526}"
EndProject
@@ -25,6 +25,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mupdf_cpp", "mupdf_cpp\mupd
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gsview", "gsview\gsview.csproj", "{5DA0ECC9-4026-4427-862F-E3226EFEFEB1}"
ProjectSection(ProjectDependencies) = postProject
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1} = {09FE8E75-9952-44E7-95F8-E8D74707FBA1}
{4468C2E0-6C90-4FA5-8A48-0A9629776167} = {4468C2E0-6C90-4FA5-8A48-0A9629776167}
EndProjectSection
EndProject
@@ -34,18 +35,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mupdfnet", "mupdfnet\mupdfn
{4D5C4349-480D-4CD6-9D3B-09C50BA35FA2} = {4D5C4349-480D-4CD6-9D3B-09C50BA35FA2}
EndProjectSection
EndProject
-Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Install64", "gsview\Install64\Install64.vdproj", "{76633D68-1082-4040-B943-362B02811577}"
- ProjectSection(ProjectDependencies) = postProject
- {5DA0ECC9-4026-4427-862F-E3226EFEFEB1} = {5DA0ECC9-4026-4427-862F-E3226EFEFEB1}
- {4468C2E0-6C90-4FA5-8A48-0A9629776167} = {4468C2E0-6C90-4FA5-8A48-0A9629776167}
- EndProjectSection
-EndProject
-Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Install32", "gsview\Install32\Install32.vdproj", "{FA5C8A67-3783-4096-B2E8-34BCF88F07EB}"
- ProjectSection(ProjectDependencies) = postProject
- {5DA0ECC9-4026-4427-862F-E3226EFEFEB1} = {5DA0ECC9-4026-4427-862F-E3226EFEFEB1}
- {4468C2E0-6C90-4FA5-8A48-0A9629776167} = {4468C2E0-6C90-4FA5-8A48-0A9629776167}
- EndProjectSection
-EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmupdf", "libmupdf\libmupdf.vcxproj", "{4D5C4349-480D-4CD6-9D3B-09C50BA35FA2}"
ProjectSection(ProjectDependencies) = postProject
{A5053AA7-02E5-4903-B596-04F17AEB1526} = {A5053AA7-02E5-4903-B596-04F17AEB1526}
@@ -53,6 +42,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmupdf", "libmupdf\libmup
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libthirdparty", "libthirdparty\libthirdparty.vcxproj", "{DF87E242-8B2C-4F04-9A7E-61C578FD994C}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gsprint", "gsprint.vcxproj", "{09FE8E75-9952-44E7-95F8-E8D74707FBA1}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
CD_ROM|Any CPU = CD_ROM|Any CPU
@@ -560,81 +551,6 @@ Global
{4468C2E0-6C90-4FA5-8A48-0A9629776167}.SingleImage|x64.Build.0 = Release|x64
{4468C2E0-6C90-4FA5-8A48-0A9629776167}.SingleImage|x86.ActiveCfg = Release|Win32
{4468C2E0-6C90-4FA5-8A48-0A9629776167}.SingleImage|x86.Build.0 = Release|Win32
- {76633D68-1082-4040-B943-362B02811577}.CD_ROM|Any CPU.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.CD_ROM|ARM.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.CD_ROM|Mixed Platforms.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.CD_ROM|Win32.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.CD_ROM|x64.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.CD_ROM|x86.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.Debug|Any CPU.ActiveCfg = Debug
- {76633D68-1082-4040-B943-362B02811577}.Debug|ARM.ActiveCfg = Debug
- {76633D68-1082-4040-B943-362B02811577}.Debug|Mixed Platforms.ActiveCfg = Debug
- {76633D68-1082-4040-B943-362B02811577}.Debug|Win32.ActiveCfg = Debug
- {76633D68-1082-4040-B943-362B02811577}.Debug|x64.ActiveCfg = Debug
- {76633D68-1082-4040-B943-362B02811577}.Debug|x86.ActiveCfg = Debug
- {76633D68-1082-4040-B943-362B02811577}.DVD-5|Any CPU.ActiveCfg = Debug
- {76633D68-1082-4040-B943-362B02811577}.DVD-5|ARM.ActiveCfg = Debug
- {76633D68-1082-4040-B943-362B02811577}.DVD-5|Mixed Platforms.ActiveCfg = Debug
- {76633D68-1082-4040-B943-362B02811577}.DVD-5|Win32.ActiveCfg = Debug
- {76633D68-1082-4040-B943-362B02811577}.DVD-5|x64.ActiveCfg = Debug
- {76633D68-1082-4040-B943-362B02811577}.DVD-5|x86.ActiveCfg = Debug
- {76633D68-1082-4040-B943-362B02811577}.Memento|Any CPU.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.Memento|ARM.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.Memento|Mixed Platforms.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.Memento|Win32.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.Memento|x64.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.Memento|x86.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.Release|Any CPU.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.Release|ARM.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.Release|Mixed Platforms.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.Release|Win32.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.Release|x64.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.Release|x64.Build.0 = Release
- {76633D68-1082-4040-B943-362B02811577}.Release|x86.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.SingleImage|Any CPU.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.SingleImage|ARM.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.SingleImage|Mixed Platforms.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.SingleImage|Win32.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.SingleImage|x64.ActiveCfg = Release
- {76633D68-1082-4040-B943-362B02811577}.SingleImage|x86.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.CD_ROM|Any CPU.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.CD_ROM|ARM.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.CD_ROM|Mixed Platforms.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.CD_ROM|Win32.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.CD_ROM|x64.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.CD_ROM|x86.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Debug|Any CPU.ActiveCfg = Debug
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Debug|ARM.ActiveCfg = Debug
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Debug|Mixed Platforms.ActiveCfg = Debug
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Debug|Win32.ActiveCfg = Debug
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Debug|x64.ActiveCfg = Debug
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Debug|x86.ActiveCfg = Debug
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.DVD-5|Any CPU.ActiveCfg = Debug
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.DVD-5|ARM.ActiveCfg = Debug
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.DVD-5|Mixed Platforms.ActiveCfg = Debug
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.DVD-5|Win32.ActiveCfg = Debug
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.DVD-5|x64.ActiveCfg = Debug
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.DVD-5|x86.ActiveCfg = Debug
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Memento|Any CPU.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Memento|ARM.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Memento|Mixed Platforms.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Memento|Win32.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Memento|x64.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Memento|x86.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Release|Any CPU.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Release|ARM.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Release|Mixed Platforms.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Release|Win32.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Release|Win32.Build.0 = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Release|x64.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Release|x86.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.Release|x86.Build.0 = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.SingleImage|Any CPU.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.SingleImage|ARM.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.SingleImage|Mixed Platforms.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.SingleImage|Win32.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.SingleImage|x64.ActiveCfg = Release
- {FA5C8A67-3783-4096-B2E8-34BCF88F07EB}.SingleImage|x86.ActiveCfg = Release
{4D5C4349-480D-4CD6-9D3B-09C50BA35FA2}.CD_ROM|Any CPU.ActiveCfg = Release|Win32
{4D5C4349-480D-4CD6-9D3B-09C50BA35FA2}.CD_ROM|ARM.ActiveCfg = Release|Win32
{4D5C4349-480D-4CD6-9D3B-09C50BA35FA2}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Win32
@@ -755,6 +671,66 @@ Global
{DF87E242-8B2C-4F04-9A7E-61C578FD994C}.SingleImage|x64.Build.0 = Release|x64
{DF87E242-8B2C-4F04-9A7E-61C578FD994C}.SingleImage|x86.ActiveCfg = Release|Win32
{DF87E242-8B2C-4F04-9A7E-61C578FD994C}.SingleImage|x86.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|Any CPU.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|ARM.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|Mixed Platforms.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|Mixed Platforms.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|Win32.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|Win32.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|x64.ActiveCfg = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|x64.Build.0 = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|x86.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.CD_ROM|x86.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|ARM.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|Win32.Build.0 = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|x64.ActiveCfg = Debug|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|x64.Build.0 = Debug|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|x86.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Debug|x86.Build.0 = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|Any CPU.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|ARM.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|Mixed Platforms.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|Mixed Platforms.Build.0 = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|Win32.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|Win32.Build.0 = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|x64.ActiveCfg = Debug|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|x64.Build.0 = Debug|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|x86.ActiveCfg = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.DVD-5|x86.Build.0 = Debug|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|Any CPU.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|ARM.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|Mixed Platforms.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|Mixed Platforms.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|Win32.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|Win32.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|x64.ActiveCfg = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|x64.Build.0 = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|x86.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Memento|x86.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|Any CPU.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|ARM.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|Mixed Platforms.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|Win32.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|Win32.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|x64.ActiveCfg = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|x64.Build.0 = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|x86.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.Release|x86.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|Any CPU.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|ARM.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|Mixed Platforms.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|Mixed Platforms.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|Win32.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|Win32.Build.0 = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|x64.ActiveCfg = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|x64.Build.0 = Release|x64
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|x86.ActiveCfg = Release|Win32
+ {09FE8E75-9952-44E7-95F8-E8D74707FBA1}.SingleImage|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/platform/windows/mupdfnet/mupdfnet.cpp b/platform/windows/mupdfnet/mupdfnet.cpp
index 6a59aec9..a778537a 100644
--- a/platform/windows/mupdfnet/mupdfnet.cpp
+++ b/platform/windows/mupdfnet/mupdfnet.cpp
@@ -287,6 +287,14 @@ SYMBOL_DECLSPEC void* __stdcall mCreateDisplayListText(void *ctx, int page_num,
return text_ptr;
}
+SYMBOL_DECLSPEC void __stdcall mReleaseLists(void *ctx, void *dlist,
+ void *annot_dlist)
+{
+ muctx *mu_ctx = static_cast<muctx*>(ctx);
+ mu_ctx->ReleaseDisplayLists(dlist, annot_dlist);
+ return;
+}
+
SYMBOL_DECLSPEC int __stdcall mRenderPageMT(void *ctx, void *dlist,
void *annot_dlist, int page_width, int page_height, byte *bmp_data, int bmp_width,
int bmp_height, double scale, bool flipy)
@@ -444,13 +452,13 @@ SYMBOL_DECLSPEC int __stdcall mExtractPages(PCWSTR infile, PCWSTR outfile,
fz_optind = 1;
result = pdfclean_main(argc, argv);
- delete(num);
+ delete[] num;
delete(infilechar);
delete(outfilechar);
if (has_password)
delete(passchar);
if (num_pages > 0)
- delete(pagenums);
+ delete[] pagenums;
delete(argv);
return result;
}
diff --git a/platform/windows/mupdfnet/mupdfnet.h b/platform/windows/mupdfnet/mupdfnet.h
index 99d23062..44a4382b 100644
--- a/platform/windows/mupdfnet/mupdfnet.h
+++ b/platform/windows/mupdfnet/mupdfnet.h
@@ -50,6 +50,8 @@ EXTERN_C SYMBOL_DECLSPEC void* __stdcall mCreateDisplayListText(void *ctx, int p
int *page_width, int *page_height, void **textptr, int *length);
EXTERN_C SYMBOL_DECLSPEC void* __stdcall mCreateDisplayListAnnot(void *ctx,
int page_num);
+EXTERN_C SYMBOL_DECLSPEC void __stdcall mReleaseLists(void *ctx, void *dlist,
+ void *annot_dlist);
EXTERN_C SYMBOL_DECLSPEC int __stdcall mRenderPageMT(void *ctx, void *dlist,
void *annot_dlist, int page_width, int page_height, byte *bmp_data, int bmp_width,
diff --git a/platform/windows/mupdfwinrt/Cache.cpp b/platform/windows/mupdfwinrt/Cache.cpp
index b129710f..d5108a7c 100644
--- a/platform/windows/mupdfwinrt/Cache.cpp
+++ b/platform/windows/mupdfwinrt/Cache.cpp
@@ -22,7 +22,6 @@ void Cache::Empty(fz_context *mu_ctx)
cache_entry_t *old_entry = curr_entry;
curr_entry = old_entry->next;
fz_drop_display_list(mu_ctx, old_entry->dlist);
-
delete old_entry;
}
this->size = 0;
@@ -49,7 +48,10 @@ void Cache::Add(int value, int width_in, int height_in, fz_display_list *dlist,
tail = prev_entry;
- /* Decrement the caches rc of this list */
+ /* Decrement the caches rc of this list. It is gone from cache but
+ may still be in use by other threads, when threads are done they
+ should decrement and it should be freed at that time. See
+ ReleaseDisplayLists in muctx class */
fz_drop_display_list(mu_ctx, curr_entry->dlist);
delete curr_entry;
size--;
@@ -76,8 +78,8 @@ void Cache::Add(int value, int width_in, int height_in, fz_display_list *dlist,
head = new_entry;
}
size++;
- /* We are going to use this item now */
- fz_keep_display_list(mu_ctx, new_entry->dlist);
+ /* Everytime we add an entry, we are also using it. Increment rc. See above */
+ fz_keep_display_list(mu_ctx, dlist);
}
fz_display_list* Cache::Use(int value, int *width_out, int *height_out, fz_context *mu_ctx)
@@ -93,7 +95,6 @@ fz_display_list* Cache::Use(int value, int *width_out, int *height_out, fz_conte
}
if (curr_entry != NULL)
{
- fz_keep_display_list(mu_ctx, curr_entry->dlist);
/* Move this to the front */
if (curr_entry != head)
{
@@ -113,6 +114,9 @@ fz_display_list* Cache::Use(int value, int *width_out, int *height_out, fz_conte
}
*width_out = curr_entry->width;
*height_out = curr_entry->height;
+ /* We must increment our reference to this one to ensure it is not
+ freed when removed from the cache. See above comments */
+ fz_keep_display_list(mu_ctx, curr_entry->dlist);
return curr_entry->dlist;
}
else
diff --git a/platform/windows/mupdfwinrt/muctx.cpp b/platform/windows/mupdfwinrt/muctx.cpp
index d5c34c80..e51ea403 100644
--- a/platform/windows/mupdfwinrt/muctx.cpp
+++ b/platform/windows/mupdfwinrt/muctx.cpp
@@ -531,6 +531,21 @@ fz_display_list * muctx::CreateDisplayList(int page_num, int *width, int *height
return dlist;
}
+void muctx::ReleaseDisplayLists(void *opdlist, void *opannotlist)
+{
+ fz_display_list *dlist = (fz_display_list*) opdlist;
+ fz_display_list *annotlist = (fz_display_list*) opannotlist;
+
+ if (dlist != NULL)
+ {
+ fz_drop_display_list(mu_ctx, dlist);
+ }
+ if (annotlist != NULL)
+ {
+ fz_drop_display_list(mu_ctx, annotlist);
+ }
+}
+
/* A special version which will create the display list AND get the information
that we need for various text selection tasks */
fz_display_list * muctx::CreateDisplayListText(int page_num, int *width, int *height,
@@ -648,8 +663,6 @@ status_t muctx::RenderPageMT(void *dlist, void *a_dlist, int page_width, int pag
{
fz_free_device(dev);
fz_drop_pixmap(ctx_clone, pix);
- fz_drop_display_list(ctx_clone, display_list);
- fz_drop_display_list(ctx_clone, annot_displaylist);
}
fz_catch(ctx_clone)
{
@@ -689,11 +702,11 @@ status_t muctx::RenderPage(int page_num, unsigned char *bmp_data, int bmp_width,
bmp_height, bmp_data);
fz_clear_pixmap_with_value(mu_ctx, pix, 255);
dev = fz_new_draw_device(mu_ctx, pix);
- fz_run_page(mu_doc, page, dev, pctm, NULL);
+ fz_run_page_contents(mu_doc, page, dev, pctm, NULL);
fz_annot *annot;
for (annot = fz_first_annot(mu_doc, page); annot; annot = fz_next_annot(mu_doc, annot))
- fz_run_annot(mu_doc, page, annot, dev, &fz_identity, NULL);
+ fz_run_annot(mu_doc, page, annot, dev, pctm, NULL);
}
fz_always(mu_ctx)
{
@@ -879,8 +892,6 @@ status_t muctx::SavePage(char *filename, int page_num, int resolution, int type,
fz_drop_pixmap(mu_ctx, pix);
fz_free_device(dev);
fz_free_page(mu_doc, page);
- if (dlist != NULL)
- fz_drop_display_list(mu_ctx, dlist);
if (out != NULL)
{
fz_close_output(out);
diff --git a/platform/windows/mupdfwinrt/muctx.h b/platform/windows/mupdfwinrt/muctx.h
index 16c44cd1..5b870543 100644
--- a/platform/windows/mupdfwinrt/muctx.h
+++ b/platform/windows/mupdfwinrt/muctx.h
@@ -101,6 +101,7 @@ public:
fz_display_list * CreateDisplayListText(int page_num, int *width,
int *height, fz_text_page **text, int *length);
fz_display_list * CreateAnnotationList(int page_num);
+ void ReleaseDisplayLists(void *dlist, void *annotlist);
int MeasurePage(int page_num, point_t *size);
point_t MeasurePage(fz_page *page);
unsigned int GetLinks(int page_num, sh_vector_link links_vec);
diff --git a/platform/windows/mupdfwinrt/mudocument.cpp b/platform/windows/mupdfwinrt/mudocument.cpp
index 060144b3..29df67c3 100644
--- a/platform/windows/mupdfwinrt/mudocument.cpp
+++ b/platform/windows/mupdfwinrt/mudocument.cpp
@@ -217,6 +217,8 @@ int mudocument::RenderPageBitmapSync(int page_num, int bmp_width, int bmp_height
&(bmp_data[0]), bmp_width, bmp_height,
scale, flipy, tile, { top_left.X, top_left.Y },
{ bottom_right.X, bottom_right.Y });
+ /* Done with lists */
+ mu_object.ReleaseDisplayLists(dlist, annotlist);
}
else
{
@@ -290,7 +292,9 @@ Windows::Foundation::IAsyncOperation<InMemoryRandomAccessStream^>^
&(bmp_data[0]), bmp_width, bmp_height,
scale, true, false, { 0.0, 0.0 },
{ (float) bmp_width, (float) bmp_height });
- }
+ /* Done with lists */
+ mu_object.ReleaseDisplayLists(dlist, annotlist);
+ }
else
{
/* Rendering in immediate mode. Keep lock in place */
diff --git a/platform/x11/curl_stream.c b/platform/x11/curl_stream.c
index 9b806b79..07464d27 100644
--- a/platform/x11/curl_stream.c
+++ b/platform/x11/curl_stream.c
@@ -317,7 +317,7 @@ fetcher_thread(curl_stream_state *state)
}
static int
-stream_next(fz_stream *stream, int len)
+stream_next(fz_context *ctx, fz_stream *stream, int len)
{
curl_stream_state *state = (curl_stream_state *)stream->state;
int len_read = 0;
@@ -327,13 +327,13 @@ stream_next(fz_stream *stream, int len)
unsigned char *buf = state->public_buffer;
if (state->error != NULL)
- fz_throw(stream->ctx, FZ_ERROR_GENERIC, "cannot fetch data: %s", state->error);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot fetch data: %s", state->error);
if (len > sizeof(state->public_buffer))
len = sizeof(state->public_buffer);
if (state->content_length == 0)
- fz_throw(stream->ctx, FZ_ERROR_TRYLATER, "read of a block we don't have (A) (offset=%d)", read_point);
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "read of a block we don't have (A) (offset=%d)", read_point);
if (state->map == NULL)
{
@@ -342,7 +342,7 @@ stream_next(fz_stream *stream, int len)
if (read_point + len > state->current_fill_point)
{
stream->rp = stream->wp;
- fz_throw(stream->ctx, FZ_ERROR_TRYLATER, "read of a block we don't have (B) (offset=%d)", read_point);
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "read of a block we don't have (B) (offset=%d)", read_point);
}
memcpy(buf, state->buffer + read_point, len);
stream->rp = buf;
@@ -367,7 +367,7 @@ stream_next(fz_stream *stream, int len)
state->fill_point = block;
unlock(state);
stream->rp = stream->wp;
- fz_throw(stream->ctx, FZ_ERROR_TRYLATER, "read of a block we don't have (C) (offset=%d)", read_point);
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "read of a block we don't have (C) (offset=%d)", read_point);
}
block++;
if (left_over > len)
@@ -388,7 +388,7 @@ stream_next(fz_stream *stream, int len)
state->fill_point = block;
unlock(state);
stream->rp = stream->wp;
- fz_throw(stream->ctx, FZ_ERROR_TRYLATER, "read of a block we don't have (D) (offset=%d)", read_point);
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "read of a block we don't have (D) (offset=%d)", read_point);
}
block++;
memcpy(buf, state->buffer + read_point, BLOCK_SIZE);
@@ -407,7 +407,7 @@ stream_next(fz_stream *stream, int len)
state->fill_point = block;
unlock(state);
stream->rp = stream->wp;
- fz_throw(stream->ctx, FZ_ERROR_TRYLATER, "read of a block we don't have (E) (offset=%d)", read_point);
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "read of a block we don't have (E) (offset=%d)", read_point);
}
memcpy(buf, state->buffer + read_point, len);
len_read += len;
@@ -441,9 +441,9 @@ stream_close(fz_context *ctx, void *state_)
pthread_mutex_destroy(&state->mutex);
#endif
- fz_free(state->ctx, state->buffer);
- fz_free(state->ctx, state->map);
- fz_free(state->ctx, state);
+ fz_free(ctx, state->buffer);
+ fz_free(ctx, state->map);
+ fz_free(ctx, state);
}
static fz_stream hack_stream;
@@ -451,7 +451,7 @@ static curl_stream_state hack;
static int hack_pos;
static void
-stream_seek(fz_stream *stream, int offset, int whence)
+stream_seek(fz_context *ctx, fz_stream *stream, int offset, int whence)
{
curl_stream_state *state = (curl_stream_state *)stream->state;
@@ -479,7 +479,7 @@ stream_seek(fz_stream *stream, int offset, int whence)
}
static int
-stream_meta(fz_stream *stream, int key, int size, void *ptr)
+stream_meta(fz_context *ctx, fz_stream *stream, int key, int size, void *ptr)
{
curl_stream_state *state = (curl_stream_state *)stream->state;
@@ -487,7 +487,7 @@ stream_meta(fz_stream *stream, int key, int size, void *ptr)
{
case FZ_STREAM_META_LENGTH:
if (!state->data_arrived)
- fz_throw(stream->ctx, FZ_ERROR_TRYLATER, "still awaiting file length");
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "still awaiting file length");
return state->content_length;
case FZ_STREAM_META_PROGRESSIVE:
return 1;
@@ -540,7 +540,7 @@ fz_stream *fz_stream_from_curl(fz_context *ctx, char *filename, void (*more_data
#endif
- stream = fz_new_stream(ctx, state, stream_next, stream_close, NULL);
+ stream = fz_new_stream(ctx, state, stream_next, stream_close);
stream->seek = stream_seek;
stream->meta = stream_meta;
return stream;
diff --git a/platform/x11/jstest_main.c b/platform/x11/jstest_main.c
index 2188855d..98fec194 100644
--- a/platform/x11/jstest_main.c
+++ b/platform/x11/jstest_main.c
@@ -426,7 +426,7 @@ main(int argc, char *argv[])
if (file_open)
pdfapp_close(&gapp);
- fz_free_context(ctx);
+ fz_drop_context(ctx);
return 0;
}
diff --git a/platform/x11/pdfapp.c b/platform/x11/pdfapp.c
index 4f05a496..90e10f83 100644
--- a/platform/x11/pdfapp.c
+++ b/platform/x11/pdfapp.c
@@ -130,10 +130,10 @@ void pdfapp_init(fz_context *ctx, pdfapp_t *app)
void pdfapp_invert(pdfapp_t *app, const fz_rect *rect)
{
fz_irect b;
- fz_invert_pixmap_rect(app->image, fz_round_rect(&b, rect));
+ fz_invert_pixmap_rect(app->ctx, app->image, fz_round_rect(&b, rect));
}
-static void event_cb(pdf_doc_event *event, void *data)
+static void event_cb(fz_context *ctx, pdf_document *doc, pdf_doc_event *event, void *data)
{
pdfapp_t *app = (pdfapp_t *)data;
@@ -141,7 +141,7 @@ static void event_cb(pdf_doc_event *event, void *data)
{
case PDF_DOCUMENT_EVENT_ALERT:
{
- pdf_alert_event *alert = pdf_access_alert_event(event);
+ pdf_alert_event *alert = pdf_access_alert_event(ctx, event);
winalert(app, alert);
}
break;
@@ -152,7 +152,7 @@ static void event_cb(pdf_doc_event *event, void *data)
case PDF_DOCUMENT_EVENT_EXEC_MENU_ITEM:
{
- char *item = pdf_access_exec_menu_item_event(event);
+ char *item = pdf_access_exec_menu_item_event(ctx, event);
if (!strcmp(item, "Print"))
winprint(app);
@@ -167,7 +167,7 @@ static void event_cb(pdf_doc_event *event, void *data)
case PDF_DOCUMENT_EVENT_LAUNCH_URL:
{
- pdf_launch_url_event *launch_url = pdf_access_launch_url_event(event);
+ pdf_launch_url_event *launch_url = pdf_access_launch_url_event(ctx, event);
pdfapp_warn(app, "The document attempted to open url: %s. (Not supported by app)", launch_url->url);
}
@@ -175,7 +175,7 @@ static void event_cb(pdf_doc_event *event, void *data)
case PDF_DOCUMENT_EVENT_MAIL_DOC:
{
- pdf_mail_doc_event *mail_doc = pdf_access_mail_doc_event(event);
+ pdf_mail_doc_event *mail_doc = pdf_access_mail_doc_event(ctx, event);
pdfapp_warn(app, "The document attmepted to mail the document%s%s%s%s%s%s%s%s (Not supported)",
mail_doc->to[0]?", To: ":"", mail_doc->to,
@@ -227,7 +227,7 @@ void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps)
{
fz_try(ctx)
{
- fz_seek(app->stream, 0, SEEK_SET);
+ fz_seek(ctx, app->stream, 0, SEEK_SET);
app->doc = fz_open_document_with_stream(ctx, filename, app->stream);
}
fz_catch(ctx)
@@ -255,7 +255,7 @@ void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps)
{
fz_try(ctx)
{
- fz_seek(stream, 0, SEEK_SET);
+ fz_seek(ctx, stream, 0, SEEK_SET);
app->doc = fz_open_document_with_stream(ctx, filename, stream);
}
fz_catch(ctx)
@@ -271,23 +271,23 @@ void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps)
}
}
- idoc = pdf_specifics(app->doc);
+ idoc = pdf_specifics(app->ctx, app->doc);
if (idoc)
{
- pdf_enable_js(idoc);
- pdf_set_doc_event_callback(idoc, event_cb, app);
+ pdf_enable_js(ctx, idoc);
+ pdf_set_doc_event_callback(ctx, idoc, event_cb, app);
}
- if (fz_needs_password(app->doc))
+ if (fz_needs_password(app->ctx, app->doc))
{
- int okay = fz_authenticate_password(app->doc, password);
+ int okay = fz_authenticate_password(app->ctx, app->doc, password);
while (!okay)
{
password = winpassword(app, filename);
if (!password)
fz_throw(ctx, FZ_ERROR_GENERIC, "Needs a password");
- okay = fz_authenticate_password(app->doc, password);
+ okay = fz_authenticate_password(app->ctx, app->doc, password);
if (!okay)
pdfapp_warn(app, "Invalid password.");
}
@@ -305,7 +305,7 @@ void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps)
{
fz_try(ctx)
{
- app->pagecount = fz_count_pages(app->doc);
+ app->pagecount = fz_count_pages(app->ctx, app->doc);
if (app->pagecount <= 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "No pages in document");
}
@@ -324,7 +324,7 @@ void pdfapp_open_progressive(pdfapp_t *app, char *filename, int reload, int bps)
{
fz_try(ctx)
{
- app->outline = fz_load_outline(app->doc);
+ app->outline = fz_load_outline(app->ctx, app->doc);
}
fz_catch(ctx)
{
@@ -371,10 +371,10 @@ void pdfapp_close(pdfapp_t *app)
fz_drop_display_list(app->ctx, app->annotations_list);
app->annotations_list = NULL;
- fz_free_text_page(app->ctx, app->page_text);
+ fz_drop_text_page(app->ctx, app->page_text);
app->page_text = NULL;
- fz_free_text_sheet(app->ctx, app->page_sheet);
+ fz_drop_text_sheet(app->ctx, app->page_sheet);
app->page_sheet = NULL;
fz_drop_link(app->ctx, app->page_links);
@@ -395,17 +395,17 @@ void pdfapp_close(pdfapp_t *app)
fz_drop_pixmap(app->ctx, app->old_image);
app->old_image = NULL;
- fz_free_outline(app->ctx, app->outline);
+ fz_drop_outline(app->ctx, app->outline);
app->outline = NULL;
- fz_free_page(app->doc, app->page);
+ fz_drop_page(app->ctx, app->page);
app->page = NULL;
- fz_close_document(app->doc);
+ fz_drop_document(app->ctx, app->doc);
app->doc = NULL;
#ifdef HAVE_CURL
- fz_close(app->stream);
+ fz_drop_stream(app->ctx, app->stream);
#endif
fz_flush_warnings(app->ctx);
@@ -454,7 +454,7 @@ static int pdfapp_save(pdfapp_t *app)
if (strcmp(buf, app->docpath) != 0)
{
wincopyfile(app->docpath, buf);
- fz_write_document(app->doc, buf, &opts);
+ fz_write_document(app->ctx, app->doc, buf, &opts);
return 1;
}
@@ -465,7 +465,7 @@ static int pdfapp_save(pdfapp_t *app)
fz_try(app->ctx)
{
wincopyfile(app->docpath, buf);
- fz_write_document(app->doc, buf, &opts);
+ fz_write_document(app->ctx, app->doc, buf, &opts);
written = 1;
}
fz_catch(app->ctx)
@@ -490,9 +490,9 @@ static int pdfapp_save(pdfapp_t *app)
int pdfapp_preclose(pdfapp_t *app)
{
- pdf_document *idoc = pdf_specifics(app->doc);
+ pdf_document *idoc = pdf_specifics(app->ctx, app->doc);
- if (idoc && pdf_has_unsaved_changes(idoc))
+ if (idoc && pdf_has_unsaved_changes(app->ctx, idoc))
{
switch (winsavequery(app))
{
@@ -552,10 +552,10 @@ static void pdfapp_loadpage(pdfapp_t *app, int no_cache)
fz_drop_display_list(app->ctx, app->page_list);
fz_drop_display_list(app->ctx, app->annotations_list);
- fz_free_text_page(app->ctx, app->page_text);
- fz_free_text_sheet(app->ctx, app->page_sheet);
+ fz_drop_text_page(app->ctx, app->page_text);
+ fz_drop_text_sheet(app->ctx, app->page_sheet);
fz_drop_link(app->ctx, app->page_links);
- fz_free_page(app->doc, app->page);
+ fz_drop_page(app->ctx, app->page);
app->page_list = NULL;
app->annotations_list = NULL;
@@ -572,9 +572,9 @@ static void pdfapp_loadpage(pdfapp_t *app, int no_cache)
fz_try(app->ctx)
{
- app->page = fz_load_page(app->doc, app->pageno - 1);
+ app->page = fz_load_page(app->ctx, app->doc, app->pageno - 1);
- fz_bound_page(app->doc, app->page, &app->page_bbox);
+ fz_bound_page(app->ctx, app->page, &app->page_bbox);
}
fz_catch(app->ctx)
{
@@ -592,15 +592,15 @@ static void pdfapp_loadpage(pdfapp_t *app, int no_cache)
app->page_list = fz_new_display_list(app->ctx);
mdev = fz_new_list_device(app->ctx, app->page_list);
if (no_cache)
- fz_enable_device_hints(mdev, FZ_NO_CACHE);
+ fz_enable_device_hints(app->ctx, mdev, FZ_NO_CACHE);
cookie.incomplete_ok = 1;
- fz_run_page_contents(app->doc, app->page, mdev, &fz_identity, &cookie);
- fz_free_device(mdev);
+ fz_run_page_contents(app->ctx, app->page, mdev, &fz_identity, &cookie);
+ fz_drop_device(app->ctx, mdev);
mdev = NULL;
app->annotations_list = fz_new_display_list(app->ctx);
mdev = fz_new_list_device(app->ctx, app->annotations_list);
- for (annot = fz_first_annot(app->doc, app->page); annot; annot = fz_next_annot(app->doc, annot))
- fz_run_annot(app->doc, app->page, annot, mdev, &fz_identity, &cookie);
+ for (annot = fz_first_annot(app->ctx, app->page); annot; annot = fz_next_annot(app->ctx, app->page, annot))
+ fz_run_annot(app->ctx, app->page, annot, mdev, &fz_identity, &cookie);
if (cookie.incomplete)
{
app->incomplete = 1;
@@ -614,7 +614,7 @@ static void pdfapp_loadpage(pdfapp_t *app, int no_cache)
}
fz_always(app->ctx)
{
- fz_free_device(mdev);
+ fz_drop_device(app->ctx, mdev);
}
fz_catch(app->ctx)
{
@@ -629,7 +629,7 @@ static void pdfapp_loadpage(pdfapp_t *app, int no_cache)
fz_try(app->ctx)
{
- app->page_links = fz_load_links(app->doc, app->page);
+ app->page_links = fz_load_links(app->ctx, app->page);
}
fz_catch(app->ctx)
{
@@ -659,8 +659,8 @@ static void pdfapp_recreate_annotationslist(pdfapp_t *app)
/* Create display list */
app->annotations_list = fz_new_display_list(app->ctx);
mdev = fz_new_list_device(app->ctx, app->annotations_list);
- for (annot = fz_first_annot(app->doc, app->page); annot; annot = fz_next_annot(app->doc, annot))
- fz_run_annot(app->doc, app->page, annot, mdev, &fz_identity, &cookie);
+ for (annot = fz_first_annot(app->ctx, app->page); annot; annot = fz_next_annot(app->ctx, app->page, annot))
+ fz_run_annot(app->ctx, app->page, annot, mdev, &fz_identity, &cookie);
if (cookie.incomplete)
{
app->incomplete = 1;
@@ -674,7 +674,7 @@ static void pdfapp_recreate_annotationslist(pdfapp_t *app)
}
fz_always(app->ctx)
{
- fz_free_device(mdev);
+ fz_drop_device(app->ctx, mdev);
}
fz_catch(app->ctx)
{
@@ -687,37 +687,37 @@ static void pdfapp_recreate_annotationslist(pdfapp_t *app)
static void pdfapp_runpage(pdfapp_t *app, fz_device *dev, const fz_matrix *ctm, const fz_rect *rect, fz_cookie *cookie)
{
- fz_begin_page(dev, rect, ctm);
+ fz_begin_page(app->ctx, dev, rect, ctm);
if (app->page_list)
- fz_run_display_list(app->page_list, dev, ctm, rect, cookie);
+ fz_run_display_list(app->ctx, app->page_list, dev, ctm, rect, cookie);
if (app->annotations_list)
- fz_run_display_list(app->annotations_list, dev, ctm, rect, cookie);
- fz_end_page(dev);
+ fz_run_display_list(app->ctx, app->annotations_list, dev, ctm, rect, cookie);
+ fz_end_page(app->ctx, dev);
}
#define MAX_TITLE 256
static void pdfapp_updatepage(pdfapp_t *app)
{
- pdf_document *idoc = pdf_specifics(app->doc);
+ pdf_document *idoc = pdf_specifics(app->ctx, app->doc);
fz_device *idev;
fz_matrix ctm;
fz_annot *annot;
pdfapp_viewctm(&ctm, app);
- pdf_update_page(idoc, (pdf_page *)app->page);
+ pdf_update_page(app->ctx, idoc, (pdf_page *)app->page);
pdfapp_recreate_annotationslist(app);
- while ((annot = (fz_annot *)pdf_poll_changed_annot(idoc, (pdf_page *)app->page)) != NULL)
+ while ((annot = (fz_annot *)pdf_poll_changed_annot(app->ctx, idoc, (pdf_page *)app->page)) != NULL)
{
fz_rect bounds;
fz_irect ibounds;
- fz_transform_rect(fz_bound_annot(app->doc, annot, &bounds), &ctm);
+ fz_transform_rect(fz_bound_annot(app->ctx, app->page, annot, &bounds), &ctm);
fz_rect_from_irect(&bounds, fz_round_rect(&ibounds, &bounds));
fz_clear_pixmap_rect_with_value(app->ctx, app->image, 255, &ibounds);
idev = fz_new_draw_device_with_bbox(app->ctx, app->image, &ibounds);
pdfapp_runpage(app, idev, &ctm, &bounds, NULL);
- fz_free_device(idev);
+ fz_drop_device(app->ctx, idev);
}
pdfapp_showpage(app, 0, 0, 1, 0, 0);
@@ -729,7 +729,7 @@ void pdfapp_reloadpage(pdfapp_t *app)
{
fz_try(app->ctx)
{
- app->outline = fz_load_outline(app->doc);
+ app->outline = fz_load_outline(app->ctx, app->doc);
}
fz_catch(app->ctx)
{
@@ -778,7 +778,7 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai
{
tdev = fz_new_text_device(app->ctx, app->page_sheet, app->page_text);
pdfapp_runpage(app, tdev, &fz_identity, &fz_infinite_rect, &cookie);
- fz_free_device(tdev);
+ fz_drop_device(app->ctx, tdev);
}
}
@@ -819,7 +819,7 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai
{
idev = fz_new_draw_device(app->ctx, app->image);
pdfapp_runpage(app, idev, &ctm, &bounds, &cookie);
- fz_free_device(idev);
+ fz_drop_device(app->ctx, idev);
}
if (app->invert)
fz_invert_pixmap(app->ctx, app->image);
@@ -838,12 +838,12 @@ static void pdfapp_showpage(pdfapp_t *app, int loadpage, int drawpage, int repai
colorspace = app->colorspace;
app->image = fz_new_pixmap_with_bbox(app->ctx, colorspace, &ibounds);
app->duration = 0;
- new_trans = fz_page_presentation(app->doc, app->page, &app->duration);
+ new_trans = fz_page_presentation(app->ctx, app->page, &app->duration);
if (new_trans)
app->transition = *new_trans;
if (app->duration == 0)
app->duration = 5;
- app->in_transit = fz_generate_transition(app->image, app->old_image, app->new_image, 0, &app->transition);
+ app->in_transit = fz_generate_transition(app->ctx, app->image, app->old_image, app->new_image, 0, &app->transition);
if (!app->in_transit)
{
if (app->duration != 0)
@@ -1411,7 +1411,7 @@ void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int sta
if (btn == 1 && (state == 1 || state == -1))
{
pdf_ui_event event;
- pdf_document *idoc = pdf_specifics(app->doc);
+ pdf_document *idoc = pdf_specifics(app->ctx, app->doc);
event.etype = PDF_EVENT_TYPE_POINTER;
event.event.pointer.pt = p;
@@ -1420,22 +1420,22 @@ void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int sta
else /* state == -1 */
event.event.pointer.ptype = PDF_POINTER_UP;
- if (idoc && pdf_pass_event(idoc, (pdf_page *)app->page, &event))
+ if (idoc && pdf_pass_event(ctx, idoc, (pdf_page *)app->page, &event))
{
pdf_widget *widget;
- widget = pdf_focused_widget(idoc);
+ widget = pdf_focused_widget(ctx, idoc);
app->nowaitcursor = 1;
pdfapp_updatepage(app);
if (widget)
{
- switch (pdf_widget_get_type(widget))
+ switch (pdf_widget_get_type(ctx, widget))
{
case PDF_WIDGET_TYPE_TEXT:
{
- char *text = pdf_text_widget_text(idoc, widget);
+ char *text = pdf_text_widget_text(ctx, idoc, widget);
char *current_text = text;
int retry = 0;
@@ -1444,7 +1444,7 @@ void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int sta
current_text = wintextinput(app, current_text, retry);
retry = 1;
}
- while (current_text && !pdf_text_widget_set_text(idoc, widget, current_text));
+ while (current_text && !pdf_text_widget_set_text(ctx, idoc, widget, current_text));
fz_free(app->ctx, text);
pdfapp_updatepage(app);
@@ -1464,17 +1464,17 @@ void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int sta
fz_try(ctx)
{
- nopts = pdf_choice_widget_options(idoc, widget, NULL);
+ nopts = pdf_choice_widget_options(ctx, idoc, widget, NULL);
opts = fz_malloc(ctx, nopts * sizeof(*opts));
- (void)pdf_choice_widget_options(idoc, widget, opts);
+ (void)pdf_choice_widget_options(ctx, idoc, widget, opts);
- nvals = pdf_choice_widget_value(idoc, widget, NULL);
+ nvals = pdf_choice_widget_value(ctx, idoc, widget, NULL);
vals = fz_malloc(ctx, MAX(nvals,nopts) * sizeof(*vals));
- (void)pdf_choice_widget_value(idoc, widget, vals);
+ (void)pdf_choice_widget_value(ctx, idoc, widget, vals);
if (winchoiceinput(app, nopts, opts, &nvals, vals))
{
- pdf_choice_widget_set_value(idoc, widget, nvals, vals);
+ pdf_choice_widget_set_value(ctx, idoc, widget, nvals, vals);
pdfapp_updatepage(app);
}
}
@@ -1495,7 +1495,7 @@ void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int sta
char ebuf[256];
ebuf[0] = 0;
- if (pdf_check_signature(idoc, widget, app->docpath, ebuf, sizeof(ebuf)))
+ if (pdf_check_signature(ctx, idoc, widget, app->docpath, ebuf, sizeof(ebuf)))
{
winwarn(app, "Signature is valid");
}
@@ -1538,10 +1538,10 @@ void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int sta
else
{
fz_annot *annot;
- for (annot = fz_first_annot(app->doc, app->page); annot; annot = fz_next_annot(app->doc, annot))
+ for (annot = fz_first_annot(app->ctx, app->page); annot; annot = fz_next_annot(app->ctx, app->page, annot))
{
fz_rect rect;
- fz_bound_annot(app->doc, annot, &rect);
+ fz_bound_annot(app->ctx, app->page, annot, &rect);
if (x >= rect.x0 && x < rect.x1)
if (y >= rect.y0 && y < rect.y1)
break;
@@ -1729,7 +1729,7 @@ void pdfapp_oncopy(pdfapp_t *app, unsigned short *ucsbuf, int ucslen)
{
for (i = 0; i < span->len; i++)
{
- fz_text_char_bbox(&hitbox, span, i);
+ fz_text_char_bbox(app->ctx, &hitbox, span, i);
fz_transform_rect(&hitbox, &ctm);
c = span->text[i].c;
if (c < 32)
@@ -1787,7 +1787,7 @@ void pdfapp_postblit(pdfapp_t *app)
winadvancetimer(app, app->duration);
}
else
- fz_generate_transition(app->image, app->old_image, app->new_image, llama, &app->transition);
+ fz_generate_transition(app->ctx, app->image, app->old_image, app->new_image, llama, &app->transition);
winrepaint(app);
if (llama >= 256)
{
diff --git a/platform/x11/win_main.c b/platform/x11/win_main.c
index 50cc7285..781e6892 100644
--- a/platform/x11/win_main.c
+++ b/platform/x11/win_main.c
@@ -443,6 +443,7 @@ dloginfoproc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
char buf[256];
wchar_t bufx[256];
+ fz_context *ctx = gapp.ctx;
fz_document *doc = gapp.doc;
switch(message)
@@ -451,7 +452,7 @@ dloginfoproc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
SetDlgItemTextW(hwnd, 0x10, wbuf);
- if (fz_meta(doc, FZ_META_FORMAT_INFO, buf, 256) < 0)
+ if (fz_meta(ctx, doc, FZ_META_FORMAT_INFO, buf, 256) < 0)
{
SetDlgItemTextA(hwnd, 0x11, "Unknown");
SetDlgItemTextA(hwnd, 0x12, "None");
@@ -461,7 +462,7 @@ dloginfoproc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
SetDlgItemTextA(hwnd, 0x11, buf);
- if (fz_meta(doc, FZ_META_CRYPT_INFO, buf, 256) == 0)
+ if (fz_meta(ctx, doc, FZ_META_CRYPT_INFO, buf, 256) == 0)
{
SetDlgItemTextA(hwnd, 0x12, buf);
}
@@ -470,13 +471,13 @@ dloginfoproc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
SetDlgItemTextA(hwnd, 0x12, "None");
}
buf[0] = 0;
- if (fz_meta(doc, FZ_META_HAS_PERMISSION, NULL, FZ_PERMISSION_PRINT) == 0)
+ if (fz_meta(ctx, doc, FZ_META_HAS_PERMISSION, NULL, FZ_PERMISSION_PRINT) == 0)
strcat(buf, "print, ");
- if (fz_meta(doc, FZ_META_HAS_PERMISSION, NULL, FZ_PERMISSION_CHANGE) == 0)
+ if (fz_meta(ctx, doc, FZ_META_HAS_PERMISSION, NULL, FZ_PERMISSION_CHANGE) == 0)
strcat(buf, "modify, ");
- if (fz_meta(doc, FZ_META_HAS_PERMISSION, NULL, FZ_PERMISSION_COPY) == 0)
+ if (fz_meta(ctx, doc, FZ_META_HAS_PERMISSION, NULL, FZ_PERMISSION_COPY) == 0)
strcat(buf, "copy, ");
- if (fz_meta(doc, FZ_META_HAS_PERMISSION, NULL, FZ_PERMISSION_NOTES) == 0)
+ if (fz_meta(ctx, doc, FZ_META_HAS_PERMISSION, NULL, FZ_PERMISSION_NOTES) == 0)
strcat(buf, "annotate, ");
if (strlen(buf) > 2)
buf[strlen(buf)-2] = 0;
@@ -487,7 +488,7 @@ dloginfoproc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
#define SETUTF8(ID, STRING) \
{ \
*(char **)buf = STRING; \
- if (fz_meta(doc, FZ_META_INFO, buf, 256) <= 0) \
+ if (fz_meta(ctx, doc, FZ_META_INFO, buf, 256) <= 0) \
buf[0] = 0; \
MultiByteToWideChar(CP_UTF8, 0, buf, -1, bufx, nelem(bufx)); \
SetDlgItemTextW(hwnd, ID, bufx); \
@@ -1220,7 +1221,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShow
}
do_close(&gapp);
- fz_free_context(ctx);
+ fz_drop_context(ctx);
return 0;
}
diff --git a/platform/x11/x11_main.c b/platform/x11/x11_main.c
index b2413777..cb067ecc 100644
--- a/platform/x11/x11_main.c
+++ b/platform/x11/x11_main.c
@@ -344,7 +344,7 @@ void cleanup(pdfapp_t *app)
XCloseDisplay(xdpy);
- fz_free_context(ctx);
+ fz_drop_context(ctx);
}
static int winresolution()
diff --git a/resources/fonts/droid/DroidSans.ttf b/resources/fonts/droid/DroidSans.ttf
deleted file mode 100644
index ad1efca8..00000000
--- a/resources/fonts/droid/DroidSans.ttf
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/droid/DroidSansMono.ttf b/resources/fonts/droid/DroidSansMono.ttf
deleted file mode 100644
index a0070719..00000000
--- a/resources/fonts/droid/DroidSansMono.ttf
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusMon-Bol.cff b/resources/fonts/urw/NimbusMon-Bol.cff
deleted file mode 100644
index 7b9b6dfc..00000000
--- a/resources/fonts/urw/NimbusMon-Bol.cff
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusMon-BolObl.cff b/resources/fonts/urw/NimbusMon-BolObl.cff
deleted file mode 100644
index 350a8646..00000000
--- a/resources/fonts/urw/NimbusMon-BolObl.cff
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusMon-Obl.cff b/resources/fonts/urw/NimbusMon-Obl.cff
deleted file mode 100644
index c0a33da0..00000000
--- a/resources/fonts/urw/NimbusMon-Obl.cff
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusMon-Reg.cff b/resources/fonts/urw/NimbusMon-Reg.cff
deleted file mode 100644
index 2ce477ec..00000000
--- a/resources/fonts/urw/NimbusMon-Reg.cff
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusMono-Bold.cff b/resources/fonts/urw/NimbusMono-Bold.cff
new file mode 100644
index 00000000..f1ff9532
--- /dev/null
+++ b/resources/fonts/urw/NimbusMono-Bold.cff
Binary files differ
diff --git a/resources/fonts/urw/NimbusMono-BoldOblique.cff b/resources/fonts/urw/NimbusMono-BoldOblique.cff
new file mode 100644
index 00000000..db42140c
--- /dev/null
+++ b/resources/fonts/urw/NimbusMono-BoldOblique.cff
Binary files differ
diff --git a/resources/fonts/urw/NimbusMono-Oblique.cff b/resources/fonts/urw/NimbusMono-Oblique.cff
new file mode 100644
index 00000000..101a91a2
--- /dev/null
+++ b/resources/fonts/urw/NimbusMono-Oblique.cff
Binary files differ
diff --git a/resources/fonts/urw/NimbusMono-Regular.cff b/resources/fonts/urw/NimbusMono-Regular.cff
new file mode 100644
index 00000000..606b4e4c
--- /dev/null
+++ b/resources/fonts/urw/NimbusMono-Regular.cff
Binary files differ
diff --git a/resources/fonts/urw/NimbusRom-Ita.cff b/resources/fonts/urw/NimbusRom-Ita.cff
deleted file mode 100644
index 7d99ef20..00000000
--- a/resources/fonts/urw/NimbusRom-Ita.cff
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusRom-Med.cff b/resources/fonts/urw/NimbusRom-Med.cff
deleted file mode 100644
index d66d287c..00000000
--- a/resources/fonts/urw/NimbusRom-Med.cff
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusRom-MedIta.cff b/resources/fonts/urw/NimbusRom-MedIta.cff
deleted file mode 100644
index 1d1dedc6..00000000
--- a/resources/fonts/urw/NimbusRom-MedIta.cff
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusRom-Reg.cff b/resources/fonts/urw/NimbusRom-Reg.cff
deleted file mode 100644
index 54bb40b4..00000000
--- a/resources/fonts/urw/NimbusRom-Reg.cff
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusRomNo9L-Med.cff b/resources/fonts/urw/NimbusRomNo9L-Med.cff
new file mode 100644
index 00000000..cbcc4202
--- /dev/null
+++ b/resources/fonts/urw/NimbusRomNo9L-Med.cff
Binary files differ
diff --git a/resources/fonts/urw/NimbusRomNo9L-MedIta.cff b/resources/fonts/urw/NimbusRomNo9L-MedIta.cff
new file mode 100644
index 00000000..53381635
--- /dev/null
+++ b/resources/fonts/urw/NimbusRomNo9L-MedIta.cff
Binary files differ
diff --git a/resources/fonts/urw/NimbusRomNo9L-Reg.cff b/resources/fonts/urw/NimbusRomNo9L-Reg.cff
new file mode 100644
index 00000000..c9383466
--- /dev/null
+++ b/resources/fonts/urw/NimbusRomNo9L-Reg.cff
Binary files differ
diff --git a/resources/fonts/urw/NimbusRomNo9L-RegIta.cff b/resources/fonts/urw/NimbusRomNo9L-RegIta.cff
new file mode 100644
index 00000000..7eb19abf
--- /dev/null
+++ b/resources/fonts/urw/NimbusRomNo9L-RegIta.cff
Binary files differ
diff --git a/resources/fonts/urw/NimbusSan-Bol.cff b/resources/fonts/urw/NimbusSan-Bol.cff
deleted file mode 100644
index 07f3b863..00000000
--- a/resources/fonts/urw/NimbusSan-Bol.cff
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusSan-BolIta.cff b/resources/fonts/urw/NimbusSan-BolIta.cff
deleted file mode 100644
index 0cf09564..00000000
--- a/resources/fonts/urw/NimbusSan-BolIta.cff
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusSan-Ita.cff b/resources/fonts/urw/NimbusSan-Ita.cff
deleted file mode 100644
index 91235729..00000000
--- a/resources/fonts/urw/NimbusSan-Ita.cff
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusSan-Reg.cff b/resources/fonts/urw/NimbusSan-Reg.cff
deleted file mode 100644
index fe400cab..00000000
--- a/resources/fonts/urw/NimbusSan-Reg.cff
+++ /dev/null
Binary files differ
diff --git a/resources/fonts/urw/NimbusSanL-Bol.cff b/resources/fonts/urw/NimbusSanL-Bol.cff
new file mode 100644
index 00000000..a6fa198b
--- /dev/null
+++ b/resources/fonts/urw/NimbusSanL-Bol.cff
Binary files differ
diff --git a/resources/fonts/urw/NimbusSanL-BolIta.cff b/resources/fonts/urw/NimbusSanL-BolIta.cff
new file mode 100644
index 00000000..94495dee
--- /dev/null
+++ b/resources/fonts/urw/NimbusSanL-BolIta.cff
Binary files differ
diff --git a/resources/fonts/urw/NimbusSanL-Reg.cff b/resources/fonts/urw/NimbusSanL-Reg.cff
new file mode 100644
index 00000000..f747c886
--- /dev/null
+++ b/resources/fonts/urw/NimbusSanL-Reg.cff
Binary files differ
diff --git a/resources/fonts/urw/NimbusSanL-RegIta.cff b/resources/fonts/urw/NimbusSanL-RegIta.cff
new file mode 100644
index 00000000..a434af57
--- /dev/null
+++ b/resources/fonts/urw/NimbusSanL-RegIta.cff
Binary files differ
diff --git a/scripts/cmapdump.c b/scripts/cmapdump.c
index 3251c701..3c4540e9 100644
--- a/scripts/cmapdump.c
+++ b/scripts/cmapdump.c
@@ -98,7 +98,7 @@ main(int argc, char **argv)
fi = fz_open_file(ctx, argv[i]);
cmap = pdf_load_cmap(ctx, fi);
- fz_close(fi);
+ fz_drop_stream(ctx, fi);
fprintf(fo, "\n/* %s */\n\n", cmap->cmap_name);
@@ -140,7 +140,7 @@ main(int argc, char **argv)
}
fprintf(fo, "static pdf_cmap cmap_%s = {\n", name);
- fprintf(fo, "\t{-1, pdf_free_cmap_imp}, ");
+ fprintf(fo, "\t{-1, pdf_drop_cmap_imp}, ");
fprintf(fo, "\"%s\", ", cmap->cmap_name);
fprintf(fo, "\"%s\", 0, ", cmap->usecmap_name);
fprintf(fo, "%u, ", cmap->wmode);
@@ -180,7 +180,7 @@ main(int argc, char **argv)
return 1;
}
- fz_free_context(ctx);
+ fz_drop_context(ctx);
return 0;
}
@@ -214,7 +214,7 @@ void fz_new_aa_context(fz_context *ctx)
{
}
-void fz_free_aa_context(fz_context *ctx)
+void fz_drop_aa_context(fz_context *ctx)
{
}
diff --git a/source/cbz/mucbz.c b/source/cbz/mucbz.c
index e72412fb..c85cca45 100644
--- a/source/cbz/mucbz.c
+++ b/source/cbz/mucbz.c
@@ -1,8 +1,9 @@
-#include "mupdf/cbz.h"
+#include "mupdf/fitz.h"
#define DPI 72.0f
-static void cbz_init_document(cbz_document *doc);
+typedef struct cbz_document_s cbz_document;
+typedef struct cbz_page_s cbz_page;
static const char *cbz_ext_list[] = {
".jpg", ".jpeg", ".png",
@@ -12,13 +13,13 @@ static const char *cbz_ext_list[] = {
struct cbz_page_s
{
+ fz_page super;
fz_image *image;
};
struct cbz_document_s
{
fz_document super;
- fz_context *ctx;
fz_archive *zip;
int page_count;
const char **page;
@@ -73,9 +74,8 @@ cbz_compare_page_names(const void *a, const void *b)
}
static void
-cbz_create_page_list(cbz_document *doc)
+cbz_create_page_list(fz_context *ctx, cbz_document *doc)
{
- fz_context *ctx = doc->ctx;
fz_archive *zip = doc->zip;
int i, k, count;
@@ -92,89 +92,70 @@ cbz_create_page_list(cbz_document *doc)
if (strstr(name, cbz_ext_list[k]))
{
doc->page[doc->page_count++] = name;
-printf("found page %d = '%s'\n", i, name);
break;
}
}
}
- qsort(doc->page, doc->page_count, sizeof *doc->page, cbz_compare_page_names);
-
- for (i = 0; i < doc->page_count; ++i)
- printf(" %d = %s\n", i, doc->page[i]);
+ qsort((char **)doc->page, doc->page_count, sizeof *doc->page, cbz_compare_page_names);
}
-cbz_document *
-cbz_open_document_with_stream(fz_context *ctx, fz_stream *file)
+static void
+cbz_close_document(fz_context *ctx, cbz_document *doc)
{
- cbz_document *doc;
-
- doc = fz_malloc_struct(ctx, cbz_document);
- cbz_init_document(doc);
- doc->ctx = ctx;
- doc->page_count = 0;
- doc->page = NULL;
-
- fz_try(ctx)
- {
- doc->zip = fz_open_archive_with_stream(ctx, file);
- cbz_create_page_list(doc);
- }
- fz_catch(ctx)
- {
- cbz_close_document(doc);
- fz_rethrow(ctx);
- }
-
- return doc;
+ fz_drop_archive(ctx, doc->zip);
+ fz_free(ctx, (char **)doc->page);
+ fz_free(ctx, doc);
}
-cbz_document *
-cbz_open_document(fz_context *ctx, const char *filename)
+static int
+cbz_count_pages(fz_context *ctx, cbz_document *doc)
{
- fz_stream *file;
- cbz_document *doc;
-
- file = fz_open_file(ctx, filename);
- if (!file)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot open file '%s': %s", filename, strerror(errno));
+ return doc->page_count;
+}
- fz_try(ctx)
- {
- doc = cbz_open_document_with_stream(ctx, file);
- }
- fz_always(ctx)
- {
- fz_close(file);
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
- }
+static fz_rect *
+cbz_bound_page(fz_context *ctx, cbz_page *page, fz_rect *bbox)
+{
+ fz_image *image = page->image;
+ int xres, yres;
- return doc;
+ fz_image_get_sanitised_res(image, &xres, &yres);
+ bbox->x0 = bbox->y0 = 0;
+ bbox->x1 = image->w * DPI / xres;
+ bbox->y1 = image->h * DPI / yres;
+ return bbox;
}
-void
-cbz_close_document(cbz_document *doc)
+static void
+cbz_run_page(fz_context *ctx, cbz_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
{
- fz_close_archive(doc->ctx, doc->zip);
- fz_free(doc->ctx, doc->page);
- fz_free(doc->ctx, doc);
+ fz_matrix local_ctm = *ctm;
+ fz_image *image = page->image;
+ int xres, yres;
+ float w, h;
+
+ fz_image_get_sanitised_res(image, &xres, &yres);
+ w = image->w * DPI / xres;
+ h = image->h * DPI / yres;
+ fz_pre_scale(&local_ctm, w, h);
+ fz_fill_image(ctx, dev, image, &local_ctm, 1);
}
-int
-cbz_count_pages(cbz_document *doc)
+static void
+cbz_drop_page_imp(fz_context *ctx, cbz_page *page)
{
- return doc->page_count;
+ if (!page)
+ return;
+ fz_drop_image(ctx, page->image);
}
-cbz_page *
-cbz_load_page(cbz_document *doc, int number)
+static cbz_page *
+cbz_load_page(fz_context *ctx, cbz_document *doc, int number)
{
- fz_context *ctx = doc->ctx;
unsigned char *data = NULL;
cbz_page *page = NULL;
+ fz_buffer *buf;
if (number < 0 || number >= doc->page_count)
return NULL;
@@ -182,58 +163,31 @@ cbz_load_page(cbz_document *doc, int number)
fz_var(data);
fz_var(page);
- fz_buffer *buf = fz_read_archive_entry(doc->ctx, doc->zip, doc->page[number]);
+ buf = fz_read_archive_entry(ctx, doc->zip, doc->page[number]);
fz_try(ctx)
{
- page = fz_malloc_struct(ctx, cbz_page);
+ page = fz_new_page(ctx, sizeof *page);
+ page->super.bound_page = (fz_page_bound_page_fn *)cbz_bound_page;
+ page->super.run_page_contents = (fz_page_run_page_contents_fn *)cbz_run_page;
+ page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)cbz_drop_page_imp;
page->image = fz_new_image_from_buffer(ctx, buf);
}
fz_always(ctx)
{
- fz_drop_buffer(doc->ctx, buf);
+ fz_drop_buffer(ctx, buf);
}
fz_catch(ctx)
{
fz_free(ctx, data);
- cbz_free_page(doc, page);
+ cbz_drop_page_imp(ctx, page);
fz_rethrow(ctx);
}
return page;
}
-void
-cbz_free_page(cbz_document *doc, cbz_page *page)
-{
- if (!page)
- return;
- fz_drop_image(doc->ctx, page->image);
- fz_free(doc->ctx, page);
-}
-
-fz_rect *
-cbz_bound_page(cbz_document *doc, cbz_page *page, fz_rect *bbox)
-{
- fz_image *image = page->image;
- bbox->x0 = bbox->y0 = 0;
- bbox->x1 = image->w * DPI / image->xres;
- bbox->y1 = image->h * DPI / image->yres;
- return bbox;
-}
-
-void
-cbz_run_page(cbz_document *doc, cbz_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
-{
- fz_matrix local_ctm = *ctm;
- fz_image *image = page->image;
- float w = image->w * DPI / image->xres;
- float h = image->h * DPI / image->yres;
- fz_pre_scale(&local_ctm, w, h);
- fz_fill_image(dev, image, &local_ctm, 1);
-}
-
static int
-cbz_meta(cbz_document *doc, int key, void *ptr, int size)
+cbz_meta(fz_context *ctx, cbz_document *doc, int key, void *ptr, int size)
{
switch (key)
{
@@ -245,24 +199,45 @@ cbz_meta(cbz_document *doc, int key, void *ptr, int size)
}
}
-static void
-cbz_rebind(cbz_document *doc, fz_context *ctx)
+static cbz_document *
+cbz_open_document_with_stream(fz_context *ctx, fz_stream *file)
{
- doc->ctx = ctx;
- fz_rebind_archive(doc->zip, ctx);
-}
+ cbz_document *doc = fz_new_document(ctx, sizeof *doc);
-static void
-cbz_init_document(cbz_document *doc)
-{
doc->super.close = (fz_document_close_fn *)cbz_close_document;
doc->super.count_pages = (fz_document_count_pages_fn *)cbz_count_pages;
doc->super.load_page = (fz_document_load_page_fn *)cbz_load_page;
- doc->super.bound_page = (fz_document_bound_page_fn *)cbz_bound_page;
- doc->super.run_page_contents = (fz_document_run_page_contents_fn *)cbz_run_page;
- doc->super.free_page = (fz_document_free_page_fn *)cbz_free_page;
doc->super.meta = (fz_document_meta_fn *)cbz_meta;
- doc->super.rebind = (fz_document_rebind_fn *)cbz_rebind;
+
+ fz_try(ctx)
+ {
+ doc->zip = fz_open_archive_with_stream(ctx, file);
+ cbz_create_page_list(ctx, doc);
+ }
+ fz_catch(ctx)
+ {
+ cbz_close_document(ctx, doc);
+ fz_rethrow(ctx);
+ }
+ return doc;
+}
+
+static cbz_document *
+cbz_open_document(fz_context *ctx, const char *filename)
+{
+ fz_stream *file;
+ cbz_document *doc;
+
+ file = fz_open_file(ctx, filename);
+
+ fz_try(ctx)
+ doc = cbz_open_document_with_stream(ctx, file);
+ fz_always(ctx)
+ fz_drop_stream(ctx, file);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
+
+ return doc;
}
static int
diff --git a/source/cbz/muimg.c b/source/cbz/muimg.c
new file mode 100644
index 00000000..169fec95
--- /dev/null
+++ b/source/cbz/muimg.c
@@ -0,0 +1,183 @@
+#include "mupdf/fitz.h"
+
+#define DPI 72.0f
+
+typedef struct img_document_s img_document;
+typedef struct img_page_s img_page;
+
+struct img_page_s
+{
+ fz_page super;
+ fz_image *image;
+};
+
+struct img_document_s
+{
+ fz_document super;
+ fz_image *image;
+};
+
+static void
+img_close_document(fz_context *ctx, img_document *doc)
+{
+ fz_drop_image(ctx, doc->image);
+ fz_free(ctx, doc);
+}
+
+static int
+img_count_pages(fz_context *ctx, img_document *doc)
+{
+ return 1;
+}
+
+static fz_rect *
+img_bound_page(fz_context *ctx, img_page *page, fz_rect *bbox)
+{
+ fz_image *image = page->image;
+ int xres, yres;
+ fz_image_get_sanitised_res(image, &xres, &yres);
+ bbox->x0 = bbox->y0 = 0;
+ bbox->x1 = image->w * DPI / xres;
+ bbox->y1 = image->h * DPI / yres;
+ return bbox;
+}
+
+static void
+img_run_page(fz_context *ctx, img_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+{
+ fz_matrix local_ctm = *ctm;
+ fz_image *image = page->image;
+ int xres, yres;
+ float w, h;
+ fz_image_get_sanitised_res(image, &xres, &yres);
+ w = image->w * DPI / xres;
+ h = image->h * DPI / yres;
+ fz_pre_scale(&local_ctm, w, h);
+ fz_fill_image(ctx, dev, image, &local_ctm, 1);
+}
+
+static void
+img_drop_page_imp(fz_context *ctx, img_page *page)
+{
+ fz_drop_image(ctx, page->image);
+}
+
+static img_page *
+img_load_page(fz_context *ctx, img_document *doc, int number)
+{
+ img_page *page;
+
+ if (number != 0)
+ return NULL;
+
+ page = fz_new_page(ctx, sizeof *page);
+
+ page->super.bound_page = (fz_page_bound_page_fn *)img_bound_page;
+ page->super.run_page_contents = (fz_page_run_page_contents_fn *)img_run_page;
+ page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)img_drop_page_imp;
+
+ page->image = fz_keep_image(ctx, doc->image);
+
+ return page;
+}
+
+static int
+img_meta(fz_context *ctx, img_document *doc, int key, void *ptr, int size)
+{
+ switch(key)
+ {
+ case FZ_META_FORMAT_INFO:
+ sprintf((char *)ptr, "IMAGE");
+ return FZ_META_OK;
+ default:
+ return FZ_META_UNKNOWN_KEY;
+ }
+}
+
+static img_document *
+img_new_document(fz_context *ctx, fz_image *image)
+{
+ img_document *doc = fz_new_document(ctx, sizeof *doc);
+
+ doc->super.close = (fz_document_close_fn *)img_close_document;
+ doc->super.count_pages = (fz_document_count_pages_fn *)img_count_pages;
+ doc->super.load_page = (fz_document_load_page_fn *)img_load_page;
+ doc->super.meta = (fz_document_meta_fn *)img_meta;
+
+ doc->image = fz_keep_image(ctx, image);
+
+ return doc;
+}
+
+static img_document *
+img_open_document_with_stream(fz_context *ctx, fz_stream *stm)
+{
+ fz_buffer *buffer = NULL;
+ fz_image *image = NULL;
+ img_document *doc;
+
+ fz_var(buffer);
+ fz_var(image);
+
+ fz_try(ctx)
+ {
+ buffer = fz_read_all(ctx, stm, 1024);
+ image = fz_new_image_from_buffer(ctx, buffer);
+ doc = img_new_document(ctx, image);
+ }
+ fz_always(ctx)
+ {
+ fz_drop_image(ctx, image);
+ fz_drop_buffer(ctx, buffer);
+ }
+ fz_catch(ctx)
+ fz_rethrow(ctx);
+
+ return doc;
+}
+
+static img_document *
+img_open_document(fz_context *ctx, const char *filename)
+{
+ fz_stream *stm;
+ img_document *doc;
+
+ stm = fz_open_file(ctx, filename);
+
+ fz_try(ctx)
+ doc = img_open_document_with_stream(ctx, stm);
+ fz_always(ctx)
+ fz_drop_stream(ctx, stm);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
+
+ return doc;
+}
+
+static int
+img_recognize(fz_context *doc, const char *magic)
+{
+ char *ext = strrchr(magic, '.');
+
+ if (ext)
+ {
+ if (!fz_strcasecmp(ext, ".png") || !fz_strcasecmp(ext, ".jpg") ||
+ !fz_strcasecmp(ext, ".jpeg") || !fz_strcasecmp(ext, ".jfif") ||
+ !fz_strcasecmp(ext, ".jfif-tbnl") || !fz_strcasecmp(ext, ".jpe"))
+ return 100;
+ }
+ if (!strcmp(magic, "png") || !strcmp(magic, "image/png") ||
+ !strcmp(magic, "jpg") || !strcmp(magic, "image/jpeg") ||
+ !strcmp(magic, "jpeg") || !strcmp(magic, "image/pjpeg") ||
+ !strcmp(magic, "jpe") || !strcmp(magic, "jfif"))
+ return 100;
+
+ return 0;
+}
+
+fz_document_handler img_document_handler =
+{
+ (fz_document_recognize_fn *)&img_recognize,
+ (fz_document_open_fn *)&img_open_document,
+ (fz_document_open_with_stream_fn *)&img_open_document_with_stream
+};
diff --git a/source/tiff/mutiff.c b/source/cbz/mutiff.c
index e2772f11..3a30cc79 100644
--- a/source/tiff/mutiff.c
+++ b/source/cbz/mutiff.c
@@ -1,156 +1,106 @@
-#include "mupdf/tiff.h"
+#include "mupdf/fitz.h"
-static void tiff_init_document(tiff_document *doc);
+typedef struct tiff_document_s tiff_document;
+typedef struct tiff_page_s tiff_page;
#define DPI 72.0f
struct tiff_page_s
{
+ fz_page super;
fz_image *image;
};
struct tiff_document_s
{
fz_document super;
-
- fz_context *ctx;
- fz_stream *file;
fz_buffer *buffer;
int page_count;
};
-tiff_document *
-tiff_open_document_with_stream(fz_context *ctx, fz_stream *file)
+static fz_rect *
+tiff_bound_page(fz_context *ctx, tiff_page *page, fz_rect *bbox)
{
- tiff_document *doc;
- int len;
- unsigned char *buf;
-
- doc = fz_malloc_struct(ctx, tiff_document);
- tiff_init_document(doc);
- doc->ctx = ctx;
- doc->file = fz_keep_stream(file);
- doc->page_count = 0;
-
- fz_try(ctx)
- {
- doc->buffer = fz_read_all(doc->file, 1024);
- len = doc->buffer->len;
- buf = doc->buffer->data;
-
- doc->page_count = fz_load_tiff_subimage_count(ctx, buf, len);
- }
- fz_catch(ctx)
- {
- tiff_close_document(doc);
- fz_rethrow(ctx);
- }
+ fz_image *image = page->image;
+ int xres, yres;
- return doc;
+ fz_image_get_sanitised_res(image, &xres, &yres);
+ bbox->x0 = bbox->y0 = 0;
+ bbox->x1 = image->w * DPI / xres;
+ bbox->y1 = image->h * DPI / yres;
+ return bbox;
}
-tiff_document *
-tiff_open_document(fz_context *ctx, const char *filename)
+static void
+tiff_run_page(fz_context *ctx, tiff_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
{
- fz_stream *file;
- tiff_document *doc;
-
- file = fz_open_file(ctx, filename);
- if (!file)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot open file '%s': %s", filename, strerror(errno));
-
- fz_try(ctx)
- {
- doc = tiff_open_document_with_stream(ctx, file);
- }
- fz_always(ctx)
- {
- fz_close(file);
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
- }
-
- return doc;
-}
+ fz_matrix local_ctm = *ctm;
+ fz_image *image = page->image;
+ int xres, yres;
+ float w, h;
-void
-tiff_close_document(tiff_document *doc)
-{
- fz_context *ctx = doc->ctx;
- fz_drop_buffer(ctx, doc->buffer);
- fz_close(doc->file);
- fz_free(ctx, doc);
+ fz_image_get_sanitised_res(image, &xres, &yres);
+ w = image->w * DPI / xres;
+ h = image->h * DPI / yres;
+ fz_pre_scale(&local_ctm, w, h);
+ fz_fill_image(ctx, dev, image, &local_ctm, 1);
}
-int
-tiff_count_pages(tiff_document *doc)
+static void
+tiff_drop_page_imp(fz_context *ctx, tiff_page *page)
{
- return doc->page_count;
+ if (!page)
+ return;
+ fz_drop_image(ctx, page->image);
}
-tiff_page *
-tiff_load_page(tiff_document *doc, int number)
+static tiff_page *
+tiff_load_page(fz_context *ctx, tiff_document *doc, int number)
{
- fz_context *ctx = doc->ctx;
- fz_image *mask = NULL;
fz_pixmap *pixmap = NULL;
+ fz_image *image = NULL;
tiff_page *page = NULL;
if (number < 0 || number >= doc->page_count)
return NULL;
fz_var(pixmap);
+ fz_var(image);
fz_var(page);
+
fz_try(ctx)
{
pixmap = fz_load_tiff_subimage(ctx, doc->buffer->data, doc->buffer->len, number);
+ image = fz_new_image_from_pixmap(ctx, pixmap, NULL);
- page = fz_malloc_struct(ctx, tiff_page);
- page->image = fz_new_image_from_pixmap(ctx, pixmap, mask);
+ page = fz_new_page(ctx, sizeof *page);
+ page->super.bound_page = (fz_page_bound_page_fn *)tiff_bound_page;
+ page->super.run_page_contents = (fz_page_run_page_contents_fn *)tiff_run_page;
+ page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)tiff_drop_page_imp;
+ page->image = fz_keep_image(ctx, image);
+ }
+ fz_always(ctx)
+ {
+ fz_drop_image(ctx, image);
+ fz_drop_pixmap(ctx, pixmap);
}
fz_catch(ctx)
{
- tiff_free_page(doc, page);
+ fz_free(ctx, page);
fz_rethrow(ctx);
}
return page;
}
-void
-tiff_free_page(tiff_document *doc, tiff_page *page)
-{
- if (!page)
- return;
- fz_drop_image(doc->ctx, page->image);
- fz_free(doc->ctx, page);
-}
-
-fz_rect *
-tiff_bound_page(tiff_document *doc, tiff_page *page, fz_rect *bbox)
-{
- fz_image *image = page->image;
- bbox->x0 = bbox->y0 = 0;
- bbox->x1 = image->w * DPI / image->xres;
- bbox->y1 = image->h * DPI / image->yres;
- return bbox;
-}
-
-void
-tiff_run_page(tiff_document *doc, tiff_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+static int
+tiff_count_pages(fz_context *ctx, tiff_document *doc)
{
- fz_matrix local_ctm = *ctm;
- fz_image *image = page->image;
- float w = image->w * DPI / image->xres;
- float h = image->h * DPI / image->yres;
- fz_pre_scale(&local_ctm, w, h);
- fz_fill_image(dev, image, &local_ctm, 1);
+ return doc->page_count;
}
static int
-tiff_meta(tiff_document *doc, int key, void *ptr, int size)
+tiff_meta(fz_context *ctx, tiff_document *doc, int key, void *ptr, int size)
{
switch (key)
{
@@ -163,23 +113,54 @@ tiff_meta(tiff_document *doc, int key, void *ptr, int size)
}
static void
-tiff_rebind(tiff_document *doc, fz_context *ctx)
+tiff_close_document(fz_context *ctx, tiff_document *doc)
{
- doc->ctx = ctx;
- fz_rebind_stream(doc->file, ctx);
+ fz_drop_buffer(ctx, doc->buffer);
+ fz_free(ctx, doc);
}
-static void
-tiff_init_document(tiff_document *doc)
+static tiff_document *
+tiff_open_document_with_stream(fz_context *ctx, fz_stream *file)
{
+ tiff_document *doc;
+
+ doc = fz_new_document(ctx, sizeof *doc);
+
doc->super.close = (fz_document_close_fn *)tiff_close_document;
doc->super.count_pages = (fz_document_count_pages_fn *)tiff_count_pages;
doc->super.load_page = (fz_document_load_page_fn *)tiff_load_page;
- doc->super.bound_page = (fz_document_bound_page_fn *)tiff_bound_page;
- doc->super.run_page_contents = (fz_document_run_page_contents_fn *)tiff_run_page;
- doc->super.free_page = (fz_document_free_page_fn *)tiff_free_page;
doc->super.meta = (fz_document_meta_fn *)tiff_meta;
- doc->super.rebind = (fz_document_rebind_fn *)tiff_rebind;
+
+ fz_try(ctx)
+ {
+ doc->buffer = fz_read_all(ctx, file, 1024);
+ doc->page_count = fz_load_tiff_subimage_count(ctx, doc->buffer->data, doc->buffer->len);
+ }
+ fz_catch(ctx)
+ {
+ tiff_close_document(ctx, doc);
+ fz_rethrow(ctx);
+ }
+
+ return doc;
+}
+
+static tiff_document *
+tiff_open_document(fz_context *ctx, const char *filename)
+{
+ fz_stream *file;
+ tiff_document *doc;
+
+ file = fz_open_file(ctx, filename);
+
+ fz_try(ctx)
+ doc = tiff_open_document_with_stream(ctx, file);
+ fz_always(ctx)
+ fz_drop_stream(ctx, file);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
+
+ return doc;
}
static int
diff --git a/source/fitz/bbox-device.c b/source/fitz/bbox-device.c
index 8a298fe1..2c639499 100644
--- a/source/fitz/bbox-device.c
+++ b/source/fitz/bbox-device.c
@@ -2,230 +2,230 @@
#define STACK_SIZE 96
-typedef struct fz_bbox_data_s
+typedef struct fz_bbox_device_s
{
+ fz_device super;
+
fz_rect *result;
int top;
fz_rect stack[STACK_SIZE];
/* mask content and tiles are ignored */
int ignore;
-} fz_bbox_data;
+} fz_bbox_device;
static void
-fz_bbox_add_rect(fz_device *dev, const fz_rect *rect, int clip)
+fz_bbox_add_rect(fz_context *ctx, fz_device *dev, const fz_rect *rect, int clip)
{
- fz_bbox_data *data = dev->user;
+ fz_bbox_device *bdev = (fz_bbox_device*)dev;
fz_rect r = *rect;
- if (0 < data->top && data->top <= STACK_SIZE)
+ if (0 < bdev->top && bdev->top <= STACK_SIZE)
{
- fz_intersect_rect(&r, &data->stack[data->top-1]);
+ fz_intersect_rect(&r, &bdev->stack[bdev->top-1]);
}
- if (!clip && data->top <= STACK_SIZE && !data->ignore)
+ if (!clip && bdev->top <= STACK_SIZE && !bdev->ignore)
{
- fz_union_rect(data->result, &r);
+ fz_union_rect(bdev->result, &r);
}
- if (clip && ++data->top <= STACK_SIZE)
+ if (clip && ++bdev->top <= STACK_SIZE)
{
- data->stack[data->top-1] = r;
+ bdev->stack[bdev->top-1] = r;
}
}
static void
-fz_bbox_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
+fz_bbox_fill_path(fz_context *ctx, fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_rect r;
- fz_bbox_add_rect(dev, fz_bound_path(dev->ctx, path, NULL, ctm, &r), 0);
+ fz_bbox_add_rect(ctx, dev, fz_bound_path(ctx, path, NULL, ctm, &r), 0);
}
static void
-fz_bbox_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke,
+fz_bbox_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, fz_stroke_state *stroke,
const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha)
{
fz_rect r;
- fz_bbox_add_rect(dev, fz_bound_path(dev->ctx, path, stroke, ctm, &r), 0);
+ fz_bbox_add_rect(ctx, dev, fz_bound_path(ctx, path, stroke, ctm, &r), 0);
}
static void
-fz_bbox_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm,
+fz_bbox_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_rect r;
- fz_bbox_add_rect(dev, fz_bound_text(dev->ctx, text, NULL, ctm, &r), 0);
+ fz_bbox_add_rect(ctx, dev, fz_bound_text(ctx, text, NULL, ctm, &r), 0);
}
static void
-fz_bbox_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke,
+fz_bbox_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke,
const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha)
{
fz_rect r;
- fz_bbox_add_rect(dev, fz_bound_text(dev->ctx, text, stroke, ctm, &r), 0);
+ fz_bbox_add_rect(ctx, dev, fz_bound_text(ctx, text, stroke, ctm, &r), 0);
}
static void
-fz_bbox_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
+fz_bbox_fill_shade(fz_context *ctx, fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
{
fz_rect r;
- fz_bbox_add_rect(dev, fz_bound_shade(dev->ctx, shade, ctm, &r), 0);
+ fz_bbox_add_rect(ctx, dev, fz_bound_shade(ctx, shade, ctm, &r), 0);
}
static void
-fz_bbox_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
+fz_bbox_fill_image(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
{
fz_rect r = fz_unit_rect;
- fz_bbox_add_rect(dev, fz_transform_rect(&r, ctm), 0);
+ fz_bbox_add_rect(ctx, dev, fz_transform_rect(&r, ctm), 0);
}
static void
-fz_bbox_fill_image_mask(fz_device *dev, fz_image *image, const fz_matrix *ctm,
+fz_bbox_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
fz_rect r = fz_unit_rect;
- fz_bbox_add_rect(dev, fz_transform_rect(&r, ctm), 0);
+ fz_bbox_add_rect(ctx, dev, fz_transform_rect(&r, ctm), 0);
}
static void
-fz_bbox_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
+fz_bbox_clip_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
{
fz_rect r;
- fz_bbox_add_rect(dev, fz_bound_path(dev->ctx, path, NULL, ctm, &r), 1);
+ fz_bbox_add_rect(ctx, dev, fz_bound_path(ctx, path, NULL, ctm, &r), 1);
}
static void
-fz_bbox_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
+fz_bbox_clip_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
{
fz_rect r;
- fz_bbox_add_rect(dev, fz_bound_path(dev->ctx, path, stroke, ctm, &r), 1);
+ fz_bbox_add_rect(ctx, dev, fz_bound_path(ctx, path, stroke, ctm, &r), 1);
}
static void
-fz_bbox_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
+fz_bbox_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
{
fz_rect r = fz_infinite_rect;
if (accumulate)
- fz_bbox_add_rect(dev, &r, accumulate != 2);
+ fz_bbox_add_rect(ctx, dev, &r, accumulate != 2);
else
- fz_bbox_add_rect(dev, fz_bound_text(dev->ctx, text, NULL, ctm, &r), 1);
+ fz_bbox_add_rect(ctx, dev, fz_bound_text(ctx, text, NULL, ctm, &r), 1);
}
static void
-fz_bbox_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
+fz_bbox_clip_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
{
fz_rect r;
- fz_bbox_add_rect(dev, fz_bound_text(dev->ctx, text, stroke, ctm, &r), 1);
+ fz_bbox_add_rect(ctx, dev, fz_bound_text(ctx, text, stroke, ctm, &r), 1);
}
static void
-fz_bbox_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
+fz_bbox_clip_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
{
fz_rect r = fz_unit_rect;
- fz_bbox_add_rect(dev, fz_transform_rect(&r, ctm), 1);
+ fz_bbox_add_rect(ctx, dev, fz_transform_rect(&r, ctm), 1);
}
static void
-fz_bbox_pop_clip(fz_device *dev)
+fz_bbox_pop_clip(fz_context *ctx, fz_device *dev)
{
- fz_bbox_data *data = dev->user;
- if (data->top > 0)
- data->top--;
+ fz_bbox_device *bdev = (fz_bbox_device*)dev;
+ if (bdev->top > 0)
+ bdev->top--;
else
- fz_warn(dev->ctx, "unexpected pop clip");
+ fz_warn(ctx, "unexpected pop clip");
}
static void
-fz_bbox_begin_mask(fz_device *dev, const fz_rect *rect, int luminosity, fz_colorspace *colorspace, float *color)
+fz_bbox_begin_mask(fz_context *ctx, fz_device *dev, const fz_rect *rect, int luminosity, fz_colorspace *colorspace, float *color)
{
- fz_bbox_data *data = dev->user;
- fz_bbox_add_rect(dev, rect, 1);
- data->ignore++;
+ fz_bbox_device *bdev = (fz_bbox_device*)dev;
+ fz_bbox_add_rect(ctx, dev, rect, 1);
+ bdev->ignore++;
}
static void
-fz_bbox_end_mask(fz_device *dev)
+fz_bbox_end_mask(fz_context *ctx, fz_device *dev)
{
- fz_bbox_data *data = dev->user;
- assert(data->ignore > 0);
- data->ignore--;
+ fz_bbox_device *bdev = (fz_bbox_device*)dev;
+ assert(bdev->ignore > 0);
+ bdev->ignore--;
}
static void
-fz_bbox_begin_group(fz_device *dev, const fz_rect *rect, int isolated, int knockout, int blendmode, float alpha)
+fz_bbox_begin_group(fz_context *ctx, fz_device *dev, const fz_rect *rect, int isolated, int knockout, int blendmode, float alpha)
{
- fz_bbox_add_rect(dev, rect, 1);
+ fz_bbox_add_rect(ctx, dev, rect, 1);
}
static void
-fz_bbox_end_group(fz_device *dev)
+fz_bbox_end_group(fz_context *ctx, fz_device *dev)
{
- fz_bbox_pop_clip(dev);
+ fz_bbox_pop_clip(ctx, dev);
}
static int
-fz_bbox_begin_tile(fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
+fz_bbox_begin_tile(fz_context *ctx, fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
{
- fz_bbox_data *data = dev->user;
+ fz_bbox_device *bdev = (fz_bbox_device*)dev;
fz_rect r = *area;
- fz_bbox_add_rect(dev, fz_transform_rect(&r, ctm), 0);
- data->ignore++;
+ fz_bbox_add_rect(ctx, dev, fz_transform_rect(&r, ctm), 0);
+ bdev->ignore++;
return 0;
}
static void
-fz_bbox_end_tile(fz_device *dev)
+fz_bbox_end_tile(fz_context *ctx, fz_device *dev)
{
- fz_bbox_data *data = dev->user;
- assert(data->ignore > 0);
- data->ignore--;
+ fz_bbox_device *bdev = (fz_bbox_device*)dev;
+ assert(bdev->ignore > 0);
+ bdev->ignore--;
}
static void
-fz_bbox_free_user(fz_device *dev)
+fz_bbox_drop_imp(fz_context *ctx, fz_device *dev)
{
- fz_bbox_data *data = dev->user;
- if (data->top > 0)
- fz_warn(dev->ctx, "items left on stack in bbox device: %d", data->top);
- fz_free(dev->ctx, dev->user);
+ fz_bbox_device *bdev = (fz_bbox_device*)dev;
+ if (bdev->top > 0)
+ fz_warn(ctx, "items left on stack in bbox device: %d", bdev->top);
}
fz_device *
fz_new_bbox_device(fz_context *ctx, fz_rect *result)
{
- fz_device *dev;
+ fz_bbox_device *dev = fz_new_device(ctx, sizeof *dev);
+
+ dev->super.drop_imp = fz_bbox_drop_imp;
- fz_bbox_data *user = fz_malloc_struct(ctx, fz_bbox_data);
- user->result = result;
- user->top = 0;
- user->ignore = 0;
- dev = fz_new_device(ctx, user);
- dev->free_user = fz_bbox_free_user;
+ dev->super.fill_path = fz_bbox_fill_path;
+ dev->super.stroke_path = fz_bbox_stroke_path;
+ dev->super.clip_path = fz_bbox_clip_path;
+ dev->super.clip_stroke_path = fz_bbox_clip_stroke_path;
- dev->fill_path = fz_bbox_fill_path;
- dev->stroke_path = fz_bbox_stroke_path;
- dev->clip_path = fz_bbox_clip_path;
- dev->clip_stroke_path = fz_bbox_clip_stroke_path;
+ dev->super.fill_text = fz_bbox_fill_text;
+ dev->super.stroke_text = fz_bbox_stroke_text;
+ dev->super.clip_text = fz_bbox_clip_text;
+ dev->super.clip_stroke_text = fz_bbox_clip_stroke_text;
- dev->fill_text = fz_bbox_fill_text;
- dev->stroke_text = fz_bbox_stroke_text;
- dev->clip_text = fz_bbox_clip_text;
- dev->clip_stroke_text = fz_bbox_clip_stroke_text;
+ dev->super.fill_shade = fz_bbox_fill_shade;
+ dev->super.fill_image = fz_bbox_fill_image;
+ dev->super.fill_image_mask = fz_bbox_fill_image_mask;
+ dev->super.clip_image_mask = fz_bbox_clip_image_mask;
- dev->fill_shade = fz_bbox_fill_shade;
- dev->fill_image = fz_bbox_fill_image;
- dev->fill_image_mask = fz_bbox_fill_image_mask;
- dev->clip_image_mask = fz_bbox_clip_image_mask;
+ dev->super.pop_clip = fz_bbox_pop_clip;
- dev->pop_clip = fz_bbox_pop_clip;
+ dev->super.begin_mask = fz_bbox_begin_mask;
+ dev->super.end_mask = fz_bbox_end_mask;
+ dev->super.begin_group = fz_bbox_begin_group;
+ dev->super.end_group = fz_bbox_end_group;
- dev->begin_mask = fz_bbox_begin_mask;
- dev->end_mask = fz_bbox_end_mask;
- dev->begin_group = fz_bbox_begin_group;
- dev->end_group = fz_bbox_end_group;
+ dev->super.begin_tile = fz_bbox_begin_tile;
+ dev->super.end_tile = fz_bbox_end_tile;
- dev->begin_tile = fz_bbox_begin_tile;
- dev->end_tile = fz_bbox_end_tile;
+ dev->result = result;
+ dev->top = 0;
+ dev->ignore = 0;
*result = fz_empty_rect;
- return dev;
+ return (fz_device*)dev;
}
diff --git a/source/fitz/buffer.c b/source/fitz/buffer.c
index acfdc20a..df0163f5 100644
--- a/source/fitz/buffer.c
+++ b/source/fitz/buffer.c
@@ -361,7 +361,7 @@ fz_test_buffer_write(fz_context *ctx)
k = (rand() & 31)+1;
if (k > j)
k = j;
- fz_write_buffer_bits(ctx, copy, fz_read_bits(stm, k), k);
+ fz_write_buffer_bits(ctx, copy, fz_read_bits(ctx, stm, k), k);
j -= k;
}
while (j);
@@ -370,7 +370,7 @@ fz_test_buffer_write(fz_context *ctx)
fprintf(stderr, "Copied buffer is different!\n");
fz_seek(stm, 0, 0);
}
- fz_close(stm);
+ fz_drop_stream(stm);
fz_drop_buffer(ctx, master);
fz_drop_buffer(ctx, copy);
}
diff --git a/source/fitz/colorspace.c b/source/fitz/colorspace.c
index 8b8f3f96..d145be27 100644
--- a/source/fitz/colorspace.c
+++ b/source/fitz/colorspace.c
@@ -3,7 +3,7 @@
#define SLOWCMYK
void
-fz_free_colorspace_imp(fz_context *ctx, fz_storable *cs_)
+fz_drop_colorspace_imp(fz_context *ctx, fz_storable *cs_)
{
fz_colorspace *cs = (fz_colorspace *)cs_;
@@ -15,8 +15,8 @@ fz_free_colorspace_imp(fz_context *ctx, fz_storable *cs_)
fz_colorspace *
fz_new_colorspace(fz_context *ctx, char *name, int n)
{
- fz_colorspace *cs = fz_malloc(ctx, sizeof(fz_colorspace));
- FZ_INIT_STORABLE(cs, 1, fz_free_colorspace_imp);
+ fz_colorspace *cs = fz_malloc_struct(ctx, fz_colorspace);
+ FZ_INIT_STORABLE(cs, 1, fz_drop_colorspace_imp);
cs->size = sizeof(fz_colorspace);
fz_strlcpy(cs->name, name, sizeof cs->name);
cs->n = n;
@@ -169,10 +169,10 @@ static void rgb_to_cmyk(fz_context *ctx, fz_colorspace *cs, const float *rgb, fl
cmyk[3] = k;
}
-static fz_colorspace k_default_gray = { {-1, fz_free_colorspace_imp}, 0, "DeviceGray", 1, gray_to_rgb, rgb_to_gray };
-static fz_colorspace k_default_rgb = { {-1, fz_free_colorspace_imp}, 0, "DeviceRGB", 3, rgb_to_rgb, rgb_to_rgb };
-static fz_colorspace k_default_bgr = { {-1, fz_free_colorspace_imp}, 0, "DeviceBGR", 3, bgr_to_rgb, rgb_to_bgr };
-static fz_colorspace k_default_cmyk = { {-1, fz_free_colorspace_imp}, 0, "DeviceCMYK", 4, cmyk_to_rgb, rgb_to_cmyk };
+static fz_colorspace k_default_gray = { {-1, fz_drop_colorspace_imp}, 0, "DeviceGray", 1, gray_to_rgb, rgb_to_gray };
+static fz_colorspace k_default_rgb = { {-1, fz_drop_colorspace_imp}, 0, "DeviceRGB", 3, rgb_to_rgb, rgb_to_rgb };
+static fz_colorspace k_default_bgr = { {-1, fz_drop_colorspace_imp}, 0, "DeviceBGR", 3, bgr_to_rgb, rgb_to_bgr };
+static fz_colorspace k_default_cmyk = { {-1, fz_drop_colorspace_imp}, 0, "DeviceCMYK", 4, cmyk_to_rgb, rgb_to_cmyk };
static fz_colorspace *fz_default_gray = &k_default_gray;
static fz_colorspace *fz_default_rgb = &k_default_rgb;
@@ -198,23 +198,16 @@ void fz_new_colorspace_context(fz_context *ctx)
fz_colorspace_context *
fz_keep_colorspace_context(fz_context *ctx)
{
- if (!ctx || !ctx->colorspace)
+ if (!ctx)
return NULL;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- ctx->colorspace->ctx_refs++;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- return ctx->colorspace;
+ return fz_keep_imp(ctx, ctx->colorspace, &ctx->colorspace->ctx_refs);
}
void fz_drop_colorspace_context(fz_context *ctx)
{
- int drop;
- if (!ctx || !ctx->colorspace)
+ if (!ctx)
return;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- drop = --ctx->colorspace->ctx_refs;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- if (drop == 0)
+ if (fz_drop_imp(ctx, ctx->colorspace, &ctx->colorspace->ctx_refs))
fz_free(ctx, ctx->colorspace);
}
@@ -286,7 +279,7 @@ fz_set_device_cmyk(fz_context *ctx, fz_colorspace *cs)
}
int
-fz_colorspace_is_indexed(fz_colorspace *cs)
+fz_colorspace_is_indexed(fz_context *ctx, fz_colorspace *cs)
{
return (cs && !strcmp(cs->name, "Indexed"));
}
@@ -840,14 +833,14 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src)
{
fz_color_converter cc;
- fz_lookup_color_converter(&cc, ctx, ds, ss);
+ fz_lookup_color_converter(ctx, &cc, ds, ss);
for (; xy > 0; xy--)
{
srcv[0] = *s++ / 255.0f * 100;
srcv[1] = *s++ - 128;
srcv[2] = *s++ - 128;
- cc.convert(&cc, dstv, srcv);
+ cc.convert(ctx, &cc, dstv, srcv);
for (k = 0; k < dstn; k++)
*d++ = dstv[k] * 255;
@@ -861,13 +854,13 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src)
{
fz_color_converter cc;
- fz_lookup_color_converter(&cc, ctx, ds, ss);
+ fz_lookup_color_converter(ctx, &cc, ds, ss);
for (; xy > 0; xy--)
{
for (k = 0; k < srcn; k++)
srcv[k] = *s++ / 255.0f;
- cc.convert(&cc, dstv, srcv);
+ cc.convert(ctx, &cc, dstv, srcv);
for (k = 0; k < dstn; k++)
*d++ = dstv[k] * 255;
@@ -882,11 +875,11 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src)
unsigned char lookup[FZ_MAX_COLORS * 256];
fz_color_converter cc;
- fz_lookup_color_converter(&cc, ctx, ds, ss);
+ fz_lookup_color_converter(ctx, &cc, ds, ss);
for (i = 0; i < 256; i++)
{
srcv[0] = i / 255.0f;
- cc.convert(&cc, dstv, srcv);
+ cc.convert(ctx, &cc, dstv, srcv);
for (k = 0; k < dstn; k++)
lookup[i * dstn + k] = dstv[k] * 255;
}
@@ -909,7 +902,7 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src)
unsigned char *sold = &dummy;
fz_color_converter cc;
- fz_lookup_color_converter(&cc, ctx, ds, ss);
+ fz_lookup_color_converter(ctx, &cc, ds, ss);
lookup = fz_new_hash_table(ctx, 509, srcn, -1);
for (; xy > 0; xy--)
@@ -937,7 +930,7 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src)
{
for (k = 0; k < srcn; k++)
srcv[k] = *s++ / 255.0f;
- cc.convert(&cc, dstv, srcv);
+ cc.convert(ctx, &cc, dstv, srcv);
for (k = 0; k < dstn; k++)
*d++ = dstv[k] * 255;
@@ -948,7 +941,7 @@ fz_std_conv_pixmap(fz_context *ctx, fz_pixmap *dst, fz_pixmap *src)
}
}
- fz_free_hash(ctx, lookup);
+ fz_drop_hash(ctx, lookup);
}
}
@@ -1000,13 +993,12 @@ fz_convert_pixmap(fz_context *ctx, fz_pixmap *dp, fz_pixmap *sp)
/* Convert a single color */
static void
-std_conv_color(fz_color_converter *cc, float *dstv, const float *srcv)
+std_conv_color(fz_context *ctx, fz_color_converter *cc, float *dstv, const float *srcv)
{
float rgb[3];
int i;
fz_colorspace *srcs = cc->ss;
fz_colorspace *dsts = cc->ds;
- fz_context *ctx = cc->ctx;
if (srcs != dsts)
{
@@ -1024,7 +1016,7 @@ std_conv_color(fz_color_converter *cc, float *dstv, const float *srcv)
}
static void
-g2rgb(fz_color_converter *cc, float *dv, const float *sv)
+g2rgb(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
dv[0] = sv[0];
dv[1] = sv[0];
@@ -1032,7 +1024,7 @@ g2rgb(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-g2cmyk(fz_color_converter *cc, float *dv, const float *sv)
+g2cmyk(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
dv[0] = 0;
dv[1] = 0;
@@ -1041,13 +1033,13 @@ g2cmyk(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-rgb2g(fz_color_converter *cc, float *dv, const float *sv)
+rgb2g(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
dv[0] = sv[0] * 0.3f + sv[1] * 0.59f + sv[2] * 0.11f;
}
static void
-rgb2bgr(fz_color_converter *cc, float *dv, const float *sv)
+rgb2bgr(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
dv[0] = sv[2];
dv[1] = sv[1];
@@ -1055,7 +1047,7 @@ rgb2bgr(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-rgb2cmyk(fz_color_converter *cc, float *dv, const float *sv)
+rgb2cmyk(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
float c = 1 - sv[0];
float m = 1 - sv[1];
@@ -1068,13 +1060,13 @@ rgb2cmyk(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-bgr2g(fz_color_converter *cc, float *dv, const float *sv)
+bgr2g(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
dv[0] = sv[0] * 0.11f + sv[1] * 0.59f + sv[2] * 0.3f;
}
static void
-bgr2cmyk(fz_color_converter *cc, float *dv, const float *sv)
+bgr2cmyk(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
float c = 1 - sv[2];
float m = 1 - sv[1];
@@ -1087,7 +1079,7 @@ bgr2cmyk(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-cmyk2g(fz_color_converter *cc, float *dv, const float *sv)
+cmyk2g(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
float c = sv[0] * 0.3f;
float m = sv[1] * 0.59f;
@@ -1096,10 +1088,10 @@ cmyk2g(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-cmyk2rgb(fz_color_converter *cc, float *dv, const float *sv)
+cmyk2rgb(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
#ifdef SLOWCMYK
- cmyk_to_rgb(cc->ctx, NULL, sv, dv);
+ cmyk_to_rgb(ctx, NULL, sv, dv);
#else
dv[0] = 1 - fz_min(sv[0] + sv[3], 1);
dv[1] = 1 - fz_min(sv[1] + sv[3], 1);
@@ -1108,11 +1100,11 @@ cmyk2rgb(fz_color_converter *cc, float *dv, const float *sv)
}
static void
-cmyk2bgr(fz_color_converter *cc, float *dv, const float *sv)
+cmyk2bgr(fz_context *ctx, fz_color_converter *cc, float *dv, const float *sv)
{
#ifdef SLOWCMYK
float rgb[3];
- cmyk_to_rgb(cc->ctx, NULL, sv, rgb);
+ cmyk_to_rgb(ctx, NULL, sv, rgb);
dv[0] = rgb[2];
dv[1] = rgb[1];
dv[2] = rgb[0];
@@ -1123,9 +1115,8 @@ cmyk2bgr(fz_color_converter *cc, float *dv, const float *sv)
#endif
}
-void fz_lookup_color_converter(fz_color_converter *cc, fz_context *ctx, fz_colorspace *ds, fz_colorspace *ss)
+void fz_lookup_color_converter(fz_context *ctx, fz_color_converter *cc, fz_colorspace *ds, fz_colorspace *ss)
{
- cc->ctx = ctx;
cc->ds = ds;
cc->ss = ss;
if (ss == fz_default_gray)
@@ -1182,8 +1173,8 @@ void
fz_convert_color(fz_context *ctx, fz_colorspace *ds, float *dv, fz_colorspace *ss, const float *sv)
{
fz_color_converter cc;
- fz_lookup_color_converter(&cc, ctx, ds, ss);
- cc.convert(&cc, dv, sv);
+ fz_lookup_color_converter(ctx, &cc, ds, ss);
+ cc.convert(ctx, &cc, dv, sv);
}
/* Indexed */
@@ -1293,10 +1284,9 @@ typedef struct fz_cached_color_converter
}
fz_cached_color_converter;
-static void fz_cached_color_convert(fz_color_converter *cc_, float *ds, const float *ss)
+static void fz_cached_color_convert(fz_context *ctx, fz_color_converter *cc_, float *ds, const float *ss)
{
fz_cached_color_converter *cc = cc_->opaque;
- fz_context *ctx = cc->base.ctx;
void *val = fz_hash_find(ctx, cc->hash, ss);
int n = cc->base.ds->n * sizeof(float);
fz_color_converter *base_cc = &cc->base;
@@ -1307,7 +1297,7 @@ static void fz_cached_color_convert(fz_color_converter *cc_, float *ds, const fl
return;
}
- base_cc->convert(base_cc, ds, ss);
+ base_cc->convert(ctx, base_cc, ds, ss);
val = fz_malloc(ctx, n);
memcpy(val, ds, n);
fz_try(ctx)
@@ -1327,25 +1317,23 @@ void fz_init_cached_color_converter(fz_context *ctx, fz_color_converter *cc, fz_
fz_try(ctx)
{
- fz_lookup_color_converter(&cached->base, ctx, ds, ss);
+ fz_lookup_color_converter(ctx, &cached->base, ds, ss);
cached->hash = fz_new_hash_table(ctx, 256, n * sizeof(float), -1);
cc->convert = fz_cached_color_convert;
- cc->ctx = ctx;
cc->ds = ds;
cc->ss = ss;
cc->opaque = cached;
}
fz_catch(ctx)
{
- fz_free_hash(ctx, cached->hash);
+ fz_drop_hash(ctx, cached->hash);
fz_rethrow(ctx);
}
}
-void fz_fin_cached_color_converter(fz_color_converter *cc_)
+void fz_fin_cached_color_converter(fz_context *ctx, fz_color_converter *cc_)
{
fz_cached_color_converter *cc;
- fz_context *ctx;
int i, n;
if (cc_ == NULL)
@@ -1354,7 +1342,6 @@ void fz_fin_cached_color_converter(fz_color_converter *cc_)
if (cc == NULL)
return;
cc_->opaque = NULL;
- ctx = cc_->ctx;
n = fz_hash_len(ctx, cc->hash);
for (i = 0; i < n; i++)
@@ -1363,6 +1350,6 @@ void fz_fin_cached_color_converter(fz_color_converter *cc_)
if (v)
fz_free(ctx, v);
}
- fz_free_hash(ctx, cc->hash);
+ fz_drop_hash(ctx, cc->hash);
fz_free(ctx, cc);
}
diff --git a/source/fitz/compressed-buffer.c b/source/fitz/compressed-buffer.c
index 1a863309..85890c72 100644
--- a/source/fitz/compressed-buffer.c
+++ b/source/fitz/compressed-buffer.c
@@ -4,7 +4,7 @@
* pulled into cmapdump.c */
void
-fz_free_compressed_buffer(fz_context *ctx, fz_compressed_buffer *buf)
+fz_drop_compressed_buffer(fz_context *ctx, fz_compressed_buffer *buf)
{
if (!buf)
return;
@@ -28,7 +28,7 @@ fz_open_image_decomp_stream(fz_context *ctx, fz_stream *chain, fz_compression_pa
{
case FZ_IMAGE_FAX:
*l2factor = 0;
- return fz_open_faxd(chain,
+ return fz_open_faxd(ctx, chain,
params->u.fax.k,
params->u.fax.end_of_line,
params->u.fax.encoded_byte_align,
@@ -39,21 +39,21 @@ fz_open_image_decomp_stream(fz_context *ctx, fz_stream *chain, fz_compression_pa
case FZ_IMAGE_JPEG:
if (*l2factor > 3)
*l2factor = 3;
- return fz_open_dctd(chain, params->u.jpeg.color_transform, *l2factor, NULL);
+ return fz_open_dctd(ctx, chain, params->u.jpeg.color_transform, *l2factor, NULL);
case FZ_IMAGE_RLD:
*l2factor = 0;
- return fz_open_rld(chain);
+ return fz_open_rld(ctx, chain);
case FZ_IMAGE_FLATE:
*l2factor = 0;
- chain = fz_open_flated(chain, 15);
+ chain = fz_open_flated(ctx, chain, 15);
if (params->u.flate.predictor > 1)
- chain = fz_open_predict(chain, params->u.flate.predictor, params->u.flate.columns, params->u.flate.colors, params->u.flate.bpc);
+ chain = fz_open_predict(ctx, chain, params->u.flate.predictor, params->u.flate.columns, params->u.flate.colors, params->u.flate.bpc);
return chain;
case FZ_IMAGE_LZW:
*l2factor = 0;
- chain = fz_open_lzwd(chain, params->u.lzw.early_change);
+ chain = fz_open_lzwd(ctx, chain, params->u.lzw.early_change);
if (params->u.lzw.predictor > 1)
- chain = fz_open_predict(chain, params->u.lzw.predictor, params->u.lzw.columns, params->u.lzw.colors, params->u.lzw.bpc);
+ chain = fz_open_predict(ctx, chain, params->u.lzw.predictor, params->u.lzw.columns, params->u.lzw.colors, params->u.lzw.bpc);
return chain;
default:
*l2factor = 0;
diff --git a/source/fitz/context.c b/source/fitz/context.c
index 6a986e59..7a2076b7 100644
--- a/source/fitz/context.c
+++ b/source/fitz/context.c
@@ -9,16 +9,10 @@ struct fz_id_context_s
static void
fz_drop_id_context(fz_context *ctx)
{
- int refs;
- fz_id_context *id = ctx->id;
-
- if (id == NULL)
+ if (!ctx)
return;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- refs = --id->refs;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- if (refs == 0)
- fz_free(ctx, id);
+ if (fz_drop_imp(ctx, ctx->id, &ctx->id->refs))
+ fz_free(ctx, ctx->id);
}
static void
@@ -32,18 +26,13 @@ fz_new_id_context(fz_context *ctx)
static fz_id_context *
fz_keep_id_context(fz_context *ctx)
{
- fz_id_context *id = ctx->id;
-
- if (id == NULL)
+ if (!ctx)
return NULL;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- ++id->refs;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- return id;
+ return fz_keep_imp(ctx, ctx->id, &ctx->id->refs);
}
void
-fz_free_context(fz_context *ctx)
+fz_drop_context(fz_context *ctx)
{
if (!ctx)
return;
@@ -52,7 +41,7 @@ fz_free_context(fz_context *ctx)
fz_drop_document_handler_context(ctx);
fz_drop_glyph_cache_context(ctx);
fz_drop_store_context(ctx);
- fz_free_aa_context(ctx);
+ fz_drop_aa_context(ctx);
fz_drop_colorspace_context(ctx);
fz_drop_font_context(ctx);
fz_drop_id_context(ctx);
@@ -90,14 +79,14 @@ new_context_phase1(fz_alloc_context *alloc, fz_locks_context *locks)
ctx->glyph_cache = NULL;
- ctx->error = fz_malloc_no_throw(ctx, sizeof(fz_error_context));
+ ctx->error = Memento_label(fz_malloc_no_throw(ctx, sizeof(fz_error_context)), "fz_error_context");
if (!ctx->error)
goto cleanup;
ctx->error->top = -1;
ctx->error->errcode = FZ_ERROR_NONE;
ctx->error->message[0] = 0;
- ctx->warn = fz_malloc_no_throw(ctx, sizeof(fz_warn_context));
+ ctx->warn = Memento_label(fz_malloc_no_throw(ctx, sizeof(fz_warn_context)), "fz_warn_context");
if (!ctx->warn)
goto cleanup;
ctx->warn->message[0] = 0;
@@ -117,7 +106,7 @@ new_context_phase1(fz_alloc_context *alloc, fz_locks_context *locks)
cleanup:
fprintf(stderr, "cannot create context (phase 1)\n");
- fz_free_context(ctx);
+ fz_drop_context(ctx);
return NULL;
}
@@ -155,7 +144,7 @@ fz_new_context_imp(fz_alloc_context *alloc, fz_locks_context *locks, unsigned in
fz_catch(ctx)
{
fprintf(stderr, "cannot create context (phase 2)\n");
- fz_free_context(ctx);
+ fz_drop_context(ctx);
return NULL;
}
return ctx;
@@ -208,12 +197,9 @@ fz_gen_id(fz_context *ctx)
{
int id;
fz_lock(ctx, FZ_LOCK_ALLOC);
- /* We'll never wrap around in normal use, but if we *do*, then avoid
- * 0. */
+ /* We'll never wrap around in normal use, but if we do, then avoid 0. */
do
- {
id = ++ctx->id->id;
- }
while (id == 0);
fz_unlock(ctx, FZ_LOCK_ALLOC);
return id;
diff --git a/source/fitz/device.c b/source/fitz/device.c
index a13cd470..cb622a84 100644
--- a/source/fitz/device.c
+++ b/source/fitz/device.c
@@ -1,73 +1,57 @@
#include "mupdf/fitz.h"
-fz_device *
-fz_new_device(fz_context *ctx, void *user)
+void *
+fz_new_device(fz_context *ctx, int size)
{
- fz_device *dev = fz_malloc_struct(ctx, fz_device);
- dev->hints = 0;
- dev->flags = 0;
- dev->user = user;
- dev->ctx = ctx;
- dev->error_depth = 0;
- return dev;
+ return Memento_label(fz_calloc(ctx, 1, size), "fz_device");
}
void
-fz_free_device(fz_device *dev)
+fz_drop_device(fz_context *ctx, fz_device *dev)
{
if (dev == NULL)
return;
- if (dev->free_user)
- dev->free_user(dev);
- fz_free(dev->ctx, dev->container);
- fz_free(dev->ctx, dev);
+ if (dev->drop_imp)
+ dev->drop_imp(ctx, dev);
+ fz_free(ctx, dev->container);
+ fz_free(ctx, dev);
}
void
-fz_enable_device_hints(fz_device *dev, int hints)
+fz_enable_device_hints(fz_context *ctx, fz_device *dev, int hints)
{
dev->hints |= hints;
}
void
-fz_disable_device_hints(fz_device *dev, int hints)
+fz_disable_device_hints(fz_context *ctx, fz_device *dev, int hints)
{
dev->hints &= ~hints;
}
void
-fz_rebind_device(fz_device *dev, fz_context *ctx)
-{
- if (dev == NULL)
- return;
- dev->ctx = ctx;
- if (dev->rebind)
- dev->rebind(dev);
-}
-
-void
-fz_begin_page(fz_device *dev, const fz_rect *rect, const fz_matrix *ctm)
+fz_begin_page(fz_context *ctx, fz_device *dev, const fz_rect *rect, const fz_matrix *ctm)
{
if (dev->begin_page)
- dev->begin_page(dev, rect, ctm);
+ dev->begin_page(ctx, dev, rect, ctm);
}
void
-fz_end_page(fz_device *dev)
+fz_end_page(fz_context *ctx, fz_device *dev)
{
if (dev->end_page)
- dev->end_page(dev);
+ dev->end_page(ctx, dev);
}
static void
-push_clip_stack(fz_device *dev, const fz_rect *rect, int flags)
+push_clip_stack(fz_context *ctx, fz_device *dev, const fz_rect *rect, int flags)
{
if (dev->container_len == dev->container_cap)
{
int newmax = dev->container_cap * 2;
if (newmax == 0)
newmax = 4;
- dev->container = fz_resize_array(dev->ctx, dev->container, newmax, sizeof(*dev->container));
+ dev->container = fz_resize_array(ctx, dev->container, newmax, sizeof(*dev->container));
dev->container_cap = newmax;
}
if (dev->container_len == 0)
@@ -83,7 +67,7 @@ push_clip_stack(fz_device *dev, const fz_rect *rect, int flags)
}
static void
-push_clip_stack_accumulate(fz_device *dev, const fz_rect *rect, int accumulate)
+push_clip_stack_accumulate(fz_context *ctx, fz_device *dev, const fz_rect *rect, int accumulate)
{
if (accumulate <= 1)
{
@@ -93,7 +77,7 @@ push_clip_stack_accumulate(fz_device *dev, const fz_rect *rect, int accumulate)
int newmax = dev->container_cap * 2;
if (newmax == 0)
newmax = 4;
- dev->container = fz_resize_array(dev->ctx, dev->container, newmax, sizeof(*dev->container));
+ dev->container = fz_resize_array(ctx, dev->container, newmax, sizeof(*dev->container));
dev->container_cap = newmax;
}
if (dev->container_len > 0)
@@ -115,37 +99,35 @@ push_clip_stack_accumulate(fz_device *dev, const fz_rect *rect, int accumulate)
}
static void
-pop_clip_stack(fz_device *dev)
+pop_clip_stack(fz_context *ctx, fz_device *dev)
{
if (dev->container_len > 0)
dev->container_len--;
}
void
-fz_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
+fz_fill_path(fz_context *ctx, fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
if (dev->error_depth)
return;
if (dev->fill_path)
- dev->fill_path(dev, path, even_odd, ctm, colorspace, color, alpha);
+ dev->fill_path(ctx, dev, path, even_odd, ctm, colorspace, color, alpha);
}
void
-fz_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm,
+fz_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
if (dev->error_depth)
return;
if (dev->stroke_path)
- dev->stroke_path(dev, path, stroke, ctm, colorspace, color, alpha);
+ dev->stroke_path(ctx, dev, path, stroke, ctm, colorspace, color, alpha);
}
void
-fz_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
+fz_clip_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
{
- fz_context *ctx = dev->ctx;
-
if (dev->error_depth)
{
dev->error_depth++;
@@ -160,13 +142,13 @@ fz_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, c
{
fz_rect bbox;
fz_bound_path(ctx, path, NULL, ctm, &bbox);
- push_clip_stack(dev, &bbox, fz_device_container_stack_is_clip_path);
+ push_clip_stack(ctx, dev, &bbox, fz_device_container_stack_is_clip_path);
}
else
- push_clip_stack(dev, rect, fz_device_container_stack_is_clip_path);
+ push_clip_stack(ctx, dev, rect, fz_device_container_stack_is_clip_path);
}
if (dev->clip_path)
- dev->clip_path(dev, path, rect, even_odd, ctm);
+ dev->clip_path(ctx, dev, path, rect, even_odd, ctm);
}
fz_catch(ctx)
{
@@ -177,10 +159,8 @@ fz_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, c
}
void
-fz_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
+fz_clip_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
{
- fz_context *ctx = dev->ctx;
-
if (dev->error_depth)
{
dev->error_depth++;
@@ -195,13 +175,13 @@ fz_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_strok
{
fz_rect bbox;
fz_bound_path(ctx, path, stroke, ctm, &bbox);
- push_clip_stack(dev, &bbox, fz_device_container_stack_is_clip_stroke_path);
+ push_clip_stack(ctx, dev, &bbox, fz_device_container_stack_is_clip_stroke_path);
}
else
- push_clip_stack(dev, rect, fz_device_container_stack_is_clip_stroke_path);
+ push_clip_stack(ctx, dev, rect, fz_device_container_stack_is_clip_stroke_path);
}
if (dev->clip_stroke_path)
- dev->clip_stroke_path(dev, path, rect, stroke, ctm);
+ dev->clip_stroke_path(ctx, dev, path, rect, stroke, ctm);
}
fz_catch(ctx)
{
@@ -212,30 +192,28 @@ fz_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_strok
}
void
-fz_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm,
+fz_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
if (dev->error_depth)
return;
if (dev->fill_text)
- dev->fill_text(dev, text, ctm, colorspace, color, alpha);
+ dev->fill_text(ctx, dev, text, ctm, colorspace, color, alpha);
}
void
-fz_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
+fz_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
if (dev->error_depth)
return;
if (dev->stroke_text)
- dev->stroke_text(dev, text, stroke, ctm, colorspace, color, alpha);
+ dev->stroke_text(ctx, dev, text, stroke, ctm, colorspace, color, alpha);
}
void
-fz_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
+fz_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
{
- fz_context *ctx = dev->ctx;
-
if (dev->error_depth)
{
if (accumulate == 0 || accumulate == 1)
@@ -249,10 +227,10 @@ fz_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate
{
fz_rect bbox;
fz_bound_text(ctx, text, NULL, ctm, &bbox);
- push_clip_stack_accumulate(dev, &bbox, accumulate);
+ push_clip_stack_accumulate(ctx, dev, &bbox, accumulate);
}
if (dev->clip_text)
- dev->clip_text(dev, text, ctm, accumulate);
+ dev->clip_text(ctx, dev, text, ctm, accumulate);
}
fz_catch(ctx)
{
@@ -265,10 +243,8 @@ 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)
+fz_clip_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
{
- fz_context *ctx = dev->ctx;
-
if (dev->error_depth)
{
dev->error_depth++;
@@ -281,10 +257,10 @@ fz_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, cons
{
fz_rect bbox;
fz_bound_text(ctx, text, stroke, ctm, &bbox);
- push_clip_stack(dev, &bbox, fz_device_container_stack_is_clip_stroke_text);
+ push_clip_stack(ctx, dev, &bbox, fz_device_container_stack_is_clip_stroke_text);
}
if (dev->clip_stroke_text)
- dev->clip_stroke_text(dev, text, stroke, ctm);
+ dev->clip_stroke_text(ctx, dev, text, stroke, ctm);
}
fz_catch(ctx)
{
@@ -295,63 +271,61 @@ fz_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, cons
}
void
-fz_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm)
+fz_ignore_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm)
{
if (dev->error_depth)
return;
if (dev->ignore_text)
- dev->ignore_text(dev, text, ctm);
+ dev->ignore_text(ctx, dev, text, ctm);
}
void
-fz_pop_clip(fz_device *dev)
+fz_pop_clip(fz_context *ctx, fz_device *dev)
{
if (dev->error_depth)
{
dev->error_depth--;
if (dev->error_depth == 0)
- fz_throw(dev->ctx, FZ_ERROR_GENERIC, "%s", dev->errmess);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "%s", dev->errmess);
return;
}
if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
- pop_clip_stack(dev);
+ pop_clip_stack(ctx, dev);
if (dev->pop_clip)
- dev->pop_clip(dev);
+ dev->pop_clip(ctx, dev);
}
void
-fz_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
+fz_fill_shade(fz_context *ctx, fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
{
if (dev->error_depth)
return;
if (dev->fill_shade)
- dev->fill_shade(dev, shade, ctm, alpha);
+ dev->fill_shade(ctx, dev, shade, ctm, alpha);
}
void
-fz_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
+fz_fill_image(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
{
if (dev->error_depth)
return;
if (dev->fill_image)
- dev->fill_image(dev, image, ctm, alpha);
+ dev->fill_image(ctx, dev, image, ctm, alpha);
}
void
-fz_fill_image_mask(fz_device *dev, fz_image *image, const fz_matrix *ctm,
+fz_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
if (dev->error_depth)
return;
if (dev->fill_image_mask)
- dev->fill_image_mask(dev, image, ctm, colorspace, color, alpha);
+ dev->fill_image_mask(ctx, dev, image, ctm, colorspace, color, alpha);
}
void
-fz_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
+fz_clip_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
{
- fz_context *ctx = dev->ctx;
-
if (dev->error_depth)
{
dev->error_depth++;
@@ -361,9 +335,9 @@ fz_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const f
fz_try(ctx)
{
if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
- push_clip_stack(dev, rect, fz_device_container_stack_is_clip_image_mask);
+ push_clip_stack(ctx, dev, rect, fz_device_container_stack_is_clip_image_mask);
if (dev->clip_image_mask)
- dev->clip_image_mask(dev, image, rect, ctm);
+ dev->clip_image_mask(ctx, dev, image, rect, ctm);
}
fz_catch(ctx)
{
@@ -374,10 +348,8 @@ fz_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const f
}
void
-fz_begin_mask(fz_device *dev, const fz_rect *area, int luminosity, fz_colorspace *colorspace, float *bc)
+fz_begin_mask(fz_context *ctx, fz_device *dev, const fz_rect *area, int luminosity, fz_colorspace *colorspace, float *bc)
{
- fz_context *ctx = dev->ctx;
-
if (dev->error_depth)
{
dev->error_depth++;
@@ -387,9 +359,9 @@ fz_begin_mask(fz_device *dev, const fz_rect *area, int luminosity, fz_colorspace
fz_try(ctx)
{
if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
- push_clip_stack(dev, area, fz_device_container_stack_in_mask);
+ push_clip_stack(ctx, dev, area, fz_device_container_stack_in_mask);
if (dev->begin_mask)
- dev->begin_mask(dev, area, luminosity, colorspace, bc);
+ dev->begin_mask(ctx, dev, area, luminosity, colorspace, bc);
}
fz_catch(ctx)
{
@@ -400,10 +372,8 @@ fz_begin_mask(fz_device *dev, const fz_rect *area, int luminosity, fz_colorspace
}
void
-fz_end_mask(fz_device *dev)
+fz_end_mask(fz_context *ctx, fz_device *dev)
{
- fz_context *ctx = dev->ctx;
-
if (dev->error_depth)
{
/* Converts from mask to clip, so no change in stack depth */
@@ -417,7 +387,7 @@ fz_end_mask(fz_device *dev)
fz_try(ctx)
{
if (dev->end_mask)
- dev->end_mask(dev);
+ dev->end_mask(ctx, dev);
}
fz_catch(ctx)
{
@@ -428,10 +398,8 @@ 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)
+fz_begin_group(fz_context *ctx, fz_device *dev, const fz_rect *area, int isolated, int knockout, int blendmode, float alpha)
{
- fz_context *ctx = dev->ctx;
-
if (dev->error_depth)
{
dev->error_depth++;
@@ -441,9 +409,9 @@ fz_begin_group(fz_device *dev, const fz_rect *area, int isolated, int knockout,
fz_try(ctx)
{
if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
- push_clip_stack(dev, area, fz_device_container_stack_is_group);
+ push_clip_stack(ctx, dev, area, fz_device_container_stack_is_group);
if (dev->begin_group)
- dev->begin_group(dev, area, isolated, knockout, blendmode, alpha);
+ dev->begin_group(ctx, dev, area, isolated, knockout, blendmode, alpha);
}
fz_catch(ctx)
{
@@ -454,32 +422,31 @@ fz_begin_group(fz_device *dev, const fz_rect *area, int isolated, int knockout,
}
void
-fz_end_group(fz_device *dev)
+fz_end_group(fz_context *ctx, fz_device *dev)
{
if (dev->error_depth)
{
dev->error_depth--;
if (dev->error_depth == 0)
- fz_throw(dev->ctx, FZ_ERROR_GENERIC, "%s", dev->errmess);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "%s", dev->errmess);
return;
}
if (dev->end_group)
- dev->end_group(dev);
+ dev->end_group(ctx, dev);
if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
- pop_clip_stack(dev);
+ pop_clip_stack(ctx, dev);
}
void
-fz_begin_tile(fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm)
+fz_begin_tile(fz_context *ctx, fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm)
{
- (void)fz_begin_tile_id(dev, area, view, xstep, ystep, ctm, 0);
+ (void)fz_begin_tile_id(ctx, dev, area, view, xstep, ystep, ctm, 0);
}
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)
+fz_begin_tile_id(fz_context *ctx, fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
{
- fz_context *ctx = dev->ctx;
- int ret = 0;
+ int ret;
if (dev->error_depth)
{
@@ -495,7 +462,7 @@ fz_begin_tile_id(fz_device *dev, const fz_rect *area, const fz_rect *view, float
fz_try(ctx)
{
if (dev->begin_tile)
- ret = dev->begin_tile(dev, area, view, xstep, ystep, ctm, id);
+ ret = dev->begin_tile(ctx, dev, area, view, xstep, ystep, ctm, id);
}
fz_catch(ctx)
{
@@ -507,15 +474,15 @@ fz_begin_tile_id(fz_device *dev, const fz_rect *area, const fz_rect *view, float
}
void
-fz_end_tile(fz_device *dev)
+fz_end_tile(fz_context *ctx, fz_device *dev)
{
if (dev->error_depth)
{
dev->error_depth--;
if (dev->error_depth == 0)
- fz_throw(dev->ctx, FZ_ERROR_GENERIC, "%s", dev->errmess);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "%s", dev->errmess);
return;
}
if (dev->end_tile)
- dev->end_tile(dev);
+ dev->end_tile(ctx, dev);
}
diff --git a/source/fitz/document.c b/source/fitz/document.c
index ad2e84ba..40113469 100644
--- a/source/fitz/document.c
+++ b/source/fitz/document.c
@@ -142,121 +142,142 @@ fz_open_document(fz_context *ctx, const char *filename)
return NULL;
}
-void
-fz_close_document(fz_document *doc)
+void *
+fz_new_document(fz_context *ctx, int size)
+{
+ fz_document *doc = fz_calloc(ctx, 1, size);
+ doc->refs = 1;
+ return doc;
+}
+
+fz_document *
+fz_keep_document(fz_context *ctx, fz_document *doc)
{
- if (doc && doc->close)
- doc->close(doc);
+ ++doc->refs;
+ return doc;
}
void
-fz_rebind_document(fz_document *doc, fz_context *ctx)
+fz_drop_document(fz_context *ctx, fz_document *doc)
{
- if (doc != NULL && doc->rebind != NULL)
- doc->rebind(doc, ctx);
+ if (doc && --doc->refs == 0 && doc->close)
+ doc->close(ctx, doc);
}
int
-fz_needs_password(fz_document *doc)
+fz_needs_password(fz_context *ctx, fz_document *doc)
{
if (doc && doc->needs_password)
- return doc->needs_password(doc);
+ return doc->needs_password(ctx, doc);
return 0;
}
int
-fz_authenticate_password(fz_document *doc, const char *password)
+fz_authenticate_password(fz_context *ctx, fz_document *doc, const char *password)
{
if (doc && doc->authenticate_password)
- return doc->authenticate_password(doc, password);
+ return doc->authenticate_password(ctx, doc, password);
return 1;
}
fz_outline *
-fz_load_outline(fz_document *doc)
+fz_load_outline(fz_context *ctx, fz_document *doc)
{
if (doc && doc->load_outline)
- return doc->load_outline(doc);
+ return doc->load_outline(ctx, doc);
return NULL;
}
void
-fz_layout_document(fz_document *doc, float w, float h, float em)
+fz_layout_document(fz_context *ctx, fz_document *doc, float w, float h, float em)
{
if (doc && doc->layout)
- doc->layout(doc, w, h, em);
+ doc->layout(ctx, doc, w, h, em);
}
int
-fz_count_pages(fz_document *doc)
+fz_count_pages(fz_context *ctx, fz_document *doc)
{
if (doc && doc->count_pages)
- return doc->count_pages(doc);
+ return doc->count_pages(ctx, doc);
return 0;
}
+int
+fz_meta(fz_context *ctx, fz_document *doc, int key, void *ptr, int size)
+{
+ if (doc && doc->meta)
+ return doc->meta(ctx, doc, key, ptr, size);
+ return FZ_META_UNKNOWN_KEY;
+}
+
+void
+fz_write_document(fz_context *ctx, fz_document *doc, char *filename, fz_write_options *opts)
+{
+ if (doc && doc->write)
+ doc->write(ctx, doc, filename, opts);
+}
+
fz_page *
-fz_load_page(fz_document *doc, int number)
+fz_load_page(fz_context *ctx, fz_document *doc, int number)
{
if (doc && doc->load_page)
- return doc->load_page(doc, number);
+ return doc->load_page(ctx, doc, number);
return NULL;
}
fz_link *
-fz_load_links(fz_document *doc, fz_page *page)
+fz_load_links(fz_context *ctx, fz_page *page)
{
- if (doc && doc->load_links && page)
- return doc->load_links(doc, page);
+ if (page && page->load_links && page)
+ return page->load_links(ctx, page);
return NULL;
}
fz_rect *
-fz_bound_page(fz_document *doc, fz_page *page, fz_rect *r)
+fz_bound_page(fz_context *ctx, fz_page *page, fz_rect *r)
{
- if (doc && doc->bound_page && page && r)
- return doc->bound_page(doc, page, r);
+ if (page && page->bound_page && page && r)
+ return page->bound_page(ctx, page, r);
if (r)
*r = fz_empty_rect;
return r;
}
fz_annot *
-fz_first_annot(fz_document *doc, fz_page *page)
+fz_first_annot(fz_context *ctx, fz_page *page)
{
- if (doc && doc->first_annot && page)
- return doc->first_annot(doc, page);
+ if (page && page->first_annot && page)
+ return page->first_annot(ctx, page);
return NULL;
}
fz_annot *
-fz_next_annot(fz_document *doc, fz_annot *annot)
+fz_next_annot(fz_context *ctx, fz_page *page, fz_annot *annot)
{
- if (doc && doc->next_annot && annot)
- return doc->next_annot(doc, annot);
+ if (page && page->next_annot && annot)
+ return page->next_annot(ctx, page, annot);
return NULL;
}
fz_rect *
-fz_bound_annot(fz_document *doc, fz_annot *annot, fz_rect *rect)
+fz_bound_annot(fz_context *ctx, fz_page *page, fz_annot *annot, fz_rect *rect)
{
- if (doc && doc->bound_annot && annot && rect)
- return doc->bound_annot(doc, annot, rect);
+ if (page && page->bound_annot && annot && rect)
+ return page->bound_annot(ctx, page, annot, rect);
if (rect)
*rect = fz_empty_rect;
return rect;
}
void
-fz_run_page_contents(fz_document *doc, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie)
+fz_run_page_contents(fz_context *ctx, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie)
{
- if (doc && doc->run_page_contents && page)
+ if (page && page->run_page_contents && page)
{
- fz_context *ctx = dev->ctx;
-
fz_try(ctx)
{
- doc->run_page_contents(doc, page, dev, transform, cookie);
+ page->run_page_contents(ctx, page, dev, transform, cookie);
}
fz_catch(ctx)
{
@@ -267,15 +288,13 @@ fz_run_page_contents(fz_document *doc, fz_page *page, fz_device *dev, const fz_m
}
void
-fz_run_annot(fz_document *doc, fz_page *page, fz_annot *annot, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie)
+fz_run_annot(fz_context *ctx, fz_page *page, fz_annot *annot, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie)
{
- if (doc && doc->run_annot && page && annot)
+ if (page && page->run_annot && page && annot)
{
- fz_context *ctx = dev->ctx;
-
fz_try(ctx)
{
- doc->run_annot(doc, page, annot, dev, transform, cookie);
+ page->run_annot(ctx, page, annot, dev, transform, cookie);
}
fz_catch(ctx)
{
@@ -286,25 +305,25 @@ fz_run_annot(fz_document *doc, fz_page *page, fz_annot *annot, fz_device *dev, c
}
void
-fz_run_page(fz_document *doc, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie)
+fz_run_page(fz_context *ctx, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie)
{
fz_annot *annot;
fz_rect mediabox;
- fz_bound_page(doc, page, &mediabox);
- fz_begin_page(dev, &mediabox, transform);
+ fz_bound_page(ctx, page, &mediabox);
+ fz_begin_page(ctx, dev, &mediabox, transform);
- fz_run_page_contents(doc, page, dev, transform, cookie);
+ fz_run_page_contents(ctx, page, dev, transform, cookie);
if (cookie && cookie->progress_max != -1)
{
int count = 1;
- for (annot = fz_first_annot(doc, page); annot; annot = fz_next_annot(doc, annot))
+ for (annot = fz_first_annot(ctx, page); annot; annot = fz_next_annot(ctx, page, annot))
count++;
cookie->progress_max += count;
}
- for (annot = fz_first_annot(doc, page); annot; annot = fz_next_annot(doc, annot))
+ for (annot = fz_first_annot(ctx, page); annot; annot = fz_next_annot(ctx, page, annot))
{
/* Check the cookie for aborting */
if (cookie)
@@ -314,43 +333,49 @@ fz_run_page(fz_document *doc, fz_page *page, fz_device *dev, const fz_matrix *tr
cookie->progress++;
}
- fz_run_annot(doc, page, annot, dev, transform, cookie);
+ fz_run_annot(ctx, page, annot, dev, transform, cookie);
}
- fz_end_page(dev);
+ fz_end_page(ctx, dev);
}
-void
-fz_free_page(fz_document *doc, fz_page *page)
+void *
+fz_new_page(fz_context *ctx, int size)
{
- if (doc && doc->free_page && page)
- doc->free_page(doc, page);
+ fz_page *page = Memento_label(fz_calloc(ctx, 1, size), "fz_page");
+ page->refs = 1;
+ return page;
}
-int
-fz_meta(fz_document *doc, int key, void *ptr, int size)
+fz_page *
+fz_keep_page(fz_context *ctx, fz_page *page)
{
- if (doc && doc->meta)
- return doc->meta(doc, key, ptr, size);
- return FZ_META_UNKNOWN_KEY;
+ if (page)
+ ++page->refs;
+ return page;
+}
+
+void
+fz_drop_page(fz_context *ctx, fz_page *page)
+{
+ if (page) {
+ if (--page->refs == 0 && page->drop_page_imp)
+ {
+ page->drop_page_imp(ctx, page);
+ fz_free(ctx, page);
+ }
+ }
}
fz_transition *
-fz_page_presentation(fz_document *doc, fz_page *page, float *duration)
+fz_page_presentation(fz_context *ctx, fz_page *page, float *duration)
{
float dummy;
if (duration)
*duration = 0;
else
duration = &dummy;
- if (doc && doc->page_presentation && page)
- return doc->page_presentation(doc, page, duration);
+ if (page && page->page_presentation && page)
+ return page->page_presentation(ctx, page, duration);
return NULL;
}
-
-void
-fz_write_document(fz_document *doc, char *filename, fz_write_options *opts)
-{
- if (doc && doc->write)
- doc->write(doc, filename, opts);
-}
diff --git a/source/fitz/draw-device.c b/source/fitz/draw-device.c
index 4592f8cf..fad44050 100644
--- a/source/fitz/draw-device.c
+++ b/source/fitz/draw-device.c
@@ -37,8 +37,8 @@ struct fz_draw_state_s {
struct fz_draw_device_s
{
+ fz_device super;
fz_gel *gel;
- fz_context *ctx;
int flags;
int top;
fz_scale_cache *cache_x;
@@ -77,11 +77,11 @@ static void dump_spaces(int x, const char *s)
#endif
#ifdef DUMP_STACK_CHANGES
-#define STACK_PUSHED(A) stack_change(dev, ">" ## A)
-#define STACK_POPPED(A) stack_change(dev, "<" ## A)
-#define STACK_CONVERT(A) stack_change(dev, A)
+#define STACK_PUSHED(A) stack_change(ctx, dev, ">" ## A)
+#define STACK_POPPED(A) stack_change(ctx, dev, "<" ## A)
+#define STACK_CONVERT(A) stack_change(ctx, dev, A)
-static void stack_change(fz_draw_device *dev, char *s)
+static void stack_change(fz_context *ctx, fz_draw_device *dev, char *s)
{
int depth = dev->top;
int n;
@@ -100,19 +100,19 @@ static void stack_change(fz_draw_device *dev, char *s)
#endif
-static void fz_grow_stack(fz_draw_device *dev)
+static void fz_grow_stack(fz_context *ctx, fz_draw_device *dev)
{
int max = dev->stack_cap * 2;
fz_draw_state *stack;
if (dev->stack == &dev->init_stack[0])
{
- stack = fz_malloc(dev->ctx, sizeof(*stack) * max);
+ stack = Memento_label(fz_malloc_array(ctx, max, sizeof *stack), "draw device stack");
memcpy(stack, dev->stack, sizeof(*stack) * dev->stack_cap);
}
else
{
- stack = fz_resize_array(dev->ctx, dev->stack, max, sizeof(*stack));
+ stack = fz_resize_array(ctx, dev->stack, max, sizeof(*stack));
}
dev->stack = stack;
dev->stack_cap = max;
@@ -122,22 +122,20 @@ static void fz_grow_stack(fz_draw_device *dev)
* already having been initialised to contain the same thing. Simply
* change any contents of state[1] that you want to and continue. */
static fz_draw_state *
-push_stack(fz_draw_device *dev)
+push_stack(fz_context *ctx, fz_draw_device *dev)
{
fz_draw_state *state;
if (dev->top == dev->stack_cap-1)
- fz_grow_stack(dev);
+ fz_grow_stack(ctx, dev);
state = &dev->stack[dev->top];
dev->top++;
memcpy(&state[1], state, sizeof(*state));
return state;
}
-static void emergency_pop_stack(fz_draw_device *dev, fz_draw_state *state)
+static void emergency_pop_stack(fz_context *ctx, fz_draw_device *dev, fz_draw_state *state)
{
- fz_context *ctx = dev->ctx;
-
if (state[1].mask != state[0].mask)
fz_drop_pixmap(ctx, state[1].mask);
if (state[1].dest != state[0].dest)
@@ -150,9 +148,8 @@ static void emergency_pop_stack(fz_draw_device *dev, fz_draw_state *state)
}
static fz_draw_state *
-fz_knockout_begin(fz_draw_device *dev)
+fz_knockout_begin(fz_context *ctx, fz_draw_device *dev)
{
- fz_context *ctx = dev->ctx;
fz_irect bbox;
fz_pixmap *dest, *shape;
fz_draw_state *state = &dev->stack[dev->top];
@@ -161,12 +158,12 @@ fz_knockout_begin(fz_draw_device *dev)
if ((state->blendmode & FZ_BLEND_KNOCKOUT) == 0)
return state;
- state = push_stack(dev);
+ state = push_stack(ctx, dev);
STACK_PUSHED("knockout");
- fz_pixmap_bbox(dev->ctx, state->dest, &bbox);
+ fz_pixmap_bbox(ctx, state->dest, &bbox);
fz_intersect_irect(&bbox, &state->scissor);
- dest = fz_new_pixmap_with_bbox(dev->ctx, state->dest->colorspace, &bbox);
+ dest = fz_new_pixmap_with_bbox(ctx, state->dest->colorspace, &bbox);
if (isolated)
{
@@ -197,8 +194,8 @@ fz_knockout_begin(fz_draw_device *dev)
}
else
{
- shape = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, shape);
+ shape = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, shape);
}
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top-1, "Knockout begin\n");
@@ -211,12 +208,11 @@ fz_knockout_begin(fz_draw_device *dev)
return &state[1];
}
-static void fz_knockout_end(fz_draw_device *dev)
+static void fz_knockout_end(fz_context *ctx, fz_draw_device *dev)
{
fz_draw_state *state;
int blendmode;
int isolated;
- fz_context *ctx = dev->ctx;
if (dev->top == 0)
{
@@ -233,12 +229,12 @@ static void fz_knockout_end(fz_draw_device *dev)
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "");
- fz_dump_blend(dev->ctx, state[1].dest, "Knockout end: blending ");
+ fz_dump_blend(ctx, state[1].dest, "Knockout end: blending ");
if (state[1].shape)
- fz_dump_blend(dev->ctx, state[1].shape, "/");
- fz_dump_blend(dev->ctx, state[0].dest, " onto ");
+ fz_dump_blend(ctx, state[1].shape, "/");
+ fz_dump_blend(ctx, state[0].dest, " onto ");
if (state[0].shape)
- fz_dump_blend(dev->ctx, state[0].shape, "/");
+ fz_dump_blend(ctx, state[0].shape, "/");
if (blendmode != 0)
printf(" (blend %d)", blendmode);
if (isolated != 0)
@@ -254,26 +250,28 @@ static void fz_knockout_end(fz_draw_device *dev)
* errors can cause the stack to get out of sync, and this saves our
* bacon. */
if (state[0].dest != state[1].dest)
- fz_drop_pixmap(dev->ctx, state[1].dest);
+ fz_drop_pixmap(ctx, state[1].dest);
if (state[0].shape != state[1].shape)
{
if (state[0].shape)
fz_paint_pixmap(state[0].shape, state[1].shape, 255);
- fz_drop_pixmap(dev->ctx, state[1].shape);
+ fz_drop_pixmap(ctx, state[1].shape);
}
#ifdef DUMP_GROUP_BLENDS
- fz_dump_blend(dev->ctx, state[0].dest, " to get ");
+ fz_dump_blend(ctx, state[0].dest, " to get ");
if (state[0].shape)
- fz_dump_blend(dev->ctx, state[0].shape, "/");
+ fz_dump_blend(ctx, state[0].shape, "/");
printf("\n");
#endif
}
static void
-fz_draw_fill_path(fz_device *devp, fz_path *path, int even_odd, const fz_matrix *ctm,
+fz_draw_fill_path(fz_context *ctx, fz_device *devp, fz_path *path, int even_odd, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
+ fz_gel *gel = dev->gel;
+
float expansion = fz_matrix_expansion(ctm);
float flatness = 0.3f / expansion;
unsigned char colorbv[FZ_MAX_COLORS + 1];
@@ -284,48 +282,50 @@ fz_draw_fill_path(fz_device *devp, fz_path *path, int even_odd, const fz_matrix
fz_colorspace *model = state->dest->colorspace;
if (model == NULL)
- model = fz_device_gray(dev->ctx);
+ model = fz_device_gray(ctx);
if (flatness < 0.001f)
flatness = 0.001f;
- fz_reset_gel(dev->gel, &state->scissor);
- fz_flatten_fill_path(dev->gel, path, ctm, flatness);
- fz_sort_gel(dev->gel);
+ fz_reset_gel(ctx, gel, &state->scissor);
+ fz_flatten_fill_path(ctx, gel, path, ctm, flatness);
+ fz_sort_gel(ctx, gel);
- fz_intersect_irect(fz_bound_gel(dev->gel, &bbox), &state->scissor);
+ fz_intersect_irect(fz_bound_gel(ctx, gel, &bbox), &state->scissor);
if (fz_is_empty_irect(&bbox))
return;
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- state = fz_knockout_begin(dev);
+ state = fz_knockout_begin(ctx, dev);
- fz_convert_color(dev->ctx, model, colorfv, colorspace, color);
+ fz_convert_color(ctx, model, colorfv, colorspace, color);
for (i = 0; i < model->n; i++)
colorbv[i] = colorfv[i] * 255;
colorbv[i] = alpha * 255;
- fz_scan_convert(dev->gel, even_odd, &bbox, state->dest, colorbv);
+ fz_scan_convert(ctx, gel, even_odd, &bbox, state->dest, colorbv);
if (state->shape)
{
- fz_reset_gel(dev->gel, &state->scissor);
- fz_flatten_fill_path(dev->gel, path, ctm, flatness);
- fz_sort_gel(dev->gel);
+ fz_reset_gel(ctx, gel, &state->scissor);
+ fz_flatten_fill_path(ctx, gel, path, ctm, flatness);
+ fz_sort_gel(ctx, gel);
colorbv[0] = alpha * 255;
- fz_scan_convert(dev->gel, even_odd, &bbox, state->shape, colorbv);
+ fz_scan_convert(ctx, gel, even_odd, &bbox, state->shape, colorbv);
}
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- fz_knockout_end(dev);
+ fz_knockout_end(ctx, dev);
}
static void
-fz_draw_stroke_path(fz_device *devp, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm,
+fz_draw_stroke_path(fz_context *ctx, fz_device *devp, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
+ fz_gel *gel = dev->gel;
+
float expansion = fz_matrix_expansion(ctm);
float flatness = 0.3f / expansion;
float linewidth = stroke->linewidth;
@@ -337,81 +337,82 @@ fz_draw_stroke_path(fz_device *devp, fz_path *path, fz_stroke_state *stroke, con
fz_colorspace *model = state->dest->colorspace;
if (model == NULL)
- model = fz_device_gray(dev->ctx);
+ model = fz_device_gray(ctx);
if (linewidth * expansion < 0.1f)
linewidth = 1 / expansion;
if (flatness < 0.001f)
flatness = 0.001f;
- fz_reset_gel(dev->gel, &state->scissor);
+ fz_reset_gel(ctx, gel, &state->scissor);
if (stroke->dash_len > 0)
- fz_flatten_dash_path(dev->gel, path, stroke, ctm, flatness, linewidth);
+ fz_flatten_dash_path(ctx, gel, path, stroke, ctm, flatness, linewidth);
else
- fz_flatten_stroke_path(dev->gel, path, stroke, ctm, flatness, linewidth);
- fz_sort_gel(dev->gel);
+ fz_flatten_stroke_path(ctx, gel, path, stroke, ctm, flatness, linewidth);
+ fz_sort_gel(ctx, gel);
- fz_intersect_irect(fz_bound_gel(dev->gel, &bbox), &state->scissor);
+ fz_intersect_irect(fz_bound_gel(ctx, gel, &bbox), &state->scissor);
if (fz_is_empty_irect(&bbox))
return;
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- state = fz_knockout_begin(dev);
+ state = fz_knockout_begin(ctx, dev);
- fz_convert_color(dev->ctx, model, colorfv, colorspace, color);
+ fz_convert_color(ctx, model, colorfv, colorspace, color);
for (i = 0; i < model->n; i++)
colorbv[i] = colorfv[i] * 255;
colorbv[i] = alpha * 255;
- fz_scan_convert(dev->gel, 0, &bbox, state->dest, colorbv);
+ fz_scan_convert(ctx, gel, 0, &bbox, state->dest, colorbv);
if (state->shape)
{
- fz_reset_gel(dev->gel, &state->scissor);
+ fz_reset_gel(ctx, gel, &state->scissor);
if (stroke->dash_len > 0)
- fz_flatten_dash_path(dev->gel, path, stroke, ctm, flatness, linewidth);
+ fz_flatten_dash_path(ctx, gel, path, stroke, ctm, flatness, linewidth);
else
- fz_flatten_stroke_path(dev->gel, path, stroke, ctm, flatness, linewidth);
- fz_sort_gel(dev->gel);
+ fz_flatten_stroke_path(ctx, gel, path, stroke, ctm, flatness, linewidth);
+ fz_sort_gel(ctx, gel);
colorbv[0] = 255;
- fz_scan_convert(dev->gel, 0, &bbox, state->shape, colorbv);
+ fz_scan_convert(ctx, gel, 0, &bbox, state->shape, colorbv);
}
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- fz_knockout_end(dev);
+ fz_knockout_end(ctx, dev);
}
static void
-fz_draw_clip_path(fz_device *devp, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
+fz_draw_clip_path(fz_context *ctx, fz_device *devp, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
+ fz_gel *gel = dev->gel;
+
float expansion = fz_matrix_expansion(ctm);
float flatness = 0.3f / expansion;
fz_irect bbox;
fz_draw_state *state = &dev->stack[dev->top];
fz_colorspace *model;
- fz_context *ctx = dev->ctx;
if (flatness < 0.001f)
flatness = 0.001f;
- fz_reset_gel(dev->gel, &state->scissor);
- fz_flatten_fill_path(dev->gel, path, ctm, flatness);
- fz_sort_gel(dev->gel);
+ fz_reset_gel(ctx, gel, &state->scissor);
+ fz_flatten_fill_path(ctx, gel, path, ctm, flatness);
+ fz_sort_gel(ctx, gel);
- state = push_stack(dev);
+ state = push_stack(ctx, dev);
STACK_PUSHED("clip path");
model = state->dest->colorspace;
- fz_intersect_irect(fz_bound_gel(dev->gel, &bbox), &state->scissor);
+ fz_intersect_irect(fz_bound_gel(ctx, gel, &bbox), &state->scissor);
if (rect)
{
fz_irect bbox2;
fz_intersect_irect(&bbox, fz_irect_from_rect(&bbox2, rect));
}
- if (fz_is_empty_irect(&bbox) || fz_is_rect_gel(dev->gel))
+ if (fz_is_empty_irect(&bbox) || fz_is_rect_gel(ctx, gel))
{
state[1].scissor = bbox;
state[1].mask = NULL;
@@ -423,17 +424,17 @@ fz_draw_clip_path(fz_device *devp, fz_path *path, const fz_rect *rect, int even_
fz_try(ctx)
{
- state[1].mask = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, state[1].mask);
- state[1].dest = fz_new_pixmap_with_bbox(dev->ctx, model, &bbox);
- fz_clear_pixmap(dev->ctx, state[1].dest);
+ state[1].mask = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, state[1].mask);
+ state[1].dest = fz_new_pixmap_with_bbox(ctx, model, &bbox);
+ fz_clear_pixmap(ctx, state[1].dest);
if (state[1].shape)
{
- state[1].shape = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, state[1].shape);
+ state[1].shape = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, state[1].shape);
}
- fz_scan_convert(dev->gel, even_odd, &bbox, state[1].mask, NULL);
+ fz_scan_convert(ctx, gel, even_odd, &bbox, state[1].mask, NULL);
state[1].blendmode |= FZ_BLEND_ISOLATED;
state[1].scissor = bbox;
@@ -443,39 +444,40 @@ fz_draw_clip_path(fz_device *devp, fz_path *path, const fz_rect *rect, int even_
}
fz_catch(ctx)
{
- emergency_pop_stack(dev, state);
+ emergency_pop_stack(ctx, dev, state);
}
}
static void
-fz_draw_clip_stroke_path(fz_device *devp, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
+fz_draw_clip_stroke_path(fz_context *ctx, fz_device *devp, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
+ fz_gel *gel = dev->gel;
+
float expansion = fz_matrix_expansion(ctm);
float flatness = 0.3f / expansion;
float linewidth = stroke->linewidth;
fz_irect bbox;
fz_draw_state *state = &dev->stack[dev->top];
fz_colorspace *model;
- fz_context *ctx = dev->ctx;
if (linewidth * expansion < 0.1f)
linewidth = 1 / expansion;
if (flatness < 0.001f)
flatness = 0.001f;
- fz_reset_gel(dev->gel, &state->scissor);
+ fz_reset_gel(ctx, gel, &state->scissor);
if (stroke->dash_len > 0)
- fz_flatten_dash_path(dev->gel, path, stroke, ctm, flatness, linewidth);
+ fz_flatten_dash_path(ctx, gel, path, stroke, ctm, flatness, linewidth);
else
- fz_flatten_stroke_path(dev->gel, path, stroke, ctm, flatness, linewidth);
- fz_sort_gel(dev->gel);
+ fz_flatten_stroke_path(ctx, gel, path, stroke, ctm, flatness, linewidth);
+ fz_sort_gel(ctx, gel);
- state = push_stack(dev);
+ state = push_stack(ctx, dev);
STACK_PUSHED("clip stroke");
model = state->dest->colorspace;
- fz_intersect_irect(fz_bound_gel(dev->gel, &bbox), &state->scissor);
+ fz_intersect_irect(fz_bound_gel(ctx, gel, &bbox), &state->scissor);
if (rect)
{
fz_irect bbox2;
@@ -484,18 +486,18 @@ fz_draw_clip_stroke_path(fz_device *devp, fz_path *path, const fz_rect *rect, fz
fz_try(ctx)
{
- state[1].mask = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, state[1].mask);
- state[1].dest = fz_new_pixmap_with_bbox(dev->ctx, model, &bbox);
- fz_clear_pixmap(dev->ctx, state[1].dest);
+ state[1].mask = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, state[1].mask);
+ state[1].dest = fz_new_pixmap_with_bbox(ctx, model, &bbox);
+ fz_clear_pixmap(ctx, state[1].dest);
if (state->shape)
{
- state[1].shape = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, state[1].shape);
+ state[1].shape = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, state[1].shape);
}
if (!fz_is_empty_irect(&bbox))
- fz_scan_convert(dev->gel, 0, &bbox, state[1].mask, NULL);
+ fz_scan_convert(ctx, gel, 0, &bbox, state[1].mask, NULL);
state[1].blendmode |= FZ_BLEND_ISOLATED;
state[1].scissor = bbox;
@@ -505,7 +507,7 @@ fz_draw_clip_stroke_path(fz_device *devp, fz_path *path, const fz_rect *rect, fz
}
fz_catch(ctx)
{
- emergency_pop_stack(dev, state);
+ emergency_pop_stack(ctx, dev, state);
}
}
@@ -558,10 +560,11 @@ draw_glyph(unsigned char *colorbv, fz_pixmap *dst, fz_glyph *glyph,
}
static void
-fz_draw_fill_text(fz_device *devp, fz_text *text, const fz_matrix *ctm,
+fz_draw_fill_text(fz_context *ctx, fz_device *devp, fz_text *text, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
+
unsigned char colorbv[FZ_MAX_COLORS + 1];
unsigned char shapebv;
float colorfv[FZ_MAX_COLORS];
@@ -572,9 +575,9 @@ fz_draw_fill_text(fz_device *devp, fz_text *text, const fz_matrix *ctm,
fz_colorspace *model = state->dest->colorspace;
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- state = fz_knockout_begin(dev);
+ state = fz_knockout_begin(ctx, dev);
- fz_convert_color(dev->ctx, model, colorfv, colorspace, color);
+ fz_convert_color(ctx, model, colorfv, colorspace, color);
for (i = 0; i < model->n; i++)
colorbv[i] = colorfv[i] * 255;
colorbv[i] = alpha * 255;
@@ -592,7 +595,7 @@ fz_draw_fill_text(fz_device *devp, fz_text *text, const fz_matrix *ctm,
tm.f = text->items[i].y;
fz_concat(&trm, &tm, ctm);
- glyph = fz_render_glyph(dev->ctx, text->font, gid, &trm, model, &state->scissor);
+ glyph = fz_render_glyph(ctx, text->font, gid, &trm, model, &state->scissor);
if (glyph)
{
fz_pixmap *pixmap = glyph->pixmap;
@@ -611,33 +614,34 @@ fz_draw_fill_text(fz_device *devp, fz_text *text, const fz_matrix *ctm,
mat.e = x + pixmap->x; mat.f = y + pixmap->y;
fz_paint_image(state->dest, &state->scissor, state->shape, pixmap, &mat, alpha * 255, !(devp->hints & FZ_DONT_INTERPOLATE_IMAGES));
}
- fz_drop_glyph(dev->ctx, glyph);
+ fz_drop_glyph(ctx, glyph);
}
else
{
- fz_path *path = fz_outline_glyph(dev->ctx, text->font, gid, &tm);
+ fz_path *path = fz_outline_glyph(ctx, text->font, gid, &tm);
if (path)
{
- fz_draw_fill_path(devp, path, 0, ctm, colorspace, color, alpha);
- fz_free_path(dev->ctx, path);
+ fz_draw_fill_path(ctx, devp, path, 0, ctm, colorspace, color, alpha);
+ fz_drop_path(ctx, path);
}
else
{
- fz_warn(dev->ctx, "cannot render glyph");
+ fz_warn(ctx, "cannot render glyph");
}
}
}
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- fz_knockout_end(dev);
+ fz_knockout_end(ctx, dev);
}
static void
-fz_draw_stroke_text(fz_device *devp, fz_text *text, fz_stroke_state *stroke,
+fz_draw_stroke_text(fz_context *ctx, fz_device *devp, fz_text *text, fz_stroke_state *stroke,
const fz_matrix *ctm, fz_colorspace *colorspace,
float *color, float alpha)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
+
unsigned char colorbv[FZ_MAX_COLORS + 1];
float colorfv[FZ_MAX_COLORS];
fz_matrix tm, trm;
@@ -647,9 +651,9 @@ fz_draw_stroke_text(fz_device *devp, fz_text *text, fz_stroke_state *stroke,
fz_colorspace *model = state->dest->colorspace;
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- state = fz_knockout_begin(dev);
+ state = fz_knockout_begin(ctx, dev);
- fz_convert_color(dev->ctx, model, colorfv, colorspace, color);
+ fz_convert_color(ctx, model, colorfv, colorspace, color);
for (i = 0; i < model->n; i++)
colorbv[i] = colorfv[i] * 255;
colorbv[i] = alpha * 255;
@@ -666,7 +670,7 @@ fz_draw_stroke_text(fz_device *devp, fz_text *text, fz_stroke_state *stroke,
tm.f = text->items[i].y;
fz_concat(&trm, &tm, ctm);
- glyph = fz_render_stroked_glyph(dev->ctx, text->font, gid, &trm, ctm, stroke, &state->scissor);
+ glyph = fz_render_stroked_glyph(ctx, text->font, gid, &trm, ctm, stroke, &state->scissor);
if (glyph)
{
int x = (int)trm.e;
@@ -674,32 +678,31 @@ fz_draw_stroke_text(fz_device *devp, fz_text *text, fz_stroke_state *stroke,
draw_glyph(colorbv, state->dest, glyph, x, y, &state->scissor);
if (state->shape)
draw_glyph(colorbv, state->shape, glyph, x, y, &state->scissor);
- fz_drop_glyph(dev->ctx, glyph);
+ fz_drop_glyph(ctx, glyph);
}
else
{
- fz_path *path = fz_outline_glyph(dev->ctx, text->font, gid, &tm);
+ fz_path *path = fz_outline_glyph(ctx, text->font, gid, &tm);
if (path)
{
- fz_draw_stroke_path(devp, path, stroke, ctm, colorspace, color, alpha);
- fz_free_path(dev->ctx, path);
+ fz_draw_stroke_path(ctx, devp, path, stroke, ctm, colorspace, color, alpha);
+ fz_drop_path(ctx, path);
}
else
{
- fz_warn(dev->ctx, "cannot render glyph");
+ fz_warn(ctx, "cannot render glyph");
}
}
}
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- fz_knockout_end(dev);
+ fz_knockout_end(ctx, dev);
}
static void
-fz_draw_clip_text(fz_device *devp, fz_text *text, const fz_matrix *ctm, int accumulate)
+fz_draw_clip_text(fz_context *ctx, fz_device *devp, fz_text *text, const fz_matrix *ctm, int accumulate)
{
- fz_draw_device *dev = devp->user;
- fz_context *ctx = dev->ctx;
+ fz_draw_device *dev = (fz_draw_device*)devp;
fz_irect bbox;
fz_pixmap *mask, *dest, *shape;
fz_matrix tm, trm;
@@ -712,7 +715,7 @@ fz_draw_clip_text(fz_device *devp, fz_text *text, const fz_matrix *ctm, int accu
/* If accumulate == 1 then this text object is the first (or only) in a sequence */
/* If accumulate == 2 then this text object is a continuation */
- state = push_stack(dev);
+ state = push_stack(ctx, dev);
STACK_PUSHED("clip text");
model = state->dest->colorspace;
@@ -721,7 +724,7 @@ fz_draw_clip_text(fz_device *devp, fz_text *text, const fz_matrix *ctm, int accu
/* make the mask the exact size needed */
fz_rect rect;
- fz_irect_from_rect(&bbox, fz_bound_text(dev->ctx, text, NULL, ctm, &rect));
+ fz_irect_from_rect(&bbox, fz_bound_text(ctx, text, NULL, ctm, &rect));
fz_intersect_irect(&bbox, &state->scissor);
}
else
@@ -734,14 +737,14 @@ fz_draw_clip_text(fz_device *devp, fz_text *text, const fz_matrix *ctm, int accu
{
if (accumulate == 0 || accumulate == 1)
{
- mask = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, mask);
- dest = fz_new_pixmap_with_bbox(dev->ctx, model, &bbox);
- fz_clear_pixmap(dev->ctx, dest);
+ mask = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, mask);
+ dest = fz_new_pixmap_with_bbox(ctx, model, &bbox);
+ fz_clear_pixmap(ctx, dest);
if (state->shape)
{
- shape = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, shape);
+ shape = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, shape);
}
else
shape = NULL;
@@ -776,7 +779,7 @@ fz_draw_clip_text(fz_device *devp, fz_text *text, const fz_matrix *ctm, int accu
tm.f = text->items[i].y;
fz_concat(&trm, &tm, ctm);
- glyph = fz_render_glyph(dev->ctx, text->font, gid, &trm, model, &state->scissor);
+ glyph = fz_render_glyph(ctx, text->font, gid, &trm, model, &state->scissor);
if (glyph)
{
int x = (int)trm.e;
@@ -784,11 +787,11 @@ fz_draw_clip_text(fz_device *devp, fz_text *text, const fz_matrix *ctm, int accu
draw_glyph(NULL, mask, glyph, x, y, &bbox);
if (state[1].shape)
draw_glyph(NULL, state[1].shape, glyph, x, y, &bbox);
- fz_drop_glyph(dev->ctx, glyph);
+ fz_drop_glyph(ctx, glyph);
}
else
{
- fz_path *path = fz_outline_glyph(dev->ctx, text->font, gid, &tm);
+ fz_path *path = fz_outline_glyph(ctx, text->font, gid, &tm);
if (path)
{
fz_pixmap *old_dest;
@@ -799,13 +802,13 @@ fz_draw_clip_text(fz_device *devp, fz_text *text, const fz_matrix *ctm, int accu
state[1].mask = NULL;
fz_try(ctx)
{
- fz_draw_fill_path(devp, path, 0, ctm, fz_device_gray(ctx), &white, 1);
+ fz_draw_fill_path(ctx, devp, path, 0, ctm, fz_device_gray(ctx), &white, 1);
}
fz_always(ctx)
{
state[1].mask = state[1].dest;
state[1].dest = old_dest;
- fz_free_path(dev->ctx, path);
+ fz_drop_path(ctx, path);
}
fz_catch(ctx)
{
@@ -814,7 +817,7 @@ fz_draw_clip_text(fz_device *devp, fz_text *text, const fz_matrix *ctm, int accu
}
else
{
- fz_warn(dev->ctx, "cannot render glyph for clipping");
+ fz_warn(ctx, "cannot render glyph for clipping");
}
}
}
@@ -823,40 +826,39 @@ fz_draw_clip_text(fz_device *devp, fz_text *text, const fz_matrix *ctm, int accu
fz_catch(ctx)
{
if (accumulate == 0 || accumulate == 1)
- emergency_pop_stack(dev, state);
+ emergency_pop_stack(ctx, dev, state);
fz_rethrow(ctx);
}
}
static void
-fz_draw_clip_stroke_text(fz_device *devp, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
+fz_draw_clip_stroke_text(fz_context *ctx, fz_device *devp, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
{
- fz_draw_device *dev = devp->user;
- fz_context *ctx = dev->ctx;
+ fz_draw_device *dev = (fz_draw_device*)devp;
fz_irect bbox;
fz_pixmap *mask, *dest, *shape;
fz_matrix tm, trm;
fz_glyph *glyph;
int i, gid;
- fz_draw_state *state = push_stack(dev);
+ fz_draw_state *state = push_stack(ctx, dev);
fz_colorspace *model = state->dest->colorspace;
fz_rect rect;
STACK_PUSHED("clip stroke text");
/* make the mask the exact size needed */
- fz_irect_from_rect(&bbox, fz_bound_text(dev->ctx, text, stroke, ctm, &rect));
+ fz_irect_from_rect(&bbox, fz_bound_text(ctx, text, stroke, ctm, &rect));
fz_intersect_irect(&bbox, &state->scissor);
fz_try(ctx)
{
- state[1].mask = mask = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, mask);
- state[1].dest = dest = fz_new_pixmap_with_bbox(dev->ctx, model, &bbox);
- fz_clear_pixmap(dev->ctx, dest);
+ state[1].mask = mask = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, mask);
+ state[1].dest = dest = fz_new_pixmap_with_bbox(ctx, model, &bbox);
+ fz_clear_pixmap(ctx, dest);
if (state->shape)
{
- state[1].shape = shape = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, shape);
+ state[1].shape = shape = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, shape);
}
else
shape = state->shape;
@@ -881,7 +883,7 @@ fz_draw_clip_stroke_text(fz_device *devp, fz_text *text, fz_stroke_state *stroke
tm.f = text->items[i].y;
fz_concat(&trm, &tm, ctm);
- glyph = fz_render_stroked_glyph(dev->ctx, text->font, gid, &trm, ctm, stroke, &state->scissor);
+ glyph = fz_render_stroked_glyph(ctx, text->font, gid, &trm, ctm, stroke, &state->scissor);
if (glyph)
{
int x = (int)trm.e;
@@ -889,11 +891,11 @@ fz_draw_clip_stroke_text(fz_device *devp, fz_text *text, fz_stroke_state *stroke
draw_glyph(NULL, mask, glyph, x, y, &bbox);
if (shape)
draw_glyph(NULL, shape, glyph, x, y, &bbox);
- fz_drop_glyph(dev->ctx, glyph);
+ fz_drop_glyph(ctx, glyph);
}
else
{
- fz_path *path = fz_outline_glyph(dev->ctx, text->font, gid, &tm);
+ fz_path *path = fz_outline_glyph(ctx, text->font, gid, &tm);
if (path)
{
fz_pixmap *old_dest;
@@ -905,13 +907,13 @@ fz_draw_clip_stroke_text(fz_device *devp, fz_text *text, fz_stroke_state *stroke
state[0].mask = NULL;
fz_try(ctx)
{
- fz_draw_stroke_path(devp, path, stroke, ctm, fz_device_gray(ctx), &white, 1);
+ fz_draw_stroke_path(ctx, devp, path, stroke, ctm, fz_device_gray(ctx), &white, 1);
}
fz_always(ctx)
{
state[0].mask = state[0].dest;
state[0].dest = old_dest;
- fz_free_path(dev->ctx, path);
+ fz_drop_path(ctx, path);
}
fz_catch(ctx)
{
@@ -920,7 +922,7 @@ fz_draw_clip_stroke_text(fz_device *devp, fz_text *text, fz_stroke_state *stroke
}
else
{
- fz_warn(dev->ctx, "cannot render glyph for stroked clipping");
+ fz_warn(ctx, "cannot render glyph for stroked clipping");
}
}
}
@@ -928,19 +930,19 @@ fz_draw_clip_stroke_text(fz_device *devp, fz_text *text, fz_stroke_state *stroke
}
fz_catch(ctx)
{
- emergency_pop_stack(dev, state);
+ emergency_pop_stack(ctx, dev, state);
}
}
static void
-fz_draw_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm)
+fz_draw_ignore_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm)
{
}
static void
-fz_draw_fill_shade(fz_device *devp, fz_shade *shade, const fz_matrix *ctm, float alpha)
+fz_draw_fill_shade(fz_context *ctx, fz_device *devp, fz_shade *shade, const fz_matrix *ctm, float alpha)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
fz_rect bounds;
fz_irect bbox, scissor;
fz_pixmap *dest, *shape;
@@ -949,7 +951,7 @@ fz_draw_fill_shade(fz_device *devp, fz_shade *shade, const fz_matrix *ctm, float
fz_draw_state *state = &dev->stack[dev->top];
fz_colorspace *model = state->dest->colorspace;
- fz_bound_shade(dev->ctx, shade, ctm, &bounds);
+ fz_bound_shade(ctx, shade, ctm, &bounds);
scissor = state->scissor;
fz_intersect_irect(fz_irect_from_rect(&bbox, &bounds), &scissor);
@@ -958,24 +960,24 @@ fz_draw_fill_shade(fz_device *devp, fz_shade *shade, const fz_matrix *ctm, float
if (!model)
{
- fz_warn(dev->ctx, "cannot render shading directly to an alpha mask");
+ fz_warn(ctx, "cannot render shading directly to an alpha mask");
return;
}
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- state = fz_knockout_begin(dev);
+ state = fz_knockout_begin(ctx, dev);
dest = state->dest;
shape = state->shape;
if (alpha < 1)
{
- dest = fz_new_pixmap_with_bbox(dev->ctx, state->dest->colorspace, &bbox);
- fz_clear_pixmap(dev->ctx, dest);
+ dest = fz_new_pixmap_with_bbox(ctx, state->dest->colorspace, &bbox);
+ fz_clear_pixmap(ctx, dest);
if (shape)
{
- shape = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, shape);
+ shape = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, shape);
}
}
@@ -983,7 +985,7 @@ fz_draw_fill_shade(fz_device *devp, fz_shade *shade, const fz_matrix *ctm, float
{
unsigned char *s;
int x, y, n, i;
- fz_convert_color(dev->ctx, model, colorfv, shade->colorspace, shade->background);
+ fz_convert_color(ctx, model, colorfv, shade->colorspace, shade->background);
for (i = 0; i < model->n; i++)
colorbv[i] = colorfv[i] * 255;
colorbv[i] = 255;
@@ -1011,30 +1013,29 @@ fz_draw_fill_shade(fz_device *devp, fz_shade *shade, const fz_matrix *ctm, float
}
}
- fz_paint_shade(dev->ctx, shade, ctm, dest, &bbox);
+ fz_paint_shade(ctx, shade, ctm, dest, &bbox);
if (shape)
- fz_clear_pixmap_rect_with_value(dev->ctx, shape, 255, &bbox);
+ fz_clear_pixmap_rect_with_value(ctx, shape, 255, &bbox);
if (alpha < 1)
{
fz_paint_pixmap(state->dest, dest, alpha * 255);
- fz_drop_pixmap(dev->ctx, dest);
+ fz_drop_pixmap(ctx, dest);
if (shape)
{
fz_paint_pixmap(state->shape, shape, alpha * 255);
- fz_drop_pixmap(dev->ctx, shape);
+ fz_drop_pixmap(ctx, shape);
}
}
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- fz_knockout_end(dev);
+ fz_knockout_end(ctx, dev);
}
static fz_pixmap *
-fz_transform_pixmap(fz_draw_device *dev, fz_pixmap *image, fz_matrix *ctm, int x, int y, int dx, int dy, int gridfit, const fz_irect *clip)
+fz_transform_pixmap(fz_context *ctx, fz_draw_device *dev, fz_pixmap *image, fz_matrix *ctm, int x, int y, int dx, int dy, int gridfit, const fz_irect *clip)
{
fz_pixmap *scaled;
- fz_context *ctx = dev->ctx;
if (ctm->a != 0 && ctm->b == 0 && ctm->c == 0 && ctm->d != 0)
{
@@ -1087,16 +1088,15 @@ fz_transform_pixmap(fz_draw_device *dev, fz_pixmap *image, fz_matrix *ctm, int x
}
static void
-fz_draw_fill_image(fz_device *devp, fz_image *image, const fz_matrix *ctm, float alpha)
+fz_draw_fill_image(fz_context *ctx, fz_device *devp, fz_image *image, const fz_matrix *ctm, float alpha)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
fz_pixmap *converted = NULL;
fz_pixmap *scaled = NULL;
fz_pixmap *pixmap;
fz_pixmap *orig_pixmap;
int after;
int dx, dy;
- fz_context *ctx = dev->ctx;
fz_draw_state *state = &dev->stack[dev->top];
fz_colorspace *model = state->dest->colorspace;
fz_irect clip;
@@ -1108,7 +1108,7 @@ fz_draw_fill_image(fz_device *devp, fz_image *image, const fz_matrix *ctm, float
if (!model)
{
- fz_warn(dev->ctx, "cannot render image directly to an alpha mask");
+ fz_warn(ctx, "cannot render image directly to an alpha mask");
return;
}
@@ -1128,7 +1128,7 @@ fz_draw_fill_image(fz_device *devp, fz_image *image, const fz_matrix *ctm, float
fz_try(ctx)
{
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- state = fz_knockout_begin(dev);
+ state = fz_knockout_begin(ctx, dev);
after = 0;
if (pixmap->colorspace == fz_device_gray(ctx))
@@ -1146,7 +1146,7 @@ fz_draw_fill_image(fz_device *devp, fz_image *image, const fz_matrix *ctm, float
if (dx < pixmap->w && dy < pixmap->h && !(devp->hints & FZ_DONT_INTERPOLATE_IMAGES))
{
int gridfit = alpha == 1.0f && !(dev->flags & FZ_DRAWDEV_FLAGS_TYPE3);
- scaled = fz_transform_pixmap(dev, pixmap, &local_ctm, state->dest->x, state->dest->y, dx, dy, gridfit, &clip);
+ scaled = fz_transform_pixmap(ctx, dev, pixmap, &local_ctm, state->dest->x, state->dest->y, dx, dy, gridfit, &clip);
if (!scaled)
{
if (dx < 1)
@@ -1179,7 +1179,7 @@ fz_draw_fill_image(fz_device *devp, fz_image *image, const fz_matrix *ctm, float
fz_paint_image(state->dest, &state->scissor, state->shape, pixmap, &local_ctm, alpha * 255, !(devp->hints & FZ_DONT_INTERPOLATE_IMAGES));
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- fz_knockout_end(dev);
+ fz_knockout_end(ctx, dev);
}
fz_always(ctx)
{
@@ -1194,10 +1194,10 @@ fz_draw_fill_image(fz_device *devp, fz_image *image, const fz_matrix *ctm, float
}
static void
-fz_draw_fill_image_mask(fz_device *devp, fz_image *image, const fz_matrix *ctm,
+fz_draw_fill_image_mask(fz_context *ctx, fz_device *devp, fz_image *image, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
unsigned char colorbv[FZ_MAX_COLORS + 1];
float colorfv[FZ_MAX_COLORS];
fz_pixmap *scaled = NULL;
@@ -1205,7 +1205,6 @@ fz_draw_fill_image_mask(fz_device *devp, fz_image *image, const fz_matrix *ctm,
fz_pixmap *orig_pixmap;
int dx, dy;
int i;
- fz_context *ctx = dev->ctx;
fz_draw_state *state = &dev->stack[dev->top];
fz_colorspace *model = state->dest->colorspace;
fz_irect clip;
@@ -1225,25 +1224,25 @@ fz_draw_fill_image_mask(fz_device *devp, fz_image *image, const fz_matrix *ctm,
fz_try(ctx)
{
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- state = fz_knockout_begin(dev);
+ state = fz_knockout_begin(ctx, dev);
if (dx < pixmap->w && dy < pixmap->h)
{
int gridfit = alpha == 1.0f && !(dev->flags & FZ_DRAWDEV_FLAGS_TYPE3);
- scaled = fz_transform_pixmap(dev, pixmap, &local_ctm, state->dest->x, state->dest->y, dx, dy, gridfit, &clip);
+ scaled = fz_transform_pixmap(ctx, dev, pixmap, &local_ctm, state->dest->x, state->dest->y, dx, dy, gridfit, &clip);
if (!scaled)
{
if (dx < 1)
dx = 1;
if (dy < 1)
dy = 1;
- scaled = fz_scale_pixmap_cached(dev->ctx, pixmap, pixmap->x, pixmap->y, dx, dy, NULL, dev->cache_x, dev->cache_y);
+ scaled = fz_scale_pixmap_cached(ctx, pixmap, pixmap->x, pixmap->y, dx, dy, NULL, dev->cache_x, dev->cache_y);
}
if (scaled)
pixmap = scaled;
}
- fz_convert_color(dev->ctx, model, colorfv, colorspace, color);
+ fz_convert_color(ctx, model, colorfv, colorspace, color);
for (i = 0; i < model->n; i++)
colorbv[i] = colorfv[i] * 255;
colorbv[i] = alpha * 255;
@@ -1251,14 +1250,14 @@ fz_draw_fill_image_mask(fz_device *devp, fz_image *image, const fz_matrix *ctm,
fz_paint_image_with_color(state->dest, &state->scissor, state->shape, pixmap, &local_ctm, colorbv, !(devp->hints & FZ_DONT_INTERPOLATE_IMAGES));
if (scaled)
- fz_drop_pixmap(dev->ctx, scaled);
+ fz_drop_pixmap(ctx, scaled);
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- fz_knockout_end(dev);
+ fz_knockout_end(ctx, dev);
}
fz_always(ctx)
{
- fz_drop_pixmap(dev->ctx, orig_pixmap);
+ fz_drop_pixmap(ctx, orig_pixmap);
}
fz_catch(ctx)
{
@@ -1267,10 +1266,9 @@ fz_draw_fill_image_mask(fz_device *devp, fz_image *image, const fz_matrix *ctm,
}
static void
-fz_draw_clip_image_mask(fz_device *devp, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
+fz_draw_clip_image_mask(fz_context *ctx, fz_device *devp, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
{
- fz_draw_device *dev = devp->user;
- fz_context *ctx = dev->ctx;
+ fz_draw_device *dev = (fz_draw_device*)devp;
fz_irect bbox;
fz_pixmap *mask = NULL;
fz_pixmap *dest = NULL;
@@ -1279,7 +1277,7 @@ fz_draw_clip_image_mask(fz_device *devp, fz_image *image, const fz_rect *rect, c
fz_pixmap *pixmap = NULL;
fz_pixmap *orig_pixmap = NULL;
int dx, dy;
- fz_draw_state *state = push_stack(dev);
+ fz_draw_state *state = push_stack(ctx, dev);
fz_colorspace *model = state->dest->colorspace;
fz_irect clip;
fz_matrix local_ctm = *ctm;
@@ -1326,15 +1324,15 @@ fz_draw_clip_image_mask(fz_device *devp, fz_image *image, const fz_rect *rect, c
pixmap = fz_new_pixmap_from_image(ctx, image, dx, dy);
orig_pixmap = pixmap;
- state[1].mask = mask = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, mask);
+ state[1].mask = mask = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, mask);
- state[1].dest = dest = fz_new_pixmap_with_bbox(dev->ctx, model, &bbox);
- fz_clear_pixmap(dev->ctx, dest);
+ state[1].dest = dest = fz_new_pixmap_with_bbox(ctx, model, &bbox);
+ fz_clear_pixmap(ctx, dest);
if (state->shape)
{
- state[1].shape = shape = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, shape);
+ state[1].shape = shape = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, shape);
}
state[1].blendmode |= FZ_BLEND_ISOLATED;
@@ -1343,14 +1341,14 @@ fz_draw_clip_image_mask(fz_device *devp, fz_image *image, const fz_rect *rect, c
if (dx < pixmap->w && dy < pixmap->h)
{
int gridfit = !(dev->flags & FZ_DRAWDEV_FLAGS_TYPE3);
- scaled = fz_transform_pixmap(dev, pixmap, &local_ctm, state->dest->x, state->dest->y, dx, dy, gridfit, &clip);
+ scaled = fz_transform_pixmap(ctx, dev, pixmap, &local_ctm, state->dest->x, state->dest->y, dx, dy, gridfit, &clip);
if (!scaled)
{
if (dx < 1)
dx = 1;
if (dy < 1)
dy = 1;
- scaled = fz_scale_pixmap_cached(dev->ctx, pixmap, pixmap->x, pixmap->y, dx, dy, NULL, dev->cache_x, dev->cache_y);
+ scaled = fz_scale_pixmap_cached(ctx, pixmap, pixmap->x, pixmap->y, dx, dy, NULL, dev->cache_x, dev->cache_y);
}
if (scaled)
pixmap = scaled;
@@ -1364,15 +1362,14 @@ fz_draw_clip_image_mask(fz_device *devp, fz_image *image, const fz_rect *rect, c
}
fz_catch(ctx)
{
- emergency_pop_stack(dev, state);
+ emergency_pop_stack(ctx, dev, state);
}
}
static void
-fz_draw_pop_clip(fz_device *devp)
+fz_draw_pop_clip(fz_context *ctx, fz_device *devp)
{
- fz_draw_device *dev = devp->user;
- fz_context *ctx = dev->ctx;
+ fz_draw_device *dev = (fz_draw_device*)devp;
fz_draw_state *state;
if (dev->top == 0)
@@ -1390,31 +1387,31 @@ fz_draw_pop_clip(fz_device *devp)
{
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "");
- fz_dump_blend(dev->ctx, state[1].dest, "Clipping ");
+ fz_dump_blend(ctx, state[1].dest, "Clipping ");
if (state[1].shape)
- fz_dump_blend(dev->ctx, state[1].shape, "/");
- fz_dump_blend(dev->ctx, state[0].dest, " onto ");
+ fz_dump_blend(ctx, state[1].shape, "/");
+ fz_dump_blend(ctx, state[0].dest, " onto ");
if (state[0].shape)
- fz_dump_blend(dev->ctx, state[0].shape, "/");
- fz_dump_blend(dev->ctx, state[1].mask, " with ");
+ fz_dump_blend(ctx, state[0].shape, "/");
+ fz_dump_blend(ctx, state[1].mask, " with ");
#endif
fz_paint_pixmap_with_mask(state[0].dest, state[1].dest, state[1].mask);
if (state[0].shape != state[1].shape)
{
fz_paint_pixmap_with_mask(state[0].shape, state[1].shape, state[1].mask);
- fz_drop_pixmap(dev->ctx, state[1].shape);
+ fz_drop_pixmap(ctx, state[1].shape);
}
/* The following tests should not be required, but just occasionally
* errors can cause the stack to get out of sync, and this might save
* our bacon. */
if (state[0].mask != state[1].mask)
- fz_drop_pixmap(dev->ctx, state[1].mask);
+ fz_drop_pixmap(ctx, state[1].mask);
if (state[0].dest != state[1].dest)
- fz_drop_pixmap(dev->ctx, state[1].dest);
+ fz_drop_pixmap(ctx, state[1].dest);
#ifdef DUMP_GROUP_BLENDS
- fz_dump_blend(dev->ctx, state[0].dest, " to get ");
+ fz_dump_blend(ctx, state[0].dest, " to get ");
if (state[0].shape)
- fz_dump_blend(dev->ctx, state[0].shape, "/");
+ fz_dump_blend(ctx, state[0].shape, "/");
printf("\n");
#endif
}
@@ -1427,21 +1424,20 @@ fz_draw_pop_clip(fz_device *devp)
}
static void
-fz_draw_begin_mask(fz_device *devp, const fz_rect *rect, int luminosity, fz_colorspace *colorspace, float *colorfv)
+fz_draw_begin_mask(fz_context *ctx, fz_device *devp, const fz_rect *rect, int luminosity, fz_colorspace *colorspace, float *colorfv)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
fz_pixmap *dest;
fz_irect bbox;
- fz_draw_state *state = push_stack(dev);
+ fz_draw_state *state = push_stack(ctx, dev);
fz_pixmap *shape = state->shape;
- fz_context *ctx = dev->ctx;
STACK_PUSHED("mask");
fz_intersect_irect(fz_irect_from_rect(&bbox, rect), &state->scissor);
fz_try(ctx)
{
- state[1].dest = dest = fz_new_pixmap_with_bbox(dev->ctx, fz_device_gray(ctx), &bbox);
+ state[1].dest = dest = fz_new_pixmap_with_bbox(ctx, fz_device_gray(ctx), &bbox);
if (state->shape)
{
/* FIXME: If we ever want to support AIS true, then
@@ -1458,16 +1454,16 @@ fz_draw_begin_mask(fz_device *devp, const fz_rect *rect, int luminosity, fz_colo
float bc;
if (!colorspace)
colorspace = fz_device_gray(ctx);
- fz_convert_color(dev->ctx, fz_device_gray(ctx), &bc, colorspace, colorfv);
- fz_clear_pixmap_with_value(dev->ctx, dest, bc * 255);
+ fz_convert_color(ctx, fz_device_gray(ctx), &bc, colorspace, colorfv);
+ fz_clear_pixmap_with_value(ctx, dest, bc * 255);
if (shape)
- fz_clear_pixmap_with_value(dev->ctx, shape, 255);
+ fz_clear_pixmap_with_value(ctx, shape, 255);
}
else
{
- fz_clear_pixmap(dev->ctx, dest);
+ fz_clear_pixmap(ctx, dest);
if (shape)
- fz_clear_pixmap(dev->ctx, shape);
+ fz_clear_pixmap(ctx, shape);
}
#ifdef DUMP_GROUP_BLENDS
@@ -1478,18 +1474,17 @@ fz_draw_begin_mask(fz_device *devp, const fz_rect *rect, int luminosity, fz_colo
}
fz_catch(ctx)
{
- emergency_pop_stack(dev, state);
+ emergency_pop_stack(ctx, dev, state);
}
}
static void
-fz_draw_end_mask(fz_device *devp)
+fz_draw_end_mask(fz_context *ctx, fz_device *devp)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
fz_pixmap *temp, *dest;
fz_irect bbox;
int luminosity;
- fz_context *ctx = dev->ctx;
fz_draw_state *state;
if (dev->top == 0)
@@ -1508,21 +1503,21 @@ fz_draw_end_mask(fz_device *devp)
fz_try(ctx)
{
/* convert to alpha mask */
- temp = fz_alpha_from_gray(dev->ctx, state[1].dest, luminosity);
+ temp = fz_alpha_from_gray(ctx, state[1].dest, luminosity);
if (state[1].mask != state[0].mask)
- fz_drop_pixmap(dev->ctx, state[1].mask);
+ fz_drop_pixmap(ctx, state[1].mask);
state[1].mask = temp;
if (state[1].dest != state[0].dest)
- fz_drop_pixmap(dev->ctx, state[1].dest);
+ fz_drop_pixmap(ctx, state[1].dest);
state[1].dest = NULL;
if (state[1].shape != state[0].shape)
- fz_drop_pixmap(dev->ctx, state[1].shape);
+ fz_drop_pixmap(ctx, state[1].shape);
state[1].shape = NULL;
/* create new dest scratch buffer */
fz_pixmap_bbox(ctx, temp, &bbox);
- dest = fz_new_pixmap_with_bbox(dev->ctx, state->dest->colorspace, &bbox);
- fz_clear_pixmap(dev->ctx, dest);
+ dest = fz_new_pixmap_with_bbox(ctx, state->dest->colorspace, &bbox);
+ fz_clear_pixmap(ctx, dest);
/* push soft mask as clip mask */
state[1].dest = dest;
@@ -1531,31 +1526,30 @@ fz_draw_end_mask(fz_device *devp)
* clip mask when we pop. So create a new shape now. */
if (state[0].shape)
{
- state[1].shape = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, state[1].shape);
+ state[1].shape = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
+ fz_clear_pixmap(ctx, state[1].shape);
}
state[1].scissor = bbox;
}
fz_catch(ctx)
{
- emergency_pop_stack(dev, state);
+ emergency_pop_stack(ctx, dev, state);
}
}
static void
-fz_draw_begin_group(fz_device *devp, const fz_rect *rect, int isolated, int knockout, int blendmode, float alpha)
+fz_draw_begin_group(fz_context *ctx, fz_device *devp, const fz_rect *rect, int isolated, int knockout, int blendmode, float alpha)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
fz_irect bbox;
fz_pixmap *dest;
- fz_context *ctx = dev->ctx;
fz_draw_state *state = &dev->stack[dev->top];
fz_colorspace *model = state->dest->colorspace;
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- fz_knockout_begin(dev);
+ fz_knockout_begin(ctx, dev);
- state = push_stack(dev);
+ state = push_stack(ctx, dev);
STACK_PUSHED("group");
fz_intersect_irect(fz_irect_from_rect(&bbox, rect), &state->scissor);
@@ -1570,11 +1564,11 @@ fz_draw_begin_group(fz_device *devp, const fz_rect *rect, int isolated, int knoc
if (isolated)
{
- fz_clear_pixmap(dev->ctx, dest);
+ fz_clear_pixmap(ctx, dest);
}
else
{
- fz_copy_pixmap_rect(dev->ctx, dest, state[0].dest, &bbox);
+ fz_copy_pixmap_rect(ctx, dest, state[0].dest, &bbox);
}
if (blendmode == 0 && alpha == 1.0 && isolated)
@@ -1586,7 +1580,7 @@ fz_draw_begin_group(fz_device *devp, const fz_rect *rect, int isolated, int knoc
else
{
state[1].shape = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
- fz_clear_pixmap(dev->ctx, state[1].shape);
+ fz_clear_pixmap(ctx, state[1].shape);
}
state[1].alpha = alpha;
@@ -1599,18 +1593,17 @@ fz_draw_begin_group(fz_device *devp, const fz_rect *rect, int isolated, int knoc
}
fz_catch(ctx)
{
- emergency_pop_stack(dev, state);
+ emergency_pop_stack(ctx, dev, state);
}
}
static void
-fz_draw_end_group(fz_device *devp)
+fz_draw_end_group(fz_context *ctx, fz_device *devp)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
int blendmode;
int isolated;
float alpha;
- fz_context *ctx = dev->ctx;
fz_draw_state *state;
if (dev->top == 0)
@@ -1626,12 +1619,12 @@ fz_draw_end_group(fz_device *devp)
isolated = state[1].blendmode & FZ_BLEND_ISOLATED;
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "");
- fz_dump_blend(dev->ctx, state[1].dest, "Group end: blending ");
+ fz_dump_blend(ctx, state[1].dest, "Group end: blending ");
if (state[1].shape)
- fz_dump_blend(dev->ctx, state[1].shape, "/");
- fz_dump_blend(dev->ctx, state[0].dest, " onto ");
+ fz_dump_blend(ctx, state[1].shape, "/");
+ fz_dump_blend(ctx, state[0].dest, " onto ");
if (state[0].shape)
- fz_dump_blend(dev->ctx, state[0].shape, "/");
+ fz_dump_blend(ctx, state[0].shape, "/");
if (alpha != 1.0f)
printf(" (alpha %g)", alpha);
if (blendmode != 0)
@@ -1650,22 +1643,22 @@ fz_draw_end_group(fz_device *devp)
* errors can cause the stack to get out of sync, and this might save
* our bacon. */
if (state[0].dest != state[1].dest)
- fz_drop_pixmap(dev->ctx, state[1].dest);
+ fz_drop_pixmap(ctx, state[1].dest);
if (state[0].shape != state[1].shape)
{
if (state[0].shape)
fz_paint_pixmap(state[0].shape, state[1].shape, alpha * 255);
- fz_drop_pixmap(dev->ctx, state[1].shape);
+ fz_drop_pixmap(ctx, state[1].shape);
}
#ifdef DUMP_GROUP_BLENDS
- fz_dump_blend(dev->ctx, state[0].dest, " to get ");
+ fz_dump_blend(ctx, state[0].dest, " to get ");
if (state[0].shape)
- fz_dump_blend(dev->ctx, state[0].shape, "/");
+ fz_dump_blend(ctx, state[0].shape, "/");
printf("\n");
#endif
if (state[0].blendmode & FZ_BLEND_KNOCKOUT)
- fz_knockout_end(dev);
+ fz_knockout_end(ctx, dev);
}
typedef struct
@@ -1683,7 +1676,7 @@ typedef struct
} tile_record;
static int
-fz_make_hash_tile_key(fz_store_hash *hash, void *key_)
+fz_make_hash_tile_key(fz_context *ctx, fz_store_hash *hash, void *key_)
{
tile_key *key = (tile_key *)key_;
@@ -1699,44 +1692,30 @@ static void *
fz_keep_tile_key(fz_context *ctx, void *key_)
{
tile_key *key = (tile_key *)key_;
-
- fz_lock(ctx, FZ_LOCK_ALLOC);
- key->refs++;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
-
- return (void *)key;
+ return fz_keep_imp(ctx, key, &key->refs);
}
static void
fz_drop_tile_key(fz_context *ctx, void *key_)
{
tile_key *key = (tile_key *)key_;
- int drop;
-
- fz_lock(ctx, FZ_LOCK_ALLOC);
- drop = --key->refs;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- if (drop == 0)
- {
+ if (fz_drop_imp(ctx, key, &key->refs))
fz_free(ctx, key);
- }
}
static int
-fz_cmp_tile_key(void *k0_, void *k1_)
+fz_cmp_tile_key(fz_context *ctx, void *k0_, void *k1_)
{
tile_key *k0 = (tile_key *)k0_;
tile_key *k1 = (tile_key *)k1_;
-
return k0->id == k1->id && k0->ctm[0] == k1->ctm[0] && k0->ctm[1] == k1->ctm[1] && k0->ctm[2] == k1->ctm[2] && k0->ctm[3] == k1->ctm[3];
}
#ifndef NDEBUG
static void
-fz_debug_tile(FILE *out, void *key_)
+fz_debug_tile(fz_context *ctx, FILE *out, void *key_)
{
tile_key *key = (tile_key *)key_;
-
fprintf(out, "(tile id=%x, ctm=%g %g %g %g) ", key->id, key->ctm[0], key->ctm[1], key->ctm[2], key->ctm[3]);
}
#endif
@@ -1753,12 +1732,9 @@ static fz_store_type fz_tile_store_type =
};
static void
-fz_free_tile_record_imp(fz_context *ctx, fz_storable *storable)
+fz_drop_tile_record_imp(fz_context *ctx, fz_storable *storable)
{
- tile_record *tr = (tile_record *)(void *)storable;
-
- if (tr == NULL)
- return;
+ tile_record *tr = (tile_record *)storable;
fz_drop_pixmap(ctx, tr->dest);
fz_drop_pixmap(ctx, tr->shape);
fz_free(ctx, tr);
@@ -1774,7 +1750,7 @@ static tile_record *
fz_new_tile_record(fz_context *ctx, fz_pixmap *dest, fz_pixmap *shape)
{
tile_record *tile = fz_malloc_struct(ctx, tile_record);
- FZ_INIT_STORABLE(tile, 1, fz_free_tile_record_imp);
+ FZ_INIT_STORABLE(tile, 1, fz_drop_tile_record_imp);
tile->dest = fz_keep_pixmap(ctx, dest);
tile->shape = fz_keep_pixmap(ctx, shape);
return tile;
@@ -1789,13 +1765,12 @@ fz_tile_size(fz_context *ctx, tile_record *tile)
}
static int
-fz_draw_begin_tile(fz_device *devp, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
+fz_draw_begin_tile(fz_context *ctx, fz_device *devp, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
fz_pixmap *dest = NULL;
fz_pixmap *shape;
fz_irect bbox;
- fz_context *ctx = dev->ctx;
fz_draw_state *state = &dev->stack[dev->top];
fz_colorspace *model = state->dest->colorspace;
fz_rect local_view = *view;
@@ -1804,9 +1779,9 @@ fz_draw_begin_tile(fz_device *devp, const fz_rect *area, const fz_rect *view, fl
/* ctm maps from pattern space to device space */
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- fz_knockout_begin(dev);
+ fz_knockout_begin(ctx, dev);
- state = push_stack(dev);
+ state = push_stack(ctx, dev);
STACK_PUSHED("tile");
fz_irect_from_rect(&bbox, fz_transform_rect(&local_view, ctm));
/* We should never have a bbox that entirely covers our destination.
@@ -1828,7 +1803,7 @@ fz_draw_begin_tile(fz_device *devp, const fz_rect *area, const fz_rect *view, fl
tk.ctm[3] = ctm->d;
tk.id = id;
- tile = fz_find_item(ctx, fz_free_tile_record_imp, &tk, &fz_tile_store_type);
+ tile = fz_find_item(ctx, fz_drop_tile_record_imp, &tk, &fz_tile_store_type);
if (tile)
{
state[1].dest = fz_keep_pixmap(ctx, tile->dest);
@@ -1851,12 +1826,12 @@ fz_draw_begin_tile(fz_device *devp, const fz_rect *area, const fz_rect *view, fl
fz_try(ctx)
{
- state[1].dest = dest = fz_new_pixmap_with_bbox(dev->ctx, model, &bbox);
+ state[1].dest = dest = fz_new_pixmap_with_bbox(ctx, model, &bbox);
fz_clear_pixmap(ctx, dest);
shape = state[0].shape;
if (shape)
{
- state[1].shape = shape = fz_new_pixmap_with_bbox(dev->ctx, NULL, &bbox);
+ state[1].shape = shape = fz_new_pixmap_with_bbox(ctx, NULL, &bbox);
fz_clear_pixmap(ctx, shape);
}
state[1].blendmode |= FZ_BLEND_ISOLATED;
@@ -1873,22 +1848,21 @@ fz_draw_begin_tile(fz_device *devp, const fz_rect *area, const fz_rect *view, fl
}
fz_catch(ctx)
{
- emergency_pop_stack(dev, state);
+ emergency_pop_stack(ctx, dev, state);
}
return 0;
}
static void
-fz_draw_end_tile(fz_device *devp)
+fz_draw_end_tile(fz_context *ctx, fz_device *devp)
{
- fz_draw_device *dev = devp->user;
+ fz_draw_device *dev = (fz_draw_device*)devp;
float xstep, ystep;
fz_matrix ttm, ctm, shapectm;
fz_irect area, scissor;
fz_rect scissor_tmp;
int x0, y0, x1, y1, x, y;
- fz_context *ctx = dev->ctx;
fz_draw_state *state;
tile_record *tile;
tile_key *key;
@@ -1940,12 +1914,12 @@ fz_draw_end_tile(fz_device *devp)
#ifdef DUMP_GROUP_BLENDS
dump_spaces(dev->top, "");
- fz_dump_blend(dev->ctx, state[1].dest, "Tiling ");
+ fz_dump_blend(ctx, state[1].dest, "Tiling ");
if (state[1].shape)
- fz_dump_blend(dev->ctx, state[1].shape, "/");
- fz_dump_blend(dev->ctx, state[0].dest, " onto ");
+ fz_dump_blend(ctx, state[1].shape, "/");
+ fz_dump_blend(ctx, state[0].dest, " onto ");
if (state[0].shape)
- fz_dump_blend(dev->ctx, state[0].shape, "/");
+ fz_dump_blend(ctx, state[0].shape, "/");
#endif
for (y = y0; y < y1; y++)
@@ -2023,25 +1997,26 @@ fz_draw_end_tile(fz_device *devp)
* errors can cause the stack to get out of sync, and this might save
* our bacon. */
if (state[0].dest != state[1].dest)
- fz_drop_pixmap(dev->ctx, state[1].dest);
+ fz_drop_pixmap(ctx, state[1].dest);
if (state[0].shape != state[1].shape)
- fz_drop_pixmap(dev->ctx, state[1].shape);
+ fz_drop_pixmap(ctx, state[1].shape);
#ifdef DUMP_GROUP_BLENDS
- fz_dump_blend(dev->ctx, state[0].dest, " to get ");
+ fz_dump_blend(ctx, state[0].dest, " to get ");
if (state[0].shape)
- fz_dump_blend(dev->ctx, state[0].shape, "/");
+ fz_dump_blend(ctx, state[0].shape, "/");
printf("\n");
#endif
if (state->blendmode & FZ_BLEND_KNOCKOUT)
- fz_knockout_end(dev);
+ fz_knockout_end(ctx, dev);
}
static void
-fz_draw_free_user(fz_device *devp)
+fz_draw_drop_imp(fz_context *ctx, fz_device *devp)
{
- fz_draw_device *dev = devp->user;
- fz_context *ctx = dev->ctx;
+ fz_draw_device *dev = (fz_draw_device*)devp;
+ fz_gel *gel = dev->gel;
+
/* pop and free the stacks */
if (dev->top > 0)
fz_warn(ctx, "items left on stack in draw device: %d", dev->top+1);
@@ -2062,103 +2037,95 @@ fz_draw_free_user(fz_device *devp)
*/
if (dev->stack != &dev->init_stack[0])
fz_free(ctx, dev->stack);
- fz_free_scale_cache(ctx, dev->cache_x);
- fz_free_scale_cache(ctx, dev->cache_y);
- fz_free_gel(dev->gel);
- fz_free(ctx, dev);
+ fz_drop_scale_cache(ctx, dev->cache_x);
+ fz_drop_scale_cache(ctx, dev->cache_y);
+ fz_drop_gel(ctx, gel);
}
fz_device *
fz_new_draw_device(fz_context *ctx, fz_pixmap *dest)
{
- fz_device *dev = NULL;
- fz_draw_device *ddev = fz_malloc_struct(ctx, fz_draw_device);
+ fz_draw_device *dev = fz_new_device(ctx, sizeof *dev);
+
+ dev->super.drop_imp = fz_draw_drop_imp;
+
+ dev->super.fill_path = fz_draw_fill_path;
+ dev->super.stroke_path = fz_draw_stroke_path;
+ dev->super.clip_path = fz_draw_clip_path;
+ dev->super.clip_stroke_path = fz_draw_clip_stroke_path;
+
+ dev->super.fill_text = fz_draw_fill_text;
+ dev->super.stroke_text = fz_draw_stroke_text;
+ dev->super.clip_text = fz_draw_clip_text;
+ dev->super.clip_stroke_text = fz_draw_clip_stroke_text;
+ dev->super.ignore_text = fz_draw_ignore_text;
+
+ dev->super.fill_image_mask = fz_draw_fill_image_mask;
+ dev->super.clip_image_mask = fz_draw_clip_image_mask;
+ dev->super.fill_image = fz_draw_fill_image;
+ dev->super.fill_shade = fz_draw_fill_shade;
+
+ dev->super.pop_clip = fz_draw_pop_clip;
+
+ dev->super.begin_mask = fz_draw_begin_mask;
+ dev->super.end_mask = fz_draw_end_mask;
+ dev->super.begin_group = fz_draw_begin_group;
+ dev->super.end_group = fz_draw_end_group;
+
+ dev->super.begin_tile = fz_draw_begin_tile;
+ dev->super.end_tile = fz_draw_end_tile;
+
+ dev->flags = 0;
+ dev->top = 0;
+ dev->stack = &dev->init_stack[0];
+ dev->stack_cap = STACK_SIZE;
+ dev->stack[0].dest = dest;
+ dev->stack[0].shape = NULL;
+ dev->stack[0].mask = NULL;
+ dev->stack[0].blendmode = 0;
+ dev->stack[0].scissor.x0 = dest->x;
+ dev->stack[0].scissor.y0 = dest->y;
+ dev->stack[0].scissor.x1 = dest->x + dest->w;
+ dev->stack[0].scissor.y1 = dest->y + dest->h;
- fz_var(dev);
fz_try(ctx)
{
- ddev->gel = fz_new_gel(ctx);
- ddev->flags = 0;
- ddev->ctx = ctx;
- ddev->top = 0;
- ddev->cache_x = fz_new_scale_cache(ctx);
- ddev->cache_y = fz_new_scale_cache(ctx);
- ddev->stack = &ddev->init_stack[0];
- ddev->stack_cap = STACK_SIZE;
- ddev->stack[0].dest = dest;
- ddev->stack[0].shape = NULL;
- ddev->stack[0].mask = NULL;
- ddev->stack[0].blendmode = 0;
- ddev->stack[0].scissor.x0 = dest->x;
- ddev->stack[0].scissor.y0 = dest->y;
- ddev->stack[0].scissor.x1 = dest->x + dest->w;
- ddev->stack[0].scissor.y1 = dest->y + dest->h;
-
- dev = fz_new_device(ctx, ddev);
+ dev->gel = fz_new_gel(ctx);
+ dev->cache_x = fz_new_scale_cache(ctx);
+ dev->cache_y = fz_new_scale_cache(ctx);
}
fz_catch(ctx)
{
- fz_free_scale_cache(ctx, ddev->cache_x);
- fz_free_scale_cache(ctx, ddev->cache_y);
- fz_free_gel(ddev->gel);
- fz_free(ctx, ddev);
+ fz_drop_device(ctx, (fz_device*)dev);
fz_rethrow(ctx);
}
- dev->free_user = fz_draw_free_user;
-
- dev->fill_path = fz_draw_fill_path;
- dev->stroke_path = fz_draw_stroke_path;
- dev->clip_path = fz_draw_clip_path;
- dev->clip_stroke_path = fz_draw_clip_stroke_path;
-
- dev->fill_text = fz_draw_fill_text;
- dev->stroke_text = fz_draw_stroke_text;
- dev->clip_text = fz_draw_clip_text;
- dev->clip_stroke_text = fz_draw_clip_stroke_text;
- dev->ignore_text = fz_draw_ignore_text;
-
- dev->fill_image_mask = fz_draw_fill_image_mask;
- dev->clip_image_mask = fz_draw_clip_image_mask;
- dev->fill_image = fz_draw_fill_image;
- dev->fill_shade = fz_draw_fill_shade;
-
- dev->pop_clip = fz_draw_pop_clip;
-
- dev->begin_mask = fz_draw_begin_mask;
- dev->end_mask = fz_draw_end_mask;
- dev->begin_group = fz_draw_begin_group;
- dev->end_group = fz_draw_end_group;
-
- dev->begin_tile = fz_draw_begin_tile;
- dev->end_tile = fz_draw_end_tile;
- return dev;
+ return (fz_device*)dev;
}
fz_device *
fz_new_draw_device_with_bbox(fz_context *ctx, fz_pixmap *dest, const fz_irect *clip)
{
- fz_device *dev = fz_new_draw_device(ctx, dest);
- fz_draw_device *ddev = dev->user;
-
- if (clip->x0 > ddev->stack[0].scissor.x0)
- ddev->stack[0].scissor.x0 = clip->x0;
- if (clip->x1 < ddev->stack[0].scissor.x1)
- ddev->stack[0].scissor.x1 = clip->x1;
- if (clip->y0 > ddev->stack[0].scissor.y0)
- ddev->stack[0].scissor.y0 = clip->y0;
- if (clip->y1 < ddev->stack[0].scissor.y1)
- ddev->stack[0].scissor.y1 = clip->y1;
- return dev;
+ fz_draw_device *dev = (fz_draw_device*)fz_new_draw_device(ctx, dest);
+
+ if (clip->x0 > dev->stack[0].scissor.x0)
+ dev->stack[0].scissor.x0 = clip->x0;
+ if (clip->x1 < dev->stack[0].scissor.x1)
+ dev->stack[0].scissor.x1 = clip->x1;
+ if (clip->y0 > dev->stack[0].scissor.y0)
+ dev->stack[0].scissor.y0 = clip->y0;
+ if (clip->y1 < dev->stack[0].scissor.y1)
+ dev->stack[0].scissor.y1 = clip->y1;
+
+ return (fz_device*)dev;
}
fz_device *
fz_new_draw_device_type3(fz_context *ctx, fz_pixmap *dest)
{
- fz_device *dev = fz_new_draw_device(ctx, dest);
- fz_draw_device *ddev = dev->user;
- ddev->flags |= FZ_DRAWDEV_FLAGS_TYPE3;
- return dev;
+ fz_draw_device *dev = (fz_draw_device*)fz_new_draw_device(ctx, dest);
+ dev->flags |= FZ_DRAWDEV_FLAGS_TYPE3;
+ return (fz_device*)dev;
}
fz_irect *
@@ -2166,18 +2133,18 @@ fz_bound_path_accurate(fz_context *ctx, fz_irect *bbox, const fz_irect *scissor,
{
fz_gel *gel = fz_new_gel(ctx);
- fz_reset_gel(gel, scissor);
+ fz_reset_gel(ctx, gel, scissor);
if (stroke)
{
if (stroke->dash_len > 0)
- fz_flatten_dash_path(gel, path, stroke, ctm, flatness, linewidth);
+ fz_flatten_dash_path(ctx, gel, path, stroke, ctm, flatness, linewidth);
else
- fz_flatten_stroke_path(gel, path, stroke, ctm, flatness, linewidth);
+ fz_flatten_stroke_path(ctx, gel, path, stroke, ctm, flatness, linewidth);
}
else
- fz_flatten_fill_path(gel, path, ctm, flatness);
- fz_bound_gel(gel, bbox);
- fz_free_gel(gel);
+ fz_flatten_fill_path(ctx, gel, path, ctm, flatness);
+ fz_bound_gel(ctx, gel, bbox);
+ fz_drop_gel(ctx, gel);
return bbox;
}
diff --git a/source/fitz/draw-edge.c b/source/fitz/draw-edge.c
index c8d94155..a4c0d02e 100644
--- a/source/fitz/draw-edge.c
+++ b/source/fitz/draw-edge.c
@@ -48,7 +48,7 @@ void fz_copy_aa_context(fz_context *dst, fz_context *src)
memcpy(dst->aa, src->aa, sizeof(*src->aa));
}
-void fz_free_aa_context(fz_context *ctx)
+void fz_drop_aa_context(fz_context *ctx)
{
#ifndef AA_BITS
fz_free(ctx, ctx->aa);
@@ -165,7 +165,6 @@ struct fz_gel_s
fz_edge *edges;
int acap, alen;
fz_edge **active;
- fz_context *ctx;
};
fz_gel *
@@ -177,7 +176,6 @@ fz_new_gel(fz_context *ctx)
fz_try(ctx)
{
gel->edges = NULL;
- gel->ctx = ctx;
gel->cap = 512;
gel->len = 0;
gel->edges = fz_malloc_array(ctx, gel->cap, sizeof(fz_edge));
@@ -204,9 +202,9 @@ fz_new_gel(fz_context *ctx)
}
void
-fz_reset_gel(fz_gel *gel, const fz_irect *clip)
+fz_reset_gel(fz_context *ctx, fz_gel *gel, const fz_irect *clip)
{
- fz_aa_context *ctxaa = gel->ctx->aa;
+ fz_aa_context *ctxaa = ctx->aa;
if (fz_is_infinite_irect(clip))
{
@@ -228,19 +226,19 @@ fz_reset_gel(fz_gel *gel, const fz_irect *clip)
}
void
-fz_free_gel(fz_gel *gel)
+fz_drop_gel(fz_context *ctx, fz_gel *gel)
{
if (gel == NULL)
return;
- fz_free(gel->ctx, gel->active);
- fz_free(gel->ctx, gel->edges);
- fz_free(gel->ctx, gel);
+ fz_free(ctx, gel->active);
+ fz_free(ctx, gel->edges);
+ fz_free(ctx, gel);
}
fz_irect *
-fz_bound_gel(const fz_gel *gel, fz_irect *bbox)
+fz_bound_gel(fz_context *ctx, const fz_gel *gel, fz_irect *bbox)
{
- fz_aa_context *ctxaa = gel->ctx->aa;
+ fz_aa_context *ctxaa = ctx->aa;
if (gel->len == 0)
{
*bbox = fz_empty_irect;
@@ -256,9 +254,9 @@ fz_bound_gel(const fz_gel *gel, fz_irect *bbox)
}
fz_rect *
-fz_gel_scissor(const fz_gel *gel, fz_rect *r)
+fz_gel_scissor(fz_context *ctx, const fz_gel *gel, fz_rect *r)
{
- fz_aa_context *ctxaa = gel->ctx->aa;
+ fz_aa_context *ctxaa = ctx->aa;
r->x0 = gel->clip.x0 / fz_aa_hscale;
r->x1 = gel->clip.x1 / fz_aa_vscale;
@@ -298,7 +296,7 @@ clip_lerp_x(int val, int m, int x0, int y0, int x1, int y1, int *out)
}
static void
-fz_insert_gel_raw(fz_gel *gel, int x0, int y0, int x1, int y1)
+fz_insert_gel_raw(fz_context *ctx, fz_gel *gel, int x0, int y0, int x1, int y1)
{
fz_edge *edge;
int dx, dy;
@@ -327,7 +325,7 @@ fz_insert_gel_raw(fz_gel *gel, int x0, int y0, int x1, int y1)
if (gel->len + 1 == gel->cap) {
int new_cap = gel->cap * 2;
- gel->edges = fz_resize_array(gel->ctx, gel->edges, new_cap, sizeof(fz_edge));
+ gel->edges = fz_resize_array(ctx, gel->edges, new_cap, sizeof(fz_edge));
gel->cap = new_cap;
}
@@ -364,11 +362,11 @@ fz_insert_gel_raw(fz_gel *gel, int x0, int y0, int x1, int y1)
}
void
-fz_insert_gel(fz_gel *gel, float fx0, float fy0, float fx1, float fy1)
+fz_insert_gel(fz_context *ctx, fz_gel *gel, float fx0, float fy0, float fx1, float fy1)
{
int x0, y0, x1, y1;
int d, v;
- fz_aa_context *ctxaa = gel->ctx->aa;
+ fz_aa_context *ctxaa = ctx->aa;
fx0 = floorf(fx0 * fz_aa_hscale);
fx1 = floorf(fx1 * fz_aa_hscale);
@@ -399,12 +397,12 @@ fz_insert_gel(fz_gel *gel, float fx0, float fy0, float fx1, float fy1)
x0 = x1 = gel->clip.x0;
}
if (d == LEAVE) {
- fz_insert_gel_raw(gel, gel->clip.x0, v, gel->clip.x0, y1);
+ fz_insert_gel_raw(ctx, gel, gel->clip.x0, v, gel->clip.x0, y1);
x1 = gel->clip.x0;
y1 = v;
}
if (d == ENTER) {
- fz_insert_gel_raw(gel, gel->clip.x0, y0, gel->clip.x0, v);
+ fz_insert_gel_raw(ctx, gel, gel->clip.x0, y0, gel->clip.x0, v);
x0 = gel->clip.x0;
y0 = v;
}
@@ -414,20 +412,21 @@ fz_insert_gel(fz_gel *gel, float fx0, float fy0, float fx1, float fy1)
x0 = x1 = gel->clip.x1;
}
if (d == LEAVE) {
- fz_insert_gel_raw(gel, gel->clip.x1, v, gel->clip.x1, y1);
+ fz_insert_gel_raw(ctx, gel, gel->clip.x1, v, gel->clip.x1, y1);
x1 = gel->clip.x1;
y1 = v;
}
if (d == ENTER) {
- fz_insert_gel_raw(gel, gel->clip.x1, y0, gel->clip.x1, v);
+ fz_insert_gel_raw(ctx, gel, gel->clip.x1, y0, gel->clip.x1, v);
x0 = gel->clip.x1;
y0 = v;
}
- fz_insert_gel_raw(gel, x0, y0, x1, y1);
+ fz_insert_gel_raw(ctx, gel, x0, y0, x1, y1);
}
-static int cmpedge(const void *va, const void *vb)
+static int
+cmpedge(const void *va, const void *vb)
{
const fz_edge *a = va;
const fz_edge *b = vb;
@@ -435,7 +434,7 @@ static int cmpedge(const void *va, const void *vb)
}
void
-fz_sort_gel(fz_gel *gel)
+fz_sort_gel(fz_context *ctx, fz_gel *gel)
{
fz_edge *a = gel->edges;
int n = gel->len;
@@ -479,7 +478,7 @@ fz_sort_gel(fz_gel *gel)
}
int
-fz_is_rect_gel(fz_gel *gel)
+fz_is_rect_gel(fz_context *ctx, fz_gel *gel)
{
/* a rectangular path is converted into two vertical edges of identical height */
if (gel->len == 2)
@@ -531,7 +530,7 @@ sort_active(fz_edge **a, int n)
}
static int
-insert_active(fz_gel *gel, int y, int *e_)
+insert_active(fz_context *ctx, fz_gel *gel, int y, int *e_)
{
int h_min = INT_MAX;
int e = *e_;
@@ -542,7 +541,7 @@ insert_active(fz_gel *gel, int y, int *e_)
do {
if (gel->alen + 1 == gel->acap) {
int newcap = gel->acap + 64;
- fz_edge **newactive = fz_resize_array(gel->ctx, gel->active, newcap, sizeof(fz_edge*));
+ fz_edge **newactive = fz_resize_array(ctx, gel->active, newcap, sizeof(fz_edge*));
gel->active = newactive;
gel->acap = newcap;
}
@@ -576,7 +575,7 @@ insert_active(fz_gel *gel, int y, int *e_)
}
static void
-advance_active(fz_gel *gel, int inc)
+advance_active(fz_context *ctx, fz_gel *gel, int inc)
{
fz_edge *edge;
int i = 0;
@@ -608,7 +607,8 @@ advance_active(fz_gel *gel, int inc)
* Anti-aliased scan conversion.
*/
-static inline void add_span_aa(fz_aa_context *ctxaa, int *list, int x0, int x1, int xofs, int h)
+static inline void
+add_span_aa(fz_aa_context *ctxaa, int *list, int x0, int x1, int xofs, int h)
{
int x0pix, x0sub;
int x1pix, x1sub;
@@ -643,12 +643,13 @@ static inline void add_span_aa(fz_aa_context *ctxaa, int *list, int x0, int x1,
}
}
-static inline void non_zero_winding_aa(fz_gel *gel, int *list, int xofs, int h)
+static inline void
+non_zero_winding_aa(fz_context *ctx, fz_gel *gel, int *list, int xofs, int h)
{
+ fz_aa_context *ctxaa = ctx->aa;
int winding = 0;
int x = 0;
int i;
- fz_aa_context *ctxaa = gel->ctx->aa;
for (i = 0; i < gel->alen; i++)
{
@@ -660,12 +661,13 @@ static inline void non_zero_winding_aa(fz_gel *gel, int *list, int xofs, int h)
}
}
-static inline void even_odd_aa(fz_gel *gel, int *list, int xofs, int h)
+static inline void
+even_odd_aa(fz_context *ctx, fz_gel *gel, int *list, int xofs, int h)
{
+ fz_aa_context *ctxaa = ctx->aa;
int even = 0;
int x = 0;
int i;
- fz_aa_context *ctxaa = gel->ctx->aa;
for (i = 0; i < gel->alen; i++)
{
@@ -677,7 +679,8 @@ static inline void even_odd_aa(fz_gel *gel, int *list, int xofs, int h)
}
}
-static inline void undelta_aa(fz_aa_context *ctxaa, unsigned char * restrict out, int * restrict in, int n)
+static inline void
+undelta_aa(fz_aa_context *ctxaa, unsigned char * restrict out, int * restrict in, int n)
{
int d = 0;
while (n--)
@@ -687,8 +690,8 @@ static inline void undelta_aa(fz_aa_context *ctxaa, unsigned char * restrict out
}
}
-static inline void blit_aa(fz_pixmap *dst, int x, int y,
- unsigned char *mp, int w, unsigned char *color)
+static inline void
+blit_aa(fz_pixmap *dst, int x, int y, unsigned char *mp, int w, unsigned char *color)
{
unsigned char *dp;
dp = dst->samples + (unsigned int)(( (y - dst->y) * dst->w + (x - dst->x) ) * dst->n);
@@ -699,15 +702,13 @@ static inline void blit_aa(fz_pixmap *dst, int x, int y,
}
static void
-fz_scan_convert_aa(fz_gel *gel, int eofill, const fz_irect *clip,
- fz_pixmap *dst, unsigned char *color)
+fz_scan_convert_aa(fz_context *ctx, fz_gel *gel, int eofill, const fz_irect *clip, fz_pixmap *dst, unsigned char *color)
{
+ fz_aa_context *ctxaa = ctx->aa;
unsigned char *alphas;
int *deltas;
int y, e;
int yd, yc;
- fz_context *ctx = gel->ctx;
- fz_aa_context *ctxaa = ctx->aa;
int height, h0, rh;
int xmin = fz_idiv(gel->bbox.x0, fz_aa_hscale);
@@ -761,7 +762,7 @@ fz_scan_convert_aa(fz_gel *gel, int eofill, const fz_irect *clip,
/* height = The number of subscanlines with identical edge
* positions (i.e. 1 if we have any non vertical edges). */
- height = insert_active(gel, y, &e);
+ height = insert_active(ctx, gel, y, &e);
h0 = height;
if (h0 >= rh)
{
@@ -783,7 +784,7 @@ fz_scan_convert_aa(fz_gel *gel, int eofill, const fz_irect *clip,
h0 = 0;
}
height -= h0;
- advance_active(gel, height);
+ advance_active(ctx, gel, height);
y += height;
}
@@ -808,7 +809,7 @@ fz_scan_convert_aa(fz_gel *gel, int eofill, const fz_irect *clip,
/* height = The number of subscanlines with identical edge
* positions (i.e. 1 if we have any non vertical edges). */
- height = insert_active(gel, y, &e);
+ height = insert_active(ctx, gel, y, &e);
h0 = height;
if (h0 > rh)
{
@@ -818,9 +819,9 @@ fz_scan_convert_aa(fz_gel *gel, int eofill, const fz_irect *clip,
* have more sub scanlines than will fit into
* it. */
if (eofill)
- even_odd_aa(gel, deltas, xofs, rh);
+ even_odd_aa(ctx, gel, deltas, xofs, rh);
else
- non_zero_winding_aa(gel, deltas, xofs, rh);
+ non_zero_winding_aa(ctx, gel, deltas, xofs, rh);
undelta_aa(ctxaa, alphas, deltas, skipx + clipn);
blit_aa(dst, xmin + skipx, yd, alphas + skipx, clipn, color);
memset(deltas, 0, (skipx + clipn) * sizeof(int));
@@ -835,9 +836,9 @@ fz_scan_convert_aa(fz_gel *gel, int eofill, const fz_irect *clip,
* scanlines. */
h0 -= fz_aa_vscale;
if (eofill)
- even_odd_aa(gel, deltas, xofs, fz_aa_vscale);
+ even_odd_aa(ctx, gel, deltas, xofs, fz_aa_vscale);
else
- non_zero_winding_aa(gel, deltas, xofs, fz_aa_vscale);
+ non_zero_winding_aa(ctx, gel, deltas, xofs, fz_aa_vscale);
undelta_aa(ctxaa, alphas, deltas, skipx + clipn);
do
{
@@ -860,11 +861,11 @@ fz_scan_convert_aa(fz_gel *gel, int eofill, const fz_irect *clip,
}
}
if (eofill)
- even_odd_aa(gel, deltas, xofs, h0);
+ even_odd_aa(ctx, gel, deltas, xofs, h0);
else
- non_zero_winding_aa(gel, deltas, xofs, h0);
+ non_zero_winding_aa(ctx, gel, deltas, xofs, h0);
advance:
- advance_active(gel, height);
+ advance_active(ctx, gel, height);
y += height;
}
@@ -883,8 +884,8 @@ clip_ended:
* Sharp (not anti-aliased) scan conversion
*/
-static inline void blit_sharp(int x0, int x1, int y,
- const fz_irect *clip, fz_pixmap *dst, unsigned char *color)
+static inline void
+blit_sharp(int x0, int x1, int y, const fz_irect *clip, fz_pixmap *dst, unsigned char *color)
{
unsigned char *dp;
x0 = fz_clampi(x0, dst->x, dst->x + dst->w);
@@ -899,8 +900,8 @@ static inline void blit_sharp(int x0, int x1, int y,
}
}
-static inline void non_zero_winding_sharp(fz_gel *gel, int y,
- const fz_irect *clip, fz_pixmap *dst, unsigned char *color)
+static inline void
+non_zero_winding_sharp(fz_context *ctx, fz_gel *gel, int y, const fz_irect *clip, fz_pixmap *dst, unsigned char *color)
{
int winding = 0;
int x = 0;
@@ -915,8 +916,8 @@ static inline void non_zero_winding_sharp(fz_gel *gel, int y,
}
}
-static inline void even_odd_sharp(fz_gel *gel, int y,
- const fz_irect *clip, fz_pixmap *dst, unsigned char *color)
+static inline void
+even_odd_sharp(fz_context *ctx, fz_gel *gel, int y, const fz_irect *clip, fz_pixmap *dst, unsigned char *color)
{
int even = 0;
int x = 0;
@@ -932,7 +933,8 @@ static inline void even_odd_sharp(fz_gel *gel, int y,
}
static void
-fz_scan_convert_sharp(fz_gel *gel, int eofill, const fz_irect *clip,
+fz_scan_convert_sharp(fz_context *ctx,
+ fz_gel *gel, int eofill, const fz_irect *clip,
fz_pixmap *dst, unsigned char *color)
{
int e = 0;
@@ -946,7 +948,7 @@ fz_scan_convert_sharp(fz_gel *gel, int eofill, const fz_irect *clip,
{
while (gel->alen > 0 || e < gel->len)
{
- height = insert_active(gel, y, &e);
+ height = insert_active(ctx, gel, y, &e);
y += height;
if (y >= clip->y0)
{
@@ -959,7 +961,7 @@ fz_scan_convert_sharp(fz_gel *gel, int eofill, const fz_irect *clip,
/* Now process as lines within the clip region */
while (gel->alen > 0 || e < gel->len)
{
- height = insert_active(gel, y, &e);
+ height = insert_active(ctx, gel, y, &e);
if (gel->alen == 0)
y += height;
@@ -973,31 +975,30 @@ fz_scan_convert_sharp(fz_gel *gel, int eofill, const fz_irect *clip,
while (h--)
{
if (eofill)
- even_odd_sharp(gel, y, clip, dst, color);
+ even_odd_sharp(ctx, gel, y, clip, dst, color);
else
- non_zero_winding_sharp(gel, y, clip, dst, color);
+ non_zero_winding_sharp(ctx, gel, y, clip, dst, color);
y++;
}
}
if (y >= clip->y1)
break;
- advance_active(gel, height);
+ advance_active(ctx, gel, height);
}
}
void
-fz_scan_convert(fz_gel *gel, int eofill, const fz_irect *clip,
- fz_pixmap *dst, unsigned char *color)
+fz_scan_convert(fz_context *ctx, fz_gel *gel, int eofill, const fz_irect *clip, fz_pixmap *dst, unsigned char *color)
{
- fz_aa_context *ctxaa = gel->ctx->aa;
+ fz_aa_context *ctxaa = ctx->aa;
fz_irect local_clip;
if (fz_is_empty_irect(fz_intersect_irect(fz_pixmap_bbox_no_ctx(dst, &local_clip), clip)))
return;
if (fz_aa_bits > 0)
- fz_scan_convert_aa(gel, eofill, &local_clip, dst, color);
+ fz_scan_convert_aa(ctx, gel, eofill, &local_clip, dst, color);
else
- fz_scan_convert_sharp(gel, eofill, &local_clip, dst, color);
+ fz_scan_convert_sharp(ctx, gel, eofill, &local_clip, dst, color);
}
diff --git a/source/fitz/draw-glyph.c b/source/fitz/draw-glyph.c
index bb2de291..e7f8af30 100644
--- a/source/fitz/draw-glyph.c
+++ b/source/fitz/draw-glyph.c
@@ -131,7 +131,7 @@ fz_keep_glyph_cache(fz_context *ctx)
}
float
-fz_subpixel_adjust(fz_matrix *ctm, fz_matrix *subpix_ctm, unsigned char *qe, unsigned char *qf)
+fz_subpixel_adjust(fz_context *ctx, fz_matrix *ctm, fz_matrix *subpix_ctm, unsigned char *qe, unsigned char *qf)
{
float size = fz_matrix_expansion(ctm);
int q;
@@ -182,7 +182,7 @@ fz_render_stroked_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix *trm,
if (stroke->dash_len > 0)
return NULL;
- (void)fz_subpixel_adjust(trm, &subpix_trm, &qe, &qf);
+ (void)fz_subpixel_adjust(ctx, trm, &subpix_trm, &qe, &qf);
return fz_render_ft_stroked_glyph(ctx, font, gid, &subpix_trm, ctm, stroke);
}
return fz_render_glyph(ctx, font, gid, trm, NULL, scissor);
@@ -198,7 +198,7 @@ fz_render_stroked_glyph_pixmap(fz_context *ctx, fz_font *font, int gid, fz_matri
if (stroke->dash_len > 0)
return NULL;
- (void)fz_subpixel_adjust(trm, &subpix_trm, &qe, &qf);
+ (void)fz_subpixel_adjust(ctx, trm, &subpix_trm, &qe, &qf);
return fz_render_ft_stroked_glyph_pixmap(ctx, font, gid, &subpix_trm, ctm, stroke);
}
return fz_render_glyph_pixmap(ctx, font, gid, trm, NULL, scissor);
@@ -258,7 +258,7 @@ fz_render_glyph(fz_context *ctx, fz_font *font, int gid, fz_matrix *ctm, fz_colo
fz_var(val);
memset(&key, 0, sizeof key);
- size = fz_subpixel_adjust(ctm, &subpix_ctm, &key.e, &key.f);
+ size = fz_subpixel_adjust(ctx, ctm, &subpix_ctm, &key.e, &key.f);
if (size <= MAX_GLYPH_SIZE)
{
scissor = &fz_infinite_irect;
@@ -412,7 +412,7 @@ fz_render_glyph_pixmap(fz_context *ctx, fz_font *font, int gid, fz_matrix *ctm,
fz_pixmap *val;
unsigned char qe, qf;
fz_matrix subpix_ctm;
- float size = fz_subpixel_adjust(ctm, &subpix_ctm, &qe, &qf);
+ float size = fz_subpixel_adjust(ctx, ctm, &subpix_ctm, &qe, &qf);
if (size <= MAX_GLYPH_SIZE)
{
diff --git a/source/fitz/draw-imp.h b/source/fitz/draw-imp.h
index 9b9e50c0..ed457d34 100644
--- a/source/fitz/draw-imp.h
+++ b/source/fitz/draw-imp.h
@@ -8,19 +8,19 @@
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);
-fz_rect *fz_gel_scissor(const fz_gel *gel, fz_rect *rect);
-
-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);
+void fz_insert_gel(fz_context *ctx, fz_gel *gel, float x0, float y0, float x1, float y1);
+void fz_reset_gel(fz_context *ctx, fz_gel *gel, const fz_irect *clip);
+void fz_sort_gel(fz_context *ctx, fz_gel *gel);
+fz_irect *fz_bound_gel(fz_context *ctx, const fz_gel *gel, fz_irect *bbox);
+void fz_drop_gel(fz_context *ctx, fz_gel *gel);
+int fz_is_rect_gel(fz_context *ctx, fz_gel *gel);
+fz_rect *fz_gel_scissor(fz_context *ctx, const fz_gel *gel, fz_rect *rect);
+
+void fz_scan_convert(fz_context *ctx, fz_gel *gel, int eofill, const fz_irect *clip, fz_pixmap *pix, unsigned char *colorbv);
+
+void fz_flatten_fill_path(fz_context *ctx, fz_gel *gel, fz_path *path, const fz_matrix *ctm, float flatness);
+void fz_flatten_stroke_path(fz_context *ctx, 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_context *ctx, 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);
diff --git a/source/fitz/draw-mesh.c b/source/fitz/draw-mesh.c
index 8b0d80a3..03cffd06 100644
--- a/source/fitz/draw-mesh.c
+++ b/source/fitz/draw-mesh.c
@@ -157,7 +157,6 @@ fz_paint_triangle(fz_pixmap *pix, float *v[3], int n, const fz_irect *bbox)
struct paint_tri_data
{
- fz_context *ctx;
fz_shade *shade;
fz_pixmap *dest;
const fz_irect *bbox;
@@ -165,7 +164,7 @@ struct paint_tri_data
};
static void
-prepare_vertex(void *arg, fz_vertex *v, const float *input)
+prepare_vertex(fz_context *ctx, void *arg, fz_vertex *v, const float *input)
{
struct paint_tri_data *ptd = (struct paint_tri_data *)arg;
fz_shade *shade = ptd->shade;
@@ -177,14 +176,14 @@ prepare_vertex(void *arg, fz_vertex *v, const float *input)
output[0] = input[0] * 255;
else
{
- ptd->cc.convert(&ptd->cc, output, input);
+ ptd->cc.convert(ctx, &ptd->cc, output, input);
for (i = 0; i < dest->colorspace->n; i++)
output[i] *= 255;
}
}
static void
-do_paint_tri(void *arg, fz_vertex *av, fz_vertex *bv, fz_vertex *cv)
+do_paint_tri(fz_context *ctx, void *arg, fz_vertex *av, fz_vertex *bv, fz_vertex *cv)
{
struct paint_tri_data *ptd = (struct paint_tri_data *)arg;
float *vertices[3];
@@ -219,10 +218,10 @@ fz_paint_shade(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz_pixmap
if (shade->use_function)
{
fz_color_converter cc;
- fz_lookup_color_converter(&cc, ctx, dest->colorspace, shade->colorspace);
+ fz_lookup_color_converter(ctx, &cc, dest->colorspace, shade->colorspace);
for (i = 0; i < 256; i++)
{
- cc.convert(&cc, color, shade->function[i]);
+ cc.convert(ctx, &cc, color, shade->function[i]);
for (k = 0; k < dest->colorspace->n; k++)
clut[i][k] = color[k] * 255;
clut[i][k] = shade->function[i][shade->colorspace->n] * 255;
@@ -236,7 +235,6 @@ fz_paint_shade(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz_pixmap
temp = dest;
}
- ptd.ctx = ctx;
ptd.dest = temp;
ptd.shade = shade;
ptd.bbox = bbox;
@@ -264,7 +262,7 @@ fz_paint_shade(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz_pixmap
}
fz_always(ctx)
{
- fz_fin_cached_color_converter(&ptd.cc);
+ fz_fin_cached_color_converter(ctx, &ptd.cc);
}
fz_catch(ctx)
{
diff --git a/source/fitz/draw-path.c b/source/fitz/draw-path.c
index d184fad2..8ad0b334 100644
--- a/source/fitz/draw-path.c
+++ b/source/fitz/draw-path.c
@@ -4,17 +4,17 @@
#define MAX_DEPTH 8
static void
-line(fz_gel *gel, const fz_matrix *ctm, float x0, float y0, float x1, float y1)
+line(fz_context *ctx, fz_gel *gel, const fz_matrix *ctm, float x0, float y0, float x1, float y1)
{
float tx0 = ctm->a * x0 + ctm->c * y0 + ctm->e;
float ty0 = ctm->b * x0 + ctm->d * y0 + ctm->f;
float tx1 = ctm->a * x1 + ctm->c * y1 + ctm->e;
float ty1 = ctm->b * x1 + ctm->d * y1 + ctm->f;
- fz_insert_gel(gel, tx0, ty0, tx1, ty1);
+ fz_insert_gel(ctx, gel, tx0, ty0, tx1, ty1);
}
static void
-bezier(fz_gel *gel, const fz_matrix *ctm, float flatness,
+bezier(fz_context *ctx, fz_gel *gel, const fz_matrix *ctm, float flatness,
float xa, float ya,
float xb, float yb,
float xc, float yc,
@@ -35,7 +35,7 @@ bezier(fz_gel *gel, const fz_matrix *ctm, float flatness,
dmax = fz_max(dmax, fz_abs(yd - yc));
if (dmax < flatness || depth >= MAX_DEPTH)
{
- line(gel, ctm, xa, ya, xd, yd);
+ line(ctx, gel, ctm, xa, ya, xd, yd);
return;
}
@@ -63,12 +63,12 @@ bezier(fz_gel *gel, const fz_matrix *ctm, float flatness,
xabcd *= 0.125f; yabcd *= 0.125f;
- bezier(gel, ctm, flatness, xa, ya, xab, yab, xabc, yabc, xabcd, yabcd, depth + 1);
- bezier(gel, ctm, flatness, xabcd, yabcd, xbcd, ybcd, xcd, ycd, xd, yd, depth + 1);
+ bezier(ctx, gel, ctm, flatness, xa, ya, xab, yab, xabc, yabc, xabcd, yabcd, depth + 1);
+ bezier(ctx, gel, ctm, flatness, xabcd, yabcd, xbcd, ybcd, xcd, ycd, xd, yd, depth + 1);
}
void
-fz_flatten_fill_path(fz_gel *gel, fz_path *path, const fz_matrix *ctm, float flatness)
+fz_flatten_fill_path(fz_context *ctx, fz_gel *gel, fz_path *path, const fz_matrix *ctm, float flatness)
{
float x1, y1, x2, y2, x3, y3;
float cx = 0;
@@ -84,7 +84,7 @@ fz_flatten_fill_path(fz_gel *gel, fz_path *path, const fz_matrix *ctm, float fla
case FZ_MOVETO:
/* implicit closepath before moveto */
if (cx != bx || cy != by)
- line(gel, ctm, cx, cy, bx, by);
+ line(ctx, gel, ctm, cx, cy, bx, by);
x1 = path->coords[k++];
y1 = path->coords[k++];
cx = bx = x1;
@@ -94,7 +94,7 @@ fz_flatten_fill_path(fz_gel *gel, fz_path *path, const fz_matrix *ctm, float fla
case FZ_LINETO:
x1 = path->coords[k++];
y1 = path->coords[k++];
- line(gel, ctm, cx, cy, x1, y1);
+ line(ctx, gel, ctm, cx, cy, x1, y1);
cx = x1;
cy = y1;
break;
@@ -106,13 +106,13 @@ fz_flatten_fill_path(fz_gel *gel, fz_path *path, const fz_matrix *ctm, float fla
y2 = path->coords[k++];
x3 = path->coords[k++];
y3 = path->coords[k++];
- bezier(gel, ctm, flatness, cx, cy, x1, y1, x2, y2, x3, y3, 0);
+ bezier(ctx, gel, ctm, flatness, cx, cy, x1, y1, x2, y2, x3, y3, 0);
cx = x3;
cy = y3;
break;
case FZ_CLOSE_PATH:
- line(gel, ctm, cx, cy, bx, by);
+ line(ctx, gel, ctm, cx, cy, bx, by);
cx = bx;
cy = by;
break;
@@ -120,7 +120,7 @@ fz_flatten_fill_path(fz_gel *gel, fz_path *path, const fz_matrix *ctm, float fla
}
if (cx != bx || cy != by)
- line(gel, ctm, cx, cy, bx, by);
+ line(ctx, gel, ctm, cx, cy, bx, by);
}
struct sctx
@@ -150,17 +150,17 @@ struct sctx
};
static void
-fz_add_line(struct sctx *s, float x0, float y0, float x1, float y1)
+fz_add_line(fz_context *ctx, struct sctx *s, float x0, float y0, float x1, float y1)
{
float tx0 = s->ctm->a * x0 + s->ctm->c * y0 + s->ctm->e;
float ty0 = s->ctm->b * x0 + s->ctm->d * y0 + s->ctm->f;
float tx1 = s->ctm->a * x1 + s->ctm->c * y1 + s->ctm->e;
float ty1 = s->ctm->b * x1 + s->ctm->d * y1 + s->ctm->f;
- fz_insert_gel(s->gel, tx0, ty0, tx1, ty1);
+ fz_insert_gel(ctx, s->gel, tx0, ty0, tx1, ty1);
}
static void
-fz_add_arc(struct sctx *s,
+fz_add_arc(fz_context *ctx, struct sctx *s,
float xc, float yc,
float x0, float y0,
float x1, float y1)
@@ -195,28 +195,28 @@ fz_add_arc(struct sctx *s,
theta = th0 + (th1 - th0) * i / n;
nx = cosf(theta) * r;
ny = sinf(theta) * r;
- fz_add_line(s, xc + ox, yc + oy, xc + nx, yc + ny);
+ fz_add_line(ctx, s, xc + ox, yc + oy, xc + nx, yc + ny);
ox = nx;
oy = ny;
}
- fz_add_line(s, xc + ox, yc + oy, xc + x1, yc + y1);
+ fz_add_line(ctx, s, xc + ox, yc + oy, xc + x1, yc + y1);
}
static void
-fz_add_line_stroke(struct sctx *s, fz_point a, fz_point b)
+fz_add_line_stroke(fz_context *ctx, struct sctx *s, fz_point a, fz_point b)
{
float dx = b.x - a.x;
float dy = b.y - a.y;
float scale = s->linewidth / sqrtf(dx * dx + dy * dy);
float dlx = dy * scale;
float dly = -dx * scale;
- fz_add_line(s, a.x - dlx, a.y - dly, b.x - dlx, b.y - dly);
- fz_add_line(s, b.x + dlx, b.y + dly, a.x + dlx, a.y + dly);
+ fz_add_line(ctx, s, a.x - dlx, a.y - dly, b.x - dlx, b.y - dly);
+ fz_add_line(ctx, s, b.x + dlx, b.y + dly, a.x + dlx, a.y + dly);
}
static void
-fz_add_line_join(struct sctx *s, fz_point a, fz_point b, fz_point c, int join_under)
+fz_add_line_join(fz_context *ctx, struct sctx *s, fz_point a, fz_point b, fz_point c, int join_under)
{
float miterlimit = s->miterlimit;
float linewidth = s->linewidth;
@@ -284,12 +284,12 @@ fz_add_line_join(struct sctx *s, fz_point a, fz_point b, fz_point c, int join_un
if (join_under)
{
- fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0);
+ fz_add_line(ctx, s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0);
}
else
{
- fz_add_line(s, b.x + dlx1, b.y + dly1, b.x, b.y);
- fz_add_line(s, b.x, b.y, b.x + dlx0, b.y + dly0);
+ fz_add_line(ctx, s, b.x + dlx1, b.y + dly1, b.x, b.y);
+ fz_add_line(ctx, s, b.x, b.y, b.x + dlx0, b.y + dly0);
}
/* XPS miter joins are clipped at miterlength, rather than simply
@@ -312,9 +312,9 @@ fz_add_line_join(struct sctx *s, fz_point a, fz_point b, fz_point c, int join_un
t1x = b.x - dmx + k * (dmx - dlx1);
t1y = b.y - dmy + k * (dmy - dly1);
- fz_add_line(s, b.x - dlx0, b.y - dly0, t0x, t0y);
- fz_add_line(s, t0x, t0y, t1x, t1y);
- fz_add_line(s, t1x, t1y, b.x - dlx1, b.y - dly1);
+ fz_add_line(ctx, s, b.x - dlx0, b.y - dly0, t0x, t0y);
+ fz_add_line(ctx, s, t0x, t0y, t1x, t1y);
+ fz_add_line(ctx, s, t1x, t1y, b.x - dlx1, b.y - dly1);
}
}
else if (linejoin == FZ_LINEJOIN_MITER)
@@ -327,23 +327,23 @@ fz_add_line_join(struct sctx *s, fz_point a, fz_point b, fz_point c, int join_un
dmx *= scale;
dmy *= scale;
- fz_add_line(s, b.x - dlx0, b.y - dly0, b.x - dmx, b.y - dmy);
- fz_add_line(s, b.x - dmx, b.y - dmy, b.x - dlx1, b.y - dly1);
+ fz_add_line(ctx, s, b.x - dlx0, b.y - dly0, b.x - dmx, b.y - dmy);
+ fz_add_line(ctx, s, b.x - dmx, b.y - dmy, b.x - dlx1, b.y - dly1);
}
if (linejoin == FZ_LINEJOIN_BEVEL)
{
- fz_add_line(s, b.x - dlx0, b.y - dly0, b.x - dlx1, b.y - dly1);
+ fz_add_line(ctx, s, b.x - dlx0, b.y - dly0, b.x - dlx1, b.y - dly1);
}
if (linejoin == FZ_LINEJOIN_ROUND)
{
- fz_add_arc(s, b.x, b.y, -dlx0, -dly0, -dlx1, -dly1);
+ fz_add_arc(ctx, s, b.x, b.y, -dlx0, -dly0, -dlx1, -dly1);
}
}
static void
-fz_add_line_cap(struct sctx *s, fz_point a, fz_point b, fz_linecap linecap)
+fz_add_line_cap(fz_context *ctx, struct sctx *s, fz_point a, fz_point b, fz_linecap linecap)
{
float flatness = s->flatness;
float linewidth = s->linewidth;
@@ -356,7 +356,7 @@ fz_add_line_cap(struct sctx *s, fz_point a, fz_point b, fz_linecap linecap)
float dly = -dx * scale;
if (linecap == FZ_LINECAP_BUTT)
- fz_add_line(s, b.x - dlx, b.y - dly, b.x + dlx, b.y + dly);
+ fz_add_line(ctx, s, b.x - dlx, b.y - dly, b.x + dlx, b.y + dly);
if (linecap == FZ_LINECAP_ROUND)
{
@@ -371,20 +371,20 @@ fz_add_line_cap(struct sctx *s, fz_point a, fz_point b, fz_linecap linecap)
float sth = sinf(theta);
float nx = b.x - dlx * cth - dly * sth;
float ny = b.y - dly * cth + dlx * sth;
- fz_add_line(s, ox, oy, nx, ny);
+ fz_add_line(ctx, s, ox, oy, nx, ny);
ox = nx;
oy = ny;
}
- fz_add_line(s, ox, oy, b.x + dlx, b.y + dly);
+ fz_add_line(ctx, s, ox, oy, b.x + dlx, b.y + dly);
}
if (linecap == FZ_LINECAP_SQUARE)
{
- fz_add_line(s, b.x - dlx, b.y - dly,
+ fz_add_line(ctx, s, b.x - dlx, b.y - dly,
b.x - dlx - dly, b.y - dly + dlx);
- fz_add_line(s, b.x - dlx - dly, b.y - dly + dlx,
+ fz_add_line(ctx, s, b.x - dlx - dly, b.y - dly + dlx,
b.x + dlx - dly, b.y + dly + dlx);
- fz_add_line(s, b.x + dlx - dly, b.y + dly + dlx,
+ fz_add_line(ctx, s, b.x + dlx - dly, b.y + dly + dlx,
b.x + dlx, b.y + dly);
}
@@ -392,13 +392,13 @@ fz_add_line_cap(struct sctx *s, fz_point a, fz_point b, fz_linecap linecap)
{
float mx = -dly;
float my = dlx;
- fz_add_line(s, b.x - dlx, b.y - dly, b.x + mx, b.y + my);
- fz_add_line(s, b.x + mx, b.y + my, b.x + dlx, b.y + dly);
+ fz_add_line(ctx, s, b.x - dlx, b.y - dly, b.x + mx, b.y + my);
+ fz_add_line(ctx, s, b.x + mx, b.y + my, b.x + dlx, b.y + dly);
}
}
static void
-fz_add_line_dot(struct sctx *s, fz_point a)
+fz_add_line_dot(fz_context *ctx, struct sctx *s, fz_point a)
{
float flatness = s->flatness;
float linewidth = s->linewidth;
@@ -414,30 +414,30 @@ fz_add_line_dot(struct sctx *s, fz_point a)
float sth = sinf(theta);
float nx = a.x - cth * linewidth;
float ny = a.y + sth * linewidth;
- fz_add_line(s, ox, oy, nx, ny);
+ fz_add_line(ctx, s, ox, oy, nx, ny);
ox = nx;
oy = ny;
}
- fz_add_line(s, ox, oy, a.x - linewidth, a.y);
+ fz_add_line(ctx, s, ox, oy, a.x - linewidth, a.y);
}
static void
-fz_stroke_flush(struct sctx *s, fz_linecap start_cap, fz_linecap end_cap)
+fz_stroke_flush(fz_context *ctx, struct sctx *s, fz_linecap start_cap, fz_linecap end_cap)
{
if (s->sn == 2)
{
- fz_add_line_cap(s, s->beg[1], s->beg[0], start_cap);
- fz_add_line_cap(s, s->seg[0], s->seg[1], end_cap);
+ fz_add_line_cap(ctx, s, s->beg[1], s->beg[0], start_cap);
+ fz_add_line_cap(ctx, s, s->seg[0], s->seg[1], end_cap);
}
else if (s->dot)
{
- fz_add_line_dot(s, s->beg[0]);
+ fz_add_line_dot(ctx, s, s->beg[0]);
}
}
static void
-fz_stroke_moveto(struct sctx *s, fz_point cur)
+fz_stroke_moveto(fz_context *ctx, struct sctx *s, fz_point cur)
{
s->seg[0] = cur;
s->beg[0] = cur;
@@ -447,7 +447,7 @@ fz_stroke_moveto(struct sctx *s, fz_point cur)
}
static void
-fz_stroke_lineto(struct sctx *s, fz_point cur, int from_bezier)
+fz_stroke_lineto(fz_context *ctx, struct sctx *s, fz_point cur, int from_bezier)
{
float dx = cur.x - s->seg[s->sn-1].x;
float dy = cur.y - s->seg[s->sn-1].y;
@@ -459,11 +459,11 @@ fz_stroke_lineto(struct sctx *s, fz_point cur, int from_bezier)
return;
}
- fz_add_line_stroke(s, s->seg[s->sn-1], cur);
+ fz_add_line_stroke(ctx, s, s->seg[s->sn-1], cur);
if (s->sn == 2)
{
- fz_add_line_join(s, s->seg[0], s->seg[1], cur, s->from_bezier & from_bezier);
+ fz_add_line_join(ctx, s, s->seg[0], s->seg[1], cur, s->from_bezier & from_bezier);
s->seg[0] = s->seg[1];
s->seg[1] = cur;
}
@@ -477,19 +477,19 @@ fz_stroke_lineto(struct sctx *s, fz_point cur, int from_bezier)
}
static void
-fz_stroke_closepath(struct sctx *s)
+fz_stroke_closepath(fz_context *ctx, struct sctx *s)
{
if (s->sn == 2)
{
- fz_stroke_lineto(s, s->beg[0], 0);
+ fz_stroke_lineto(ctx, s, s->beg[0], 0);
if (s->seg[1].x == s->beg[0].x && s->seg[1].y == s->beg[0].y)
- fz_add_line_join(s, s->seg[0], s->beg[0], s->beg[1], 0);
+ fz_add_line_join(ctx, s, s->seg[0], s->beg[0], s->beg[1], 0);
else
- fz_add_line_join(s, s->seg[1], s->beg[0], s->beg[1], 0);
+ fz_add_line_join(ctx, s, s->seg[1], s->beg[0], s->beg[1], 0);
}
else if (s->dot)
{
- fz_add_line_dot(s, s->beg[0]);
+ fz_add_line_dot(ctx, s, s->beg[0]);
}
s->seg[0] = s->beg[0];
@@ -499,7 +499,7 @@ fz_stroke_closepath(struct sctx *s)
}
static void
-fz_stroke_bezier(struct sctx *s,
+fz_stroke_bezier(fz_context *ctx, struct sctx *s,
float xa, float ya,
float xb, float yb,
float xc, float yc,
@@ -523,7 +523,7 @@ fz_stroke_bezier(struct sctx *s,
fz_point p;
p.x = xd;
p.y = yd;
- fz_stroke_lineto(s, p, 1);
+ fz_stroke_lineto(ctx, s, p, 1);
return;
}
@@ -551,12 +551,12 @@ fz_stroke_bezier(struct sctx *s,
xabcd *= 0.125f; yabcd *= 0.125f;
- fz_stroke_bezier(s, xa, ya, xab, yab, xabc, yabc, xabcd, yabcd, depth + 1);
- fz_stroke_bezier(s, xabcd, yabcd, xbcd, ybcd, xcd, ycd, xd, yd, depth + 1);
+ fz_stroke_bezier(ctx, s, xa, ya, xab, yab, xabc, yabc, xabcd, yabcd, depth + 1);
+ fz_stroke_bezier(ctx, s, xabcd, yabcd, xbcd, ybcd, xcd, ycd, xd, yd, depth + 1);
}
void
-fz_flatten_stroke_path(fz_gel *gel, fz_path *path, const fz_stroke_state *stroke, const fz_matrix *ctm, float flatness, float linewidth)
+fz_flatten_stroke_path(fz_context *ctx, fz_gel *gel, fz_path *path, const fz_stroke_state *stroke, const fz_matrix *ctm, float flatness, float linewidth)
{
struct sctx s;
fz_point p0, p1, p2, p3;
@@ -594,15 +594,15 @@ fz_flatten_stroke_path(fz_gel *gel, fz_path *path, const fz_stroke_state *stroke
case FZ_MOVETO:
p1.x = path->coords[k++];
p1.y = path->coords[k++];
- fz_stroke_flush(&s, stroke->start_cap, stroke->end_cap);
- fz_stroke_moveto(&s, p1);
+ fz_stroke_flush(ctx, &s, stroke->start_cap, stroke->end_cap);
+ fz_stroke_moveto(ctx, &s, p1);
p0 = p1;
break;
case FZ_LINETO:
p1.x = path->coords[k++];
p1.y = path->coords[k++];
- fz_stroke_lineto(&s, p1, 0);
+ fz_stroke_lineto(ctx, &s, p1, 0);
p0 = p1;
break;
@@ -613,21 +613,21 @@ fz_flatten_stroke_path(fz_gel *gel, fz_path *path, const fz_stroke_state *stroke
p2.y = path->coords[k++];
p3.x = path->coords[k++];
p3.y = path->coords[k++];
- fz_stroke_bezier(&s, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0);
+ fz_stroke_bezier(ctx, &s, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0);
p0 = p3;
break;
case FZ_CLOSE_PATH:
- fz_stroke_closepath(&s);
+ fz_stroke_closepath(ctx, &s);
break;
}
}
- fz_stroke_flush(&s, stroke->start_cap, stroke->end_cap);
+ fz_stroke_flush(ctx, &s, stroke->start_cap, stroke->end_cap);
}
static void
-fz_dash_moveto(struct sctx *s, fz_point a, fz_linecap start_cap, fz_linecap end_cap)
+fz_dash_moveto(fz_context *ctx, struct sctx *s, fz_point a, fz_linecap start_cap, fz_linecap end_cap)
{
s->toggle = 1;
s->offset = 0;
@@ -646,14 +646,14 @@ fz_dash_moveto(struct sctx *s, fz_point a, fz_linecap start_cap, fz_linecap end_
if (s->toggle)
{
- fz_stroke_flush(s, s->cap, end_cap);
+ fz_stroke_flush(ctx, s, s->cap, end_cap);
s->cap = start_cap;
- fz_stroke_moveto(s, a);
+ fz_stroke_moveto(ctx, s, a);
}
}
static void
-fz_dash_lineto(struct sctx *s, fz_point b, int dash_cap, int from_bezier)
+fz_dash_lineto(fz_context *ctx, struct sctx *s, fz_point b, int dash_cap, int from_bezier)
{
float dx, dy, d;
float total, used, ratio, tail;
@@ -736,13 +736,13 @@ a_moved_vertically: /* d and dy have the same sign */
/* Update the position in the dash array */
if (s->toggle)
{
- fz_stroke_lineto(s, a, from_bezier);
+ fz_stroke_lineto(ctx, s, a, from_bezier);
}
else
{
- fz_stroke_flush(s, s->cap, dash_cap);
+ fz_stroke_flush(ctx, s, s->cap, dash_cap);
s->cap = dash_cap;
- fz_stroke_moveto(s, a);
+ fz_stroke_moveto(ctx, s, a);
}
used += s->phase;
n = used/s->dash_total;
@@ -759,13 +759,13 @@ a_moved_vertically: /* d and dy have the same sign */
}
if (s->toggle)
{
- fz_stroke_lineto(s, a, from_bezier);
+ fz_stroke_lineto(ctx, s, a, from_bezier);
}
else
{
- fz_stroke_flush(s, s->cap, dash_cap);
+ fz_stroke_flush(ctx, s, s->cap, dash_cap);
s->cap = dash_cap;
- fz_stroke_moveto(s, a);
+ fz_stroke_moveto(ctx, s, a);
}
s->phase = used;
used = 0;
@@ -819,13 +819,13 @@ b_moved_vertically: /* d and dy have the same sign */
if (s->toggle)
{
- fz_stroke_lineto(s, m, from_bezier);
+ fz_stroke_lineto(ctx, s, m, from_bezier);
}
else
{
- fz_stroke_flush(s, s->cap, dash_cap);
+ fz_stroke_flush(ctx, s, s->cap, dash_cap);
s->cap = dash_cap;
- fz_stroke_moveto(s, m);
+ fz_stroke_moveto(ctx, s, m);
}
s->toggle = !s->toggle;
@@ -843,7 +843,7 @@ b_moved_vertically: /* d and dy have the same sign */
if (s->toggle)
{
- fz_stroke_lineto(s, b, from_bezier);
+ fz_stroke_lineto(ctx, s, b, from_bezier);
}
}
else
@@ -853,13 +853,13 @@ adjust_for_tail:
/* Update the position in the dash array */
if (s->toggle)
{
- fz_stroke_lineto(s, old_b, from_bezier);
+ fz_stroke_lineto(ctx, s, old_b, from_bezier);
}
else
{
- fz_stroke_flush(s, s->cap, dash_cap);
+ fz_stroke_flush(ctx, s, s->cap, dash_cap);
s->cap = dash_cap;
- fz_stroke_moveto(s, old_b);
+ fz_stroke_moveto(ctx, s, old_b);
}
tail += s->phase;
n = tail/s->dash_total;
@@ -876,20 +876,20 @@ adjust_for_tail:
}
if (s->toggle)
{
- fz_stroke_lineto(s, old_b, from_bezier);
+ fz_stroke_lineto(ctx, s, old_b, from_bezier);
}
else
{
- fz_stroke_flush(s, s->cap, dash_cap);
+ fz_stroke_flush(ctx, s, s->cap, dash_cap);
s->cap = dash_cap;
- fz_stroke_moveto(s, old_b);
+ fz_stroke_moveto(ctx, s, old_b);
}
s->phase = tail;
}
}
static void
-fz_dash_bezier(struct sctx *s,
+fz_dash_bezier(fz_context *ctx, struct sctx *s,
float xa, float ya,
float xb, float yb,
float xc, float yc,
@@ -914,7 +914,7 @@ fz_dash_bezier(struct sctx *s,
fz_point p;
p.x = xd;
p.y = yd;
- fz_dash_lineto(s, p, dash_cap, 1);
+ fz_dash_lineto(ctx, s, p, dash_cap, 1);
return;
}
@@ -942,12 +942,12 @@ fz_dash_bezier(struct sctx *s,
xabcd *= 0.125f; yabcd *= 0.125f;
- fz_dash_bezier(s, xa, ya, xab, yab, xabc, yabc, xabcd, yabcd, depth + 1, dash_cap);
- fz_dash_bezier(s, xabcd, yabcd, xbcd, ybcd, xcd, ycd, xd, yd, depth + 1, dash_cap);
+ fz_dash_bezier(ctx, s, xa, ya, xab, yab, xabc, yabc, xabcd, yabcd, depth + 1, dash_cap);
+ fz_dash_bezier(ctx, s, xabcd, yabcd, xbcd, ybcd, xcd, ycd, xd, yd, depth + 1, dash_cap);
}
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_flatten_dash_path(fz_context *ctx, fz_gel *gel, fz_path *path, const fz_stroke_state *stroke, const fz_matrix *ctm, float flatness, float linewidth)
{
struct sctx s;
fz_point p0, p1, p2, p3, beg;
@@ -982,7 +982,7 @@ fz_flatten_dash_path(fz_gel *gel, fz_path *path, const fz_stroke_state *stroke,
phase_len += stroke->dash_list[i];
if (stroke->dash_len > 0 && phase_len == 0)
return;
- fz_gel_scissor(gel, &s.rect);
+ fz_gel_scissor(ctx, gel, &s.rect);
if (fz_try_invert_matrix(&inv, ctm))
return;
fz_transform_rect(&s.rect, &inv);
@@ -994,7 +994,7 @@ fz_flatten_dash_path(fz_gel *gel, fz_path *path, const fz_stroke_state *stroke,
max_expand = fz_matrix_max_expansion(ctm);
if (phase_len < 0.01f || phase_len * max_expand < 0.5f)
{
- fz_flatten_stroke_path(gel, path, stroke, ctm, flatness, linewidth);
+ fz_flatten_stroke_path(ctx, gel, path, stroke, ctm, flatness, linewidth);
return;
}
s.dash_total = phase_len;
@@ -1009,14 +1009,14 @@ fz_flatten_dash_path(fz_gel *gel, fz_path *path, const fz_stroke_state *stroke,
case FZ_MOVETO:
p1.x = path->coords[k++];
p1.y = path->coords[k++];
- fz_dash_moveto(&s, p1, stroke->start_cap, stroke->end_cap);
+ fz_dash_moveto(ctx, &s, p1, stroke->start_cap, stroke->end_cap);
beg = p0 = p1;
break;
case FZ_LINETO:
p1.x = path->coords[k++];
p1.y = path->coords[k++];
- fz_dash_lineto(&s, p1, stroke->dash_cap, 0);
+ fz_dash_lineto(ctx, &s, p1, stroke->dash_cap, 0);
p0 = p1;
break;
@@ -1027,16 +1027,16 @@ fz_flatten_dash_path(fz_gel *gel, fz_path *path, const fz_stroke_state *stroke,
p2.y = path->coords[k++];
p3.x = path->coords[k++];
p3.y = path->coords[k++];
- fz_dash_bezier(&s, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0, stroke->dash_cap);
+ fz_dash_bezier(ctx, &s, p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, 0, stroke->dash_cap);
p0 = p3;
break;
case FZ_CLOSE_PATH:
- fz_dash_lineto(&s, beg, stroke->dash_cap, 0);
+ fz_dash_lineto(ctx, &s, beg, stroke->dash_cap, 0);
p0 = p1 = beg;
break;
}
}
- fz_stroke_flush(&s, s.cap, stroke->end_cap);
+ fz_stroke_flush(ctx, &s, s.cap, stroke->end_cap);
}
diff --git a/source/fitz/draw-scale-simple.c b/source/fitz/draw-scale-simple.c
index 939464a1..5651e1f4 100644
--- a/source/fitz/draw-scale-simple.c
+++ b/source/fitz/draw-scale-simple.c
@@ -1498,7 +1498,7 @@ cleanup:
}
void
-fz_free_scale_cache(fz_context *ctx, fz_scale_cache *sc)
+fz_drop_scale_cache(fz_context *ctx, fz_scale_cache *sc)
{
if (!sc)
return;
diff --git a/source/fitz/draw-unpack.c b/source/fitz/draw-unpack.c
index d862ea2a..806fe448 100644
--- a/source/fitz/draw-unpack.c
+++ b/source/fitz/draw-unpack.c
@@ -47,7 +47,7 @@ init_get1_tables(void)
}
void
-fz_unpack_tile(fz_pixmap *dst, unsigned char * restrict src, int n, int depth, int stride, int scale)
+fz_unpack_tile(fz_context *ctx, fz_pixmap *dst, unsigned char * restrict src, int n, int depth, int stride, int scale)
{
int pad, x, y, k;
int w = dst->w;
@@ -172,7 +172,7 @@ fz_unpack_tile(fz_pixmap *dst, unsigned char * restrict src, int n, int depth, i
/* Apply decode array */
void
-fz_decode_indexed_tile(fz_pixmap *pix, float *decode, int maxval)
+fz_decode_indexed_tile(fz_context *ctx, fz_pixmap *pix, float *decode, int maxval)
{
int add[FZ_MAX_COLORS];
int mul[FZ_MAX_COLORS];
@@ -207,7 +207,7 @@ fz_decode_indexed_tile(fz_pixmap *pix, float *decode, int maxval)
}
void
-fz_decode_tile(fz_pixmap *pix, float *decode)
+fz_decode_tile(fz_context *ctx, fz_pixmap *pix, float *decode)
{
int add[FZ_MAX_COLORS];
int mul[FZ_MAX_COLORS];
diff --git a/source/fitz/filter-basic.c b/source/fitz/filter-basic.c
index 807364bc..eb9e838e 100644
--- a/source/fitz/filter-basic.c
+++ b/source/fitz/filter-basic.c
@@ -3,9 +3,9 @@
/* Pretend we have a filter that just copies data forever */
fz_stream *
-fz_open_copy(fz_stream *chain)
+fz_open_copy(fz_context *ctx, fz_stream *chain)
{
- return fz_keep_stream(chain);
+ return fz_keep_stream(ctx, chain);
}
/* Null filter copies a specified amount of data */
@@ -19,15 +19,15 @@ struct null_filter
};
static int
-next_null(fz_stream *stm, int max)
+next_null(fz_context *ctx, fz_stream *stm, int max)
{
struct null_filter *state = stm->state;
int n;
if (state->remain == 0)
return EOF;
- fz_seek(state->chain, state->offset, 0);
- n = fz_available(state->chain, max);
+ fz_seek(ctx, state->chain, state->offset, 0);
+ n = fz_available(ctx, state->chain, max);
if (n > state->remain)
n = state->remain;
if (n > sizeof(state->buffer))
@@ -50,21 +50,13 @@ close_null(fz_context *ctx, void *state_)
struct null_filter *state = (struct null_filter *)state_;
fz_stream *chain = state->chain;
fz_free(ctx, state);
- fz_close(chain);
-}
-
-static fz_stream *
-rebind_null(fz_stream *s)
-{
- struct null_filter *state = s->state;
- return state->chain;
+ fz_drop_stream(ctx, chain);
}
fz_stream *
-fz_open_null(fz_stream *chain, int len, int offset)
+fz_open_null(fz_context *ctx, fz_stream *chain, int len, int offset)
{
struct null_filter *state;
- fz_context *ctx = chain->ctx;
if (len < 0)
len = 0;
@@ -77,11 +69,11 @@ fz_open_null(fz_stream *chain, int len, int offset)
}
fz_catch(ctx)
{
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, state, next_null, close_null, rebind_null);
+ return fz_new_stream(ctx, state, next_null, close_null);
}
/* Concat filter concatenates several streams into one */
@@ -97,7 +89,7 @@ struct concat_filter
};
static int
-next_concat(fz_stream *stm, int max)
+next_concat(fz_context *ctx, fz_stream *stm, int max)
{
struct concat_filter *state = (struct concat_filter *)stm->state;
int n;
@@ -107,7 +99,7 @@ next_concat(fz_stream *stm, int max)
/* Read the next block of underlying data. */
if (stm->wp == state->chain[state->current]->wp)
state->chain[state->current]->rp = stm->wp;
- n = fz_available(state->chain[state->current], max);
+ n = fz_available(ctx, state->chain[state->current], max);
if (n)
{
stm->rp = state->chain[state->current]->rp;
@@ -123,7 +115,7 @@ next_concat(fz_stream *stm, int max)
break;
}
state->current++;
- fz_close(state->chain[state->current-1]);
+ fz_drop_stream(ctx, state->chain[state->current-1]);
if (state->pad)
{
stm->rp = (&state->ws_buf)+1;
@@ -147,26 +139,11 @@ close_concat(fz_context *ctx, void *state_)
for (i = state->current; i < state->count; i++)
{
- fz_close(state->chain[i]);
+ fz_drop_stream(ctx, state->chain[i]);
}
fz_free(ctx, state);
}
-static fz_stream *
-rebind_concat(fz_stream *s)
-{
- struct concat_filter *state = s->state;
- int i;
-
- if (state->current >= state->count)
- return NULL;
- for (i = state->current; i < state->count-1; i++)
- {
- fz_rebind_stream(state->chain[i], s->ctx);
- }
- return state->chain[i];
-}
-
fz_stream *
fz_open_concat(fz_context *ctx, int len, int pad)
{
@@ -179,16 +156,16 @@ fz_open_concat(fz_context *ctx, int len, int pad)
state->pad = pad;
state->ws_buf = 32;
- return fz_new_stream(ctx, state, next_concat, close_concat, rebind_concat);
+ return fz_new_stream(ctx, state, next_concat, close_concat);
}
void
-fz_concat_push(fz_stream *concat, fz_stream *chain)
+fz_concat_push(fz_context *ctx, fz_stream *concat, fz_stream *chain)
{
struct concat_filter *state = (struct concat_filter *)concat->state;
if (state->count == state->max)
- fz_throw(concat->ctx, FZ_ERROR_GENERIC, "Concat filter size exceeded");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Concat filter size exceeded");
state->chain[state->count++] = chain;
}
@@ -230,7 +207,7 @@ static inline int unhex(int a)
}
static int
-next_ahxd(fz_stream *stm, int max)
+next_ahxd(fz_context *ctx, fz_stream *stm, int max)
{
fz_ahxd *state = stm->state;
unsigned char *p = state->buffer;
@@ -248,7 +225,7 @@ next_ahxd(fz_stream *stm, int max)
if (state->eod)
break;
- c = fz_read_byte(state->chain);
+ c = fz_read_byte(ctx, state->chain);
if (c < 0)
break;
@@ -275,7 +252,7 @@ next_ahxd(fz_stream *stm, int max)
}
else if (!iswhite(c))
{
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "bad data in ahxd: '%c'", c);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "bad data in ahxd: '%c'", c);
}
}
stm->rp = state->buffer;
@@ -293,21 +270,13 @@ close_ahxd(fz_context *ctx, void *state_)
fz_ahxd *state = (fz_ahxd *)state_;
fz_stream *chain = state->chain;
fz_free(ctx, state);
- fz_close(chain);
-}
-
-static fz_stream *
-rebind_ahxd(fz_stream *s)
-{
- fz_ahxd *state = s->state;
- return state->chain;
+ fz_drop_stream(ctx, chain);
}
fz_stream *
-fz_open_ahxd(fz_stream *chain)
+fz_open_ahxd(fz_context *ctx, fz_stream *chain)
{
fz_ahxd *state;
- fz_context *ctx = chain->ctx;
fz_try(ctx)
{
@@ -317,11 +286,11 @@ fz_open_ahxd(fz_stream *chain)
}
fz_catch(ctx)
{
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, state, next_ahxd, close_ahxd, rebind_ahxd);
+ return fz_new_stream(ctx, state, next_ahxd, close_ahxd);
}
/* ASCII 85 Decode */
@@ -336,7 +305,7 @@ struct fz_a85d_s
};
static int
-next_a85d(fz_stream *stm, int max)
+next_a85d(fz_context *ctx, fz_stream *stm, int max)
{
fz_a85d *state = stm->state;
unsigned char *p = state->buffer;
@@ -354,7 +323,7 @@ next_a85d(fz_stream *stm, int max)
ep = p + max;
while (p < ep)
{
- c = fz_read_byte(state->chain);
+ c = fz_read_byte(ctx, state->chain);
if (c < 0)
break;
@@ -389,9 +358,9 @@ next_a85d(fz_stream *stm, int max)
else if (c == '~')
{
- c = fz_read_byte(state->chain);
+ c = fz_read_byte(ctx, state->chain);
if (c != '>')
- fz_warn(stm->ctx, "bad eod marker in a85d");
+ fz_warn(ctx, "bad eod marker in a85d");
switch (count) {
case 0:
@@ -400,7 +369,7 @@ next_a85d(fz_stream *stm, int max)
/* Specifically illegal in the spec, but adobe
* and gs both cope. See normal_87.pdf for a
* case where this matters. */
- fz_warn(stm->ctx, "partial final byte in a85d");
+ fz_warn(ctx, "partial final byte in a85d");
break;
case 2:
word = word * (85 * 85 * 85) + 0xffffff;
@@ -424,7 +393,7 @@ next_a85d(fz_stream *stm, int max)
else if (!iswhite(c))
{
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "bad data in a85d: '%c'", c);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "bad data in a85d: '%c'", c);
}
}
@@ -445,21 +414,13 @@ close_a85d(fz_context *ctx, void *state_)
fz_stream *chain = state->chain;
fz_free(ctx, state);
- fz_close(chain);
-}
-
-static fz_stream *
-rebind_a85d(fz_stream *s)
-{
- fz_a85d *state = s->state;
- return state->chain;
+ fz_drop_stream(ctx, chain);
}
fz_stream *
-fz_open_a85d(fz_stream *chain)
+fz_open_a85d(fz_context *ctx, fz_stream *chain)
{
fz_a85d *state;
- fz_context *ctx = chain->ctx;
fz_try(ctx)
{
@@ -469,11 +430,11 @@ fz_open_a85d(fz_stream *chain)
}
fz_catch(ctx)
{
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, state, next_a85d, close_a85d, rebind_a85d);
+ return fz_new_stream(ctx, state, next_a85d, close_a85d);
}
/* Run Length Decode */
@@ -488,7 +449,7 @@ struct fz_rld_s
};
static int
-next_rld(fz_stream *stm, int max)
+next_rld(fz_context *ctx, fz_stream *stm, int max)
{
fz_rld *state = stm->state;
unsigned char *p = state->buffer;
@@ -508,7 +469,7 @@ next_rld(fz_stream *stm, int max)
if (state->n == 0)
{
- state->run = fz_read_byte(state->chain);
+ state->run = fz_read_byte(ctx, state->chain);
if (state->run < 0)
{
state->run = 128;
@@ -519,9 +480,9 @@ next_rld(fz_stream *stm, int max)
if (state->run > 128)
{
state->n = 257 - state->run;
- state->c = fz_read_byte(state->chain);
+ state->c = fz_read_byte(ctx, state->chain);
if (state->c < 0)
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "premature end of data in run length decode");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "premature end of data in run length decode");
}
}
@@ -529,9 +490,9 @@ next_rld(fz_stream *stm, int max)
{
while (p < ep && state->n)
{
- int c = fz_read_byte(state->chain);
+ int c = fz_read_byte(ctx, state->chain);
if (c < 0)
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "premature end of data in run length decode");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "premature end of data in run length decode");
*p++ = c;
state->n--;
}
@@ -564,21 +525,13 @@ close_rld(fz_context *ctx, void *state_)
fz_stream *chain = state->chain;
fz_free(ctx, state);
- fz_close(chain);
-}
-
-static fz_stream *
-rebind_rld(fz_stream *s)
-{
- fz_rld *state = s->state;
- return state->chain;
+ fz_drop_stream(ctx, chain);
}
fz_stream *
-fz_open_rld(fz_stream *chain)
+fz_open_rld(fz_context *ctx, fz_stream *chain)
{
fz_rld *state;
- fz_context *ctx = chain->ctx;
fz_try(ctx)
{
@@ -590,11 +543,11 @@ fz_open_rld(fz_stream *chain)
}
fz_catch(ctx)
{
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, state, next_rld, close_rld, rebind_rld);
+ return fz_new_stream(ctx, state, next_rld, close_rld);
}
/* RC4 Filter */
@@ -609,10 +562,10 @@ struct fz_arc4c_s
};
static int
-next_arc4(fz_stream *stm, int max)
+next_arc4(fz_context *ctx, fz_stream *stm, int max)
{
fz_arc4c *state = stm->state;
- int n = fz_available(state->chain, max);
+ int n = fz_available(ctx, state->chain, max);
if (n == 0)
return EOF;
@@ -635,21 +588,13 @@ close_arc4(fz_context *ctx, void *state_)
fz_stream *chain = state->chain;
fz_free(ctx, state);
- fz_close(chain);
-}
-
-static fz_stream *
-rebind_arc4c(fz_stream *s)
-{
- fz_arc4c *state = s->state;
- return state->chain;
+ fz_drop_stream(ctx, chain);
}
fz_stream *
-fz_open_arc4(fz_stream *chain, unsigned char *key, unsigned keylen)
+fz_open_arc4(fz_context *ctx, fz_stream *chain, unsigned char *key, unsigned keylen)
{
fz_arc4c *state;
- fz_context *ctx = chain->ctx;
fz_try(ctx)
{
@@ -659,11 +604,11 @@ fz_open_arc4(fz_stream *chain, unsigned char *key, unsigned keylen)
}
fz_catch(ctx)
{
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, state, next_arc4, close_arc4, rebind_arc4c);
+ return fz_new_stream(ctx, state, next_arc4, close_arc4);
}
/* AES Filter */
@@ -682,7 +627,7 @@ struct fz_aesd_s
};
static int
-next_aesd(fz_stream *stm, int max)
+next_aesd(fz_context *ctx, fz_stream *stm, int max)
{
fz_aesd *state = stm->state;
unsigned char *p = state->buffer;
@@ -694,9 +639,9 @@ next_aesd(fz_stream *stm, int max)
while (state->ivcount < 16)
{
- int c = fz_read_byte(state->chain);
+ int c = fz_read_byte(ctx, state->chain);
if (c < 0)
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "premature end in aes filter");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "premature end in aes filter");
state->iv[state->ivcount++] = c;
}
@@ -705,22 +650,22 @@ next_aesd(fz_stream *stm, int max)
while (p < ep)
{
- int n = fz_read(state->chain, state->bp, 16);
+ int n = fz_read(ctx, state->chain, state->bp, 16);
if (n == 0)
break;
else if (n < 16)
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "partial block in aes filter");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "partial block in aes filter");
aes_crypt_cbc(&state->aes, AES_DECRYPT, 16, state->iv, state->bp, state->bp);
state->rp = state->bp;
state->wp = state->bp + 16;
/* strip padding at end of file */
- if (fz_is_eof(state->chain))
+ if (fz_is_eof(ctx, state->chain))
{
int pad = state->bp[15];
if (pad < 1 || pad > 16)
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "aes padding out of range: %d", pad);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "aes padding out of range: %d", pad);
state->wp -= pad;
}
@@ -745,21 +690,13 @@ close_aesd(fz_context *ctx, void *state_)
fz_stream *chain = state->chain;
fz_free(ctx, state);
- fz_close(chain);
-}
-
-static fz_stream *
-rebind_aesd(fz_stream *s)
-{
- fz_aesd *state = s->state;
- return state->chain;
+ fz_drop_stream(ctx, chain);
}
fz_stream *
-fz_open_aesd(fz_stream *chain, unsigned char *key, unsigned keylen)
+fz_open_aesd(fz_context *ctx, fz_stream *chain, unsigned char *key, unsigned keylen)
{
fz_aesd *state = NULL;
- fz_context *ctx = chain->ctx;
fz_var(state);
@@ -776,9 +713,9 @@ fz_open_aesd(fz_stream *chain, unsigned char *key, unsigned keylen)
fz_catch(ctx)
{
fz_free(ctx, state);
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, state, next_aesd, close_aesd, rebind_aesd);
+ return fz_new_stream(ctx, state, next_aesd, close_aesd);
}
diff --git a/source/fitz/filter-dct.c b/source/fitz/filter-dct.c
index 344dbdbf..0d24de88 100644
--- a/source/fitz/filter-dct.c
+++ b/source/fitz/filter-dct.c
@@ -109,13 +109,13 @@ static boolean fill_input_buffer(j_decompress_ptr cinfo)
{
struct jpeg_source_mgr *src = cinfo->src;
fz_dctd *state = JZ_DCT_STATE_FROM_CINFO(cinfo);
+ fz_context *ctx = state->ctx;
fz_stream *curr_stm = state->curr_stm;
- fz_context *ctx = curr_stm->ctx;
curr_stm->rp = curr_stm->wp;
fz_try(ctx)
{
- src->bytes_in_buffer = fz_available(curr_stm, 1);
+ src->bytes_in_buffer = fz_available(ctx, curr_stm, 1);
}
fz_catch(ctx)
{
@@ -151,7 +151,7 @@ static void skip_input_data(j_decompress_ptr cinfo, long num_bytes)
}
static int
-next_dctd(fz_stream *stm, int max)
+next_dctd(fz_context *ctx, fz_stream *stm, int max)
{
fz_dctd *state = stm->state;
j_decompress_ptr cinfo = &state->cinfo;
@@ -166,7 +166,7 @@ next_dctd(fz_stream *stm, int max)
{
if (cinfo->src)
state->curr_stm->rp = state->curr_stm->wp - cinfo->src->bytes_in_buffer;
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "jpeg error: %s", state->msg);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "jpeg error: %s", state->msg);
}
if (!state->init)
@@ -183,8 +183,8 @@ next_dctd(fz_stream *stm, int max)
state->init = 1;
/* Skip over any stray returns at the start of the stream */
- while ((c = fz_peek_byte(state->chain)) == '\n' || c == '\r')
- (void)fz_read_byte(state->chain);
+ while ((c = fz_peek_byte(ctx, state->chain)) == '\n' || c == '\r')
+ (void)fz_read_byte(ctx, state->chain);
cinfo->src = &state->srcmgr;
cinfo->src->init_source = init_source;
@@ -244,7 +244,7 @@ next_dctd(fz_stream *stm, int max)
jpeg_start_decompress(cinfo);
state->stride = cinfo->output_width * cinfo->output_components;
- state->scanline = fz_malloc(state->ctx, state->stride);
+ state->scanline = fz_malloc(ctx, state->stride);
state->rp = state->scanline;
state->wp = state->scanline;
}
@@ -308,30 +308,22 @@ skip:
fz_dct_mem_term(state);
fz_free(ctx, state->scanline);
- fz_close(state->chain);
- fz_close(state->jpegtables);
+ fz_drop_stream(ctx, state->chain);
+ fz_drop_stream(ctx, state->jpegtables);
fz_free(ctx, state);
}
-static fz_stream *
-rebind_dctd(fz_stream *s)
-{
- fz_dctd *state = s->state;
- return state->chain;
-}
-
/* Default: color_transform = -1 (unset), l2factor = 0, jpegtables = NULL */
fz_stream *
-fz_open_dctd(fz_stream *chain, int color_transform, int l2factor, fz_stream *jpegtables)
+fz_open_dctd(fz_context *ctx, fz_stream *chain, int color_transform, int l2factor, fz_stream *jpegtables)
{
- fz_context *ctx = chain->ctx;
fz_dctd *state = NULL;
fz_var(state);
fz_try(ctx)
{
- state = fz_malloc_struct(chain->ctx, fz_dctd);
+ state = fz_malloc_struct(ctx, fz_dctd);
state->ctx = ctx;
state->chain = chain;
state->jpegtables = jpegtables;
@@ -344,10 +336,10 @@ fz_open_dctd(fz_stream *chain, int color_transform, int l2factor, fz_stream *jpe
fz_catch(ctx)
{
fz_free(ctx, state);
- fz_close(chain);
- fz_close(jpegtables);
+ fz_drop_stream(ctx, chain);
+ fz_drop_stream(ctx, jpegtables);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, state, next_dctd, close_dctd, rebind_dctd);
+ return fz_new_stream(ctx, state, next_dctd, close_dctd);
}
diff --git a/source/fitz/filter-fax.c b/source/fitz/filter-fax.c
index 70692338..f0a58160 100644
--- a/source/fitz/filter-fax.c
+++ b/source/fitz/filter-fax.c
@@ -321,7 +321,6 @@ enum
struct fz_faxd_s
{
- fz_context *ctx;
fz_stream *chain;
int k;
@@ -355,14 +354,14 @@ static inline void eat_bits(fz_faxd *fax, int nbits)
}
static int
-fill_bits(fz_faxd *fax)
+fill_bits(fz_context *ctx, fz_faxd *fax)
{
/* The longest length of bits we'll ever need is 13. Never read more
* than we need to avoid unnecessary overreading of the end of the
* stream. */
while (fax->bidx > (32-13))
{
- int c = fz_read_byte(fax->chain);
+ int c = fz_read_byte(ctx, fax->chain);
if (c == EOF)
return EOF;
fax->bidx -= 8;
@@ -372,7 +371,7 @@ fill_bits(fz_faxd *fax)
}
static int
-get_code(fz_faxd *fax, const cfd_node *table, int initialbits)
+get_code(fz_context *ctx, fz_faxd *fax, const cfd_node *table, int initialbits)
{
unsigned int word = fax->word;
int tidx = word >> (32 - initialbits);
@@ -402,9 +401,9 @@ dec1d(fz_context *ctx, fz_faxd *fax)
fax->a = 0;
if (fax->c)
- code = get_code(fax, cf_black_decode, cfd_black_initial_bits);
+ code = get_code(ctx, fax, cf_black_decode, cfd_black_initial_bits);
else
- code = get_code(fax, cf_white_decode, cfd_white_initial_bits);
+ code = get_code(ctx, fax, cf_white_decode, cfd_white_initial_bits);
if (code == UNCOMPRESSED)
fz_throw(ctx, FZ_ERROR_GENERIC, "uncompressed data in faxd");
@@ -441,9 +440,9 @@ dec2d(fz_context *ctx, fz_faxd *fax)
fax->a = 0;
if (fax->c)
- code = get_code(fax, cf_black_decode, cfd_black_initial_bits);
+ code = get_code(ctx, fax, cf_black_decode, cfd_black_initial_bits);
else
- code = get_code(fax, cf_white_decode, cfd_white_initial_bits);
+ code = get_code(ctx, fax, cf_white_decode, cfd_white_initial_bits);
if (code == UNCOMPRESSED)
fz_throw(ctx, FZ_ERROR_GENERIC, "uncompressed data in faxd");
@@ -471,7 +470,7 @@ dec2d(fz_context *ctx, fz_faxd *fax)
return;
}
- code = get_code(fax, cf_2d_decode, cfd_2d_initial_bits);
+ code = get_code(ctx, fax, cf_2d_decode, cfd_2d_initial_bits);
switch (code)
{
@@ -556,9 +555,8 @@ dec2d(fz_context *ctx, fz_faxd *fax)
}
static int
-next_faxd(fz_stream *stm, int max)
+next_faxd(fz_context *ctx, fz_stream *stm, int max)
{
- fz_context *ctx = stm->ctx;
fz_faxd *fax = stm->state;
unsigned char *p = fax->buffer;
unsigned char *ep;
@@ -569,11 +567,11 @@ next_faxd(fz_stream *stm, int max)
ep = p + max;
if (fax->stage == STATE_INIT && fax->end_of_line)
{
- fill_bits(fax);
+ fill_bits(ctx, fax);
if ((fax->word >> (32 - 12)) != 1)
{
fz_warn(ctx, "faxd stream doesn't start with EOL");
- while (!fill_bits(fax) && (fax->word >> (32 - 12)) != 1)
+ while (!fill_bits(ctx, fax) && (fax->word >> (32 - 12)) != 1)
eat_bits(fax, 1);
}
if ((fax->word >> (32 - 12)) != 1)
@@ -591,7 +589,7 @@ next_faxd(fz_stream *stm, int max)
loop:
- if (fill_bits(fax))
+ if (fill_bits(ctx, fax))
{
if (fax->bidx > 31)
{
@@ -776,28 +774,20 @@ close_faxd(fz_context *ctx, void *state_)
/* if we read any extra bytes, try to put them back */
i = (32 - fax->bidx) / 8;
while (i--)
- fz_unread_byte(fax->chain);
+ fz_unread_byte(ctx, fax->chain);
- fz_close(fax->chain);
+ fz_drop_stream(ctx, fax->chain);
fz_free(ctx, fax->ref);
fz_free(ctx, fax->dst);
fz_free(ctx, fax);
}
-static fz_stream *
-rebind_faxd(fz_stream *s)
-{
- fz_faxd *state = s->state;
- return state->chain;
-}
-
/* Default: columns = 1728, end_of_block = 1, the rest = 0 */
fz_stream *
-fz_open_faxd(fz_stream *chain,
+fz_open_faxd(fz_context *ctx, 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_context *ctx = chain->ctx;
fz_faxd *fax = NULL;
fz_var(fax);
@@ -848,9 +838,9 @@ fz_open_faxd(fz_stream *chain,
fz_free(ctx, fax->ref);
}
fz_free(ctx, fax);
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, fax, next_faxd, close_faxd, rebind_faxd);
+ return fz_new_stream(ctx, fax, next_faxd, close_faxd);
}
diff --git a/source/fitz/filter-flate.c b/source/fitz/filter-flate.c
index b66661cc..46ff6970 100644
--- a/source/fitz/filter-flate.c
+++ b/source/fitz/filter-flate.c
@@ -22,7 +22,7 @@ static void zfree(void *opaque, void *ptr)
}
static int
-next_flated(fz_stream *stm, int required)
+next_flated(fz_context *ctx, fz_stream *stm, int required)
{
fz_flate *state = stm->state;
fz_stream *chain = state->chain;
@@ -39,7 +39,7 @@ next_flated(fz_stream *stm, int required)
while (zp->avail_out > 0)
{
- zp->avail_in = fz_available(chain, 1);
+ zp->avail_in = fz_available(ctx, chain, 1);
zp->next_in = chain->rp;
code = inflate(zp, Z_SYNC_FLUSH);
@@ -52,23 +52,23 @@ next_flated(fz_stream *stm, int required)
}
else if (code == Z_BUF_ERROR)
{
- fz_warn(stm->ctx, "premature end of data in flate filter");
+ fz_warn(ctx, "premature end of data in flate filter");
break;
}
else if (code == Z_DATA_ERROR && zp->avail_in == 0)
{
- fz_warn(stm->ctx, "ignoring zlib error: %s", zp->msg);
+ fz_warn(ctx, "ignoring zlib error: %s", zp->msg);
break;
}
else if (code == Z_DATA_ERROR && !strcmp(zp->msg, "incorrect data check"))
{
- fz_warn(stm->ctx, "ignoring zlib error: %s", zp->msg);
+ fz_warn(ctx, "ignoring zlib error: %s", zp->msg);
chain->rp = chain->wp;
break;
}
else if (code != Z_OK)
{
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "zlib error: %s", zp->msg);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "zlib error: %s", zp->msg);
}
}
@@ -93,23 +93,15 @@ close_flated(fz_context *ctx, void *state_)
if (code != Z_OK)
fz_warn(ctx, "zlib error: inflateEnd: %s", state->z.msg);
- fz_close(state->chain);
+ fz_drop_stream(ctx, state->chain);
fz_free(ctx, state);
}
-static fz_stream *
-rebind_flated(fz_stream *s)
-{
- fz_flate *state = s->state;
- return state->chain;
-}
-
fz_stream *
-fz_open_flated(fz_stream *chain, int window_bits)
+fz_open_flated(fz_context *ctx, fz_stream *chain, int window_bits)
{
fz_flate *state = NULL;
int code = Z_OK;
- fz_context *ctx = chain->ctx;
fz_var(code);
fz_var(state);
@@ -134,8 +126,8 @@ fz_open_flated(fz_stream *chain, int window_bits)
if (state && code == Z_OK)
inflateEnd(&state->z);
fz_free(ctx, state);
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, state, next_flated, close_flated, rebind_flated);
+ return fz_new_stream(ctx, state, next_flated, close_flated);
}
diff --git a/source/fitz/filter-jbig2.c b/source/fitz/filter-jbig2.c
index 98919dcb..8aec1d67 100644
--- a/source/fitz/filter-jbig2.c
+++ b/source/fitz/filter-jbig2.c
@@ -35,12 +35,12 @@ close_jbig2d(fz_context *ctx, void *state_)
if (state->gctx)
fz_drop_jbig2_globals(ctx, state->gctx);
jbig2_ctx_free(state->ctx);
- fz_close(state->chain);
+ fz_drop_stream(ctx, state->chain);
fz_free(ctx, state);
}
static int
-next_jbig2d(fz_stream *stm, int len)
+next_jbig2d(fz_context *ctx, fz_stream *stm, int len)
{
fz_jbig2d *state = stm->state;
unsigned char tmp[4096];
@@ -58,7 +58,7 @@ next_jbig2d(fz_stream *stm, int len)
{
while (1)
{
- n = fz_read(state->chain, tmp, sizeof tmp);
+ n = fz_read(ctx, state->chain, tmp, sizeof tmp);
if (n == 0)
break;
jbig2_data_in(state->ctx, tmp, n);
@@ -68,7 +68,7 @@ next_jbig2d(fz_stream *stm, int len)
state->page = jbig2_page_out(state->ctx);
if (!state->page)
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "jbig2_page_out failed");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "jbig2_page_out failed");
}
s = state->page->data;
@@ -86,13 +86,6 @@ next_jbig2d(fz_stream *stm, int len)
return *stm->rp++;
}
-static fz_stream *
-rebind_jbig2d(fz_stream *s)
-{
- fz_jbig2d *state = s->state;
- return state->chain;
-}
-
static int
error_callback(void *data, const char *msg, Jbig2Severity severity, int32_t seg_idx)
{
@@ -112,14 +105,14 @@ fz_load_jbig2_globals(fz_context *ctx, unsigned char *data, int size)
Jbig2Ctx *jctx = jbig2_ctx_new(NULL, JBIG2_OPTIONS_EMBEDDED, NULL, error_callback, ctx);
jbig2_data_in(jctx, data, size);
- FZ_INIT_STORABLE(globals, 1, fz_free_jbig2_globals_imp);
+ FZ_INIT_STORABLE(globals, 1, fz_drop_jbig2_globals_imp);
globals->gctx = jbig2_make_global_ctx(jctx);
return globals;
}
void
-fz_free_jbig2_globals_imp(fz_context *ctx, fz_storable *globals_)
+fz_drop_jbig2_globals_imp(fz_context *ctx, fz_storable *globals_)
{
fz_jbig2_globals *globals = (fz_jbig2_globals *)globals_;
jbig2_global_ctx_free(globals->gctx);
@@ -127,16 +120,15 @@ fz_free_jbig2_globals_imp(fz_context *ctx, fz_storable *globals_)
}
fz_stream *
-fz_open_jbig2d(fz_stream *chain, fz_jbig2_globals *globals)
+fz_open_jbig2d(fz_context *ctx, fz_stream *chain, fz_jbig2_globals *globals)
{
fz_jbig2d *state = NULL;
- fz_context *ctx = chain->ctx;
fz_var(state);
fz_try(ctx)
{
- state = fz_malloc_struct(chain->ctx, fz_jbig2d);
+ state = fz_malloc_struct(ctx, fz_jbig2d);
state->ctx = NULL;
state->gctx = globals;
state->chain = chain;
@@ -153,9 +145,9 @@ fz_open_jbig2d(fz_stream *chain, fz_jbig2_globals *globals)
jbig2_ctx_free(state->ctx);
}
fz_free(ctx, state);
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, state, next_jbig2d, close_jbig2d, rebind_jbig2d);
+ return fz_new_stream(ctx, state, next_jbig2d, close_jbig2d);
}
diff --git a/source/fitz/filter-leech.c b/source/fitz/filter-leech.c
index 321e31d7..90e28565 100644
--- a/source/fitz/filter-leech.c
+++ b/source/fitz/filter-leech.c
@@ -11,18 +11,18 @@ struct fz_leech_s
};
static int
-next_leech(fz_stream *stm, int max)
+next_leech(fz_context *ctx, fz_stream *stm, int max)
{
fz_leech *state = stm->state;
fz_buffer *buffer = state->buffer;
- int n = fz_available(state->chain, max);
+ int n = fz_available(ctx, state->chain, max);
if (n > max)
n = max;
while (buffer->cap < buffer->len + n)
{
- fz_grow_buffer(stm->ctx, state->buffer);
+ fz_grow_buffer(ctx, state->buffer);
}
memcpy(buffer->data + buffer->len, state->chain->rp, n);
stm->rp = buffer->data + buffer->len;
@@ -40,22 +40,14 @@ close_leech(fz_context *ctx, void *state_)
{
fz_leech *state = (fz_leech *)state_;
- fz_close(state->chain);
+ fz_drop_stream(ctx, state->chain);
fz_free(ctx, state);
}
-static fz_stream *
-rebind_leech(fz_stream *s)
-{
- fz_leech *state = s->state;
- return state->chain;
-}
-
fz_stream *
-fz_open_leecher(fz_stream *chain, fz_buffer *buffer)
+fz_open_leecher(fz_context *ctx, fz_stream *chain, fz_buffer *buffer)
{
fz_leech *state = NULL;
- fz_context *ctx = chain->ctx;
fz_var(state);
@@ -68,8 +60,8 @@ fz_open_leecher(fz_stream *chain, fz_buffer *buffer)
fz_catch(ctx)
{
fz_free(ctx, state);
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, state, next_leech, close_leech, rebind_leech);
+ return fz_new_stream(ctx, state, next_leech, close_leech);
}
diff --git a/source/fitz/filter-lzw.c b/source/fitz/filter-lzw.c
index e13b0ef0..257c6c86 100644
--- a/source/fitz/filter-lzw.c
+++ b/source/fitz/filter-lzw.c
@@ -46,7 +46,7 @@ struct fz_lzwd_s
};
static int
-next_lzwd(fz_stream *stm, int len)
+next_lzwd(fz_context *ctx, fz_stream *stm, int len)
{
fz_lzwd *lzw = stm->state;
lzw_code *table = lzw->table;
@@ -73,9 +73,9 @@ next_lzwd(fz_stream *stm, int len)
if (lzw->eod)
return EOF;
- code = fz_read_bits(lzw->chain, code_bits);
+ code = fz_read_bits(ctx, lzw->chain, code_bits);
- if (fz_is_eof_bits(lzw->chain))
+ if (fz_is_eof_bits(ctx, lzw->chain))
{
lzw->eod = 1;
break;
@@ -87,9 +87,9 @@ next_lzwd(fz_stream *stm, int len)
break;
}
- if (next_code >= NUM_CODES && code != LZW_CLEAR)
+ if (next_code > NUM_CODES && code != LZW_CLEAR)
{
- fz_warn(stm->ctx, "missing clear code in lzw decode");
+ fz_warn(ctx, "missing clear code in lzw decode");
code = LZW_CLEAR;
}
@@ -106,9 +106,15 @@ next_lzwd(fz_stream *stm, int len)
{
old_code = code;
}
+ else if (next_code == NUM_CODES)
+ {
+ /* TODO: Ghostscript checks for a following LZW_CLEAR before tolerating */
+ fz_warn(ctx, "tolerating a single out of range code in lzw decode");
+ next_code++;
+ }
else if (code > next_code || next_code >= NUM_CODES)
{
- fz_warn(stm->ctx, "out of range code encountered in lzw decode");
+ fz_warn(ctx, "out of range code encountered in lzw decode");
}
else
{
@@ -121,7 +127,7 @@ next_lzwd(fz_stream *stm, int len)
else if (code == next_code)
table[next_code].value = table[next_code].first_char;
else
- fz_warn(stm->ctx, "out of range code encountered in lzw decode");
+ fz_warn(ctx, "out of range code encountered in lzw decode");
next_code ++;
@@ -182,23 +188,15 @@ static void
close_lzwd(fz_context *ctx, void *state_)
{
fz_lzwd *lzw = (fz_lzwd *)state_;
- fz_sync_bits(lzw->chain);
- fz_close(lzw->chain);
+ fz_sync_bits(ctx, lzw->chain);
+ fz_drop_stream(ctx, lzw->chain);
fz_free(ctx, lzw);
}
-static fz_stream *
-rebind_lzwd(fz_stream *s)
-{
- fz_lzwd *state = s->state;
- return state->chain;
-}
-
/* Default: early_change = 1 */
fz_stream *
-fz_open_lzwd(fz_stream *chain, int early_change)
+fz_open_lzwd(fz_context *ctx, fz_stream *chain, int early_change)
{
- fz_context *ctx = chain->ctx;
fz_lzwd *lzw = NULL;
int i;
@@ -237,9 +235,9 @@ fz_open_lzwd(fz_stream *chain, int early_change)
fz_catch(ctx)
{
fz_free(ctx, lzw);
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, lzw, next_lzwd, close_lzwd, rebind_lzwd);
+ return fz_new_stream(ctx, lzw, next_lzwd, close_lzwd);
}
diff --git a/source/fitz/filter-predict.c b/source/fitz/filter-predict.c
index 3aaa6ee9..3136c651 100644
--- a/source/fitz/filter-predict.c
+++ b/source/fitz/filter-predict.c
@@ -157,7 +157,7 @@ fz_predict_png(fz_predict *state, unsigned char *out, unsigned char *in, int len
}
static int
-next_predict(fz_stream *stm, int len)
+next_predict(fz_context *ctx, fz_stream *stm, int len)
{
fz_predict *state = stm->state;
unsigned char *buf = state->buffer;
@@ -175,7 +175,7 @@ next_predict(fz_stream *stm, int len)
while (p < ep)
{
- n = fz_read(state->chain, state->in, state->stride + ispng);
+ n = fz_read(ctx, state->chain, state->in, state->stride + ispng);
if (n == 0)
break;
@@ -209,25 +209,17 @@ static void
close_predict(fz_context *ctx, void *state_)
{
fz_predict *state = (fz_predict *)state_;
- fz_close(state->chain);
+ fz_drop_stream(ctx, state->chain);
fz_free(ctx, state->in);
fz_free(ctx, state->out);
fz_free(ctx, state->ref);
fz_free(ctx, state);
}
-static fz_stream *
-rebind_predict(fz_stream *s)
-{
- fz_predict *state = s->state;
- return state->chain;
-}
-
/* Default values: predictor = 1, columns = 1, colors = 1, bpc = 8 */
fz_stream *
-fz_open_predict(fz_stream *chain, int predictor, int columns, int colors, int bpc)
+fz_open_predict(fz_context *ctx, fz_stream *chain, int predictor, int columns, int colors, int bpc)
{
- fz_context *ctx = chain->ctx;
fz_predict *state = NULL;
fz_var(state);
@@ -288,9 +280,9 @@ fz_open_predict(fz_stream *chain, int predictor, int columns, int colors, int bp
fz_free(ctx, state->out);
}
fz_free(ctx, state);
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
- return fz_new_stream(ctx, state, next_predict, close_predict, rebind_predict);
+ return fz_new_stream(ctx, state, next_predict, close_predict);
}
diff --git a/source/fitz/font.c b/source/fitz/font.c
index 598931e8..5f2f85e1 100644
--- a/source/fitz/font.c
+++ b/source/fitz/font.c
@@ -74,12 +74,7 @@ fz_new_font(fz_context *ctx, const char *name, int use_glyph_bbox, int glyph_cou
fz_font *
fz_keep_font(fz_context *ctx, fz_font *font)
{
- if (!font)
- return NULL;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- font->refs ++;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- return font;
+ return fz_keep_imp(ctx, font, &font->refs);
}
static void
@@ -89,7 +84,7 @@ free_resources(fz_context *ctx, fz_font *font)
if (font->t3resources)
{
- font->t3freeres(font->t3doc, font->t3resources);
+ font->t3freeres(ctx, font->t3doc, font->t3resources);
font->t3resources = NULL;
}
@@ -119,12 +114,9 @@ void
fz_drop_font(fz_context *ctx, fz_font *font)
{
int fterr;
- int i, drop;
+ int i;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- drop = (font && --font->refs == 0);
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- if (!drop)
+ if (!fz_drop_imp(ctx, font, &font->refs))
return;
free_resources(ctx, font);
@@ -214,23 +206,16 @@ void fz_new_font_context(fz_context *ctx)
fz_font_context *
fz_keep_font_context(fz_context *ctx)
{
- if (!ctx || !ctx->font)
+ if (!ctx)
return NULL;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- ctx->font->ctx_refs++;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- return ctx->font;
+ return fz_keep_imp(ctx, ctx->font, &ctx->font->ctx_refs);
}
void fz_drop_font_context(fz_context *ctx)
{
- int drop;
- if (!ctx || !ctx->font)
+ if (!ctx)
return;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- drop = --ctx->font->ctx_refs;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- if (drop == 0)
+ if (fz_drop_imp(ctx, ctx->font, &ctx->font->ctx_refs))
fz_free(ctx, ctx->font);
}
@@ -1063,9 +1048,9 @@ fz_prepare_t3_glyph(fz_context *ctx, fz_font *font, int gid, int nested_depth)
FZ_DEVFLAG_LINEJOIN_UNDEFINED |
FZ_DEVFLAG_MITERLIMIT_UNDEFINED |
FZ_DEVFLAG_LINEWIDTH_UNDEFINED;
- font->t3run(font->t3doc, font->t3resources, contents, dev, &fz_identity, NULL, 0);
+ font->t3run(ctx, font->t3doc, font->t3resources, contents, dev, &fz_identity, NULL, 0);
font->t3flags[gid] = dev->flags;
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
}
static fz_rect *
@@ -1087,11 +1072,11 @@ fz_bound_t3_glyph(fz_context *ctx, fz_font *font, int gid, const fz_matrix *trm,
dev = fz_new_bbox_device(ctx, bounds);
fz_try(ctx)
{
- fz_run_display_list(list, dev, &ctm, &fz_infinite_rect, NULL);
+ fz_run_display_list(ctx, list, dev, &ctm, &fz_infinite_rect, NULL);
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
}
fz_catch(ctx)
{
@@ -1117,7 +1102,7 @@ fz_run_t3_glyph(fz_context *ctx, fz_font *font, int gid, const fz_matrix *trm, f
return;
fz_concat(&ctm, &font->t3matrix, trm);
- fz_run_display_list(list, dev, &ctm, &fz_infinite_rect, NULL);
+ fz_run_display_list(ctx, list, dev, &ctm, &fz_infinite_rect, NULL);
}
fz_pixmap *
@@ -1168,7 +1153,7 @@ fz_render_t3_glyph_pixmap(fz_context *ctx, fz_font *font, int gid, const fz_matr
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
}
fz_catch(ctx)
{
@@ -1230,7 +1215,7 @@ fz_render_t3_glyph_direct(fz_context *ctx, fz_device *dev, fz_font *font, int gi
}
fz_concat(&ctm, &font->t3matrix, trm);
- font->t3run(font->t3doc, font->t3resources, contents, dev, &ctm, gstate, nested_depth);
+ font->t3run(ctx, font->t3doc, font->t3resources, contents, dev, &ctm, gstate, nested_depth);
}
#ifndef NDEBUG
diff --git a/source/fitz/function.c b/source/fitz/function.c
index 2623ff3d..5dbe9f9c 100644
--- a/source/fitz/function.c
+++ b/source/fitz/function.c
@@ -45,7 +45,7 @@ fz_drop_function(fz_context *ctx, fz_function *func)
}
unsigned int
-fz_function_size(fz_function *func)
+fz_function_size(fz_context *ctx, fz_function *func)
{
return (func ? func->size : 0);
}
diff --git a/source/fitz/glyph.c b/source/fitz/glyph.c
index 0bf4c7fd..8e514751 100644
--- a/source/fitz/glyph.c
+++ b/source/fitz/glyph.c
@@ -15,7 +15,7 @@ fz_drop_glyph(fz_context *ctx, fz_glyph *glyph)
}
static void
-fz_free_glyph_imp(fz_context *ctx, fz_storable *glyph_)
+fz_drop_glyph_imp(fz_context *ctx, fz_storable *glyph_)
{
fz_glyph *glyph = (fz_glyph *)glyph_;
@@ -136,7 +136,7 @@ fz_new_glyph_from_pixmap(fz_context *ctx, fz_pixmap *pix)
if (pix->n != 1 || pix->w * pix->h < RLE_THRESHOLD)
{
glyph = fz_malloc_struct(ctx, fz_glyph);
- FZ_INIT_STORABLE(glyph, 1, fz_free_glyph_imp);
+ FZ_INIT_STORABLE(glyph, 1, fz_drop_glyph_imp);
glyph->x = pix->x;
glyph->y = pix->y;
glyph->w = pix->w;
@@ -181,7 +181,7 @@ fz_new_glyph_from_8bpp_data(fz_context *ctx, int x, int y, int w, int h, unsigne
size = h * w;
fill = h * sizeof(int);
glyph = fz_malloc(ctx, sizeof(fz_glyph) + size);
- FZ_INIT_STORABLE(glyph, 1, fz_free_glyph_imp);
+ FZ_INIT_STORABLE(glyph, 1, fz_drop_glyph_imp);
glyph->x = x;
glyph->y = y;
glyph->w = w;
@@ -288,7 +288,7 @@ fz_new_glyph_from_8bpp_data(fz_context *ctx, int x, int y, int w, int h, unsigne
* critical. */
try_pixmap:
glyph = fz_resize_array(ctx, glyph, 1, sizeof(fz_glyph));
- FZ_INIT_STORABLE(glyph, 1, fz_free_glyph_imp);
+ FZ_INIT_STORABLE(glyph, 1, fz_drop_glyph_imp);
pix = fz_new_pixmap_from_8bpp_data(ctx, x, y, w, h, orig_sp, span);
glyph->x = pix->x;
glyph->y = pix->y;
@@ -329,7 +329,7 @@ fz_new_glyph_from_1bpp_data(fz_context *ctx, int x, int y, int w, int h, unsigne
size = h * w;
fill = h * sizeof(int);
glyph = fz_malloc(ctx, sizeof(fz_glyph) + size);
- FZ_INIT_STORABLE(glyph, 1, fz_free_glyph_imp);
+ FZ_INIT_STORABLE(glyph, 1, fz_drop_glyph_imp);
glyph->x = x;
glyph->y = y;
glyph->w = w;
@@ -420,7 +420,7 @@ fz_new_glyph_from_1bpp_data(fz_context *ctx, int x, int y, int w, int h, unsigne
* critical. */
try_pixmap:
glyph = fz_resize_array(ctx, glyph, 1, sizeof(fz_glyph));
- FZ_INIT_STORABLE(glyph, 1, fz_free_glyph_imp);
+ FZ_INIT_STORABLE(glyph, 1, fz_drop_glyph_imp);
pix = fz_new_pixmap_from_1bpp_data(ctx, x, y, w, h, orig_sp, span);
glyph->x = pix->x;
glyph->y = pix->y;
diff --git a/source/fitz/hash.c b/source/fitz/hash.c
index 708d72f2..f80e79b3 100644
--- a/source/fitz/hash.c
+++ b/source/fitz/hash.c
@@ -94,7 +94,7 @@ fz_hash_get_val(fz_context *ctx, fz_hash_table *table, int idx)
}
void
-fz_free_hash(fz_context *ctx, fz_hash_table *table)
+fz_drop_hash(fz_context *ctx, fz_hash_table *table)
{
fz_free(ctx, table->ents);
fz_free(ctx, table);
@@ -159,10 +159,10 @@ fz_resize_hash(fz_context *ctx, fz_hash_table *table, int newsize)
}
if (table->lock == FZ_LOCK_ALLOC)
- fz_unlock(ctx, FZ_LOCK_ALLOC);
+ fz_unlock(ctx, table->lock);
newents = fz_malloc_array_no_throw(ctx, newsize, sizeof(fz_hash_entry));
if (table->lock == FZ_LOCK_ALLOC)
- fz_lock(ctx, FZ_LOCK_ALLOC);
+ fz_lock(ctx, table->lock);
if (table->lock >= 0)
{
if (table->size >= newsize)
@@ -192,10 +192,10 @@ fz_resize_hash(fz_context *ctx, fz_hash_table *table, int newsize)
}
if (table->lock == FZ_LOCK_ALLOC)
- fz_unlock(ctx, FZ_LOCK_ALLOC);
+ fz_unlock(ctx, table->lock);
fz_free(ctx, oldents);
if (table->lock == FZ_LOCK_ALLOC)
- fz_lock(ctx, FZ_LOCK_ALLOC);
+ fz_lock(ctx, table->lock);
}
void *
diff --git a/source/fitz/image.c b/source/fitz/image.c
index 556e841b..77999ff1 100644
--- a/source/fitz/image.c
+++ b/source/fitz/image.c
@@ -1,5 +1,7 @@
#include "mupdf/fitz.h"
+#define SANE_DPI 72.0f
+
fz_pixmap *
fz_new_pixmap_from_image(fz_context *ctx, fz_image *image, int w, int h)
{
@@ -29,10 +31,9 @@ struct fz_image_key_s {
};
static int
-fz_make_hash_image_key(fz_store_hash *hash, void *key_)
+fz_make_hash_image_key(fz_context *ctx, fz_store_hash *hash, void *key_)
{
fz_image_key *key = (fz_image_key *)key_;
-
hash->u.pi.ptr = key->image;
hash->u.pi.i = key->l2factor;
return 1;
@@ -42,26 +43,14 @@ static void *
fz_keep_image_key(fz_context *ctx, void *key_)
{
fz_image_key *key = (fz_image_key *)key_;
-
- fz_lock(ctx, FZ_LOCK_ALLOC);
- key->refs++;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
-
- return (void *)key;
+ return fz_keep_imp(ctx, key, &key->refs);
}
static void
fz_drop_image_key(fz_context *ctx, void *key_)
{
fz_image_key *key = (fz_image_key *)key_;
- int drop;
-
- if (key == NULL)
- return;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- drop = --key->refs;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- if (drop == 0)
+ if (fz_drop_imp(ctx, key, &key->refs))
{
fz_drop_image(ctx, key->image);
fz_free(ctx, key);
@@ -69,17 +58,16 @@ fz_drop_image_key(fz_context *ctx, void *key_)
}
static int
-fz_cmp_image_key(void *k0_, void *k1_)
+fz_cmp_image_key(fz_context *ctx, void *k0_, void *k1_)
{
fz_image_key *k0 = (fz_image_key *)k0_;
fz_image_key *k1 = (fz_image_key *)k1_;
-
return k0->image == k1->image && k0->l2factor == k1->l2factor;
}
#ifndef NDEBUG
static void
-fz_debug_image(FILE *out, void *key_)
+fz_debug_image(fz_context *ctx, FILE *out, void *key_)
{
fz_image_key *key = (fz_image_key *)key_;
@@ -167,7 +155,7 @@ fz_decomp_image_from_stream(fz_context *ctx, fz_stream *stm, fz_image *image, in
samples = fz_malloc_array(ctx, h, stride);
- len = fz_read(stm, samples, h * stride);
+ len = fz_read(ctx, stm, samples, h * stride);
/* Pad truncated images */
if (len < stride * h)
@@ -186,7 +174,7 @@ fz_decomp_image_from_stream(fz_context *ctx, fz_stream *stm, fz_image *image, in
p[i] = ~p[i];
}
- fz_unpack_tile(tile, samples, image->n, image->bpc, stride, indexed);
+ fz_unpack_tile(ctx, tile, samples, image->n, image->bpc, stride, indexed);
fz_free(ctx, samples);
samples = NULL;
@@ -198,14 +186,14 @@ fz_decomp_image_from_stream(fz_context *ctx, fz_stream *stm, fz_image *image, in
if (indexed)
{
fz_pixmap *conv;
- fz_decode_indexed_tile(tile, image->decode, (1 << image->bpc) - 1);
+ fz_decode_indexed_tile(ctx, tile, image->decode, (1 << image->bpc) - 1);
conv = fz_expand_indexed_pixmap(ctx, tile);
fz_drop_pixmap(ctx, tile);
tile = conv;
}
else
{
- fz_decode_tile(tile, image->decode);
+ fz_decode_tile(ctx, tile, image->decode);
}
/* pre-blended matte color */
@@ -214,7 +202,7 @@ fz_decomp_image_from_stream(fz_context *ctx, fz_stream *stm, fz_image *image, in
}
fz_always(ctx)
{
- fz_close(stm);
+ fz_drop_stream(ctx, stm);
}
fz_catch(ctx)
{
@@ -237,14 +225,14 @@ fz_decomp_image_from_stream(fz_context *ctx, fz_stream *stm, fz_image *image, in
}
void
-fz_free_image(fz_context *ctx, fz_storable *image_)
+fz_drop_image_imp(fz_context *ctx, fz_storable *image_)
{
fz_image *image = (fz_image *)image_;
if (image == NULL)
return;
fz_drop_pixmap(ctx, image->tile);
- fz_free_compressed_buffer(ctx, image->buffer);
+ fz_drop_compressed_buffer(ctx, image->buffer);
fz_drop_colorspace(ctx, image->colorspace);
fz_drop_image(ctx, image->mask);
fz_free(ctx, image);
@@ -291,7 +279,7 @@ fz_image_get_pixmap(fz_context *ctx, fz_image *image, int w, int h)
key.l2factor = l2factor;
do
{
- tile = fz_find_item(ctx, fz_free_pixmap_imp, &key, &fz_image_store_type);
+ tile = fz_find_item(ctx, fz_drop_pixmap_imp, &key, &fz_image_store_type);
if (tile)
return tile;
key.l2factor--;
@@ -334,7 +322,7 @@ fz_image_get_pixmap(fz_context *ctx, fz_image *image, int w, int h)
native_l2factor = l2factor;
stm = fz_open_image_decomp_stream_from_buffer(ctx, image->buffer, &native_l2factor);
- indexed = fz_colorspace_is_indexed(image->colorspace);
+ indexed = fz_colorspace_is_indexed(ctx, image->colorspace);
tile = fz_decomp_image_from_stream(ctx, stm, image, indexed, l2factor, native_l2factor);
/* CMYK JPEGs in XPS documents have to be inverted */
@@ -391,7 +379,7 @@ fz_new_image_from_pixmap(fz_context *ctx, fz_pixmap *pixmap, fz_image *mask)
fz_try(ctx)
{
image = fz_malloc_struct(ctx, fz_image);
- FZ_INIT_STORABLE(image, 1, fz_free_image);
+ FZ_INIT_STORABLE(image, 1, fz_drop_image_imp);
image->w = pixmap->w;
image->h = pixmap->h;
image->n = pixmap->n;
@@ -401,12 +389,11 @@ fz_new_image_from_pixmap(fz_context *ctx, fz_pixmap *pixmap, fz_image *mask)
image->get_pixmap = fz_image_get_pixmap;
image->xres = pixmap->xres;
image->yres = pixmap->yres;
- image->tile = pixmap;
+ image->tile = fz_keep_pixmap(ctx, pixmap);
image->mask = mask;
}
fz_catch(ctx)
{
- fz_drop_pixmap(ctx, pixmap);
fz_drop_image(ctx, mask);
fz_rethrow(ctx);
}
@@ -425,7 +412,7 @@ fz_new_image(fz_context *ctx, int w, int h, int bpc, fz_colorspace *colorspace,
fz_try(ctx)
{
image = fz_malloc_struct(ctx, fz_image);
- FZ_INIT_STORABLE(image, 1, fz_free_image);
+ FZ_INIT_STORABLE(image, 1, fz_drop_image_imp);
image->get_pixmap = fz_image_get_pixmap;
image->w = w;
image->h = h;
@@ -443,7 +430,7 @@ fz_new_image(fz_context *ctx, int w, int h, int bpc, fz_colorspace *colorspace,
memcpy(image->decode, decode, sizeof(float)*image->n*2);
else
{
- float maxval = fz_colorspace_is_indexed(colorspace) ? (1 << bpc) - 1 : 1;
+ float maxval = fz_colorspace_is_indexed(ctx, colorspace) ? (1 << bpc) - 1 : 1;
int i;
for (i = 0; i < image->n; i++)
{
@@ -456,7 +443,7 @@ fz_new_image(fz_context *ctx, int w, int h, int bpc, fz_colorspace *colorspace,
}
fz_catch(ctx)
{
- fz_free_compressed_buffer(ctx, buffer);
+ fz_drop_compressed_buffer(ctx, buffer);
fz_rethrow(ctx);
}
@@ -536,9 +523,49 @@ fz_new_image_from_buffer(fz_context *ctx, fz_buffer *buffer)
}
fz_catch(ctx)
{
- fz_free_compressed_buffer(ctx, bc);
+ fz_drop_compressed_buffer(ctx, bc);
fz_rethrow(ctx);
}
return fz_new_image(ctx, w, h, 8, cspace, xres, yres, 0, 0, NULL, NULL, bc, NULL);
}
+
+void
+fz_image_get_sanitised_res(fz_image *image, int *xres, int *yres)
+{
+ *xres = image->xres;
+ *yres = image->yres;
+ if (*xres < 0 || *yres < 0 || (*xres == 0 && *yres == 0))
+ {
+ /* If neither xres or yres is sane, pick a sane value */
+ *xres = SANE_DPI; *yres = SANE_DPI;
+ }
+ else if (*xres == 0)
+ {
+ *xres = *yres;
+ }
+ else if (*yres == 0)
+ {
+ *yres = *xres;
+ }
+
+ /* Scale xres and yres up until we get beleivable values */
+ if (*xres < SANE_DPI || *yres < SANE_DPI)
+ {
+ if (*xres == *yres)
+ {
+ *xres = SANE_DPI;
+ *yres = SANE_DPI;
+ }
+ else if (*xres < *yres)
+ {
+ *yres = *yres * SANE_DPI / *xres;
+ *xres = SANE_DPI;
+ }
+ else
+ {
+ *xres = *xres * SANE_DPI / *yres;
+ *yres = SANE_DPI;
+ }
+ }
+}
diff --git a/source/fitz/link.c b/source/fitz/link.c
index 30dca222..152d48ea 100644
--- a/source/fitz/link.c
+++ b/source/fitz/link.c
@@ -1,7 +1,7 @@
#include "mupdf/fitz.h"
void
-fz_free_link_dest(fz_context *ctx, fz_link_dest *dest)
+fz_drop_link_dest(fz_context *ctx, fz_link_dest *dest)
{
switch (dest->kind)
{
@@ -35,7 +35,7 @@ fz_new_link(fz_context *ctx, const fz_rect *bbox, fz_link_dest dest)
}
fz_catch(ctx)
{
- fz_free_link_dest(ctx, &dest);
+ fz_drop_link_dest(ctx, &dest);
fz_rethrow(ctx);
}
link->dest = dest;
@@ -58,7 +58,7 @@ fz_drop_link(fz_context *ctx, fz_link *link)
while (link && --link->refs == 0)
{
fz_link *next = link->next;
- fz_free_link_dest(ctx, &link->dest);
+ fz_drop_link_dest(ctx, &link->dest);
fz_free(ctx, link);
link = next;
}
diff --git a/source/fitz/list-device.c b/source/fitz/list-device.c
index 2bac3034..3dbfb9e2 100644
--- a/source/fitz/list-device.c
+++ b/source/fitz/list-device.c
@@ -1,6 +1,7 @@
#include "mupdf/fitz.h"
typedef struct fz_display_node_s fz_display_node;
+typedef struct fz_list_device_s fz_list_device;
#define STACK_SIZE 96
@@ -30,32 +31,104 @@ typedef enum fz_display_command_e
FZ_CMD_END_TILE
} fz_display_command;
+/* The display list is a list of nodes.
+ * Each node is a structure consisting of a bitfield (that packs into a
+ * 32 bit word).
+ * The different fields in the bitfield identify what information is
+ * present in the node.
+ *
+ * cmd: What type of node this is.
+ *
+ * size: The number of sizeof(fz_display_node) bytes that this nodes
+ * data occupies. (i.e. &node[node->size] = the next node in the
+ * chain; 0 for end of list).
+ *
+ * rect: 0 for unchanged, 1 for present.
+ *
+ * path: 0 for unchanged, 1 for present.
+ *
+ * cs: 0 for unchanged
+ * 1 for devicegray (color defaults to 0)
+ * 2 for devicegray (color defaults to 1)
+ * 3 for devicergb (color defaults to 0,0,0)
+ * 4 for devicergb (color defaults to 1,1,1)
+ * 5 for devicecmyk (color defaults to 0,0,0,0)
+ * 6 for devicecmyk (color defaults to 0,0,0,1)
+ * 7 for present (color defaults to 0)
+ *
+ * color: 0 for unchanged color, 1 for present.
+ *
+ * alpha: 0 for unchanged, 1 for solid, 2 for transparent, 3
+ * for alpha value present.
+ *
+ * ctm: 0 for unchanged,
+ * 1 for change ad
+ * 2 for change bc
+ * 4 for change ef.
+ *
+ * stroke: 0 for unchanged, 1 for present.
+ *
+ * flags: Flags (node specific meanings)
+ *
+ * Nodes are packed in the order:
+ * header, rect, path, colorspace, color, alpha, ctm, stroke_state, private data.
+ */
struct fz_display_node_s
{
- fz_display_command cmd;
- fz_display_node *next;
- fz_rect rect;
- union {
- fz_path *path;
- fz_text *text;
- fz_shade *shade;
- fz_image *image;
- int blendmode;
- } item;
- fz_stroke_state *stroke;
- int flag; /* even_odd, accumulate, isolated/knockout... */
- fz_matrix ctm;
- fz_colorspace *colorspace;
- float alpha;
- float color[FZ_MAX_COLORS];
+ unsigned int cmd : 5;
+ unsigned int size : 9;
+ unsigned int rect : 1;
+ unsigned int path : 1;
+ unsigned int cs : 3;
+ unsigned int color : 1;
+ unsigned int alpha : 2;
+ unsigned int ctm : 3;
+ unsigned int stroke : 1;
+ unsigned int flags : 6;
+};
+
+enum {
+ CS_UNCHANGED = 0,
+ CS_GRAY_0 = 1,
+ CS_GRAY_1 = 2,
+ CS_RGB_0 = 3,
+ CS_RGB_1 = 4,
+ CS_CMYK_0 = 5,
+ CS_CMYK_1 = 6,
+ CS_OTHER_0 = 7,
+
+ ALPHA_UNCHANGED = 0,
+ ALPHA_1 = 1,
+ ALPHA_0 = 2,
+ ALPHA_PRESENT = 3,
+
+ CTM_UNCHANGED = 0,
+ CTM_CHANGE_AD = 1,
+ CTM_CHANGE_BC = 2,
+ CTM_CHANGE_EF = 4
};
struct fz_display_list_s
{
fz_storable storable;
- fz_display_node *first;
- fz_display_node *last;
+ fz_display_node *list;
+ int max;
int len;
+};
+
+struct fz_list_device_s
+{
+ fz_device super;
+
+ fz_display_list *list;
+
+ fz_path *path;
+ float alpha;
+ fz_matrix ctm;
+ fz_stroke_state *stroke;
+ fz_colorspace *colorspace;
+ float color[FZ_MAX_COLORS];
+ fz_rect rect;
int top;
struct {
@@ -67,545 +140,1215 @@ struct fz_display_list_s
enum { ISOLATED = 1, KNOCKOUT = 2 };
-static fz_display_node *
-fz_new_display_node(fz_context *ctx, fz_display_command cmd, const fz_matrix *ctm,
- fz_colorspace *colorspace, float *color, float alpha)
-{
- fz_display_node *node;
- int i;
-
- node = fz_malloc_struct(ctx, fz_display_node);
- node->cmd = cmd;
- node->next = NULL;
- node->rect = fz_empty_rect;
- node->item.path = NULL;
- node->stroke = NULL;
- node->flag = (cmd == FZ_CMD_BEGIN_TILE ? fz_gen_id(ctx) : 0);
- node->ctm = *ctm;
- if (colorspace)
- {
- node->colorspace = fz_keep_colorspace(ctx, colorspace);
- if (color)
- {
- for (i = 0; i < node->colorspace->n; i++)
- node->color[i] = color[i];
- }
- }
- else
- {
- node->colorspace = NULL;
- }
- node->alpha = alpha;
-
- return node;
-}
+#define SIZE_IN_NODES(t) \
+ ((t + sizeof(fz_display_node) - 1) / sizeof(fz_display_node))
static void
-fz_append_display_node(fz_display_list *list, fz_display_node *node)
+fz_append_display_node(
+ fz_context *ctx,
+ fz_device *dev,
+ fz_display_command cmd,
+ int flags,
+ const fz_rect *rect,
+ fz_path *path,
+ float *color,
+ fz_colorspace *colorspace,
+ float *alpha,
+ const fz_matrix *ctm,
+ fz_stroke_state *stroke,
+ void *private_data,
+ int private_data_len)
{
- switch (node->cmd)
+ fz_display_node node = { 0 };
+ fz_display_node *node_ptr;
+ fz_list_device *writer = (fz_list_device *)dev;
+ fz_display_list *list = writer->list;
+ int size;
+ int rect_off = 0;
+ int path_off = 0;
+ int color_off = 0;
+ int colorspace_off = 0;
+ int alpha_off = 0;
+ int ctm_off = 0;
+ int stroke_off = 0;
+ int rect_for_updates = 0;
+ int private_off = 0;
+ fz_path *my_path = NULL;
+ fz_stroke_state *my_stroke = NULL;
+ fz_rect local_rect;
+
+ switch (cmd)
{
case FZ_CMD_CLIP_PATH:
case FZ_CMD_CLIP_STROKE_PATH:
case FZ_CMD_CLIP_IMAGE_MASK:
- if (list->top < STACK_SIZE)
+ if (writer->top < STACK_SIZE)
{
- list->stack[list->top].update = &node->rect;
- list->stack[list->top].rect = fz_empty_rect;
+ rect_for_updates = 1;
+ writer->stack[writer->top].rect = fz_empty_rect;
}
- list->top++;
+ writer->top++;
break;
case FZ_CMD_CLIP_TEXT:
/* don't reset the clip rect for accumulated text */
- if (node->flag == 2)
+ if (flags == 2)
break;
/* fallthrough */
case FZ_CMD_END_MASK:
case FZ_CMD_CLIP_STROKE_TEXT:
- if (list->top < STACK_SIZE)
+ if (writer->top < STACK_SIZE)
{
- list->stack[list->top].update = NULL;
- list->stack[list->top].rect = fz_empty_rect;
+ writer->stack[writer->top].update = NULL;
+ writer->stack[writer->top].rect = fz_empty_rect;
}
- list->top++;
+ writer->top++;
break;
case FZ_CMD_BEGIN_TILE:
- list->tiled++;
- if (list->top > 0 && list->top <= STACK_SIZE)
+ writer->tiled++;
+ if (writer->top > 0 && writer->top <= STACK_SIZE)
{
- list->stack[list->top-1].rect = fz_infinite_rect;
+ writer->stack[writer->top-1].rect = fz_infinite_rect;
}
break;
case FZ_CMD_END_TILE:
- list->tiled--;
+ writer->tiled--;
break;
case FZ_CMD_END_GROUP:
break;
case FZ_CMD_POP_CLIP:
- if (list->top > STACK_SIZE)
+ if (writer->top > STACK_SIZE)
{
- list->top--;
- node->rect = fz_infinite_rect;
+ writer->top--;
+ rect = &fz_infinite_rect;
}
- else if (list->top > 0)
+ else if (writer->top > 0)
{
fz_rect *update;
- list->top--;
- update = list->stack[list->top].update;
- if (list->tiled == 0)
+ writer->top--;
+ update = writer->stack[writer->top].update;
+ if (writer->tiled == 0)
{
if (update)
{
- fz_intersect_rect(update, &list->stack[list->top].rect);
- node->rect = *update;
+ fz_intersect_rect(update, &writer->stack[writer->top].rect);
+ local_rect = *update;
+ rect = &local_rect;
}
else
- node->rect = list->stack[list->top].rect;
+ rect = &writer->stack[writer->top].rect;
}
else
- node->rect = fz_infinite_rect;
+ rect = &fz_infinite_rect;
}
/* fallthrough */
default:
- if (list->top > 0 && list->tiled == 0 && list->top <= STACK_SIZE)
- fz_union_rect(&list->stack[list->top-1].rect, &node->rect);
+ if (writer->top > 0 && writer->tiled == 0 && writer->top <= STACK_SIZE)
+ fz_union_rect(&writer->stack[writer->top-1].rect, rect);
break;
}
- if (!list->first)
+
+ size = 1; /* 1 for the fz_display_node */
+ node.cmd = cmd;
+
+ /* Figure out what we need to write, and the offsets at which we will
+ * write it. */
+ if (rect_for_updates || (rect != NULL && (writer->rect.x0 != rect->x0 || writer->rect.y0 != rect->y0 || writer->rect.x1 != rect->x1 || writer->rect.y1 != rect->y1)))
+ {
+ node.rect = 1;
+ rect_off = size;
+ size += SIZE_IN_NODES(sizeof(fz_rect));
+ }
+ if (path && (writer->path == NULL || path != writer->path))
+ {
+ node.path = 1;
+ path_off = size;
+ size += SIZE_IN_NODES(sizeof(fz_path *));
+ }
+ if (color && !colorspace)
+ {
+ /* SoftMasks can omit a colorspace, but we know what they mean */
+ colorspace = fz_device_gray(ctx);
+ }
+ if (colorspace)
+ {
+ if (colorspace != writer->colorspace)
+ {
+ assert(color);
+ if (colorspace == fz_device_gray(ctx))
+ {
+ if (color[0] == 0.0f)
+ node.cs = CS_GRAY_0, color = NULL;
+ else
+ {
+ node.cs = CS_GRAY_1;
+ if (color[0] == 1.0f)
+ color = NULL;
+ }
+ }
+ else if (colorspace == fz_device_rgb(ctx))
+ {
+ if (color[0] == 0.0f && color[1] == 0.0f && color[2] == 0.0f)
+ node.cs = CS_RGB_0, color = NULL;
+ else
+ {
+ node.cs = CS_RGB_1;
+ if (color[0] == 1.0f && color[1] == 1.0f && color[2] == 1.0f)
+ color = NULL;
+ }
+ }
+ else if (colorspace == fz_device_cmyk(ctx))
+ {
+ node.cs = CS_CMYK_0;
+ if (color[0] == 0.0f && color[1] == 0.0f && color[2] == 0.0f)
+ {
+ if (color[3] == 0.0f)
+ color = NULL;
+ else
+ {
+ node.cs = CS_CMYK_1;
+ if (color[3] == 1.0f)
+ color = NULL;
+ }
+ }
+ }
+ else
+ {
+ int i;
+ int n = colorspace->n;
+
+ colorspace_off = size;
+ size += SIZE_IN_NODES(sizeof(fz_colorspace *));
+ node.cs = CS_OTHER_0;
+ for (i = 0; i < n; i++)
+ if (color[i] != 0.0f)
+ break;
+ if (i == n)
+ color = NULL;
+ memset(writer->color, 0, sizeof(float)*n);
+ }
+ }
+ else
+ {
+ /* Colorspace is unchanged, but color may have changed
+ * to something best coded as a colorspace change */
+ if (colorspace == fz_device_gray(ctx))
+ {
+ if (writer->color[0] != color[0])
+ {
+ if (color[0] == 0.0f)
+ {
+ node.cs = CS_GRAY_0;
+ color = NULL;
+ }
+ else if (color[0] == 1.0f)
+ {
+ node.cs = CS_GRAY_1;
+ color = NULL;
+ }
+ }
+ }
+ else if (colorspace == fz_device_rgb(ctx))
+ {
+ if (writer->color[0] != color[0] || writer->color[1] != color[1] || writer->color[2] != color[2])
+ {
+ if (color[0] == 0.0f && color[1] == 0.0f && color[2] == 0.0f)
+ {
+ node.cs = CS_RGB_0;
+ color = NULL;
+ }
+ else if (color[0] == 1.0f && color[1] == 1.0f && color[2] == 1.0f)
+ {
+ node.cs = CS_RGB_1;
+ color = NULL;
+ }
+ }
+ }
+ else if (colorspace == fz_device_cmyk(ctx))
+ {
+ if (writer->color[0] != color[0] || writer->color[1] != color[1] || writer->color[2] != color[2] || writer->color[3] != color[3])
+ {
+ if (color[0] == 0.0f && color[1] == 0.0f && color[2] == 0.0f)
+ {
+ if (color[3] == 0.0f)
+ {
+ node.cs = CS_CMYK_0;
+ color = NULL;
+ }
+ else if (color[3] == 1.0f)
+ {
+ node.cs = CS_CMYK_1;
+ color = NULL;
+ }
+ }
+ }
+ }
+ else
+ {
+ int i;
+ int n = colorspace->n;
+ for (i=0; i < n; i++)
+ if (color[i] != 0.0f)
+ break;
+ if (i == n)
+ {
+ node.cs = CS_OTHER_0;
+ colorspace_off = size;
+ size += SIZE_IN_NODES(sizeof(fz_colorspace *));
+ color = NULL;
+ }
+ }
+ }
+ }
+ if (color)
+ {
+
+ int i, n = colorspace->n;
+ const float *wc = &writer->color[0];
+
+ i = 0;
+ /* Only check colors if the colorspace is unchanged. If the
+ * colorspace *has* changed and the colors are implicit then
+ * this will have been caught above. */
+ if (colorspace == writer->colorspace)
+ for (; i < n; i++)
+ if (color[i] != wc[i])
+ break;
+
+ if (i != n)
+ {
+ node.color = 1;
+ color_off = size;
+ size += n * SIZE_IN_NODES(sizeof(float));
+ }
+ }
+ if (alpha && (*alpha != writer->alpha))
+ {
+ if (*alpha >= 1.0)
+ node.alpha = ALPHA_1;
+ else if (*alpha <= 0.0)
+ node.alpha = ALPHA_0;
+ else
+ {
+ alpha_off = size;
+ size += SIZE_IN_NODES(sizeof(float));
+ node.alpha = ALPHA_PRESENT;
+ }
+ }
+ if (ctm && (ctm->a != writer->ctm.a || ctm->b != writer->ctm.b || ctm->c != writer->ctm.c || ctm->d != writer->ctm.d || ctm->e != writer->ctm.e || ctm->f != writer->ctm.f))
+ {
+ int flags;
+
+ ctm_off = size;
+ flags = CTM_UNCHANGED;
+ if (ctm->a != writer->ctm.a || ctm->d != writer->ctm.d)
+ flags = CTM_CHANGE_AD, size += SIZE_IN_NODES(2*sizeof(float));
+ if (ctm->b != writer->ctm.b || ctm->c != writer->ctm.c)
+ flags |= CTM_CHANGE_BC, size += SIZE_IN_NODES(2*sizeof(float));
+ if (ctm->e != writer->ctm.e || ctm->f != writer->ctm.f)
+ flags |= CTM_CHANGE_EF, size += SIZE_IN_NODES(2*sizeof(float));
+ node.ctm = flags;
+ }
+ if (stroke && (writer->stroke == NULL || stroke != writer->stroke))
+ {
+ stroke_off = size;
+ size += SIZE_IN_NODES(sizeof(fz_stroke_state *));
+ node.stroke = 1;
+ }
+ if (private_data != NULL)
+ {
+ private_off = size;
+ size += SIZE_IN_NODES(private_data_len);
+ }
+
+ if (list->len + size > list->max)
+ {
+ int newsize = list->max * 2;
+ fz_display_node *old = list->list;
+ ptrdiff_t diff;
+ int i, n;
+
+ if (newsize < 256)
+ newsize = 256;
+ list->list = fz_resize_array(ctx, list->list, newsize, sizeof(fz_display_node));
+ list->max = newsize;
+ diff = (char *)(list->list) - (char *)old;
+ n = (writer->top < STACK_SIZE ? writer->top : STACK_SIZE);
+ for (i = 0; i < n; i++)
+ {
+ if (writer->stack[i].update != NULL)
+ writer->stack[i].update = (fz_rect *)(((char *)writer->stack[i].update) + diff);
+ }
+ }
+
+ /* Path is the most frequent one, so try to avoid the try/catch in
+ * this case */
+ if (path_off)
+ my_path = fz_keep_path(ctx, path);
+
+ if (stroke_off)
+ {
+ fz_try(ctx)
+ {
+ my_stroke = fz_keep_stroke_state(ctx, stroke);
+ }
+ fz_catch(ctx)
+ {
+ fz_drop_path(ctx, my_path);
+ fz_rethrow(ctx);
+ }
+ }
+
+ /* Write the node to the list */
+ node.size = size;
+ node.flags = flags;
+ assert(size < (1<<9));
+ node_ptr = &list->list[list->len];
+ *node_ptr = node;
+ if (rect_off)
+ {
+ fz_rect *out_rect = (fz_rect *)(void *)(&node_ptr[rect_off]);
+ writer->rect = *rect;
+ *out_rect = *rect;
+ if (rect_for_updates)
+ writer->stack[writer->top-1].update = out_rect;
+ }
+ if (path_off)
+ {
+ fz_path **out_path = (fz_path **)(void *)(&node_ptr[path_off]);
+ *out_path = my_path;
+ fz_drop_path(ctx, writer->path);
+ writer->path = fz_keep_path(ctx, my_path); /* Can never fail */
+ }
+ if (node.cs)
+ {
+ fz_drop_colorspace(ctx, writer->colorspace);
+ switch(node.cs)
+ {
+ case CS_GRAY_0:
+ writer->colorspace = fz_device_gray(ctx);
+ writer->color[0] = 0;
+ break;
+ case CS_GRAY_1:
+ writer->colorspace = fz_device_gray(ctx);
+ writer->color[0] = 1;
+ break;
+ case CS_RGB_0:
+ writer->color[0] = 0;
+ writer->color[1] = 0;
+ writer->color[2] = 0;
+ writer->colorspace = fz_device_rgb(ctx);
+ break;
+ case CS_RGB_1:
+ writer->color[0] = 1;
+ writer->color[1] = 1;
+ writer->color[2] = 1;
+ writer->colorspace = fz_device_rgb(ctx);
+ break;
+ case CS_CMYK_0:
+ writer->color[0] = 0;
+ writer->color[1] = 0;
+ writer->color[2] = 0;
+ writer->color[3] = 0;
+ writer->colorspace = fz_device_cmyk(ctx);
+ break;
+ case CS_CMYK_1:
+ writer->color[0] = 0;
+ writer->color[1] = 0;
+ writer->color[2] = 0;
+ writer->color[3] = 1;
+ writer->colorspace = fz_device_cmyk(ctx);
+ break;
+ default:
+ {
+ fz_colorspace **out_colorspace = (fz_colorspace **)(void *)(&node_ptr[colorspace_off]);
+ int i, n = colorspace->n;
+ *out_colorspace = fz_keep_colorspace(ctx, colorspace);
+
+ writer->colorspace = fz_keep_colorspace(ctx, colorspace);
+ for (i = 0; i < n; i++)
+ writer->color[i] = 0;
+ break;
+ }
+ }
+ }
+ if (color_off)
+ {
+ float *out_color = (float *)(void *)(&node_ptr[color_off]);
+ memcpy(writer->color, color, colorspace->n * sizeof(float));
+ memcpy(out_color, color, colorspace->n * sizeof(float));
+ }
+ if (node.alpha)
+ {
+ writer->alpha = *alpha;
+ if (alpha_off)
+ {
+ float *out_alpha = (float *)(void *)(&node_ptr[alpha_off]);
+ *out_alpha = *alpha;
+ }
+ }
+ if (ctm_off)
{
- list->first = node;
- list->last = node;
+ float *out_ctm = (float *)(void *)(&node_ptr[ctm_off]);
+ if (node.ctm & CTM_CHANGE_AD)
+ {
+ writer->ctm.a = *out_ctm++ = ctm->a;
+ writer->ctm.d = *out_ctm++ = ctm->d;
+ }
+ if (node.ctm & CTM_CHANGE_BC)
+ {
+ writer->ctm.b = *out_ctm++ = ctm->b;
+ writer->ctm.c = *out_ctm++ = ctm->c;
+ }
+ if (node.ctm & CTM_CHANGE_EF)
+ {
+ writer->ctm.e = *out_ctm++ = ctm->e;
+ writer->ctm.f = *out_ctm++ = ctm->f;
+ }
}
- else
+ if (stroke_off)
{
- list->last->next = node;
- list->last = node;
+ fz_stroke_state **out_stroke = (fz_stroke_state **)(void *)(&node_ptr[stroke_off]);
+ *out_stroke = my_stroke;
+ fz_drop_stroke_state(ctx, writer->stroke);
+ /* Can never fail as my_stroke was kept above */
+ writer->stroke = fz_keep_stroke_state(ctx, my_stroke);
}
- list->len++;
+ if (private_off)
+ {
+ char *out_private = (char *)(void *)(&node_ptr[private_off]);
+ memcpy(out_private, private_data, private_data_len);
+ }
+ list->len += size;
}
static void
-fz_free_display_node(fz_context *ctx, fz_display_node *node)
+fz_list_begin_page(fz_context *ctx, fz_device *dev, const fz_rect *mediabox, const fz_matrix *ctm)
{
- switch (node->cmd)
- {
- case FZ_CMD_FILL_PATH:
- case FZ_CMD_STROKE_PATH:
- case FZ_CMD_CLIP_PATH:
- case FZ_CMD_CLIP_STROKE_PATH:
- fz_free_path(ctx, node->item.path);
- break;
- case FZ_CMD_FILL_TEXT:
- case FZ_CMD_STROKE_TEXT:
- case FZ_CMD_CLIP_TEXT:
- case FZ_CMD_CLIP_STROKE_TEXT:
- case FZ_CMD_IGNORE_TEXT:
- fz_free_text(ctx, node->item.text);
- break;
- case FZ_CMD_FILL_SHADE:
- fz_drop_shade(ctx, node->item.shade);
- break;
- case FZ_CMD_FILL_IMAGE:
- case FZ_CMD_FILL_IMAGE_MASK:
- case FZ_CMD_CLIP_IMAGE_MASK:
- fz_drop_image(ctx, node->item.image);
- break;
- case FZ_CMD_POP_CLIP:
- case FZ_CMD_BEGIN_MASK:
- case FZ_CMD_END_MASK:
- case FZ_CMD_BEGIN_GROUP:
- case FZ_CMD_END_GROUP:
- case FZ_CMD_BEGIN_TILE:
- case FZ_CMD_END_TILE:
- case FZ_CMD_BEGIN_PAGE:
- case FZ_CMD_END_PAGE:
- break;
- }
- if (node->stroke)
- fz_drop_stroke_state(ctx, node->stroke);
- if (node->colorspace)
- fz_drop_colorspace(ctx, node->colorspace);
- fz_free(ctx, node);
+ fz_rect rect = *mediabox;
+
+ fz_transform_rect(&rect, ctm);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_BEGIN_PAGE,
+ 0, /* flags */
+ &rect,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ ctm,
+ NULL, /* stroke_state */
+ NULL, /* private_data */
+ 0); /* private_data_len */
+}
+
+static void
+fz_list_end_page(fz_context *ctx, fz_device *dev)
+{
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_END_PAGE,
+ 0, /* flags */
+ NULL, /* rect */
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ NULL, /* ctm */
+ NULL, /* stroke_state */
+ NULL, /* private_data */
+ 0); /* private_data_len */
+}
+
+static void
+fz_list_fill_path(fz_context *ctx, fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
+ fz_colorspace *colorspace, float *color, float alpha)
+{
+ fz_rect rect;
+
+ fz_bound_path(ctx, path, NULL, ctm, &rect);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_FILL_PATH,
+ even_odd, /* flags */
+ &rect,
+ path, /* path */
+ color,
+ colorspace,
+ &alpha, /* alpha */
+ ctm,
+ NULL, /* stroke_state */
+ NULL, /* private_data */
+ 0); /* private_data_len */
+}
+
+static void
+fz_list_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, fz_stroke_state *stroke,
+ const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha)
+{
+ fz_rect rect;
+
+ fz_bound_path(ctx, path, stroke, ctm, &rect);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_STROKE_PATH,
+ 0, /* flags */
+ &rect,
+ path, /* path */
+ color,
+ colorspace,
+ &alpha, /* alpha */
+ ctm, /* ctm */
+ stroke,
+ NULL, /* private_data */
+ 0); /* private_data_len */
}
static void
-fz_list_begin_page(fz_device *dev, const fz_rect *mediabox, const fz_matrix *ctm)
+fz_list_clip_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
{
- fz_context *ctx = dev->ctx;
- fz_display_node *node = fz_new_display_node(ctx, FZ_CMD_BEGIN_PAGE, ctm, NULL, NULL, 0);
- node->rect = *mediabox;
- fz_transform_rect(&node->rect, ctm);
- fz_append_display_node(dev->user, node);
+ fz_rect rect2;
+
+ fz_bound_path(ctx, path, NULL, ctm, &rect2);
+ if (rect)
+ fz_intersect_rect(&rect2, rect);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_CLIP_PATH,
+ even_odd, /* flags */
+ &rect2,
+ path, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ ctm, /* ctm */
+ NULL, /* stroke */
+ NULL, /* private_data */
+ 0); /* private_data_len */
}
static void
-fz_list_end_page(fz_device *dev)
+fz_list_clip_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
{
- fz_context *ctx = dev->ctx;
- fz_display_node *node = fz_new_display_node(ctx, FZ_CMD_END_PAGE, &fz_identity, NULL, NULL, 0);
- fz_append_display_node(dev->user, node);
+ fz_rect rect2;
+
+ fz_bound_path(ctx, path, stroke, ctm, &rect2);
+ if (rect)
+ fz_intersect_rect(&rect2, rect);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_CLIP_STROKE_PATH,
+ 0, /* flags */
+ &rect2,
+ path, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ ctm, /* ctm */
+ stroke, /* stroke */
+ NULL, /* private_data */
+ 0); /* private_data_len */
}
static void
-fz_list_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
+fz_list_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- fz_display_node *node;
- fz_context *ctx = dev->ctx;
- node = fz_new_display_node(ctx, FZ_CMD_FILL_PATH, ctm, colorspace, color, alpha);
+ fz_rect rect;
+ fz_text *cloned_text = fz_keep_text(ctx, text);
+
fz_try(ctx)
{
- fz_bound_path(dev->ctx, path, NULL, ctm, &node->rect);
- node->item.path = fz_clone_path(dev->ctx, path);
- node->flag = even_odd;
+ fz_bound_text(ctx, text, NULL, ctm, &rect);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_FILL_TEXT,
+ 0, /* flags */
+ &rect,
+ NULL, /* path */
+ color, /* color */
+ colorspace, /* colorspace */
+ &alpha, /* alpha */
+ ctm, /* ctm */
+ NULL, /* stroke */
+ &cloned_text, /* private_data */
+ sizeof(cloned_text)); /* private_data_len */
}
fz_catch(ctx)
{
- fz_free_display_node(ctx, node);
+ fz_drop_text(ctx, cloned_text);
fz_rethrow(ctx);
}
- fz_append_display_node(dev->user, node);
}
static void
-fz_list_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke,
- const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha)
+fz_list_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
+ fz_colorspace *colorspace, float *color, float alpha)
{
- fz_display_node *node;
- fz_context *ctx = dev->ctx;
- node = fz_new_display_node(ctx, FZ_CMD_STROKE_PATH, ctm, colorspace, color, alpha);
+ fz_rect rect;
+ fz_text *cloned_text = fz_keep_text(ctx, text);
+
fz_try(ctx)
{
- fz_bound_path(dev->ctx, path, stroke, ctm, &node->rect);
- node->item.path = fz_clone_path(dev->ctx, path);
- node->stroke = fz_keep_stroke_state(dev->ctx, stroke);
+ fz_bound_text(ctx, text, stroke, ctm, &rect);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_STROKE_TEXT,
+ 0, /* flags */
+ &rect,
+ NULL, /* path */
+ color, /* color */
+ colorspace, /* colorspace */
+ &alpha, /* alpha */
+ ctm, /* ctm */
+ stroke,
+ &cloned_text, /* private_data */
+ sizeof(cloned_text)); /* private_data_len */
}
fz_catch(ctx)
{
- fz_free_display_node(ctx, node);
+ fz_drop_text(ctx, cloned_text);
fz_rethrow(ctx);
}
- fz_append_display_node(dev->user, node);
}
static void
-fz_list_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
+fz_list_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
{
- fz_display_node *node;
- fz_context *ctx = dev->ctx;
- node = fz_new_display_node(ctx, FZ_CMD_CLIP_PATH, ctm, NULL, NULL, 0);
+ fz_rect rect;
+ fz_text *cloned_text = fz_keep_text(ctx, text);
+
fz_try(ctx)
{
- fz_bound_path(dev->ctx, path, NULL, ctm, &node->rect);
- if (rect)
- fz_intersect_rect(&node->rect, rect);
- node->item.path = fz_clone_path(dev->ctx, path);
- node->flag = even_odd;
+ if (accumulate)
+ rect = fz_infinite_rect;
+ else
+ fz_bound_text(ctx, text, NULL, ctm, &rect);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_CLIP_TEXT,
+ accumulate, /* flags */
+ &rect,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ ctm, /* ctm */
+ NULL, /* stroke */
+ &cloned_text, /* private_data */
+ sizeof(cloned_text)); /* private_data_len */
}
fz_catch(ctx)
{
- fz_free_display_node(ctx, node);
+ fz_drop_text(ctx, cloned_text);
fz_rethrow(ctx);
}
- fz_append_display_node(dev->user, node);
}
static void
-fz_list_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
+fz_list_clip_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
{
- fz_display_node *node;
- fz_context *ctx = dev->ctx;
- node = fz_new_display_node(ctx, FZ_CMD_CLIP_STROKE_PATH, ctm, NULL, NULL, 0);
+ fz_rect rect;
+ fz_text *cloned_text = fz_keep_text(ctx, text);
+
fz_try(ctx)
{
- fz_bound_path(dev->ctx, path, stroke, ctm, &node->rect);
- if (rect)
- fz_intersect_rect(&node->rect, rect);
- node->item.path = fz_clone_path(dev->ctx, path);
- node->stroke = fz_keep_stroke_state(dev->ctx, stroke);
+ fz_bound_text(ctx, text, stroke, ctm, &rect);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_CLIP_STROKE_TEXT,
+ 0, /* flags */
+ &rect,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ ctm, /* ctm */
+ stroke, /* stroke */
+ &cloned_text, /* private_data */
+ sizeof(cloned_text)); /* private_data_len */
}
fz_catch(ctx)
{
- fz_free_display_node(ctx, node);
+ fz_drop_text(ctx, cloned_text);
fz_rethrow(ctx);
}
- fz_append_display_node(dev->user, node);
}
static void
-fz_list_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm,
- fz_colorspace *colorspace, float *color, float alpha)
+fz_list_ignore_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm)
{
- fz_display_node *node;
- fz_context *ctx = dev->ctx;
- node = fz_new_display_node(ctx, FZ_CMD_FILL_TEXT, ctm, colorspace, color, alpha);
+ fz_rect rect;
+ fz_text *cloned_text = fz_keep_text(ctx, text);
+
fz_try(ctx)
{
- fz_bound_text(dev->ctx, text, NULL, ctm, &node->rect);
- node->item.text = fz_clone_text(dev->ctx, text);
+ fz_bound_text(ctx, text, NULL, ctm, &rect);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_IGNORE_TEXT,
+ 0, /* flags */
+ &rect,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ ctm, /* ctm */
+ NULL, /* stroke */
+ &cloned_text, /* private_data */
+ sizeof(cloned_text)); /* private_data_len */
}
fz_catch(ctx)
{
- fz_free_display_node(ctx, node);
+ fz_drop_text(ctx, cloned_text);
fz_rethrow(ctx);
}
- fz_append_display_node(dev->user, node);
}
static void
-fz_list_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
- fz_colorspace *colorspace, float *color, float alpha)
+fz_list_pop_clip(fz_context *ctx, fz_device *dev)
{
- fz_display_node *node;
- fz_context *ctx = dev->ctx;
- node = fz_new_display_node(ctx, FZ_CMD_STROKE_TEXT, ctm, colorspace, color, alpha);
- node->item.text = NULL;
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_POP_CLIP,
+ 0, /* flags */
+ NULL, /* rect */
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ NULL, /* ctm */
+ NULL, /* stroke */
+ NULL, /* private_data */
+ 0); /* private_data_len */
+}
+
+static void
+fz_list_fill_shade(fz_context *ctx, fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
+{
+ fz_shade *shade2 = fz_keep_shade(ctx, shade);
+ fz_rect rect;
+
fz_try(ctx)
{
- fz_bound_text(dev->ctx, text, stroke, ctm, &node->rect);
- node->item.text = fz_clone_text(dev->ctx, text);
- node->stroke = fz_keep_stroke_state(dev->ctx, stroke);
+ fz_bound_shade(ctx, shade, ctm, &rect);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_FILL_SHADE,
+ 0, /* flags */
+ &rect,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ &alpha, /* alpha */
+ ctm,
+ NULL, /* stroke */
+ &shade2, /* private_data */
+ sizeof(shade2)); /* private_data_len */
}
fz_catch(ctx)
{
- fz_free_display_node(ctx, node);
+ fz_drop_shade(ctx, shade2);
fz_rethrow(ctx);
}
- fz_append_display_node(dev->user, node);
}
static void
-fz_list_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
+fz_list_fill_image(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
{
- fz_display_node *node;
- fz_context *ctx = dev->ctx;
- node = fz_new_display_node(ctx, FZ_CMD_CLIP_TEXT, ctm, NULL, NULL, 0);
+ fz_image *image2 = fz_keep_image(ctx, image);
+ fz_rect rect = fz_unit_rect;
+
fz_try(ctx)
{
- fz_bound_text(dev->ctx, text, NULL, ctm, &node->rect);
- node->item.text = fz_clone_text(dev->ctx, text);
- node->flag = accumulate;
- /* when accumulating, be conservative about culling */
- if (accumulate)
- node->rect = fz_infinite_rect;
+ fz_transform_rect(&rect, ctm);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_FILL_IMAGE,
+ 0, /* flags */
+ &rect,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ &alpha, /* alpha */
+ ctm,
+ NULL, /* stroke */
+ &image2, /* private_data */
+ sizeof(image2)); /* private_data_len */
}
fz_catch(ctx)
{
- fz_free_display_node(ctx, node);
+ fz_drop_image(ctx, image2);
fz_rethrow(ctx);
}
- fz_append_display_node(dev->user, node);
}
static void
-fz_list_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
+fz_list_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm,
+ fz_colorspace *colorspace, float *color, float alpha)
{
- fz_display_node *node;
- fz_context *ctx = dev->ctx;
- node = fz_new_display_node(ctx, FZ_CMD_CLIP_STROKE_TEXT, ctm, NULL, NULL, 0);
+ fz_image *image2 = fz_keep_image(ctx, image);
+ fz_rect rect = fz_unit_rect;
+
fz_try(ctx)
{
- fz_bound_text(dev->ctx, text, stroke, ctm, &node->rect);
- node->item.text = fz_clone_text(dev->ctx, text);
- node->stroke = fz_keep_stroke_state(dev->ctx, stroke);
+ fz_transform_rect(&rect, ctm);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_FILL_IMAGE_MASK,
+ 0, /* flags */
+ &rect,
+ NULL, /* path */
+ color,
+ colorspace,
+ &alpha, /* alpha */
+ ctm,
+ NULL, /* stroke */
+ &image2, /* private_data */
+ sizeof(image2)); /* private_data_len */
}
fz_catch(ctx)
{
- fz_free_display_node(ctx, node);
+ fz_drop_image(ctx, image2);
fz_rethrow(ctx);
}
- fz_append_display_node(dev->user, node);
}
static void
-fz_list_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm)
+fz_list_clip_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
{
- fz_display_node *node;
- fz_context *ctx = dev->ctx;
- node = fz_new_display_node(ctx, FZ_CMD_IGNORE_TEXT, ctm, NULL, NULL, 0);
+ fz_image *image2 = fz_keep_image(ctx, image);
+ fz_rect rect2 = fz_unit_rect;
+
+ fz_transform_rect(&rect2, ctm);
+ if (rect)
+ fz_intersect_rect(&rect2, rect);
fz_try(ctx)
{
- fz_bound_text(dev->ctx, text, NULL, ctm, &node->rect);
- node->item.text = fz_clone_text(dev->ctx, text);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_CLIP_IMAGE_MASK,
+ 0, /* flags */
+ &rect2,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ ctm,
+ NULL, /* stroke */
+ &image2, /* private_data */
+ sizeof(image2)); /* private_data_len */
}
fz_catch(ctx)
{
- fz_free_display_node(ctx, node);
+ fz_drop_image(ctx, image2);
fz_rethrow(ctx);
}
- fz_append_display_node(dev->user, node);
}
static void
-fz_list_pop_clip(fz_device *dev)
+fz_list_begin_mask(fz_context *ctx, fz_device *dev, const fz_rect *rect, int luminosity, fz_colorspace *colorspace, float *color)
{
- fz_display_node *node;
- node = fz_new_display_node(dev->ctx, FZ_CMD_POP_CLIP, &fz_identity, NULL, NULL, 0);
- fz_append_display_node(dev->user, node);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_BEGIN_MASK,
+ luminosity, /* flags */
+ rect,
+ NULL, /* path */
+ color,
+ colorspace,
+ NULL, /* alpha */
+ NULL, /* ctm */
+ NULL, /* stroke */
+ NULL, /* private_data */
+ 0); /* private_data_len */
}
static void
-fz_list_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
+fz_list_end_mask(fz_context *ctx, fz_device *dev)
{
- fz_display_node *node;
- fz_context *ctx = dev->ctx;
- node = fz_new_display_node(ctx, FZ_CMD_FILL_SHADE, ctm, NULL, NULL, alpha);
- fz_bound_shade(ctx, shade, ctm, &node->rect);
- node->item.shade = fz_keep_shade(ctx, shade);
- fz_append_display_node(dev->user, node);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_END_MASK,
+ 0, /* flags */
+ NULL, /* rect */
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ NULL, /* ctm */
+ NULL, /* stroke */
+ NULL, /* private_data */
+ 0); /* private_data_len */
}
static void
-fz_list_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
+fz_list_begin_group(fz_context *ctx, fz_device *dev, const fz_rect *rect, int isolated, int knockout, int blendmode, float alpha)
{
- fz_display_node *node;
- node = fz_new_display_node(dev->ctx, FZ_CMD_FILL_IMAGE, ctm, NULL, NULL, alpha);
- node->rect = fz_unit_rect;
- fz_transform_rect(&node->rect, ctm);
- node->item.image = fz_keep_image(dev->ctx, image);
- fz_append_display_node(dev->user, node);
-}
+ int flags;
-static void
-fz_list_fill_image_mask(fz_device *dev, fz_image *image, const fz_matrix *ctm,
- fz_colorspace *colorspace, float *color, float alpha)
-{
- fz_display_node *node;
- node = fz_new_display_node(dev->ctx, FZ_CMD_FILL_IMAGE_MASK, ctm, colorspace, color, alpha);
- node->rect = fz_unit_rect;
- fz_transform_rect(&node->rect, ctm);
- node->item.image = fz_keep_image(dev->ctx, image);
- fz_append_display_node(dev->user, node);
+ flags = (blendmode<<2);
+ if (isolated)
+ flags |= ISOLATED;
+ if (knockout)
+ flags |= KNOCKOUT;
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_BEGIN_GROUP,
+ flags,
+ rect,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ &alpha, /* alpha */
+ NULL, /* ctm */
+ NULL, /* stroke */
+ NULL, /* private_data */
+ 0); /* private_data_len */
}
static void
-fz_list_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
+fz_list_end_group(fz_context *ctx, fz_device *dev)
{
- fz_display_node *node;
- node = fz_new_display_node(dev->ctx, FZ_CMD_CLIP_IMAGE_MASK, ctm, NULL, NULL, 0);
- node->rect = fz_unit_rect;
- fz_transform_rect(&node->rect, ctm);
- if (rect)
- fz_intersect_rect(&node->rect, rect);
- node->item.image = fz_keep_image(dev->ctx, image);
- fz_append_display_node(dev->user, node);
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_END_GROUP,
+ 0, /* flags */
+ NULL, /* rect */
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ NULL, /* ctm */
+ NULL, /* stroke */
+ NULL, /* private_data */
+ 0); /* private_data_len */
}
-static void
-fz_list_begin_mask(fz_device *dev, const fz_rect *rect, int luminosity, fz_colorspace *colorspace, float *color)
-{
- fz_display_node *node;
- node = fz_new_display_node(dev->ctx, FZ_CMD_BEGIN_MASK, &fz_identity, colorspace, color, 0);
- node->rect = *rect;
- node->flag = luminosity;
- fz_append_display_node(dev->user, node);
-}
+typedef struct fz_list_tile_data_s fz_list_tile_data;
-static void
-fz_list_end_mask(fz_device *dev)
+struct fz_list_tile_data_s
{
- fz_display_node *node;
- node = fz_new_display_node(dev->ctx, FZ_CMD_END_MASK, &fz_identity, NULL, NULL, 0);
- fz_append_display_node(dev->user, node);
-}
+ float xstep;
+ float ystep;
+ fz_rect view;
+};
-static void
-fz_list_begin_group(fz_device *dev, const fz_rect *rect, int isolated, int knockout, int blendmode, float alpha)
+static int
+fz_list_begin_tile(fz_context *ctx, fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
{
- fz_display_node *node;
- node = fz_new_display_node(dev->ctx, FZ_CMD_BEGIN_GROUP, &fz_identity, NULL, NULL, alpha);
- node->rect = *rect;
- node->item.blendmode = blendmode;
- node->flag |= isolated ? ISOLATED : 0;
- node->flag |= knockout ? KNOCKOUT : 0;
- fz_append_display_node(dev->user, node);
-}
+ fz_list_tile_data tile;
-static void
-fz_list_end_group(fz_device *dev)
-{
- fz_display_node *node;
- node = fz_new_display_node(dev->ctx, FZ_CMD_END_GROUP, &fz_identity, NULL, NULL, 0);
- fz_append_display_node(dev->user, node);
+ tile.xstep = xstep;
+ tile.ystep = ystep;
+ tile.view = *view;
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_BEGIN_TILE,
+ 0, /* flags */
+ area,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ ctm,
+ NULL, /* stroke */
+ &tile, /* private_data */
+ sizeof(tile)); /* private_data_len */
+
+ return 0;
}
-static int
-fz_list_begin_tile(fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
+static void
+fz_list_end_tile(fz_context *ctx, fz_device *dev)
{
- /* We ignore id here, as we will pass on our own id */
- fz_display_node *node;
- node = fz_new_display_node(dev->ctx, FZ_CMD_BEGIN_TILE, ctm, NULL, NULL, 0);
- node->rect = *area;
- node->color[0] = xstep;
- node->color[1] = ystep;
- node->color[2] = view->x0;
- node->color[3] = view->y0;
- node->color[4] = view->x1;
- node->color[5] = view->y1;
- fz_append_display_node(dev->user, node);
- return 0;
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_END_TILE,
+ 0, /* flags */
+ NULL,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ NULL, /* ctm */
+ NULL, /* stroke */
+ NULL, /* private_data */
+ 0); /* private_data_len */
}
static void
-fz_list_end_tile(fz_device *dev)
+drop_writer(fz_context *ctx, fz_device *dev)
{
- fz_display_node *node;
- node = fz_new_display_node(dev->ctx, FZ_CMD_END_TILE, &fz_identity, NULL, NULL, 0);
- fz_append_display_node(dev->user, node);
+ fz_list_device *writer = (fz_list_device *)dev;
+
+ fz_drop_colorspace(ctx, writer->colorspace);
+ fz_drop_stroke_state(ctx, writer->stroke);
+ fz_drop_path(ctx, writer->path);
}
fz_device *
fz_new_list_device(fz_context *ctx, fz_display_list *list)
{
- fz_device *dev = fz_new_device(ctx, list);
+ fz_list_device *dev;
+
+ dev = fz_new_device(ctx, sizeof(fz_list_device));
+
+ dev->super.begin_page = fz_list_begin_page;
+ dev->super.end_page = fz_list_end_page;
+
+ dev->super.fill_path = fz_list_fill_path;
+ dev->super.stroke_path = fz_list_stroke_path;
+ dev->super.clip_path = fz_list_clip_path;
+ dev->super.clip_stroke_path = fz_list_clip_stroke_path;
- dev->begin_page = fz_list_begin_page;
- dev->end_page = fz_list_end_page;
+ dev->super.fill_text = fz_list_fill_text;
+ dev->super.stroke_text = fz_list_stroke_text;
+ dev->super.clip_text = fz_list_clip_text;
+ dev->super.clip_stroke_text = fz_list_clip_stroke_text;
+ dev->super.ignore_text = fz_list_ignore_text;
- dev->fill_path = fz_list_fill_path;
- dev->stroke_path = fz_list_stroke_path;
- dev->clip_path = fz_list_clip_path;
- dev->clip_stroke_path = fz_list_clip_stroke_path;
+ dev->super.fill_shade = fz_list_fill_shade;
+ dev->super.fill_image = fz_list_fill_image;
+ dev->super.fill_image_mask = fz_list_fill_image_mask;
+ dev->super.clip_image_mask = fz_list_clip_image_mask;
- dev->fill_text = fz_list_fill_text;
- dev->stroke_text = fz_list_stroke_text;
- dev->clip_text = fz_list_clip_text;
- dev->clip_stroke_text = fz_list_clip_stroke_text;
- dev->ignore_text = fz_list_ignore_text;
+ dev->super.pop_clip = fz_list_pop_clip;
- dev->fill_shade = fz_list_fill_shade;
- dev->fill_image = fz_list_fill_image;
- dev->fill_image_mask = fz_list_fill_image_mask;
- dev->clip_image_mask = fz_list_clip_image_mask;
+ dev->super.begin_mask = fz_list_begin_mask;
+ dev->super.end_mask = fz_list_end_mask;
+ dev->super.begin_group = fz_list_begin_group;
+ dev->super.end_group = fz_list_end_group;
- dev->pop_clip = fz_list_pop_clip;
+ dev->super.begin_tile = fz_list_begin_tile;
+ dev->super.end_tile = fz_list_end_tile;
- dev->begin_mask = fz_list_begin_mask;
- dev->end_mask = fz_list_end_mask;
- dev->begin_group = fz_list_begin_group;
- dev->end_group = fz_list_end_group;
+ dev->super.drop_imp = drop_writer;
- dev->begin_tile = fz_list_begin_tile;
- dev->end_tile = fz_list_end_tile;
+ dev->list = list;
+ dev->path = NULL;
+ dev->alpha = 1.0f;
+ dev->ctm = fz_identity;
+ dev->stroke = NULL;
+ dev->colorspace = fz_device_gray(ctx);
+ memset(dev->color, 0, sizeof(float)*FZ_MAX_COLORS);
+ dev->top = 0;
+ dev->tiled = 0;
- return dev;
+ return &dev->super;
}
static void
-fz_free_display_list(fz_context *ctx, fz_storable *list_)
+fz_drop_display_list_imp(fz_context *ctx, fz_storable *list_)
{
fz_display_list *list = (fz_display_list *)list_;
- fz_display_node *node;
+ fz_display_node *node = list->list;
+ fz_display_node *node_end = list->list + list->len;
+ int cs_n = 1;
if (list == NULL)
return;
- node = list->first;
- while (node)
+ while (node != node_end)
{
- fz_display_node *next = node->next;
- fz_free_display_node(ctx, node);
+ fz_display_node n = *node;
+ fz_display_node *next = node + n.size;
+
+ node++;
+ if (n.rect)
+ {
+ node += SIZE_IN_NODES(sizeof(fz_rect));
+ }
+ if (n.path)
+ {
+ fz_drop_path(ctx, *(fz_path **)node);
+ node += SIZE_IN_NODES(sizeof(fz_path *));
+ }
+ switch (n.cs)
+ {
+ default:
+ case CS_UNCHANGED:
+ break;
+ case CS_GRAY_0:
+ case CS_GRAY_1:
+ cs_n = 1;
+ break;
+ case CS_RGB_0:
+ case CS_RGB_1:
+ cs_n = 3;
+ break;
+ case CS_CMYK_0:
+ case CS_CMYK_1:
+ cs_n = 4;
+ break;
+ case CS_OTHER_0:
+ cs_n = (*(fz_colorspace **)node)->n;
+ fz_drop_colorspace(ctx, *(fz_colorspace **)node);
+ node += SIZE_IN_NODES(sizeof(fz_colorspace *));
+ break;
+ }
+ if (n.color)
+ {
+ node += SIZE_IN_NODES(cs_n * sizeof(float));
+ }
+ if (n.alpha == ALPHA_PRESENT)
+ {
+ node += SIZE_IN_NODES(sizeof(float));
+ }
+ if (n.ctm & CTM_CHANGE_AD)
+ node += SIZE_IN_NODES(2*sizeof(float));
+ if (n.ctm & CTM_CHANGE_BC)
+ node += SIZE_IN_NODES(2*sizeof(float));
+ if (n.ctm & CTM_CHANGE_EF)
+ node += SIZE_IN_NODES(2*sizeof(float));
+ if (n.stroke)
+ {
+ fz_drop_stroke_state(ctx, *(fz_stroke_state **)node);
+ node += SIZE_IN_NODES(sizeof(fz_stroke_state *));
+ }
+ switch(n.cmd)
+ {
+ case FZ_CMD_FILL_TEXT:
+ case FZ_CMD_STROKE_TEXT:
+ case FZ_CMD_CLIP_TEXT:
+ case FZ_CMD_CLIP_STROKE_TEXT:
+ case FZ_CMD_IGNORE_TEXT:
+ fz_drop_text(ctx, *(fz_text **)node);
+ break;
+ case FZ_CMD_FILL_SHADE:
+ fz_drop_shade(ctx, *(fz_shade **)node);
+ break;
+ case FZ_CMD_FILL_IMAGE:
+ case FZ_CMD_FILL_IMAGE_MASK:
+ case FZ_CMD_CLIP_IMAGE_MASK:
+ fz_drop_image(ctx, *(fz_image **)node);
+ break;
+ }
+
node = next;
}
+ fz_free(ctx, list->list);
fz_free(ctx, list);
}
@@ -613,12 +1356,10 @@ fz_display_list *
fz_new_display_list(fz_context *ctx)
{
fz_display_list *list = fz_malloc_struct(ctx, fz_display_list);
- FZ_INIT_STORABLE(list, 1, fz_free_display_list);
- list->first = NULL;
- list->last = NULL;
+ FZ_INIT_STORABLE(list, 1, fz_drop_display_list_imp);
+ list->list = NULL;
+ list->max = 0;
list->len = 0;
- list->top = 0;
- list->tiled = 0;
return list;
}
@@ -635,7 +1376,7 @@ fz_drop_display_list(fz_context *ctx, fz_display_list *list)
}
static fz_display_node *
-skip_to_end_tile(fz_display_node *node, int *progress)
+skip_to_end_tile(fz_display_node *node, fz_display_node *node_end, int *progress)
{
fz_display_node *next;
int depth = 1;
@@ -645,8 +1386,8 @@ skip_to_end_tile(fz_display_node *node, int *progress)
* the calling routine. */
do
{
- next = node->next;
- if (next == NULL)
+ next = node + node->size;
+ if (next == node_end)
break;
if (next->cmd == FZ_CMD_BEGIN_TILE)
depth++;
@@ -665,14 +1406,29 @@ skip_to_end_tile(fz_display_node *node, int *progress)
}
void
-fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_ctm, const fz_rect *scissor, fz_cookie *cookie)
+fz_run_display_list(fz_context *ctx, fz_display_list *list, fz_device *dev, const fz_matrix *top_ctm, const fz_rect *scissor, fz_cookie *cookie)
{
fz_display_node *node;
- fz_matrix ctm;
+ fz_display_node *node_end;
+ fz_display_node *next_node;
int clipped = 0;
int tiled = 0;
int progress = 0;
- fz_context *ctx = dev->ctx;
+
+ /* Current graphics state as unpacked from list */
+ fz_path *path = NULL;
+ float alpha = 1.0f;
+ fz_matrix ctm = fz_identity;
+ fz_stroke_state *stroke = NULL;
+ float color[FZ_MAX_COLORS] = { 0 };
+ fz_colorspace *colorspace = fz_device_gray(ctx);
+ fz_rect rect = { 0 };
+
+ /* Transformed versions of graphic state entries */
+ fz_rect trans_rect;
+ fz_matrix trans_ctm;
+
+ fz_var(colorspace);
if (!scissor)
scissor = &fz_infinite_rect;
@@ -683,12 +1439,14 @@ fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_
cookie->progress = 0;
}
- for (node = list->first; node; node = node->next)
+ node = list->list;
+ node_end = &list->list[list->len];
+ for (; node != node_end ; node = next_node)
{
int empty;
+ fz_display_node n = *node;
- fz_rect node_rect = node->rect;
- fz_transform_rect(&node_rect, top_ctm);
+ next_node = node + n.size;
/* Check the cookie for aborting */
if (cookie)
@@ -698,24 +1456,140 @@ fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_
cookie->progress = progress++;
}
+ node++;
+ if (n.rect)
+ {
+ rect = *(fz_rect *)node;
+ node += SIZE_IN_NODES(sizeof(fz_rect));
+ }
+ if (n.path)
+ {
+ fz_drop_path(ctx, path);
+ path = fz_keep_path(ctx, *(fz_path **)node);
+ node += SIZE_IN_NODES(sizeof(fz_path *));
+ }
+ if (n.cs)
+ {
+ int i;
+
+ fz_drop_colorspace(ctx, colorspace);
+ switch (n.cs)
+ {
+ default:
+ case CS_GRAY_0:
+ colorspace = fz_device_gray(ctx);
+ color[0] = 0.0f;
+ break;
+ case CS_GRAY_1:
+ colorspace = fz_device_gray(ctx);
+ color[0] = 1.0f;
+ break;
+ case CS_RGB_0:
+ colorspace = fz_device_rgb(ctx);
+ color[0] = 0.0f;
+ color[1] = 0.0f;
+ color[2] = 0.0f;
+ break;
+ case CS_RGB_1:
+ colorspace = fz_device_rgb(ctx);
+ color[0] = 1.0f;
+ color[1] = 1.0f;
+ color[2] = 1.0f;
+ break;
+ case CS_CMYK_0:
+ colorspace = fz_device_cmyk(ctx);
+ color[0] = 0.0f;
+ color[1] = 0.0f;
+ color[2] = 0.0f;
+ color[3] = 0.0f;
+ break;
+ case CS_CMYK_1:
+ colorspace = fz_device_cmyk(ctx);
+ color[0] = 0.0f;
+ color[1] = 0.0f;
+ color[2] = 0.0f;
+ color[3] = 1.0f;
+ break;
+ case CS_OTHER_0:
+ colorspace = fz_keep_colorspace(ctx, *(fz_colorspace **)(node));
+ node += SIZE_IN_NODES(sizeof(fz_colorspace *));
+ for (i = 0; i < colorspace->n; i++)
+ color[i] = 0.0f;
+ break;
+ }
+ }
+ if (n.color)
+ {
+ memcpy(color, (float *)node, colorspace->n * sizeof(float));
+ node += SIZE_IN_NODES(colorspace->n * sizeof(float));
+ }
+ if (n.alpha)
+ {
+ switch(n.alpha)
+ {
+ default:
+ case ALPHA_0:
+ alpha = 0.0f;
+ break;
+ case ALPHA_1:
+ alpha = 1.0f;
+ break;
+ case ALPHA_PRESENT:
+ alpha = *(float *)node;
+ node += SIZE_IN_NODES(sizeof(float));
+ break;
+ }
+ }
+ if (n.ctm != 0)
+ {
+ float *packed_ctm = (float *)node;
+ if (n.ctm & CTM_CHANGE_AD)
+ {
+ ctm.a = *packed_ctm++;
+ ctm.d = *packed_ctm++;
+ node += SIZE_IN_NODES(2*sizeof(float));
+ }
+ if (n.ctm & CTM_CHANGE_BC)
+ {
+ ctm.b = *packed_ctm++;
+ ctm.c = *packed_ctm++;
+ node += SIZE_IN_NODES(2*sizeof(float));
+ }
+ if (n.ctm & CTM_CHANGE_EF)
+ {
+ ctm.e = *packed_ctm++;
+ ctm.f = *packed_ctm++;
+ node += SIZE_IN_NODES(2*sizeof(float));
+ }
+ }
+ if (n.stroke)
+ {
+ fz_drop_stroke_state(ctx, stroke);
+ stroke = fz_keep_stroke_state(ctx, *(fz_stroke_state **)node);
+ node += SIZE_IN_NODES(sizeof(fz_stroke_state *));
+ }
+
+ trans_rect = rect;
+ fz_transform_rect(&trans_rect, top_ctm);
+
/* cull objects to draw using a quick visibility test */
if (tiled ||
- node->cmd == FZ_CMD_BEGIN_TILE || node->cmd == FZ_CMD_END_TILE ||
- node->cmd == FZ_CMD_BEGIN_PAGE || node->cmd == FZ_CMD_END_PAGE)
+ n.cmd == FZ_CMD_BEGIN_TILE || n.cmd == FZ_CMD_END_TILE ||
+ n.cmd == FZ_CMD_BEGIN_PAGE || n.cmd == FZ_CMD_END_PAGE)
{
empty = 0;
}
else
{
- fz_rect rect = node_rect;
- fz_intersect_rect(&rect, scissor);
- empty = fz_is_empty_rect(&rect);
+ fz_rect irect = rect;
+ fz_intersect_rect(&irect, scissor);
+ empty = fz_is_empty_rect(&irect);
}
if (clipped || empty)
{
- switch (node->cmd)
+ switch (n.cmd)
{
case FZ_CMD_CLIP_PATH:
case FZ_CMD_CLIP_STROKE_PATH:
@@ -727,7 +1601,7 @@ fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_
continue;
case FZ_CMD_CLIP_TEXT:
/* Accumulated text has no extra pops */
- if (node->flag != 2)
+ if (n.flags != 2)
clipped++;
continue;
case FZ_CMD_POP_CLIP:
@@ -746,100 +1620,91 @@ fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_
}
visible:
- fz_concat(&ctm, &node->ctm, top_ctm);
+ fz_concat(&trans_ctm, &ctm, top_ctm);
fz_try(ctx)
{
- switch (node->cmd)
+ switch (n.cmd)
{
case FZ_CMD_BEGIN_PAGE:
- fz_begin_page(dev, &node_rect, &ctm);
+ fz_begin_page(ctx, dev, &trans_rect, &trans_ctm);
break;
case FZ_CMD_END_PAGE:
- fz_end_page(dev);
+ fz_end_page(ctx, dev);
break;
case FZ_CMD_FILL_PATH:
- fz_fill_path(dev, node->item.path, node->flag, &ctm,
- node->colorspace, node->color, node->alpha);
+ fz_fill_path(ctx, dev, path, n.flags, &trans_ctm, colorspace, color, alpha);
break;
case FZ_CMD_STROKE_PATH:
- fz_stroke_path(dev, node->item.path, node->stroke, &ctm,
- node->colorspace, node->color, node->alpha);
+ fz_stroke_path(ctx, dev, path, stroke, &trans_ctm, colorspace, color, alpha);
break;
case FZ_CMD_CLIP_PATH:
- fz_clip_path(dev, node->item.path, &node_rect, node->flag, &ctm);
+ fz_clip_path(ctx, dev, path, &trans_rect, n.flags, &trans_ctm);
break;
case FZ_CMD_CLIP_STROKE_PATH:
- fz_clip_stroke_path(dev, node->item.path, &node_rect, node->stroke, &ctm);
+ fz_clip_stroke_path(ctx, dev, path, &trans_rect, stroke, &trans_ctm);
break;
case FZ_CMD_FILL_TEXT:
- fz_fill_text(dev, node->item.text, &ctm,
- node->colorspace, node->color, node->alpha);
+ fz_fill_text(ctx, dev, *(fz_text **)node, &trans_ctm, colorspace, color, alpha);
break;
case FZ_CMD_STROKE_TEXT:
- fz_stroke_text(dev, node->item.text, node->stroke, &ctm,
- node->colorspace, node->color, node->alpha);
+ fz_stroke_text(ctx, dev, *(fz_text **)node, stroke, &trans_ctm, colorspace, color, alpha);
break;
case FZ_CMD_CLIP_TEXT:
- fz_clip_text(dev, node->item.text, &ctm, node->flag);
+ fz_clip_text(ctx, dev, *(fz_text **)node, &trans_ctm, n.flags);
break;
case FZ_CMD_CLIP_STROKE_TEXT:
- fz_clip_stroke_text(dev, node->item.text, node->stroke, &ctm);
+ fz_clip_stroke_text(ctx, dev, *(fz_text **)node, stroke, &trans_ctm);
break;
case FZ_CMD_IGNORE_TEXT:
- fz_ignore_text(dev, node->item.text, &ctm);
+ fz_ignore_text(ctx, dev, *(fz_text **)node, &trans_ctm);
break;
case FZ_CMD_FILL_SHADE:
if ((dev->hints & FZ_IGNORE_SHADE) == 0)
- fz_fill_shade(dev, node->item.shade, &ctm, node->alpha);
+ fz_fill_shade(ctx, dev, *(fz_shade **)node, &trans_ctm, alpha);
break;
case FZ_CMD_FILL_IMAGE:
if ((dev->hints & FZ_IGNORE_IMAGE) == 0)
- fz_fill_image(dev, node->item.image, &ctm, node->alpha);
+ fz_fill_image(ctx, dev, *(fz_image **)node, &trans_ctm, alpha);
break;
case FZ_CMD_FILL_IMAGE_MASK:
if ((dev->hints & FZ_IGNORE_IMAGE) == 0)
- fz_fill_image_mask(dev, node->item.image, &ctm,
- node->colorspace, node->color, node->alpha);
+ fz_fill_image_mask(ctx, dev, *(fz_image **)node, &trans_ctm, colorspace, color, alpha);
break;
case FZ_CMD_CLIP_IMAGE_MASK:
if ((dev->hints & FZ_IGNORE_IMAGE) == 0)
- fz_clip_image_mask(dev, node->item.image, &node_rect, &ctm);
+ fz_clip_image_mask(ctx, dev, *(fz_image **)node, &trans_rect, &trans_ctm);
break;
case FZ_CMD_POP_CLIP:
- fz_pop_clip(dev);
+ fz_pop_clip(ctx, dev);
break;
case FZ_CMD_BEGIN_MASK:
- fz_begin_mask(dev, &node_rect, node->flag, node->colorspace, node->color);
+ fz_begin_mask(ctx, dev, &trans_rect, n.flags, colorspace, color);
break;
case FZ_CMD_END_MASK:
- fz_end_mask(dev);
+ fz_end_mask(ctx, dev);
break;
case FZ_CMD_BEGIN_GROUP:
- fz_begin_group(dev, &node_rect,
- (node->flag & ISOLATED) != 0, (node->flag & KNOCKOUT) != 0,
- node->item.blendmode, node->alpha);
+ fz_begin_group(ctx, dev, &trans_rect, (n.flags & ISOLATED) != 0, (n.flags & KNOCKOUT) != 0, (n.flags>>2), alpha);
break;
case FZ_CMD_END_GROUP:
- fz_end_group(dev);
+ fz_end_group(ctx, dev);
break;
case FZ_CMD_BEGIN_TILE:
{
int cached;
+ fz_list_tile_data *data = (fz_list_tile_data *)node;
fz_rect tile_rect;
tiled++;
- tile_rect.x0 = node->color[2];
- tile_rect.y0 = node->color[3];
- tile_rect.x1 = node->color[4];
- tile_rect.y1 = node->color[5];
- cached = fz_begin_tile_id(dev, &node->rect, &tile_rect, node->color[0], node->color[1], &ctm, node->flag);
+ tile_rect = data->view;
+ cached = fz_begin_tile_id(ctx, dev, &rect, &tile_rect, data->xstep, data->ystep, &trans_ctm, n.flags);
if (cached)
- node = skip_to_end_tile(node, &progress);
+ node = skip_to_end_tile(node, node_end, &progress);
break;
}
case FZ_CMD_END_TILE:
tiled--;
- fz_end_tile(dev);
+ fz_end_tile(ctx, dev);
break;
}
}
@@ -853,4 +1718,7 @@ visible:
fz_warn(ctx, "Ignoring error during interpretation");
}
}
+ fz_drop_colorspace(ctx, colorspace);
+ fz_drop_stroke_state(ctx, stroke);
+ fz_drop_path(ctx, path);
}
diff --git a/source/fitz/load-png.c b/source/fitz/load-png.c
index d897b5be..9c947148 100644
--- a/source/fitz/load-png.c
+++ b/source/fitz/load-png.c
@@ -4,7 +4,6 @@
struct info
{
- fz_context *ctx;
unsigned int width, height, depth, n;
int interlace, indexed;
unsigned int size;
@@ -162,7 +161,7 @@ static const unsigned int adam7_iy[7] = { 0, 0, 4, 0, 2, 0, 1 };
static const unsigned int adam7_dy[7] = { 8, 8, 8, 4, 4, 2, 2 };
static void
-png_deinterlace_passes(struct info *info, unsigned int *w, unsigned int *h, unsigned int *ofs)
+png_deinterlace_passes(fz_context *ctx, struct info *info, unsigned int *w, unsigned int *h, unsigned int *ofs)
{
int p, bpp = info->depth * info->n;
ofs[0] = 0;
@@ -180,7 +179,7 @@ png_deinterlace_passes(struct info *info, unsigned int *w, unsigned int *h, unsi
}
static void
-png_deinterlace(struct info *info, unsigned int *passw, unsigned int *passh, unsigned int *passofs)
+png_deinterlace(fz_context *ctx, struct info *info, unsigned int *passw, unsigned int *passh, unsigned int *passofs)
{
unsigned int n = info->n;
unsigned int depth = info->depth;
@@ -188,7 +187,7 @@ png_deinterlace(struct info *info, unsigned int *passw, unsigned int *passh, uns
unsigned char *output;
unsigned int p, x, y, k;
- output = fz_malloc_array(info->ctx, info->height, stride);
+ output = fz_malloc_array(ctx, info->height, stride);
for (p = 0; p < 7; p++)
{
@@ -214,17 +213,17 @@ png_deinterlace(struct info *info, unsigned int *passw, unsigned int *passh, uns
}
}
- fz_free(info->ctx, info->samples);
+ fz_free(ctx, info->samples);
info->samples = output;
}
static void
-png_read_ihdr(struct info *info, unsigned char *p, unsigned int size)
+png_read_ihdr(fz_context *ctx, struct info *info, unsigned char *p, unsigned int size)
{
int color, compression, filter;
if (size != 13)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "IHDR chunk is the wrong size");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "IHDR chunk is the wrong size");
info->width = getuint(p + 0);
info->height = getuint(p + 4);
@@ -236,21 +235,21 @@ png_read_ihdr(struct info *info, unsigned char *p, unsigned int size)
info->interlace = p[12];
if (info->width <= 0)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "image width must be > 0");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "image width must be > 0");
if (info->height <= 0)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "image height must be > 0");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "image height must be > 0");
if (info->depth != 1 && info->depth != 2 && info->depth != 4 &&
info->depth != 8 && info->depth != 16)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "image bit depth must be one of 1, 2, 4, 8, 16");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "image bit depth must be one of 1, 2, 4, 8, 16");
if (color == 2 && info->depth < 8)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "illegal bit depth for truecolor");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "illegal bit depth for truecolor");
if (color == 3 && info->depth > 8)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "illegal bit depth for indexed");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "illegal bit depth for indexed");
if (color == 4 && info->depth < 8)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "illegal bit depth for grayscale with alpha");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "illegal bit depth for grayscale with alpha");
if (color == 6 && info->depth < 8)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "illegal bit depth for truecolor with alpha");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "illegal bit depth for truecolor with alpha");
info->indexed = 0;
if (color == 0) /* gray */
@@ -267,25 +266,27 @@ png_read_ihdr(struct info *info, unsigned char *p, unsigned int size)
info->n = 1;
}
else
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "unknown color type");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown color type");
if (compression != 0)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "unknown compression method");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown compression method");
if (filter != 0)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "unknown filter method");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown filter method");
if (info->interlace != 0 && info->interlace != 1)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "interlace method not supported");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "interlace method not supported");
+ if (info->height > UINT_MAX / info->width / info->n / (info->depth / 8 + 1))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "image dimensions might overflow");
}
static void
-png_read_plte(struct info *info, unsigned char *p, unsigned int size)
+png_read_plte(fz_context *ctx, struct info *info, unsigned char *p, unsigned int size)
{
int n = size / 3;
int i;
if (n > 256)
{
- fz_warn(info->ctx, "too many samples in palette");
+ fz_warn(ctx, "too many samples in palette");
n = 256;
}
@@ -306,7 +307,7 @@ png_read_plte(struct info *info, unsigned char *p, unsigned int size)
}
static void
-png_read_trns(struct info *info, unsigned char *p, unsigned int size)
+png_read_trns(fz_context *ctx, struct info *info, unsigned char *p, unsigned int size)
{
unsigned int i;
@@ -316,7 +317,7 @@ png_read_trns(struct info *info, unsigned char *p, unsigned int size)
{
if (size > 256)
{
- fz_warn(info->ctx, "too many samples in transparency table");
+ fz_warn(ctx, "too many samples in transparency table");
size = 256;
}
for (i = 0; i < size; i++)
@@ -328,14 +329,14 @@ png_read_trns(struct info *info, unsigned char *p, unsigned int size)
else
{
if (size != info->n * 2)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "tRNS chunk is the wrong size");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "tRNS chunk is the wrong size");
for (i = 0; i < info->n; i++)
info->trns[i] = (p[i * 2] << 8 | p[i * 2 + 1]) & ((1 << info->depth) - 1);
}
}
static void
-png_read_idat(struct info *info, unsigned char *p, unsigned int size, z_stream *stm)
+png_read_idat(fz_context *ctx, struct info *info, unsigned char *p, unsigned int size, z_stream *stm)
{
int code;
@@ -344,20 +345,20 @@ png_read_idat(struct info *info, unsigned char *p, unsigned int size, z_stream *
code = inflate(stm, Z_SYNC_FLUSH);
if (code != Z_OK && code != Z_STREAM_END)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "zlib error: %s", stm->msg);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "zlib error: %s", stm->msg);
if (stm->avail_in != 0)
{
if (stm->avail_out == 0)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "ran out of output before input");
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "inflate did not consume buffer (%d remaining)", stm->avail_in);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "ran out of output before input");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "inflate did not consume buffer (%d remaining)", stm->avail_in);
}
}
static void
-png_read_phys(struct info *info, unsigned char *p, unsigned int size)
+png_read_phys(fz_context *ctx, struct info *info, unsigned char *p, unsigned int size)
{
if (size != 9)
- fz_throw(info->ctx, FZ_ERROR_GENERIC, "pHYs chunk is the wrong size");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "pHYs chunk is the wrong size");
if (p[8] == 1)
{
info->xres = (getuint(p) * 254 + 5000) / 10000;
@@ -373,7 +374,6 @@ png_read_image(fz_context *ctx, struct info *info, unsigned char *p, unsigned in
z_stream stm;
memset(info, 0, sizeof (struct info));
- info->ctx = ctx;
memset(info->palette, 255, sizeof(info->palette));
info->xres = 96;
info->yres = 96;
@@ -393,7 +393,7 @@ png_read_image(fz_context *ctx, struct info *info, unsigned char *p, unsigned in
fz_throw(ctx, FZ_ERROR_GENERIC, "premature end of data in png image");
if (!memcmp(p + 4, "IHDR", 4))
- png_read_ihdr(info, p + 8, size);
+ png_read_ihdr(ctx, info, p + 8, size);
else
fz_throw(ctx, FZ_ERROR_GENERIC, "png file must start with IHDR chunk");
@@ -408,7 +408,7 @@ png_read_image(fz_context *ctx, struct info *info, unsigned char *p, unsigned in
}
else
{
- png_deinterlace_passes(info, passw, passh, passofs);
+ png_deinterlace_passes(ctx, info, passw, passh, passofs);
info->size = passofs[7];
}
@@ -439,13 +439,13 @@ png_read_image(fz_context *ctx, struct info *info, unsigned char *p, unsigned in
fz_throw(ctx, FZ_ERROR_GENERIC, "premature end of data in png image");
if (!memcmp(p + 4, "PLTE", 4))
- png_read_plte(info, p + 8, size);
+ png_read_plte(ctx, info, p + 8, size);
if (!memcmp(p + 4, "tRNS", 4))
- png_read_trns(info, p + 8, size);
+ png_read_trns(ctx, info, p + 8, size);
if (!memcmp(p + 4, "pHYs", 4))
- png_read_phys(info, p + 8, size);
+ png_read_phys(ctx, info, p + 8, size);
if (!memcmp(p + 4, "IDAT", 4))
- png_read_idat(info, p + 8, size, &stm);
+ png_read_idat(ctx, info, p + 8, size, &stm);
if (!memcmp(p + 4, "IEND", 4))
break;
@@ -480,7 +480,7 @@ png_read_image(fz_context *ctx, struct info *info, unsigned char *p, unsigned in
if (!info->interlace)
png_predict(info->samples, info->width, info->height, info->n, info->depth);
else
- png_deinterlace(info, passw, passh, passofs);
+ png_deinterlace(ctx, info, passw, passh, passofs);
}
fz_catch(ctx)
{
@@ -513,7 +513,7 @@ png_expand_palette(fz_context *ctx, struct info *info, fz_pixmap *src)
}
}
- fz_drop_pixmap(info->ctx, src);
+ fz_drop_pixmap(ctx, src);
return dst;
}
@@ -564,24 +564,35 @@ fz_load_png(fz_context *ctx, unsigned char *p, int total)
}
fz_catch(ctx)
{
- fz_free(png.ctx, png.samples);
+ fz_free(ctx, png.samples);
fz_rethrow_message(ctx, "out of memory loading png");
}
image->xres = png.xres;
image->yres = png.yres;
- fz_unpack_tile(image, png.samples, png.n, png.depth, stride, png.indexed);
+ fz_unpack_tile(ctx, image, png.samples, png.n, png.depth, stride, png.indexed);
if (png.indexed)
- image = png_expand_palette(ctx, &png, image);
+ {
+ fz_try(ctx)
+ {
+ image = png_expand_palette(ctx, &png, image);
+ }
+ fz_catch(ctx)
+ {
+ fz_free(ctx, png.samples);
+ fz_drop_pixmap(ctx, image);
+ fz_rethrow(ctx);
+ }
+ }
else if (png.transparency)
png_mask_transparency(&png, image);
if (png.transparency || png.n == 2 || png.n == 4)
- fz_premultiply_pixmap(png.ctx, image);
+ fz_premultiply_pixmap(ctx, image);
- fz_free(png.ctx, png.samples);
+ fz_free(ctx, png.samples);
return image;
}
@@ -602,5 +613,5 @@ fz_load_png_info(fz_context *ctx, unsigned char *p, int total, int *wp, int *hp,
*hp = png.height;
*xresp = png.xres;
*yresp = png.xres;
- fz_free(png.ctx, png.samples);
+ fz_free(ctx, png.samples);
}
diff --git a/source/fitz/load-tiff.c b/source/fitz/load-tiff.c
index 671e5146..054baebe 100644
--- a/source/fitz/load-tiff.c
+++ b/source/fitz/load-tiff.c
@@ -11,8 +11,6 @@
struct tiff
{
- fz_context *ctx;
-
/* "file" */
unsigned char *bp, *rp, *ep;
@@ -142,63 +140,63 @@ static const unsigned char bitrev[256] =
};
static void
-fz_decode_tiff_uncompressed(struct tiff *tiff, fz_stream *stm, unsigned char *wp, int wlen)
+fz_decode_tiff_uncompressed(fz_context *ctx, struct tiff *tiff, fz_stream *stm, unsigned char *wp, int wlen)
{
- fz_read(stm, wp, wlen);
- fz_close(stm);
+ fz_read(ctx, stm, wp, wlen);
+ fz_drop_stream(ctx, stm);
}
static void
-fz_decode_tiff_packbits(struct tiff *tiff, fz_stream *chain, unsigned char *wp, int wlen)
+fz_decode_tiff_packbits(fz_context *ctx, struct tiff *tiff, fz_stream *chain, unsigned char *wp, int wlen)
{
- fz_stream *stm = fz_open_rld(chain);
- fz_read(stm, wp, wlen);
- fz_close(stm);
+ fz_stream *stm = fz_open_rld(ctx, chain);
+ fz_read(ctx, stm, wp, wlen);
+ fz_drop_stream(ctx, stm);
}
static void
-fz_decode_tiff_lzw(struct tiff *tiff, fz_stream *chain, unsigned char *wp, int wlen)
+fz_decode_tiff_lzw(fz_context *ctx, struct tiff *tiff, fz_stream *chain, unsigned char *wp, int wlen)
{
- fz_stream *stm = fz_open_lzwd(chain, 1);
- fz_read(stm, wp, wlen);
- fz_close(stm);
+ fz_stream *stm = fz_open_lzwd(ctx, chain, 1);
+ fz_read(ctx, stm, wp, wlen);
+ fz_drop_stream(ctx, stm);
}
static void
-fz_decode_tiff_flate(struct tiff *tiff, fz_stream *chain, unsigned char *wp, int wlen)
+fz_decode_tiff_flate(fz_context *ctx, struct tiff *tiff, fz_stream *chain, unsigned char *wp, int wlen)
{
- fz_stream *stm = fz_open_flated(chain, 15);
- fz_read(stm, wp, wlen);
- fz_close(stm);
+ fz_stream *stm = fz_open_flated(ctx, chain, 15);
+ fz_read(ctx, stm, wp, wlen);
+ fz_drop_stream(ctx, stm);
}
static void
-fz_decode_tiff_fax(struct tiff *tiff, int comp, fz_stream *chain, unsigned char *wp, int wlen)
+fz_decode_tiff_fax(fz_context *ctx, struct tiff *tiff, int comp, fz_stream *chain, unsigned char *wp, int wlen)
{
fz_stream *stm;
int black_is_1 = tiff->photometric == 0;
int k = comp == 4 ? -1 : 0;
int encoded_byte_align = comp == 2;
- stm = fz_open_faxd(chain,
+ stm = fz_open_faxd(ctx, chain,
k, 0, encoded_byte_align,
tiff->imagewidth, tiff->imagelength, 0, black_is_1);
- fz_read(stm, wp, wlen);
- fz_close(stm);
+ fz_read(ctx, stm, wp, wlen);
+ fz_drop_stream(ctx, stm);
}
static void
-fz_decode_tiff_jpeg(struct tiff *tiff, fz_stream *chain, unsigned char *wp, int wlen)
+fz_decode_tiff_jpeg(fz_context *ctx, struct tiff *tiff, fz_stream *chain, unsigned char *wp, int wlen)
{
fz_stream *stm;
fz_stream *jpegtables = NULL;
int color_transform = -1; /* unset */
if (tiff->jpegtables && (int)tiff->jpegtableslen > 0)
- jpegtables = fz_open_memory(tiff->ctx, tiff->jpegtables, (int)tiff->jpegtableslen);
+ jpegtables = fz_open_memory(ctx, tiff->jpegtables, (int)tiff->jpegtableslen);
if (tiff->photometric == 2 /* RGB */ || tiff->photometric == 3 /* RGBPal */)
color_transform = 0;
- stm = fz_open_dctd(chain, color_transform, 0, jpegtables);
- fz_read(stm, wp, wlen);
- fz_close(stm);
+ stm = fz_open_dctd(ctx, chain, color_transform, 0, jpegtables);
+ fz_read(ctx, stm, wp, wlen);
+ fz_drop_stream(ctx, stm);
}
static inline int getcomp(unsigned char *line, int x, int bpc)
@@ -276,7 +274,7 @@ fz_invert_tiff(unsigned char *line, int width, int comps, int bits, int alpha)
}
static void
-fz_expand_tiff_colormap(struct tiff *tiff)
+fz_expand_tiff_colormap(fz_context *ctx, struct tiff *tiff)
{
int maxval = 1 << tiff->bitspersample;
unsigned char *samples;
@@ -289,17 +287,20 @@ fz_expand_tiff_colormap(struct tiff *tiff)
/* image can be with or without extrasamples: comps is 1 or 2 */
if (tiff->samplesperpixel != 1 && tiff->samplesperpixel != 2)
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "invalid number of samples for RGBPal");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "invalid number of samples for RGBPal");
if (tiff->bitspersample != 1 && tiff->bitspersample != 4 && tiff->bitspersample != 8)
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "invalid number of bits for RGBPal");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "invalid number of bits for RGBPal");
if (tiff->colormaplen < (unsigned)maxval * 3)
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "insufficient colormap data");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "insufficient colormap data");
+
+ if (tiff->imagelength > UINT_MAX / tiff->imagewidth / (tiff->samplesperpixel + 2))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "image dimensions might overflow");
stride = tiff->imagewidth * (tiff->samplesperpixel + 2);
- samples = fz_malloc(tiff->ctx, stride * tiff->imagelength);
+ samples = fz_malloc(ctx, stride * tiff->imagelength);
for (y = 0; y < tiff->imagelength; y++)
{
@@ -330,12 +331,12 @@ fz_expand_tiff_colormap(struct tiff *tiff)
tiff->samplesperpixel += 2;
tiff->bitspersample = 8;
tiff->stride = stride;
- fz_free(tiff->ctx, tiff->samples);
+ fz_free(ctx, tiff->samples);
tiff->samples = samples;
}
static void
-fz_decode_tiff_strips(struct tiff *tiff)
+fz_decode_tiff_strips(fz_context *ctx, struct tiff *tiff)
{
fz_stream *stm;
@@ -354,40 +355,43 @@ fz_decode_tiff_strips(struct tiff *tiff)
unsigned i;
if (!tiff->rowsperstrip || !tiff->stripoffsets || !tiff->stripbytecounts)
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "no image data in tiff; maybe it is tiled");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "no image data in tiff; maybe it is tiled");
if (tiff->stripoffsetslen < (tiff->imagelength - 1) / tiff->rowsperstrip + 1 ||
tiff->stripbytecountslen < (tiff->imagelength - 1) / tiff->rowsperstrip + 1)
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "insufficient strip offset data");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "insufficient strip offset data");
if (tiff->planar != 1)
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "image data is not in chunky format");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "image data is not in chunky format");
+
+ if (tiff->imagelength > UINT_MAX / tiff->imagewidth / (tiff->samplesperpixel + 2) / (tiff->bitspersample / 8 + 1))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "image dimensions might overflow");
tiff->stride = (tiff->imagewidth * tiff->samplesperpixel * tiff->bitspersample + 7) / 8;
switch (tiff->photometric)
{
case 0: /* WhiteIsZero -- inverted */
- tiff->colorspace = fz_device_gray(tiff->ctx);
+ tiff->colorspace = fz_device_gray(ctx);
break;
case 1: /* BlackIsZero */
- tiff->colorspace = fz_device_gray(tiff->ctx);
+ tiff->colorspace = fz_device_gray(ctx);
break;
case 2: /* RGB */
- tiff->colorspace = fz_device_rgb(tiff->ctx);
+ tiff->colorspace = fz_device_rgb(ctx);
break;
case 3: /* RGBPal */
- tiff->colorspace = fz_device_rgb(tiff->ctx);
+ tiff->colorspace = fz_device_rgb(ctx);
break;
case 5: /* CMYK */
- tiff->colorspace = fz_device_cmyk(tiff->ctx);
+ tiff->colorspace = fz_device_cmyk(ctx);
break;
case 6: /* YCbCr */
/* it's probably a jpeg ... we let jpeg convert to rgb */
- tiff->colorspace = fz_device_rgb(tiff->ctx);
+ tiff->colorspace = fz_device_rgb(ctx);
break;
default:
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "unknown photometric: %d", tiff->photometric);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown photometric: %d", tiff->photometric);
}
switch (tiff->resolutionunit)
@@ -412,7 +416,7 @@ fz_decode_tiff_strips(struct tiff *tiff)
tiff->yresolution = 96;
}
- tiff->samples = fz_malloc_array(tiff->ctx, tiff->imagelength, tiff->stride);
+ tiff->samples = fz_malloc_array(ctx, tiff->imagelength, tiff->stride);
memset(tiff->samples, 0x55, tiff->imagelength * tiff->stride);
wp = tiff->samples;
@@ -428,7 +432,7 @@ fz_decode_tiff_strips(struct tiff *tiff)
wlen = tiff->samples + (unsigned int)(tiff->stride * tiff->imagelength) - wp;
if (rp + rlen > tiff->ep)
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "strip extends beyond the end of the file");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "strip extends beyond the end of the file");
/* the bits are in un-natural order */
if (tiff->fillorder == 2)
@@ -436,39 +440,39 @@ fz_decode_tiff_strips(struct tiff *tiff)
rp[i] = bitrev[rp[i]];
/* the strip decoders will close this */
- stm = fz_open_memory(tiff->ctx, rp, rlen);
+ stm = fz_open_memory(ctx, rp, rlen);
switch (tiff->compression)
{
case 1:
- fz_decode_tiff_uncompressed(tiff, stm, wp, wlen);
+ fz_decode_tiff_uncompressed(ctx, tiff, stm, wp, wlen);
break;
case 2:
- fz_decode_tiff_fax(tiff, 2, stm, wp, wlen);
+ fz_decode_tiff_fax(ctx, tiff, 2, stm, wp, wlen);
break;
case 3:
- fz_decode_tiff_fax(tiff, 3, stm, wp, wlen);
+ fz_decode_tiff_fax(ctx, tiff, 3, stm, wp, wlen);
break;
case 4:
- fz_decode_tiff_fax(tiff, 4, stm, wp, wlen);
+ fz_decode_tiff_fax(ctx, tiff, 4, stm, wp, wlen);
break;
case 5:
- fz_decode_tiff_lzw(tiff, stm, wp, wlen);
+ fz_decode_tiff_lzw(ctx, tiff, stm, wp, wlen);
break;
case 6:
- fz_warn(tiff->ctx, "deprecated JPEG in TIFF compression not fully supported");
+ fz_warn(ctx, "deprecated JPEG in TIFF compression not fully supported");
/* fall through */
case 7:
- fz_decode_tiff_jpeg(tiff, stm, wp, wlen);
+ fz_decode_tiff_jpeg(ctx, tiff, stm, wp, wlen);
break;
case 8:
- fz_decode_tiff_flate(tiff, stm, wp, wlen);
+ fz_decode_tiff_flate(ctx, tiff, stm, wp, wlen);
break;
case 32773:
- fz_decode_tiff_packbits(tiff, stm, wp, wlen);
+ fz_decode_tiff_packbits(ctx, tiff, stm, wp, wlen);
break;
default:
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "unknown TIFF compression: %d", tiff->compression);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown TIFF compression: %d", tiff->compression);
}
/* scramble the bits back into original order */
@@ -493,7 +497,7 @@ fz_decode_tiff_strips(struct tiff *tiff)
/* RGBPal */
if (tiff->photometric == 3 && tiff->colormap)
- fz_expand_tiff_colormap(tiff);
+ fz_expand_tiff_colormap(ctx, tiff);
/* WhiteIsZero .. invert */
if (tiff->photometric == 0)
@@ -584,7 +588,7 @@ fz_read_tiff_tag_value(unsigned *p, struct tiff *tiff, unsigned type, unsigned o
}
static void
-fz_read_tiff_tag(struct tiff *tiff, unsigned offset)
+fz_read_tiff_tag(fz_context *ctx, struct tiff *tiff, unsigned offset)
{
unsigned tag;
unsigned type;
@@ -662,7 +666,7 @@ fz_read_tiff_tag(struct tiff *tiff, unsigned offset)
break;
case ICCProfile:
- tiff->profile = fz_malloc(tiff->ctx, count);
+ tiff->profile = fz_malloc(ctx, count);
/* ICC profile data type is set to UNDEFINED.
* TBYTE reading not correct in fz_read_tiff_tag_value */
fz_read_tiff_bytes(tiff->profile, tiff, value, count);
@@ -675,19 +679,19 @@ fz_read_tiff_tag(struct tiff *tiff, unsigned offset)
break;
case StripOffsets:
- tiff->stripoffsets = fz_malloc_array(tiff->ctx, count, sizeof(unsigned));
+ tiff->stripoffsets = fz_malloc_array(ctx, count, sizeof(unsigned));
fz_read_tiff_tag_value(tiff->stripoffsets, tiff, type, value, count);
tiff->stripoffsetslen = count;
break;
case StripByteCounts:
- tiff->stripbytecounts = fz_malloc_array(tiff->ctx, count, sizeof(unsigned));
+ tiff->stripbytecounts = fz_malloc_array(ctx, count, sizeof(unsigned));
fz_read_tiff_tag_value(tiff->stripbytecounts, tiff, type, value, count);
tiff->stripbytecountslen = count;
break;
case ColorMap:
- tiff->colormap = fz_malloc_array(tiff->ctx, count, sizeof(unsigned));
+ tiff->colormap = fz_malloc_array(ctx, count, sizeof(unsigned));
fz_read_tiff_tag_value(tiff->colormap, tiff, type, value, count);
tiff->colormaplen = count;
break;
@@ -696,10 +700,10 @@ fz_read_tiff_tag(struct tiff *tiff, unsigned offset)
case TileLength:
case TileOffsets:
case TileByteCounts:
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "tiled tiffs not supported");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "tiled tiffs not supported");
default:
- /* fz_warn(tiff->ctx, "unknown tag: %d t=%d n=%d", tag, type, count); */
+ /* fz_warn(ctx, "unknown tag: %d t=%d n=%d", tag, type, count); */
break;
}
}
@@ -722,7 +726,6 @@ fz_decode_tiff_header(fz_context *ctx, struct tiff *tiff, unsigned char *buf, in
unsigned version;
memset(tiff, 0, sizeof(struct tiff));
- tiff->ctx = ctx;
tiff->bp = buf;
tiff->rp = buf;
tiff->ep = buf + len;
@@ -748,12 +751,12 @@ fz_decode_tiff_header(fz_context *ctx, struct tiff *tiff, unsigned char *buf, in
tiff->order = TII;
tiff->order = readshort(tiff);
if (tiff->order != TII && tiff->order != TMM)
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "not a TIFF file, wrong magic marker");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "not a TIFF file, wrong magic marker");
/* check version */
version = readshort(tiff);
if (version != 42)
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "not a TIFF file, wrong version marker");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "not a TIFF file, wrong version marker");
/* get offset of IFD */
tiff->ifd_offset = readlong(tiff);
@@ -767,12 +770,12 @@ fz_next_ifd(fz_context *ctx, struct tiff *tiff, unsigned offset)
tiff->rp = tiff->bp + offset;
if (tiff->rp <= tiff->bp || tiff->rp > tiff->ep)
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "invalid IFD offset %u", offset);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "invalid IFD offset %u", offset);
count = readshort(tiff);
if (count * 12 > (unsigned)(tiff->ep - tiff->rp))
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "overlarge IFD entry count %u", count);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "overlarge IFD entry count %u", count);
tiff->rp += count * 12;
offset = readlong(tiff);
@@ -790,13 +793,13 @@ fz_seek_ifd(fz_context *ctx, struct tiff *tiff, int subimage)
offset = fz_next_ifd(ctx, tiff, offset);
if (offset == 0)
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "subimage index %i out of range", subimage);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "subimage index %i out of range", subimage);
}
tiff->rp = tiff->bp + offset;
if (tiff->rp < tiff->bp || tiff->rp > tiff->ep)
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "invalid IFD offset %u", tiff->ifd_offset);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "invalid IFD offset %u", tiff->ifd_offset);
}
static void
@@ -811,12 +814,12 @@ fz_decode_tiff_ifd(fz_context *ctx, struct tiff *tiff)
count = readshort(tiff);
if (count * 12 > (unsigned)(tiff->ep - tiff->rp))
- fz_throw(tiff->ctx, FZ_ERROR_GENERIC, "overlarge IFD entry count %u", count);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "overlarge IFD entry count %u", count);
offset += 2;
for (i = 0; i < count; i++)
{
- fz_read_tiff_tag(tiff, offset);
+ fz_read_tiff_tag(ctx, tiff, offset);
offset += 12;
}
}
@@ -838,7 +841,7 @@ fz_load_tiff_subimage(fz_context *ctx, unsigned char *buf, int len, int subimage
if (tiff.rowsperstrip > tiff.imagelength)
tiff.rowsperstrip = tiff.imagelength;
- fz_decode_tiff_strips(&tiff);
+ fz_decode_tiff_strips(ctx, &tiff);
/* Byte swap 16-bit images to big endian if necessary */
if (tiff.bitspersample == 16)
@@ -846,11 +849,11 @@ fz_load_tiff_subimage(fz_context *ctx, unsigned char *buf, int len, int subimage
fz_swap_tiff_byte_order(tiff.samples, tiff.imagewidth * tiff.imagelength * tiff.samplesperpixel);
/* Expand into fz_pixmap struct */
- image = fz_new_pixmap(tiff.ctx, tiff.colorspace, tiff.imagewidth, tiff.imagelength);
+ image = fz_new_pixmap(ctx, tiff.colorspace, tiff.imagewidth, tiff.imagelength);
image->xres = tiff.xresolution;
image->yres = tiff.yresolution;
- fz_unpack_tile(image, tiff.samples, tiff.samplesperpixel, tiff.bitspersample, tiff.stride, 0);
+ fz_unpack_tile(ctx, image, tiff.samples, tiff.samplesperpixel, tiff.bitspersample, tiff.stride, 0);
/* We should only do this on non-pre-multiplied images, but files in the wild are bad */
if (tiff.extrasamples /* == 2 */)
@@ -858,8 +861,8 @@ fz_load_tiff_subimage(fz_context *ctx, unsigned char *buf, int len, int subimage
/* CMYK is a subtractive colorspace, we want additive for premul alpha */
if (image->n == 5)
{
- fz_pixmap *rgb = fz_new_pixmap(tiff.ctx, fz_device_rgb(ctx), image->w, image->h);
- fz_convert_pixmap(tiff.ctx, rgb, image);
+ fz_pixmap *rgb = fz_new_pixmap(ctx, fz_device_rgb(ctx), image->w, image->h);
+ fz_convert_pixmap(ctx, rgb, image);
rgb->xres = image->xres;
rgb->yres = image->yres;
fz_drop_pixmap(ctx, image);
diff --git a/source/fitz/outline.c b/source/fitz/outline.c
index e26fd378..07a27001 100644
--- a/source/fitz/outline.c
+++ b/source/fitz/outline.c
@@ -1,34 +1,34 @@
#include "mupdf/fitz.h"
void
-fz_free_outline(fz_context *ctx, fz_outline *outline)
+fz_drop_outline(fz_context *ctx, fz_outline *outline)
{
while (outline)
{
fz_outline *next = outline->next;
- fz_free_outline(ctx, outline->down);
+ fz_drop_outline(ctx, outline->down);
fz_free(ctx, outline->title);
- fz_free_link_dest(ctx, &outline->dest);
+ fz_drop_link_dest(ctx, &outline->dest);
fz_free(ctx, outline);
outline = next;
}
}
static void
-do_debug_outline_xml(fz_output *out, fz_outline *outline, int level)
+fz_debug_outline_xml_imp(fz_context *ctx, fz_output *out, fz_outline *outline, int level)
{
while (outline)
{
- fz_printf(out, "<outline title=\"%s\" page=\"%d\"", outline->title, outline->dest.kind == FZ_LINK_GOTO ? outline->dest.ld.gotor.page + 1 : 0);
+ fz_printf(ctx, out, "<outline title=\"%s\" page=\"%d\"", outline->title, outline->dest.kind == FZ_LINK_GOTO ? outline->dest.ld.gotor.page + 1 : 0);
if (outline->down)
{
- fz_printf(out, ">\n");
- do_debug_outline_xml(out, outline->down, level + 1);
- fz_printf(out, "</outline>\n");
+ fz_printf(ctx, out, ">\n");
+ fz_debug_outline_xml_imp(ctx, out, outline->down, level + 1);
+ fz_printf(ctx, out, "</outline>\n");
}
else
{
- fz_printf(out, " />\n");
+ fz_printf(ctx, out, " />\n");
}
outline = outline->next;
}
@@ -37,20 +37,20 @@ do_debug_outline_xml(fz_output *out, fz_outline *outline, int level)
void
fz_print_outline_xml(fz_context *ctx, fz_output *out, fz_outline *outline)
{
- do_debug_outline_xml(out, outline, 0);
+ fz_debug_outline_xml_imp(ctx, out, outline, 0);
}
static void
-do_debug_outline(fz_output *out, fz_outline *outline, int level)
+fz_print_outline_imp(fz_context *ctx, fz_output *out, fz_outline *outline, int level)
{
int i;
while (outline)
{
for (i = 0; i < level; i++)
- fz_printf(out, "\t");
- fz_printf(out, "%s\t%d\n", outline->title, outline->dest.kind == FZ_LINK_GOTO ? outline->dest.ld.gotor.page + 1 : 0);
+ fz_printf(ctx, out, "\t");
+ fz_printf(ctx, out, "%s\t%d\n", outline->title, outline->dest.kind == FZ_LINK_GOTO ? outline->dest.ld.gotor.page + 1 : 0);
if (outline->down)
- do_debug_outline(out, outline->down, level + 1);
+ fz_print_outline_imp(ctx, out, outline->down, level + 1);
outline = outline->next;
}
}
@@ -58,5 +58,5 @@ do_debug_outline(fz_output *out, fz_outline *outline, int level)
void
fz_print_outline(fz_context *ctx, fz_output *out, fz_outline *outline)
{
- do_debug_outline(out, outline, 0);
+ fz_print_outline_imp(ctx, out, outline, 0);
}
diff --git a/source/fitz/output-pcl.c b/source/fitz/output-pcl.c
index 0eeab8d3..a6dcc23b 100644
--- a/source/fitz/output-pcl.c
+++ b/source/fitz/output-pcl.c
@@ -302,7 +302,7 @@ make_init(fz_pcl_options *pcl, char *buf, unsigned long len, const char *str, in
}
static void
-pcl_header(fz_output *out, fz_pcl_options *pcl, int num_copies, int xres)
+pcl_header(fz_context *ctx, fz_output *out, fz_pcl_options *pcl, int num_copies, int xres)
{
char odd_page_init[80];
char even_page_init[80];
@@ -313,12 +313,12 @@ pcl_header(fz_output *out, fz_pcl_options *pcl, int num_copies, int xres)
if (pcl->page_count == 0)
{
if (pcl->features & HACK__IS_A_LJET4PJL)
- fz_puts(out, "\033%-12345X@PJL\r\n@PJL ENTER LANGUAGE = PCL\r\n");
- fz_puts(out, "\033E"); /* reset printer */
+ fz_puts(ctx, out, "\033%-12345X@PJL\r\n@PJL ENTER LANGUAGE = PCL\r\n");
+ fz_puts(ctx, out, "\033E"); /* reset printer */
/* If the printer supports it, set the paper size */
/* based on the actual requested size. */
if (pcl->features & PCL_CAN_SET_PAPER_SIZE)
- fz_printf(out, "\033&l%dA", pcl->paper_size);
+ fz_printf(ctx, out, "\033&l%dA", pcl->paper_size);
/* If printer can duplex, set duplex mode appropriately. */
if (pcl->features & PCL_HAS_DUPLEX)
{
@@ -327,17 +327,17 @@ pcl_header(fz_output *out, fz_pcl_options *pcl, int num_copies, int xres)
if (pcl->duplex)
{
if (!pcl->tumble)
- fz_puts(out, "\033&l1S");
+ fz_puts(ctx, out, "\033&l1S");
else
- fz_puts(out, "\033&l2S");
+ fz_puts(ctx, out, "\033&l2S");
}
else
- fz_puts(out, "\033&l0S");
+ fz_puts(ctx, out, "\033&l0S");
}
else
{
/* default to duplex for this printer */
- fz_puts(out, "\033&l1S");
+ fz_puts(ctx, out, "\033&l1S");
}
}
}
@@ -360,58 +360,55 @@ pcl_header(fz_output *out, fz_pcl_options *pcl, int num_copies, int xres)
{
if (pcl->page_count != 0 && (pcl->features & PCL_CAN_SET_PAPER_SIZE))
{
- fz_printf(out, "\033&l%dA", pcl->paper_size);
+ fz_printf(ctx, out, "\033&l%dA", pcl->paper_size);
}
- fz_puts(out, "\033&l0o0l0E");
- fz_puts(out, pcl->odd_page_init);
+ fz_puts(ctx, out, "\033&l0o0l0E");
+ fz_puts(ctx, out, pcl->odd_page_init);
}
else
- fz_puts(out, pcl->even_page_init);
+ fz_puts(ctx, out, pcl->even_page_init);
}
else
{
if (pcl->features & PCL_CAN_SET_PAPER_SIZE)
{
- fz_printf(out, "\033&l%dA", pcl->paper_size);
+ fz_printf(ctx, out, "\033&l%dA", pcl->paper_size);
}
- fz_puts(out, "\033&l0o0l0E");
- fz_puts(out, pcl->odd_page_init);
+ fz_puts(ctx, out, "\033&l0o0l0E");
+ fz_puts(ctx, out, pcl->odd_page_init);
}
- fz_printf(out, "\033&l%dX", num_copies); /* # of copies */
+ fz_printf(ctx, out, "\033&l%dX", num_copies); /* # of copies */
/* End raster graphics, position cursor at top. */
- fz_puts(out, "\033*rB\033*p0x0Y");
+ fz_puts(ctx, out, "\033*rB\033*p0x0Y");
/* The DeskJet and DeskJet Plus reset everything upon */
/* receiving \033*rB, so we must reinitialize graphics mode. */
if (pcl->features & PCL_END_GRAPHICS_DOES_RESET)
{
- fz_puts(out, pcl->odd_page_init); /* Assume this does the right thing */
- fz_printf(out, "\033&l%dX", num_copies); /* # of copies */
+ fz_puts(ctx, out, pcl->odd_page_init); /* Assume this does the right thing */
+ fz_printf(ctx, out, "\033&l%dX", num_copies); /* # of copies */
}
/* Set resolution. */
- fz_printf(out, "\033*t%dR", xres);
+ fz_printf(ctx, out, "\033*t%dR", xres);
pcl->page_count++;
}
void
-fz_output_pcl(fz_output *out, const fz_pixmap *pixmap, fz_pcl_options *pcl)
+fz_output_pcl(fz_context *ctx, fz_output *out, const fz_pixmap *pixmap, fz_pcl_options *pcl)
{
//unsigned char *sp;
//int y, x, sn, dn, ss;
- fz_context *ctx;
if (!out || !pixmap)
return;
- ctx = out->ctx;
-
if (pixmap->n != 1 && pixmap->n != 2 && pixmap->n != 4)
fz_throw(ctx, FZ_ERROR_GENERIC, "pixmap must be grayscale or rgb to write as pcl");
- pcl_header(out, pcl, 1, pixmap->xres);
+ pcl_header(ctx, out, pcl, 1, pixmap->xres);
#if 0
sn = pixmap->n;
@@ -464,7 +461,7 @@ fz_output_pcl(fz_output *out, const fz_pixmap *pixmap, fz_pcl_options *pcl)
break;
}
fz_write_byte(out, xrep-1);
- fz_write(out, sp, dn);
+ fz_write(ctx, out, sp, dn);
sp += sn*xrep;
x += xrep;
}
@@ -474,7 +471,7 @@ fz_output_pcl(fz_output *out, const fz_pixmap *pixmap, fz_pcl_options *pcl)
x += d;
while (d > 0)
{
- fz_write(out, sp, dn);
+ fz_write(ctx, out, sp, dn);
sp += sn;
d--;
}
@@ -593,11 +590,10 @@ void wind(void)
{}
void
-fz_output_pcl_bitmap(fz_output *out, const fz_bitmap *bitmap, fz_pcl_options *pcl)
+fz_output_pcl_bitmap(fz_context *ctx, fz_output *out, const fz_bitmap *bitmap, fz_pcl_options *pcl)
{
unsigned char *data, *out_data;
int y, ss, rmask, line_size;
- fz_context *ctx;
int num_blank_lines;
int compression = -1;
unsigned char *prev_row = NULL;
@@ -610,15 +606,13 @@ fz_output_pcl_bitmap(fz_output *out, const fz_bitmap *bitmap, fz_pcl_options *pc
if (!out || !bitmap)
return;
- ctx = out->ctx;
-
if (pcl->features & HACK__IS_A_OCE9050)
{
/* Enter HPGL/2 mode, begin plot, Initialise (start plot), Enter PCL mode */
- fz_puts(out, "\033%1BBPIN;\033%1A");
+ fz_puts(ctx, out, "\033%1BBPIN;\033%1A");
}
- pcl_header(out, pcl, 1, bitmap->xres);
+ pcl_header(ctx, out, pcl, 1, bitmap->xres);
fz_var(prev_row);
fz_var(out_row_mode_2);
@@ -663,23 +657,23 @@ fz_output_pcl_bitmap(fz_output *out, const fz_bitmap *bitmap, fz_pcl_options *pc
if (pcl->features & PCL_ANY_SPACING)
{
if (num_blank_lines > 0)
- fz_printf(out, "\033*p+%dY", num_blank_lines * bitmap->yres);
+ fz_printf(ctx, out, "\033*p+%dY", num_blank_lines * bitmap->yres);
/* Start raster graphics. */
- fz_puts(out, "\033*r1A");
+ fz_puts(ctx, out, "\033*r1A");
}
else if (pcl->features & PCL_MODE_3_COMPRESSION)
{
/* Start raster graphics. */
- fz_puts(out, "\033*r1A");
+ fz_puts(ctx, out, "\033*r1A");
for (; num_blank_lines; num_blank_lines--)
- fz_puts(out, "\033*b0W");
+ fz_puts(ctx, out, "\033*b0W");
}
else
{
/* Start raster graphics. */
- fz_puts(out, "\033*r1A");
+ fz_puts(ctx, out, "\033*r1A");
for (; num_blank_lines; num_blank_lines--)
- fz_puts(out, "\033*bW");
+ fz_puts(ctx, out, "\033*bW");
}
}
@@ -701,30 +695,30 @@ fz_output_pcl_bitmap(fz_output *out, const fz_bitmap *bitmap, fz_pcl_options *pc
if (mode_3ns && compression != 2)
{
/* Switch to mode 2 */
- fz_puts(out, from3to2);
+ fz_puts(ctx, out, from3to2);
compression = 2;
}
if (pcl->features & PCL_MODE_3_COMPRESSION)
{
/* Must clear the seed row. */
- fz_puts(out, "\033*b1Y");
+ fz_puts(ctx, out, "\033*b1Y");
num_blank_lines--;
}
if (mode_3ns)
{
for (; num_blank_lines; num_blank_lines--)
- fz_puts(out, "\033*b0W");
+ fz_puts(ctx, out, "\033*b0W");
}
else
{
for (; num_blank_lines; num_blank_lines--)
- fz_puts(out, "\033*bW");
+ fz_puts(ctx, out, "\033*bW");
}
}
else if (pcl->features & PCL3_SPACING)
- fz_printf(out, "\033*p+%dY", num_blank_lines * bitmap->yres);
+ fz_printf(ctx, out, "\033*p+%dY", num_blank_lines * bitmap->yres);
else
- fz_printf(out, "\033*b%dY", num_blank_lines);
+ fz_printf(ctx, out, "\033*b%dY", num_blank_lines);
/* Clear the seed row (only matters for mode 3 compression). */
memset(prev_row, 0, line_size);
}
@@ -744,7 +738,7 @@ fz_output_pcl_bitmap(fz_output *out, const fz_bitmap *bitmap, fz_pcl_options *pc
if (count3 + penalty3 < count2 + penalty2)
{
if (compression != 3)
- fz_puts(out, from2to3);
+ fz_puts(ctx, out, from2to3);
compression = 3;
out_data = (unsigned char *)out_row_mode_3;
out_count = count3;
@@ -752,7 +746,7 @@ fz_output_pcl_bitmap(fz_output *out, const fz_bitmap *bitmap, fz_pcl_options *pc
else
{
if (compression != 2)
- fz_puts(out, from3to2);
+ fz_puts(ctx, out, from3to2);
compression = 2;
out_data = (unsigned char *)out_row_mode_2;
out_count = count2;
@@ -770,17 +764,17 @@ fz_output_pcl_bitmap(fz_output *out, const fz_bitmap *bitmap, fz_pcl_options *pc
}
/* Transfer the data */
- fz_printf(out, "\033*b%dW", out_count);
- fz_write(out, out_data, out_count);
+ fz_printf(ctx, out, "\033*b%dW", out_count);
+ fz_write(ctx, out, out_data, out_count);
}
/* end raster graphics and eject page */
- fz_puts(out, "\033*rB\f");
+ fz_puts(ctx, out, "\033*rB\f");
if (pcl->features & HACK__IS_A_OCE9050)
{
/* Pen up, pen select, advance full page, reset */
- fz_puts(out, "\033%1BPUSP0PG;\033E");
+ fz_puts(ctx, out, "\033%1BPUSP0PG;\033E");
}
}
fz_always(ctx)
@@ -811,13 +805,12 @@ fz_write_pcl(fz_context *ctx, fz_pixmap *pixmap, char *filename, int append, fz_
fz_try(ctx)
{
- out = fz_new_output_with_file(ctx, fp);
- fz_output_pcl(out, pixmap, pcl);
+ out = fz_new_output_with_file(ctx, fp, 1);
+ fz_output_pcl(ctx, out, pixmap, pcl);
}
fz_always(ctx)
{
- fz_close_output(out);
- fclose(fp);
+ fz_drop_output(ctx, out);
}
fz_catch(ctx)
{
@@ -841,13 +834,12 @@ fz_write_pcl_bitmap(fz_context *ctx, fz_bitmap *bitmap, char *filename, int appe
fz_try(ctx)
{
- out = fz_new_output_with_file(ctx, fp);
- fz_output_pcl_bitmap(out, bitmap, pcl);
+ out = fz_new_output_with_file(ctx, fp, 1);
+ fz_output_pcl_bitmap(ctx, out, bitmap, pcl);
}
fz_always(ctx)
{
- fz_close_output(out);
- fclose(fp);
+ fz_drop_output(ctx, out);
}
fz_catch(ctx)
{
diff --git a/source/fitz/output-pwg.c b/source/fitz/output-pwg.c
index c6d1a0b5..4af67c25 100644
--- a/source/fitz/output-pwg.c
+++ b/source/fitz/output-pwg.c
@@ -1,103 +1,100 @@
#include "mupdf/fitz.h"
void
-fz_output_pwg_file_header(fz_output *out)
+fz_output_pwg_file_header(fz_context *ctx, fz_output *out)
{
static const unsigned char pwgsig[4] = { 'R', 'a', 'S', '2' };
/* Sync word */
- fz_write(out, pwgsig, 4);
+ fz_write(ctx, out, pwgsig, 4);
}
static void
-output_header(fz_output *out, const fz_pwg_options *pwg, int xres, int yres, int w, int h, int bpp)
+output_header(fz_context *ctx, fz_output *out, const fz_pwg_options *pwg, int xres, int yres, int w, int h, int bpp)
{
static const char zero[64] = { 0 };
int i;
/* Page Header: */
- fz_write(out, pwg ? pwg->media_class : zero, 64);
- fz_write(out, pwg ? pwg->media_color : zero, 64);
- fz_write(out, pwg ? pwg->media_type : zero, 64);
- fz_write(out, pwg ? pwg->output_type : zero, 64);
- fz_write_int32be(out, pwg ? pwg->advance_distance : 0);
- fz_write_int32be(out, pwg ? pwg->advance_media : 0);
- fz_write_int32be(out, pwg ? pwg->collate : 0);
- fz_write_int32be(out, pwg ? pwg->cut_media : 0);
- fz_write_int32be(out, pwg ? pwg->duplex : 0);
- fz_write_int32be(out, xres);
- fz_write_int32be(out, yres);
+ fz_write(ctx, out, pwg ? pwg->media_class : zero, 64);
+ fz_write(ctx, out, pwg ? pwg->media_color : zero, 64);
+ fz_write(ctx, out, pwg ? pwg->media_type : zero, 64);
+ fz_write(ctx, out, pwg ? pwg->output_type : zero, 64);
+ fz_write_int32be(ctx, out, pwg ? pwg->advance_distance : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->advance_media : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->collate : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->cut_media : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->duplex : 0);
+ fz_write_int32be(ctx, out, xres);
+ fz_write_int32be(ctx, out, yres);
/* CUPS format says that 284->300 are supposed to be the bbox of the
* page in points. PWG says 'Reserved'. */
for (i=284; i < 300; i += 4)
- fz_write(out, zero, 4);
- fz_write_int32be(out, pwg ? pwg->insert_sheet : 0);
- fz_write_int32be(out, pwg ? pwg->jog : 0);
- fz_write_int32be(out, pwg ? pwg->leading_edge : 0);
+ fz_write(ctx, out, zero, 4);
+ fz_write_int32be(ctx, out, pwg ? pwg->insert_sheet : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->jog : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->leading_edge : 0);
/* CUPS format says that 312->320 are supposed to be the margins of
* the lower left hand edge of page in points. PWG says 'Reserved'. */
for (i=312; i < 320; i += 4)
- fz_write(out, zero, 4);
- fz_write_int32be(out, pwg ? pwg->manual_feed : 0);
- fz_write_int32be(out, pwg ? pwg->media_position : 0);
- fz_write_int32be(out, pwg ? pwg->media_weight : 0);
- fz_write_int32be(out, pwg ? pwg->mirror_print : 0);
- fz_write_int32be(out, pwg ? pwg->negative_print : 0);
- fz_write_int32be(out, pwg ? pwg->num_copies : 0);
- fz_write_int32be(out, pwg ? pwg->orientation : 0);
- fz_write_int32be(out, pwg ? pwg->output_face_up : 0);
- fz_write_int32be(out, w * 72/ xres); /* Page size in points */
- fz_write_int32be(out, h * 72/ yres);
- fz_write_int32be(out, pwg ? pwg->separations : 0);
- fz_write_int32be(out, pwg ? pwg->tray_switch : 0);
- fz_write_int32be(out, pwg ? pwg->tumble : 0);
- fz_write_int32be(out, w); /* Page image in pixels */
- fz_write_int32be(out, h);
- fz_write_int32be(out, pwg ? pwg->media_type_num : 0);
- fz_write_int32be(out, bpp < 8 ? 1 : 8); /* Bits per color */
- fz_write_int32be(out, bpp); /* Bits per pixel */
- fz_write_int32be(out, (w * bpp + 7)/8); /* Bytes per line */
- fz_write_int32be(out, 0); /* Chunky pixels */
+ fz_write(ctx, out, zero, 4);
+ fz_write_int32be(ctx, out, pwg ? pwg->manual_feed : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->media_position : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->media_weight : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->mirror_print : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->negative_print : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->num_copies : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->orientation : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->output_face_up : 0);
+ fz_write_int32be(ctx, out, w * 72/ xres); /* Page size in points */
+ fz_write_int32be(ctx, out, h * 72/ yres);
+ fz_write_int32be(ctx, out, pwg ? pwg->separations : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->tray_switch : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->tumble : 0);
+ fz_write_int32be(ctx, out, w); /* Page image in pixels */
+ fz_write_int32be(ctx, out, h);
+ fz_write_int32be(ctx, out, pwg ? pwg->media_type_num : 0);
+ fz_write_int32be(ctx, out, bpp < 8 ? 1 : 8); /* Bits per color */
+ fz_write_int32be(ctx, out, bpp); /* Bits per pixel */
+ fz_write_int32be(ctx, out, (w * bpp + 7)/8); /* Bytes per line */
+ fz_write_int32be(ctx, out, 0); /* Chunky pixels */
switch (bpp)
{
- case 1: fz_write_int32be(out, 3); /* Black */ break;
- case 8: fz_write_int32be(out, 18); /* Sgray */ break;
- case 24: fz_write_int32be(out, 19); /* Srgb */ break;
- case 32: fz_write_int32be(out, 6); /* Cmyk */ break;
- default: fz_throw(out->ctx, FZ_ERROR_GENERIC, "pixmap bpp must be 1, 8, 24 or 32 to write as pwg");
+ case 1: fz_write_int32be(ctx, out, 3); /* Black */ break;
+ case 8: fz_write_int32be(ctx, out, 18); /* Sgray */ break;
+ case 24: fz_write_int32be(ctx, out, 19); /* Srgb */ break;
+ case 32: fz_write_int32be(ctx, out, 6); /* Cmyk */ break;
+ default: fz_throw(ctx, FZ_ERROR_GENERIC, "pixmap bpp must be 1, 8, 24 or 32 to write as pwg");
}
- fz_write_int32be(out, pwg ? pwg->compression : 0);
- fz_write_int32be(out, pwg ? pwg->row_count : 0);
- fz_write_int32be(out, pwg ? pwg->row_feed : 0);
- fz_write_int32be(out, pwg ? pwg->row_step : 0);
- fz_write_int32be(out, bpp <= 8 ? 1 : 3); /* Num Colors */
+ fz_write_int32be(ctx, out, pwg ? pwg->compression : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->row_count : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->row_feed : 0);
+ fz_write_int32be(ctx, out, pwg ? pwg->row_step : 0);
+ fz_write_int32be(ctx, out, bpp <= 8 ? 1 : 3); /* Num Colors */
for (i=424; i < 452; i += 4)
- fz_write(out, zero, 4);
- fz_write_int32be(out, 1); /* TotalPageCount */
- fz_write_int32be(out, 1); /* CrossFeedTransform */
- fz_write_int32be(out, 1); /* FeedTransform */
- fz_write_int32be(out, 0); /* ImageBoxLeft */
- fz_write_int32be(out, 0); /* ImageBoxTop */
- fz_write_int32be(out, w); /* ImageBoxRight */
- fz_write_int32be(out, h); /* ImageBoxBottom */
+ fz_write(ctx, out, zero, 4);
+ fz_write_int32be(ctx, out, 1); /* TotalPageCount */
+ fz_write_int32be(ctx, out, 1); /* CrossFeedTransform */
+ fz_write_int32be(ctx, out, 1); /* FeedTransform */
+ fz_write_int32be(ctx, out, 0); /* ImageBoxLeft */
+ fz_write_int32be(ctx, out, 0); /* ImageBoxTop */
+ fz_write_int32be(ctx, out, w); /* ImageBoxRight */
+ fz_write_int32be(ctx, out, h); /* ImageBoxBottom */
for (i=480; i < 1668; i += 4)
- fz_write(out, zero, 4);
- fz_write(out, pwg ? pwg->rendering_intent : zero, 64);
- fz_write(out, pwg ? pwg->page_size_name : zero, 64);
+ fz_write(ctx, out, zero, 4);
+ fz_write(ctx, out, pwg ? pwg->rendering_intent : zero, 64);
+ fz_write(ctx, out, pwg ? pwg->page_size_name : zero, 64);
}
void
-fz_output_pwg_page(fz_output *out, const fz_pixmap *pixmap, const fz_pwg_options *pwg)
+fz_output_pwg_page(fz_context *ctx, fz_output *out, const fz_pixmap *pixmap, const fz_pwg_options *pwg)
{
unsigned char *sp;
int y, x, sn, dn, ss;
- fz_context *ctx;
if (!out || !pixmap)
return;
- ctx = out->ctx;
-
if (pixmap->n != 1 && pixmap->n != 2 && pixmap->n != 4 && pixmap->n != 5)
fz_throw(ctx, FZ_ERROR_GENERIC, "pixmap must be grayscale, rgb or cmyk to write as pwg");
@@ -106,7 +103,7 @@ fz_output_pwg_page(fz_output *out, const fz_pixmap *pixmap, const fz_pwg_options
if (dn > 1)
dn--;
- output_header(out, pwg, pixmap->xres, pixmap->yres, pixmap->w, pixmap->h, dn*8);
+ output_header(ctx, out, pwg, pixmap->xres, pixmap->yres, pixmap->w, pixmap->h, dn*8);
/* Now output the actual bitmap, using a packbits like compression */
sp = pixmap->samples;
@@ -124,7 +121,7 @@ fz_output_pwg_page(fz_output *out, const fz_pixmap *pixmap, const fz_pwg_options
if (memcmp(sp, sp + yrep * ss, ss) != 0)
break;
}
- fz_write_byte(out, yrep-1);
+ fz_write_byte(ctx, out, yrep-1);
/* Encode the line */
x = 0;
@@ -152,18 +149,18 @@ fz_output_pwg_page(fz_output *out, const fz_pixmap *pixmap, const fz_pwg_options
if (memcmp(sp, sp + xrep*sn, sn) != 0)
break;
}
- fz_write_byte(out, xrep-1);
- fz_write(out, sp, dn);
+ fz_write_byte(ctx, out, xrep-1);
+ fz_write(ctx, out, sp, dn);
sp += sn*xrep;
x += xrep;
}
else
{
- fz_write_byte(out, 257-d);
+ fz_write_byte(ctx, out, 257-d);
x += d;
while (d > 0)
{
- fz_write(out, sp, dn);
+ fz_write(ctx, out, sp, dn);
sp += sn;
d--;
}
@@ -177,7 +174,7 @@ fz_output_pwg_page(fz_output *out, const fz_pixmap *pixmap, const fz_pwg_options
}
void
-fz_output_pwg_bitmap_page(fz_output *out, const fz_bitmap *bitmap, const fz_pwg_options *pwg)
+fz_output_pwg_bitmap_page(fz_context *ctx, fz_output *out, const fz_bitmap *bitmap, const fz_pwg_options *pwg)
{
unsigned char *sp;
int y, x, ss;
@@ -186,7 +183,7 @@ fz_output_pwg_bitmap_page(fz_output *out, const fz_bitmap *bitmap, const fz_pwg_
if (!out || !bitmap)
return;
- output_header(out, pwg, bitmap->xres, bitmap->yres, bitmap->w, bitmap->h, 1);
+ output_header(ctx, out, pwg, bitmap->xres, bitmap->yres, bitmap->w, bitmap->h, 1);
/* Now output the actual bitmap, using a packbits like compression */
sp = bitmap->samples;
@@ -205,7 +202,7 @@ fz_output_pwg_bitmap_page(fz_output *out, const fz_bitmap *bitmap, const fz_pwg_
if (memcmp(sp, sp + yrep * ss, byte_width) != 0)
break;
}
- fz_write_byte(out, yrep-1);
+ fz_write_byte(ctx, out, yrep-1);
/* Encode the line */
x = 0;
@@ -233,15 +230,15 @@ fz_output_pwg_bitmap_page(fz_output *out, const fz_bitmap *bitmap, const fz_pwg_
if (sp[0] != sp[xrep])
break;
}
- fz_write_byte(out, xrep-1);
- fz_write(out, sp, 1);
+ fz_write_byte(ctx, out, xrep-1);
+ fz_write(ctx, out, sp, 1);
sp += xrep;
x += xrep;
}
else
{
- fz_write_byte(out, 257-d);
- fz_write(out, sp, d);
+ fz_write_byte(ctx, out, 257-d);
+ fz_write(ctx, out, sp, d);
sp += d;
x += d;
}
@@ -254,10 +251,10 @@ fz_output_pwg_bitmap_page(fz_output *out, const fz_bitmap *bitmap, const fz_pwg_
}
void
-fz_output_pwg(fz_output *out, const fz_pixmap *pixmap, const fz_pwg_options *pwg)
+fz_output_pwg(fz_context *ctx, fz_output *out, const fz_pixmap *pixmap, const fz_pwg_options *pwg)
{
- fz_output_pwg_file_header(out);
- fz_output_pwg_page(out, pixmap, pwg);
+ fz_output_pwg_file_header(ctx, out);
+ fz_output_pwg_page(ctx, out, pixmap, pwg);
}
void
@@ -276,15 +273,14 @@ fz_write_pwg(fz_context *ctx, fz_pixmap *pixmap, char *filename, int append, con
fz_try(ctx)
{
- out = fz_new_output_with_file(ctx, fp);
+ out = fz_new_output_with_file(ctx, fp, 1);
if (!append)
- fz_output_pwg_file_header(out);
- fz_output_pwg_page(out, pixmap, pwg);
+ fz_output_pwg_file_header(ctx, out);
+ fz_output_pwg_page(ctx, out, pixmap, pwg);
}
fz_always(ctx)
{
- fz_close_output(out);
- fclose(fp);
+ fz_drop_output(ctx, out);
}
fz_catch(ctx)
{
@@ -308,15 +304,14 @@ fz_write_pwg_bitmap(fz_context *ctx, fz_bitmap *bitmap, char *filename, int appe
fz_try(ctx)
{
- out = fz_new_output_with_file(ctx, fp);
+ out = fz_new_output_with_file(ctx, fp, 1);
if (!append)
- fz_output_pwg_file_header(out);
- fz_output_pwg_bitmap_page(out, bitmap, pwg);
+ fz_output_pwg_file_header(ctx, out);
+ fz_output_pwg_bitmap_page(ctx, out, bitmap, pwg);
}
fz_always(ctx)
{
- fz_close_output(out);
- fclose(fp);
+ fz_drop_output(ctx, out);
}
fz_catch(ctx)
{
diff --git a/source/fitz/output.c b/source/fitz/output.c
index fe63de92..52381377 100644
--- a/source/fitz/output.c
+++ b/source/fitz/output.c
@@ -1,44 +1,42 @@
#include "mupdf/fitz.h"
-void fz_rebind_output(fz_output *out, fz_context *ctx)
+struct fz_output_s
{
- if (out != NULL)
- out->ctx = ctx;
-}
+ void *opaque;
+ int (*printf)(fz_context *, void *opaque, const char *, va_list ap);
+ int (*write)(fz_context *, void *opaque, const void *, int n);
+ void (*close)(fz_context *, void *opaque);
+};
static int
-file_printf(fz_output *out, const char *fmt, va_list ap)
+file_printf(fz_context *ctx, void *opaque, const char *fmt, va_list ap)
{
- FILE *file = (FILE *)out->opaque;
-
- return fz_vfprintf(out->ctx, file, fmt, ap);
+ FILE *file = opaque;
+ return fz_vfprintf(ctx, file, fmt, ap);
}
static int
-file_write(fz_output *out, const void *buffer, int count)
+file_write(fz_context *ctx, void *opaque, const void *buffer, int count)
{
- FILE *file = (FILE *)out->opaque;
-
+ FILE *file = opaque;
return fwrite(buffer, 1, count, file);
}
static void
-file_close(fz_output *out)
+file_close(fz_context *ctx, void *opaque)
{
- FILE *file = (FILE *)out->opaque;
-
+ FILE *file = opaque;
fclose(file);
}
fz_output *
-fz_new_output_with_file(fz_context *ctx, FILE *file)
+fz_new_output_with_file(fz_context *ctx, FILE *file, int close)
{
fz_output *out = fz_malloc_struct(ctx, fz_output);
- out->ctx = ctx;
out->opaque = file;
out->printf = file_printf;
out->write = file_write;
- out->close = NULL;
+ out->close = close ? file_close : NULL;
return out;
}
@@ -56,7 +54,6 @@ fz_new_output_to_filename(fz_context *ctx, const char *filename)
fz_try(ctx)
{
out = fz_malloc_struct(ctx, fz_output);
- out->ctx = ctx;
out->opaque = file;
out->printf = file_printf;
out->write = file_write;
@@ -71,17 +68,17 @@ fz_new_output_to_filename(fz_context *ctx, const char *filename)
}
void
-fz_close_output(fz_output *out)
+fz_drop_output(fz_context *ctx, fz_output *out)
{
if (!out)
return;
if (out->close)
- out->close(out);
- fz_free(out->ctx, out);
+ out->close(ctx, out->opaque);
+ fz_free(ctx, out);
}
int
-fz_printf(fz_output *out, const char *fmt, ...)
+fz_printf(fz_context *ctx, fz_output *out, const char *fmt, ...)
{
int ret;
va_list ap;
@@ -90,60 +87,64 @@ fz_printf(fz_output *out, const char *fmt, ...)
return 0;
va_start(ap, fmt);
- ret = out->printf(out, fmt, ap);
+ ret = out->printf(ctx, out->opaque, fmt, ap);
va_end(ap);
return ret;
}
int
-fz_write(fz_output *out, const void *data, int len)
+fz_write(fz_context *ctx, fz_output *out, const void *data, int len)
{
if (!out)
return 0;
- return out->write(out, data, len);
+ return out->write(ctx, out->opaque, data, len);
}
void
-fz_putc(fz_output *out, char c)
+fz_putc(fz_context *ctx, fz_output *out, char c)
{
if (out)
- (void)out->write(out, &c, 1);
+ (void)out->write(ctx, out->opaque, &c, 1);
}
int
-fz_puts(fz_output *out, const char *str)
+fz_puts(fz_context *ctx, fz_output *out, const char *str)
{
if (!out)
return 0;
- return out->write(out, str, strlen(str));
+ return out->write(ctx, out->opaque, str, strlen(str));
}
static int
-buffer_printf(fz_output *out, const char *fmt, va_list list)
+buffer_printf(fz_context *ctx, void *opaque, const char *fmt, va_list list)
{
- fz_buffer *buffer = (fz_buffer *)out->opaque;
-
- return fz_buffer_vprintf(out->ctx, buffer, fmt, list);
+ fz_buffer *buffer = opaque;
+ return fz_buffer_vprintf(ctx, buffer, fmt, list);
}
static int
-buffer_write(fz_output *out, const void *data, int len)
+buffer_write(fz_context *ctx, void *opaque, const void *data, int len)
{
- fz_buffer *buffer = (fz_buffer *)out->opaque;
-
- fz_write_buffer(out->ctx, buffer, (unsigned char *)data, len);
+ fz_buffer *buffer = opaque;
+ fz_write_buffer(ctx, buffer, (unsigned char *)data, len);
return len;
}
+static void
+buffer_close(fz_context *ctx, void *opaque)
+{
+ fz_buffer *buffer = opaque;
+ fz_drop_buffer(ctx, buffer);
+}
+
fz_output *
fz_new_output_with_buffer(fz_context *ctx, fz_buffer *buf)
{
fz_output *out = fz_malloc_struct(ctx, fz_output);
- out->ctx = ctx;
- out->opaque = buf;
+ out->opaque = fz_keep_buffer(ctx, buf);
out->printf = buffer_printf;
out->write = buffer_write;
- out->close = NULL;
+ out->close = buffer_close;
return out;
}
diff --git a/source/fitz/path.c b/source/fitz/path.c
index 04a3a7bc..8deb85b8 100644
--- a/source/fitz/path.c
+++ b/source/fitz/path.c
@@ -7,6 +7,7 @@ fz_new_path(fz_context *ctx)
fz_path *path;
path = fz_malloc_struct(ctx, fz_path);
+ path->refs = 1;
path->last_cmd = 0;
path->current.x = 0;
path->current.y = 0;
@@ -17,48 +18,30 @@ fz_new_path(fz_context *ctx)
}
fz_path *
-fz_clone_path(fz_context *ctx, fz_path *old)
+fz_keep_path(fz_context *ctx, fz_path *path)
{
- fz_path *path;
+ if (path->refs == 1)
+ fz_trim_path(ctx, path);
+ return fz_keep_imp(ctx, path, &path->refs);
+}
- assert(old);
- path = fz_malloc_struct(ctx, fz_path);
- fz_try(ctx)
- {
- path->cmd_len = old->cmd_len;
- path->cmd_cap = old->cmd_len;
- path->cmds = fz_malloc_array(ctx, path->cmd_cap, sizeof(unsigned char));
- memcpy(path->cmds, old->cmds, sizeof(unsigned char) * path->cmd_len);
-
- path->coord_len = old->coord_len;
- path->coord_cap = old->coord_len;
- path->coords = fz_malloc_array(ctx, path->coord_cap, sizeof(float));
- memcpy(path->coords, old->coords, sizeof(float) * path->coord_len);
- }
- fz_catch(ctx)
+void
+fz_drop_path(fz_context *ctx, fz_path *path)
+{
+ if (fz_drop_imp(ctx, path, &path->refs))
{
fz_free(ctx, path->cmds);
fz_free(ctx, path->coords);
fz_free(ctx, path);
- fz_rethrow(ctx);
}
-
- return path;
-}
-
-void
-fz_free_path(fz_context *ctx, fz_path *path)
-{
- if (path == NULL)
- return;
- fz_free(ctx, path->cmds);
- fz_free(ctx, path->coords);
- fz_free(ctx, path);
}
static void
push_cmd(fz_context *ctx, fz_path *path, int cmd)
{
+ if (path->refs != 1)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot modify shared paths");
+
if (path->cmd_len + 1 >= path->cmd_cap)
{
int new_cmd_cap = fz_maxi(16, path->cmd_cap * 2);
@@ -286,14 +269,14 @@ fz_bound_path(fz_context *ctx, fz_path *path, const fz_stroke_state *stroke, con
if (stroke)
{
- fz_adjust_rect_for_stroke(r, stroke, ctm);
+ fz_adjust_rect_for_stroke(ctx, r, stroke, ctm);
}
return r;
}
fz_rect *
-fz_adjust_rect_for_stroke(fz_rect *r, const fz_stroke_state *stroke, const fz_matrix *ctm)
+fz_adjust_rect_for_stroke(fz_context *ctx, fz_rect *r, const fz_stroke_state *stroke, const fz_matrix *ctm)
{
float expand;
@@ -322,6 +305,20 @@ fz_transform_path(fz_context *ctx, fz_path *path, const fz_matrix *ctm)
fz_transform_point((fz_point *)&path->coords[i], ctm);
}
+void fz_trim_path(fz_context *ctx, fz_path *path)
+{
+ if (path->cmd_cap > path->cmd_len)
+ {
+ path->cmds = fz_resize_array(ctx, path->cmds, path->cmd_len, sizeof(unsigned char));
+ path->cmd_cap = path->cmd_len;
+ }
+ if (path->coord_cap > path->coord_len)
+ {
+ path->coords = fz_resize_array(ctx, path->coords, path->coord_len, sizeof(float));
+ path->coord_cap = path->coord_len;
+ }
+}
+
#ifndef NDEBUG
void
fz_print_path(fz_context *ctx, FILE *out, fz_path *path, int indent)
@@ -382,25 +379,13 @@ fz_keep_stroke_state(fz_context *ctx, fz_stroke_state *stroke)
if (stroke->refs == -2)
return fz_clone_stroke_state(ctx, stroke);
- fz_lock(ctx, FZ_LOCK_ALLOC);
- if (stroke->refs > 0)
- stroke->refs++;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- return stroke;
+ return fz_keep_imp(ctx, stroke, &stroke->refs);
}
void
fz_drop_stroke_state(fz_context *ctx, fz_stroke_state *stroke)
{
- int drop;
-
- if (!stroke)
- return;
-
- fz_lock(ctx, FZ_LOCK_ALLOC);
- drop = (stroke->refs > 0 ? --stroke->refs == 0 : 0);
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- if (drop)
+ if (fz_drop_imp(ctx, stroke, &stroke->refs))
fz_free(ctx, stroke);
}
@@ -464,10 +449,12 @@ fz_unshare_stroke_state_with_dash_len(fz_context *ctx, fz_stroke_state *shared,
len = 0;
if (single && shlen >= len)
return shared;
+
unsize = sizeof(*unshared) + sizeof(unshared->dash_list[0]) * len;
unshared = Memento_label(fz_malloc(ctx, unsize), "fz_stroke_state");
memcpy(unshared, shared, (shsize > unsize ? unsize : shsize));
unshared->refs = 1;
+
fz_lock(ctx, FZ_LOCK_ALLOC);
drop = (shared->refs > 0 ? --shared->refs == 0 : 0);
fz_unlock(ctx, FZ_LOCK_ALLOC);
diff --git a/source/fitz/pixmap.c b/source/fitz/pixmap.c
index 9ce8ffba..fa4843bc 100644
--- a/source/fitz/pixmap.c
+++ b/source/fitz/pixmap.c
@@ -13,7 +13,7 @@ fz_drop_pixmap(fz_context *ctx, fz_pixmap *pix)
}
void
-fz_free_pixmap_imp(fz_context *ctx, fz_storable *pix_)
+fz_drop_pixmap_imp(fz_context *ctx, fz_storable *pix_)
{
fz_pixmap *pix = (fz_pixmap *)pix_;
@@ -33,7 +33,7 @@ fz_new_pixmap_with_data(fz_context *ctx, fz_colorspace *colorspace, int w, int h
fz_throw(ctx, FZ_ERROR_GENERIC, "Illegal dimensions for pixmap %d %d", w, h);
pix = fz_malloc_struct(ctx, fz_pixmap);
- FZ_INIT_STORABLE(pix, 1, fz_free_pixmap_imp);
+ FZ_INIT_STORABLE(pix, 1, fz_drop_pixmap_imp);
pix->x = 0;
pix->y = 0;
pix->w = w;
@@ -478,7 +478,7 @@ fz_invert_pixmap(fz_context *ctx, fz_pixmap *pix)
}
}
-void fz_invert_pixmap_rect(fz_pixmap *image, const fz_irect *rect)
+void fz_invert_pixmap_rect(fz_context *ctx, fz_pixmap *image, const fz_irect *rect)
{
unsigned char *p;
int x, y, n;
@@ -526,23 +526,21 @@ fz_gamma_pixmap(fz_context *ctx, fz_pixmap *pix, float gamma)
*/
void
-fz_output_pnm_header(fz_output *out, int w, int h, int n)
+fz_output_pnm_header(fz_context *ctx, fz_output *out, int w, int h, int n)
{
- fz_context *ctx = out->ctx;
-
if (n != 1 && n != 2 && n != 4)
fz_throw(ctx, FZ_ERROR_GENERIC, "pixmap must be grayscale or rgb to write as pnm");
if (n == 1 || n == 2)
- fz_printf(out, "P5\n");
+ fz_printf(ctx, out, "P5\n");
if (n == 4)
- fz_printf(out, "P6\n");
- fz_printf(out, "%d %d\n", w, h);
- fz_printf(out, "255\n");
+ fz_printf(ctx, out, "P6\n");
+ fz_printf(ctx, out, "%d %d\n", w, h);
+ fz_printf(ctx, out, "255\n");
}
void
-fz_output_pnm_band(fz_output *out, int w, int h, int n, int band, int bandheight, unsigned char *p)
+fz_output_pnm_band(fz_context *ctx, fz_output *out, int w, int h, int n, int band, int bandheight, unsigned char *p)
{
int len;
int start = band * bandheight;
@@ -557,21 +555,21 @@ fz_output_pnm_band(fz_output *out, int w, int h, int n, int band, int bandheight
switch (n)
{
case 1:
- fz_write(out, p, len);
+ fz_write(ctx, out, p, len);
break;
case 2:
while (len--)
{
- fz_putc(out, p[0]);
+ fz_putc(ctx, out, p[0]);
p += 2;
}
break;
case 4:
while (len--)
{
- fz_putc(out, p[0]);
- fz_putc(out, p[1]);
- fz_putc(out, p[2]);
+ fz_putc(ctx, out, p[0]);
+ fz_putc(ctx, out, p[1]);
+ fz_putc(ctx, out, p[2]);
p += 4;
}
}
@@ -581,9 +579,9 @@ void
fz_write_pnm(fz_context *ctx, fz_pixmap *pixmap, char *filename)
{
fz_output *out = fz_new_output_to_filename(ctx, filename);
- fz_output_pnm_header(out, pixmap->w, pixmap->h, pixmap->n);
- fz_output_pnm_band(out, pixmap->w, pixmap->h, pixmap->n, 0, pixmap->h, pixmap->samples);
- fz_close_output(out);
+ fz_output_pnm_header(ctx, out, pixmap->w, pixmap->h, pixmap->n);
+ fz_output_pnm_band(ctx, out, pixmap->w, pixmap->h, pixmap->n, 0, pixmap->h, pixmap->samples);
+ fz_drop_output(ctx, out);
}
/*
@@ -591,29 +589,29 @@ fz_write_pnm(fz_context *ctx, fz_pixmap *pixmap, char *filename)
*/
void
-fz_output_pam_header(fz_output *out, int w, int h, int n, int savealpha)
+fz_output_pam_header(fz_context *ctx, fz_output *out, int w, int h, int n, int savealpha)
{
int sn = n;
int dn = n;
if (!savealpha && dn > 1)
dn--;
- fz_printf(out, "P7\n");
- fz_printf(out, "WIDTH %d\n", w);
- fz_printf(out, "HEIGHT %d\n", h);
- fz_printf(out, "DEPTH %d\n", dn);
- fz_printf(out, "MAXVAL 255\n");
- if (dn == 1) fz_printf(out, "TUPLTYPE GRAYSCALE\n");
- else if (dn == 2 && sn == 2) fz_printf(out, "TUPLTYPE GRAYSCALE_ALPHA\n");
- else if (dn == 3 && sn == 4) fz_printf(out, "TUPLTYPE RGB\n");
- else if (dn == 4 && sn == 4) fz_printf(out, "TUPLTYPE RGB_ALPHA\n");
- else if (dn == 4 && sn == 5) fz_printf(out, "TUPLTYPE CMYK\n");
- else if (dn == 5 && sn == 5) fz_printf(out, "TUPLTYPE CMYK_ALPHA\n");
- fz_printf(out, "ENDHDR\n");
+ fz_printf(ctx, out, "P7\n");
+ fz_printf(ctx, out, "WIDTH %d\n", w);
+ fz_printf(ctx, out, "HEIGHT %d\n", h);
+ fz_printf(ctx, out, "DEPTH %d\n", dn);
+ fz_printf(ctx, out, "MAXVAL 255\n");
+ if (dn == 1) fz_printf(ctx, out, "TUPLTYPE GRAYSCALE\n");
+ else if (dn == 2 && sn == 2) fz_printf(ctx, out, "TUPLTYPE GRAYSCALE_ALPHA\n");
+ else if (dn == 3 && sn == 4) fz_printf(ctx, out, "TUPLTYPE RGB\n");
+ else if (dn == 4 && sn == 4) fz_printf(ctx, out, "TUPLTYPE RGB_ALPHA\n");
+ else if (dn == 4 && sn == 5) fz_printf(ctx, out, "TUPLTYPE CMYK\n");
+ else if (dn == 5 && sn == 5) fz_printf(ctx, out, "TUPLTYPE CMYK_ALPHA\n");
+ fz_printf(ctx, out, "ENDHDR\n");
}
void
-fz_output_pam_band(fz_output *out, int w, int h, int n, int band, int bandheight, unsigned char *sp, int savealpha)
+fz_output_pam_band(fz_context *ctx, fz_output *out, int w, int h, int n, int band, int bandheight, unsigned char *sp, int savealpha)
{
int y, x, k;
int start = band * bandheight;
@@ -633,7 +631,7 @@ fz_output_pam_band(fz_output *out, int w, int h, int n, int band, int bandheight
while (x--)
{
for (k = 0; k < dn; k++)
- fz_putc(out, sp[k]);
+ fz_putc(ctx, out, sp[k]);
sp += sn;
}
}
@@ -643,9 +641,9 @@ void
fz_write_pam(fz_context *ctx, fz_pixmap *pixmap, char *filename, int savealpha)
{
fz_output *out = fz_new_output_to_filename(ctx, filename);
- fz_output_pam_header(out, pixmap->w, pixmap->h, pixmap->n, savealpha);
- fz_output_pam_band(out, pixmap->w, pixmap->h, pixmap->n, 0, pixmap->h, pixmap->samples, savealpha);
- fz_close_output(out);
+ fz_output_pam_header(ctx, out, pixmap->w, pixmap->h, pixmap->n, savealpha);
+ fz_output_pam_band(ctx, out, pixmap->w, pixmap->h, pixmap->n, 0, pixmap->h, pixmap->samples, savealpha);
+ fz_drop_output(ctx, out);
}
/*
@@ -662,16 +660,16 @@ static inline void big32(unsigned char *buf, unsigned int v)
buf[3] = (v) & 0xff;
}
-static void putchunk(char *tag, unsigned char *data, int size, fz_output *out)
+static void putchunk(fz_context *ctx, fz_output *out, char *tag, unsigned char *data, int size)
{
unsigned int sum;
- fz_write_int32be(out, size);
- fz_write(out, tag, 4);
- fz_write(out, data, size);
+ fz_write_int32be(ctx, out, size);
+ fz_write(ctx, out, tag, 4);
+ fz_write(ctx, out, data, size);
sum = crc32(0, NULL, 0);
sum = crc32(sum, (unsigned char*)tag, 4);
sum = crc32(sum, data, size);
- fz_write_int32be(out, sum);
+ fz_write_int32be(ctx, out, sum);
}
void
@@ -684,13 +682,13 @@ fz_write_png(fz_context *ctx, fz_pixmap *pixmap, char *filename, int savealpha)
fz_try(ctx)
{
- poc = fz_output_png_header(out, pixmap->w, pixmap->h, pixmap->n, savealpha);
- fz_output_png_band(out, pixmap->w, pixmap->h, pixmap->n, 0, pixmap->h, pixmap->samples, savealpha, poc);
+ poc = fz_output_png_header(ctx, out, pixmap->w, pixmap->h, pixmap->n, savealpha);
+ fz_output_png_band(ctx, out, pixmap->w, pixmap->h, pixmap->n, 0, pixmap->h, pixmap->samples, savealpha, poc);
}
fz_always(ctx)
{
- fz_output_png_trailer(out, poc);
- fz_close_output(out);
+ fz_output_png_trailer(ctx, out, poc);
+ fz_drop_output(ctx, out);
}
fz_catch(ctx)
{
@@ -699,24 +697,22 @@ fz_write_png(fz_context *ctx, fz_pixmap *pixmap, char *filename, int savealpha)
}
void
-fz_output_png(fz_output *out, const fz_pixmap *pixmap, int savealpha)
+fz_output_png(fz_context *ctx, fz_output *out, const fz_pixmap *pixmap, int savealpha)
{
fz_png_output_context *poc;
- fz_context *ctx;
if (!out)
return;
- ctx = out->ctx;
- poc = fz_output_png_header(out, pixmap->w, pixmap->h, pixmap->n, savealpha);
+ poc = fz_output_png_header(ctx, out, pixmap->w, pixmap->h, pixmap->n, savealpha);
fz_try(ctx)
{
- fz_output_png_band(out, pixmap->w, pixmap->h, pixmap->n, 0, pixmap->h, pixmap->samples, savealpha, poc);
+ fz_output_png_band(ctx, out, pixmap->w, pixmap->h, pixmap->n, 0, pixmap->h, pixmap->samples, savealpha, poc);
}
fz_always(ctx)
{
- fz_output_png_trailer(out, poc);
+ fz_output_png_trailer(ctx, out, poc);
}
fz_catch(ctx)
{
@@ -733,19 +729,16 @@ struct fz_png_output_context_s
};
fz_png_output_context *
-fz_output_png_header(fz_output *out, int w, int h, int n, int savealpha)
+fz_output_png_header(fz_context *ctx, fz_output *out, int w, int h, int n, int savealpha)
{
static const unsigned char pngsig[8] = { 137, 80, 78, 71, 13, 10, 26, 10 };
unsigned char head[13];
- fz_context *ctx;
int color;
fz_png_output_context *poc;
if (!out)
return NULL;
- ctx = out->ctx;
-
if (n != 1 && n != 2 && n != 4)
fz_throw(ctx, FZ_ERROR_GENERIC, "pixmap must be grayscale or rgb to write as png");
@@ -771,24 +764,21 @@ fz_output_png_header(fz_output *out, int w, int h, int n, int savealpha)
head[11] = 0; /* filter */
head[12] = 0; /* interlace */
- fz_write(out, pngsig, 8);
- putchunk("IHDR", head, 13, out);
+ fz_write(ctx, out, pngsig, 8);
+ putchunk(ctx, out, "IHDR", head, 13);
return poc;
}
void
-fz_output_png_band(fz_output *out, int w, int h, int n, int band, int bandheight, unsigned char *sp, int savealpha, fz_png_output_context *poc)
+fz_output_png_band(fz_context *ctx, fz_output *out, int w, int h, int n, int band, int bandheight, unsigned char *sp, int savealpha, fz_png_output_context *poc)
{
unsigned char *dp;
int y, x, k, sn, dn, err, finalband;
- fz_context *ctx;
if (!out || !sp || !poc)
return;
- ctx = out->ctx;
-
if (n != 1 && n != 2 && n != 4)
fz_throw(ctx, FZ_ERROR_GENERIC, "pixmap must be grayscale or rgb to write as png");
@@ -867,23 +857,20 @@ fz_output_png_band(fz_output *out, int w, int h, int n, int band, int bandheight
}
if (poc->stream.next_out != poc->cdata)
- putchunk("IDAT", poc->cdata, poc->stream.next_out - poc->cdata, out);
+ putchunk(ctx, out, "IDAT", poc->cdata, poc->stream.next_out - poc->cdata);
}
while (poc->stream.avail_out == 0);
}
void
-fz_output_png_trailer(fz_output *out, fz_png_output_context *poc)
+fz_output_png_trailer(fz_context *ctx, fz_output *out, fz_png_output_context *poc)
{
unsigned char block[1];
int err;
- fz_context *ctx;
if (!out || !poc)
return;
- ctx = out->ctx;
-
err = deflateEnd(&poc->stream);
if (err != Z_OK)
fz_throw(ctx, FZ_ERROR_GENERIC, "compression error %d", err);
@@ -892,7 +879,7 @@ fz_output_png_trailer(fz_output *out, fz_png_output_context *poc)
fz_free(ctx, poc->udata);
fz_free(ctx, poc);
- putchunk("IEND", block, 0, out);
+ putchunk(ctx, out, "IEND", block, 0);
}
/* We use an auxiliary function to do pixmap_as_png, as it can enable us to
@@ -924,12 +911,12 @@ png_from_pixmap(fz_context *ctx, fz_pixmap *pix, int drop)
}
buf = fz_new_buffer(ctx, 1024);
out = fz_new_output_with_buffer(ctx, buf);
- fz_output_png(out, pix, 1);
+ fz_output_png(ctx, out, pix, 1);
}
fz_always(ctx)
{
fz_drop_pixmap(ctx, drop ? pix : pix2);
- fz_close_output(out);
+ fz_drop_output(ctx, out);
}
fz_catch(ctx)
{
@@ -957,23 +944,23 @@ fz_new_png_from_pixmap(fz_context *ctx, fz_pixmap *pix)
* Write pixmap to TGA file (with or without alpha channel)
*/
-static inline void tga_put_pixel(unsigned char *data, int n, int is_bgr, fz_output *out)
+static inline void tga_put_pixel(fz_context *ctx, fz_output *out, unsigned char *data, int n, int is_bgr)
{
if (n >= 3 && !is_bgr)
{
- fz_putc(out, data[2]);
- fz_putc(out, data[1]);
- fz_putc(out, data[0]);
+ fz_putc(ctx, out, data[2]);
+ fz_putc(ctx, out, data[1]);
+ fz_putc(ctx, out, data[0]);
if (n == 4)
- fz_putc(out, data[3]);
+ fz_putc(ctx, out, data[3]);
return;
}
if (n == 2)
{
- fz_putc(out, data[0]);
- fz_putc(out, data[0]);
+ fz_putc(ctx, out, data[0]);
+ fz_putc(ctx, out, data[0]);
}
- fz_write(out, data, n);
+ fz_write(ctx, out, data, n);
}
void
@@ -1003,7 +990,7 @@ fz_write_tga(fz_context *ctx, fz_pixmap *pixmap, const char *filename, int savea
if (savealpha && d == 2)
head[16] = 32;
- fz_write(out, head, sizeof(head));
+ fz_write(ctx, out, head, sizeof(head));
for (k = 1; k <= pixmap->h; k++)
{
int i, j;
@@ -1013,23 +1000,23 @@ fz_write_tga(fz_context *ctx, fz_pixmap *pixmap, const char *filename, int savea
for (; i + j < pixmap->w && j < 128 && !memcmp(line + i * n, line + (i + j) * n, d); j++);
if (j > 1)
{
- fz_putc(out, j - 1 + 128);
- tga_put_pixel(line + i * n, d, is_bgr, out);
+ fz_putc(ctx, out, j - 1 + 128);
+ tga_put_pixel(ctx, out, line + i * n, d, is_bgr);
}
else
{
for (; i + j < pixmap->w && j <= 128 && memcmp(line + (i + j - 1) * n, line + (i + j) * n, d) != 0; j++);
if (i + j < pixmap->w || j > 128)
j--;
- fz_putc(out, j - 1);
+ fz_putc(ctx, out, j - 1);
for (; j > 0; j--, i++)
- tga_put_pixel(line + i * n, d, is_bgr, out);
+ tga_put_pixel(ctx, out, line + i * n, d, is_bgr);
}
}
}
- fz_write(out, "\0\0\0\0\0\0\0\0TRUEVISION-XFILE.\0", 26);
+ fz_write(ctx, out, "\0\0\0\0\0\0\0\0TRUEVISION-XFILE.\0", 26);
- fz_close_output(out);
+ fz_drop_output(ctx, out);
}
unsigned int
@@ -1403,7 +1390,7 @@ fz_pixmap_set_resolution(fz_pixmap *pix, int res)
}
void
-fz_md5_pixmap(fz_pixmap *pix, unsigned char digest[16])
+fz_md5_pixmap(fz_context *ctx, fz_pixmap *pix, unsigned char digest[16])
{
fz_md5 md5;
diff --git a/source/fitz/shade.c b/source/fitz/shade.c
index 4c6b1472..f5e25639 100644
--- a/source/fitz/shade.c
+++ b/source/fitz/shade.c
@@ -1,18 +1,28 @@
#include "mupdf/fitz.h"
+typedef struct fz_mesh_processor_s fz_mesh_processor;
+
+struct fz_mesh_processor_s {
+ fz_shade *shade;
+ fz_mesh_prepare_fn *prepare;
+ fz_mesh_process_fn *process;
+ void *process_arg;
+ int ncomp;
+};
+
#define SWAP(a,b) {fz_vertex *t = (a); (a) = (b); (b) = t;}
static inline void
-paint_tri(fz_mesh_processor *painter, fz_vertex *v0, fz_vertex *v1, fz_vertex *v2)
+paint_tri(fz_context *ctx, fz_mesh_processor *painter, fz_vertex *v0, fz_vertex *v1, fz_vertex *v2)
{
if (painter->process)
{
- painter->process(painter->process_arg, v0, v1, v2);
+ painter->process(ctx, painter->process_arg, v0, v1, v2);
}
}
static inline void
-paint_quad(fz_mesh_processor *painter, fz_vertex *v0, fz_vertex *v1, fz_vertex *v2, fz_vertex *v3)
+paint_quad(fz_context *ctx, fz_mesh_processor *painter, fz_vertex *v0, fz_vertex *v1, fz_vertex *v2, fz_vertex *v3)
{
/* For a quad with corners (in clockwise or anticlockwise order) are
* v0, v1, v2, v3. We can choose to split in in various different ways.
@@ -35,27 +45,27 @@ paint_quad(fz_mesh_processor *painter, fz_vertex *v0, fz_vertex *v1, fz_vertex *
*/
if (painter->process)
{
- painter->process(painter->process_arg, v0, v1, v3);
- painter->process(painter->process_arg, v3, v2, v1);
+ painter->process(ctx, painter->process_arg, v0, v1, v3);
+ painter->process(ctx, painter->process_arg, v3, v2, v1);
}
}
static inline void
-fz_prepare_color(fz_mesh_processor *painter, fz_vertex *v, float *c)
+fz_prepare_color(fz_context *ctx, fz_mesh_processor *painter, fz_vertex *v, float *c)
{
if (painter->prepare)
{
- painter->prepare(painter->process_arg, v, c);
+ painter->prepare(ctx, painter->process_arg, v, c);
}
}
static inline void
-fz_prepare_vertex(fz_mesh_processor *painter, fz_vertex *v, const fz_matrix *ctm, float x, float y, float *c)
+fz_prepare_vertex(fz_context *ctx, fz_mesh_processor *painter, fz_vertex *v, const fz_matrix *ctm, float x, float y, float *c)
{
fz_transform_point_xy(&v->p, ctm, x, y);
if (painter->prepare)
{
- painter->prepare(painter->process_arg, v, c);
+ painter->prepare(ctx, painter->process_arg, v, c);
}
}
@@ -86,19 +96,19 @@ fz_process_mesh_type1(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
x = x0;
- fz_prepare_vertex(painter, &v[0], &local_ctm, x, y, p);
+ fz_prepare_vertex(ctx, painter, &v[0], &local_ctm, x, y, p);
p += n;
- fz_prepare_vertex(painter, &v[1], &local_ctm, x, yn, p + xdivs * n);
+ fz_prepare_vertex(ctx, painter, &v[1], &local_ctm, x, yn, p + xdivs * n);
for (xx = 0; xx < xdivs; xx++)
{
x = x0 + (x1 - x0) * (xx + 1) / xdivs;
- fz_prepare_vertex(painter, &vn[0], &local_ctm, x, y, p);
+ fz_prepare_vertex(ctx, painter, &vn[0], &local_ctm, x, y, p);
p += n;
- fz_prepare_vertex(painter, &vn[1], &local_ctm, x, yn, p + xdivs * n);
+ fz_prepare_vertex(ctx, painter, &vn[1], &local_ctm, x, yn, p + xdivs * n);
- paint_quad(painter, &v[0], &vn[0], &vn[1], &v[1]);
+ paint_quad(ctx, painter, &v[0], &vn[0], &vn[1], &v[1]);
SWAP(v,vn);
}
y = yn;
@@ -142,42 +152,42 @@ fz_process_mesh_type2(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
v2.p = fz_point_on_circle(p0, -HUGENUM, theta);
v3.p = fz_point_on_circle(p1, -HUGENUM, theta);
- fz_prepare_color(painter, &v0, &zero);
- fz_prepare_color(painter, &v1, &one);
- fz_prepare_color(painter, &v2, &zero);
- fz_prepare_color(painter, &v3, &one);
+ fz_prepare_color(ctx, painter, &v0, &zero);
+ fz_prepare_color(ctx, painter, &v1, &one);
+ fz_prepare_color(ctx, painter, &v2, &zero);
+ fz_prepare_color(ctx, painter, &v3, &one);
- paint_quad(painter, &v0, &v2, &v3, &v1);
+ paint_quad(ctx, painter, &v0, &v2, &v3, &v1);
if (shade->u.l_or_r.extend[0])
{
e0.p.x = v0.p.x - (p1.x - p0.x) * HUGENUM;
e0.p.y = v0.p.y - (p1.y - p0.y) * HUGENUM;
- fz_prepare_color(painter, &e0, &zero);
+ fz_prepare_color(ctx, painter, &e0, &zero);
e1.p.x = v2.p.x - (p1.x - p0.x) * HUGENUM;
e1.p.y = v2.p.y - (p1.y - p0.y) * HUGENUM;
- fz_prepare_color(painter, &e1, &zero);
+ fz_prepare_color(ctx, painter, &e1, &zero);
- paint_quad(painter, &e0, &v0, &v2, &e1);
+ paint_quad(ctx, painter, &e0, &v0, &v2, &e1);
}
if (shade->u.l_or_r.extend[1])
{
e0.p.x = v1.p.x + (p1.x - p0.x) * HUGENUM;
e0.p.y = v1.p.y + (p1.y - p0.y) * HUGENUM;
- fz_prepare_color(painter, &e0, &one);
+ fz_prepare_color(ctx, painter, &e0, &one);
e1.p.x = v3.p.x + (p1.x - p0.x) * HUGENUM;
e1.p.y = v3.p.y + (p1.y - p0.y) * HUGENUM;
- fz_prepare_color(painter, &e1, &one);
+ fz_prepare_color(ctx, painter, &e1, &one);
- paint_quad(painter, &e0, &v1, &v3, &e1);
+ paint_quad(ctx, painter, &e0, &v1, &v3, &e1);
}
}
static void
-fz_paint_annulus(const fz_matrix *ctm,
+fz_paint_annulus(fz_context *ctx, const fz_matrix *ctm,
fz_point p0, float r0, float c0,
fz_point p1, float r1, float c1,
int count,
@@ -213,17 +223,17 @@ fz_paint_annulus(const fz_matrix *ctm,
fz_transform_point(&b2.p, ctm);
fz_transform_point(&b3.p, ctm);
- fz_prepare_color(painter, &t0, &c0);
- fz_prepare_color(painter, &t1, &c0);
- fz_prepare_color(painter, &t2, &c1);
- fz_prepare_color(painter, &t3, &c1);
- fz_prepare_color(painter, &b0, &c0);
- fz_prepare_color(painter, &b1, &c0);
- fz_prepare_color(painter, &b2, &c1);
- fz_prepare_color(painter, &b3, &c1);
+ fz_prepare_color(ctx, painter, &t0, &c0);
+ fz_prepare_color(ctx, painter, &t1, &c0);
+ fz_prepare_color(ctx, painter, &t2, &c1);
+ fz_prepare_color(ctx, painter, &t3, &c1);
+ fz_prepare_color(ctx, painter, &b0, &c0);
+ fz_prepare_color(ctx, painter, &b1, &c0);
+ fz_prepare_color(ctx, painter, &b2, &c1);
+ fz_prepare_color(ctx, painter, &b3, &c1);
- paint_quad(painter, &t0, &t2, &t3, &t1);
- paint_quad(painter, &b0, &b2, &b3, &b1);
+ paint_quad(ctx, painter, &t0, &t2, &t3, &t1);
+ paint_quad(ctx, painter, &b0, &b2, &b3, &b1);
a = b;
}
@@ -264,10 +274,10 @@ fz_process_mesh_type3(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
e.y = p0.y + (p1.y - p0.y) * rs;
er = r0 + (r1 - r0) * rs;
- fz_paint_annulus(ctm, e, er, 0, p0, r0, 0, count, painter);
+ fz_paint_annulus(ctx, ctm, e, er, 0, p0, r0, 0, count, painter);
}
- fz_paint_annulus(ctm, p0, r0, 0, p1, r1, 1, count, painter);
+ fz_paint_annulus(ctx, ctm, p0, r0, 0, p1, r1, 1, count, painter);
if (shade->u.l_or_r.extend[1])
{
@@ -280,15 +290,15 @@ fz_process_mesh_type3(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
e.y = p1.y + (p0.y - p1.y) * rs;
er = r1 + (r0 - r1) * rs;
- fz_paint_annulus(ctm, p1, r1, 1, e, er, 1, count, painter);
+ fz_paint_annulus(ctx, ctm, p1, r1, 1, e, er, 1, count, painter);
}
}
-static inline float read_sample(fz_stream *stream, int bits, float min, float max)
+static inline float read_sample(fz_context *ctx, fz_stream *stream, int bits, float min, float max)
{
/* we use pow(2,x) because (1<<x) would overflow the math on 32-bit samples */
float bitscale = 1 / (powf(2, bits) - 1);
- return min + fz_read_bits(stream, bits) * (max - min) * bitscale;
+ return min + fz_read_bits(ctx, stream, bits) * (max - min) * bitscale;
}
static void
@@ -314,55 +324,55 @@ fz_process_mesh_type4(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
fz_try(ctx)
{
- while (!fz_is_eof_bits(stream))
+ while (!fz_is_eof_bits(ctx, stream))
{
- flag = fz_read_bits(stream, bpflag);
- x = read_sample(stream, bpcoord, x0, x1);
- y = read_sample(stream, bpcoord, y0, y1);
+ flag = fz_read_bits(ctx, stream, bpflag);
+ x = read_sample(ctx, stream, bpcoord, x0, x1);
+ y = read_sample(ctx, stream, bpcoord, y0, y1);
for (i = 0; i < ncomp; i++)
- c[i] = read_sample(stream, bpcomp, c0[i], c1[i]);
- fz_prepare_vertex(painter, vd, ctm, x, y, c);
+ c[i] = read_sample(ctx, stream, bpcomp, c0[i], c1[i]);
+ fz_prepare_vertex(ctx, painter, vd, ctm, x, y, c);
switch (flag)
{
case 0: /* start new triangle */
SWAP(va, vd);
- fz_read_bits(stream, bpflag);
- x = read_sample(stream, bpcoord, x0, x1);
- y = read_sample(stream, bpcoord, y0, y1);
+ fz_read_bits(ctx, stream, bpflag);
+ x = read_sample(ctx, stream, bpcoord, x0, x1);
+ y = read_sample(ctx, stream, bpcoord, y0, y1);
for (i = 0; i < ncomp; i++)
- c[i] = read_sample(stream, bpcomp, c0[i], c1[i]);
- fz_prepare_vertex(painter, vb, ctm, x, y, c);
+ c[i] = read_sample(ctx, stream, bpcomp, c0[i], c1[i]);
+ fz_prepare_vertex(ctx, painter, vb, ctm, x, y, c);
- fz_read_bits(stream, bpflag);
- x = read_sample(stream, bpcoord, x0, x1);
- y = read_sample(stream, bpcoord, y0, y1);
+ fz_read_bits(ctx, stream, bpflag);
+ x = read_sample(ctx, stream, bpcoord, x0, x1);
+ y = read_sample(ctx, stream, bpcoord, y0, y1);
for (i = 0; i < ncomp; i++)
- c[i] = read_sample(stream, bpcomp, c0[i], c1[i]);
- fz_prepare_vertex(painter, vc, ctm, x, y, c);
+ c[i] = read_sample(ctx, stream, bpcomp, c0[i], c1[i]);
+ fz_prepare_vertex(ctx, painter, vc, ctm, x, y, c);
- paint_tri(painter, va, vb, vc);
+ paint_tri(ctx, painter, va, vb, vc);
break;
case 1: /* Vb, Vc, Vd */
SWAP(va, vb);
SWAP(vb, vc);
SWAP(vc, vd);
- paint_tri(painter, va, vb, vc);
+ paint_tri(ctx, painter, va, vb, vc);
break;
case 2: /* Va, Vc, Vd */
SWAP(vb, vc);
SWAP(vc, vd);
- paint_tri(painter, va, vb, vc);
+ paint_tri(ctx, painter, va, vb, vc);
break;
}
}
}
fz_always(ctx)
{
- fz_close(stream);
+ fz_drop_stream(ctx, stream);
}
fz_catch(ctx)
{
@@ -399,20 +409,20 @@ fz_process_mesh_type5(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
buf = fz_malloc_array(ctx, vprow, sizeof(fz_vertex));
first = 1;
- while (!fz_is_eof_bits(stream))
+ while (!fz_is_eof_bits(ctx, stream))
{
for (i = 0; i < vprow; i++)
{
- x = read_sample(stream, bpcoord, x0, x1);
- y = read_sample(stream, bpcoord, y0, y1);
+ x = read_sample(ctx, stream, bpcoord, x0, x1);
+ y = read_sample(ctx, stream, bpcoord, y0, y1);
for (k = 0; k < ncomp; k++)
- c[k] = read_sample(stream, bpcomp, c0[k], c1[k]);
- fz_prepare_vertex(painter, &buf[i], ctm, x, y, c);
+ c[k] = read_sample(ctx, stream, bpcomp, c0[k], c1[k]);
+ fz_prepare_vertex(ctx, painter, &buf[i], ctm, x, y, c);
}
if (!first)
for (i = 0; i < vprow - 1; i++)
- paint_quad(painter, &ref[i], &ref[i+1], &buf[i+1], &buf[i]);
+ paint_quad(ctx, painter, &ref[i], &ref[i+1], &buf[i+1], &buf[i]);
SWAP(ref,buf);
first = 0;
@@ -422,7 +432,7 @@ fz_process_mesh_type5(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
{
fz_free(ctx, ref);
fz_free(ctx, buf);
- fz_close(stream);
+ fz_drop_stream(ctx, stream);
}
fz_catch(ctx)
{
@@ -441,7 +451,7 @@ struct tensor_patch_s
};
static void
-triangulate_patch(fz_mesh_processor *painter, tensor_patch p)
+triangulate_patch(fz_context *ctx, fz_mesh_processor *painter, tensor_patch p)
{
fz_vertex v0, v1, v2, v3;
@@ -450,12 +460,12 @@ triangulate_patch(fz_mesh_processor *painter, tensor_patch p)
v2.p = p.pole[3][3];
v3.p = p.pole[3][0];
- fz_prepare_color(painter, &v0, p.color[0]);
- fz_prepare_color(painter, &v1, p.color[1]);
- fz_prepare_color(painter, &v2, p.color[2]);
- fz_prepare_color(painter, &v3, p.color[3]);
+ fz_prepare_color(ctx, painter, &v0, p.color[0]);
+ fz_prepare_color(ctx, painter, &v1, p.color[1]);
+ fz_prepare_color(ctx, painter, &v2, p.color[2]);
+ fz_prepare_color(ctx, painter, &v3, p.color[3]);
- paint_quad(painter, &v0, &v1, &v2, &v3);
+ paint_quad(ctx, painter, &v0, &v1, &v2, &v3);
}
static inline void midcolor(float *c, float *c1, float *c2, int n)
@@ -526,7 +536,7 @@ split_stripe(tensor_patch *p, tensor_patch *s0, tensor_patch *s1, int n)
}
static void
-draw_stripe(fz_mesh_processor *painter, tensor_patch *p, int depth)
+draw_stripe(fz_context *ctx, fz_mesh_processor *painter, tensor_patch *p, int depth)
{
tensor_patch s0, s1;
@@ -537,14 +547,14 @@ draw_stripe(fz_mesh_processor *painter, tensor_patch *p, int depth)
if (depth == 0)
{
/* if no more subdividing, draw two new patches... */
- triangulate_patch(painter, s1);
- triangulate_patch(painter, s0);
+ triangulate_patch(ctx, painter, s1);
+ triangulate_patch(ctx, painter, s0);
}
else
{
/* ...otherwise, continue subdividing. */
- draw_stripe(painter, &s1, depth);
- draw_stripe(painter, &s0, depth);
+ draw_stripe(ctx, painter, &s1, depth);
+ draw_stripe(ctx, painter, &s0, depth);
}
}
@@ -573,7 +583,7 @@ split_patch(tensor_patch *p, tensor_patch *s0, tensor_patch *s1, int n)
}
static void
-draw_patch(fz_mesh_processor *painter, tensor_patch *p, int depth, int origdepth)
+draw_patch(fz_context *ctx, fz_mesh_processor *painter, tensor_patch *p, int depth, int origdepth)
{
tensor_patch s0, s1;
@@ -584,14 +594,14 @@ draw_patch(fz_mesh_processor *painter, tensor_patch *p, int depth, int origdepth
if (depth == 0)
{
/* if no more subdividing, draw two new patches... */
- draw_stripe(painter, &s0, origdepth);
- draw_stripe(painter, &s1, origdepth);
+ draw_stripe(ctx, painter, &s0, origdepth);
+ draw_stripe(ctx, painter, &s1, origdepth);
}
else
{
/* ...otherwise, continue subdividing. */
- draw_patch(painter, &s0, depth, origdepth);
- draw_patch(painter, &s1, depth, origdepth);
+ draw_patch(ctx, painter, &s0, depth, origdepth);
+ draw_patch(ctx, painter, &s1, depth, origdepth);
}
}
@@ -708,7 +718,7 @@ fz_process_mesh_type6(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
{
float (*prevc)[FZ_MAX_COLORS] = NULL;
fz_point *prevp = NULL;
- while (!fz_is_eof_bits(stream))
+ while (!fz_is_eof_bits(ctx, stream))
{
float (*c)[FZ_MAX_COLORS] = color_storage[store];
fz_point *v = point_storage[store];
@@ -717,7 +727,7 @@ fz_process_mesh_type6(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
int flag;
tensor_patch patch;
- flag = fz_read_bits(stream, bpflag);
+ flag = fz_read_bits(ctx, stream, bpflag);
if (flag == 0)
{
@@ -732,15 +742,15 @@ fz_process_mesh_type6(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
for (i = startpt; i < 12; i++)
{
- v[i].x = read_sample(stream, bpcoord, x0, x1);
- v[i].y = read_sample(stream, bpcoord, y0, y1);
+ v[i].x = read_sample(ctx, stream, bpcoord, x0, x1);
+ v[i].y = read_sample(ctx, stream, bpcoord, y0, y1);
fz_transform_point(&v[i], ctm);
}
for (i = startcolor; i < 4; i++)
{
for (k = 0; k < ncomp; k++)
- c[i][k] = read_sample(stream, bpcomp, c0[k], c1[k]);
+ c[i][k] = read_sample(ctx, stream, bpcomp, c0[k], c1[k]);
}
if (flag == 0)
@@ -781,7 +791,7 @@ fz_process_mesh_type6(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
for (i = 0; i < 4; i++)
memcpy(patch.color[i], c[i], ncomp * sizeof(float));
- draw_patch(painter, &patch, SUBDIV, SUBDIV);
+ draw_patch(ctx, painter, &patch, SUBDIV, SUBDIV);
prevp = v;
prevc = c;
@@ -790,7 +800,7 @@ fz_process_mesh_type6(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
}
fz_always(ctx)
{
- fz_close(stream);
+ fz_drop_stream(ctx, stream);
}
fz_catch(ctx)
{
@@ -821,7 +831,7 @@ fz_process_mesh_type7(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
fz_try(ctx)
{
- while (!fz_is_eof_bits(stream))
+ while (!fz_is_eof_bits(ctx, stream))
{
float (*c)[FZ_MAX_COLORS] = color_storage[store];
fz_point *v = point_storage[store];
@@ -830,7 +840,7 @@ fz_process_mesh_type7(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
int flag;
tensor_patch patch;
- flag = fz_read_bits(stream, bpflag);
+ flag = fz_read_bits(ctx, stream, bpflag);
if (flag == 0)
{
@@ -845,15 +855,15 @@ fz_process_mesh_type7(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
for (i = startpt; i < 16; i++)
{
- v[i].x = read_sample(stream, bpcoord, x0, x1);
- v[i].y = read_sample(stream, bpcoord, y0, y1);
+ v[i].x = read_sample(ctx, stream, bpcoord, x0, x1);
+ v[i].y = read_sample(ctx, stream, bpcoord, y0, y1);
fz_transform_point(&v[i], ctm);
}
for (i = startcolor; i < 4; i++)
{
for (k = 0; k < ncomp; k++)
- c[i][k] = read_sample(stream, bpcomp, c0[k], c1[k]);
+ c[i][k] = read_sample(ctx, stream, bpcomp, c0[k], c1[k]);
}
if (flag == 0)
@@ -894,7 +904,7 @@ fz_process_mesh_type7(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
for (i = 0; i < 4; i++)
memcpy(patch.color[i], c[i], ncomp * sizeof(float));
- draw_patch(painter, &patch, SUBDIV, SUBDIV);
+ draw_patch(ctx, painter, &patch, SUBDIV, SUBDIV);
prevp = v;
prevc = c;
@@ -903,7 +913,7 @@ fz_process_mesh_type7(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz
}
fz_always(ctx)
{
- fz_close(stream);
+ fz_drop_stream(ctx, stream);
}
fz_catch(ctx)
{
@@ -917,7 +927,6 @@ fz_process_mesh(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm,
{
fz_mesh_processor painter;
- painter.ctx = ctx;
painter.shade = shade;
painter.prepare = prepare;
painter.process = process;
@@ -1043,7 +1052,7 @@ fz_keep_shade(fz_context *ctx, fz_shade *shade)
}
void
-fz_free_shade_imp(fz_context *ctx, fz_storable *shade_)
+fz_drop_shade_imp(fz_context *ctx, fz_storable *shade_)
{
fz_shade *shade = (fz_shade *)shade_;
@@ -1051,7 +1060,7 @@ fz_free_shade_imp(fz_context *ctx, fz_storable *shade_)
fz_drop_colorspace(ctx, shade->colorspace);
if (shade->type == FZ_FUNCTION_BASED)
fz_free(ctx, shade->u.f.fn_vals);
- fz_free_compressed_buffer(ctx, shade->buffer);
+ fz_drop_compressed_buffer(ctx, shade->buffer);
fz_free(ctx, shade);
}
diff --git a/source/fitz/stext-device.c b/source/fitz/stext-device.c
index 20e5e525..3213406e 100644
--- a/source/fitz/stext-device.c
+++ b/source/fitz/stext-device.c
@@ -25,6 +25,7 @@ typedef struct span_soup_s span_soup;
struct fz_text_device_s
{
+ fz_device super;
fz_text_sheet *sheet;
fz_text_page *page;
span_soup *spans;
@@ -47,7 +48,7 @@ add_point_to_rect(fz_rect *a, const fz_point *p)
}
fz_rect *
-fz_text_char_bbox(fz_rect *bbox, fz_text_span *span, int i)
+fz_text_char_bbox(fz_context *ctx, fz_rect *bbox, fz_text_span *span, int i)
{
fz_point a, d;
const fz_point *max;
@@ -112,7 +113,6 @@ add_bbox_to_span(fz_text_span *span)
struct span_soup_s
{
- fz_context *ctx;
int len, cap;
fz_text_span **spans;
};
@@ -121,7 +121,6 @@ static span_soup *
new_span_soup(fz_context *ctx)
{
span_soup *soup = fz_malloc_struct(ctx, span_soup);
- soup->ctx = ctx;
soup->len = 0;
soup->cap = 0;
soup->spans = NULL;
@@ -129,7 +128,7 @@ new_span_soup(fz_context *ctx)
}
static void
-free_span_soup(span_soup *soup)
+free_span_soup(fz_context *ctx, span_soup *soup)
{
int i;
@@ -137,21 +136,21 @@ free_span_soup(span_soup *soup)
return;
for (i = 0; i < soup->len; i++)
{
- fz_free(soup->ctx, soup->spans[i]);
+ fz_free(ctx, soup->spans[i]);
}
- fz_free(soup->ctx, soup->spans);
- fz_free(soup->ctx, soup);
+ fz_free(ctx, soup->spans);
+ fz_free(ctx, soup);
}
static void
-add_span_to_soup(span_soup *soup, fz_text_span *span)
+add_span_to_soup(fz_context *ctx, span_soup *soup, fz_text_span *span)
{
if (span == NULL)
return;
if (soup->len == soup->cap)
{
int newcap = (soup->cap ? soup->cap * 2 : 16);
- soup->spans = fz_resize_array(soup->ctx, soup->spans, newcap, sizeof(*soup->spans));
+ soup->spans = fz_resize_array(ctx, soup->spans, newcap, sizeof(*soup->spans));
soup->cap = newcap;
}
add_bbox_to_span(span);
@@ -266,6 +265,9 @@ strain_soup(fz_context *ctx, fz_text_device *tdev)
fz_text_span *last_span = NULL;
int span_num;
+ if (soup == NULL)
+ return;
+
/* Really dumb implementation to match what we had before */
for (span_num=0; span_num < soup->len; span_num++)
{
@@ -368,7 +370,7 @@ fz_new_text_sheet(fz_context *ctx)
}
void
-fz_free_text_sheet(fz_context *ctx, fz_text_sheet *sheet)
+fz_drop_text_sheet(fz_context *ctx, fz_text_sheet *sheet)
{
fz_text_style *style;
@@ -447,7 +449,7 @@ fz_new_text_page(fz_context *ctx)
}
static void
-fz_free_text_line_contents(fz_context *ctx, fz_text_line *line)
+fz_drop_text_line_contents(fz_context *ctx, fz_text_line *line)
{
fz_text_span *span, *next;
for (span = line->first_span; span; span=next)
@@ -459,19 +461,19 @@ fz_free_text_line_contents(fz_context *ctx, fz_text_line *line)
}
static void
-fz_free_text_block(fz_context *ctx, fz_text_block *block)
+fz_drop_text_block(fz_context *ctx, fz_text_block *block)
{
fz_text_line *line;
if (block == NULL)
return;
for (line = block->lines; line < block->lines + block->len; line++)
- fz_free_text_line_contents(ctx, line);
+ fz_drop_text_line_contents(ctx, line);
fz_free(ctx, block->lines);
fz_free(ctx, block);
}
static void
-fz_free_image_block(fz_context *ctx, fz_image_block *block)
+fz_drop_image_block(fz_context *ctx, fz_image_block *block)
{
if (block == NULL)
return;
@@ -481,7 +483,7 @@ fz_free_image_block(fz_context *ctx, fz_image_block *block)
}
void
-fz_free_text_page(fz_context *ctx, fz_text_page *page)
+fz_drop_text_page(fz_context *ctx, fz_text_page *page)
{
fz_page_block *block;
if (page == NULL)
@@ -491,10 +493,10 @@ fz_free_text_page(fz_context *ctx, fz_text_page *page)
switch (block->type)
{
case FZ_PAGE_BLOCK_TEXT:
- fz_free_text_block(ctx, block->u.text);
+ fz_drop_text_block(ctx, block->u.text);
break;
case FZ_PAGE_BLOCK_IMAGE:
- fz_free_image_block(ctx, block->u.image);
+ fz_drop_image_block(ctx, block->u.image);
break;
}
}
@@ -638,7 +640,7 @@ fz_add_text_char_imp(fz_context *ctx, fz_text_device *dev, fz_text_style *style,
if (can_append == 0)
{
/* Start a new span */
- add_span_to_soup(dev->spans, dev->cur_span);
+ add_span_to_soup(ctx, dev->spans, dev->cur_span);
dev->cur_span = NULL;
dev->cur_span = fz_new_text_span(ctx, &p, wmode, trm);
dev->cur_span->spacing = 0;
@@ -787,60 +789,59 @@ fz_text_extract(fz_context *ctx, fz_text_device *dev, fz_text *text, const fz_ma
}
static void
-fz_text_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm,
+fz_text_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- fz_text_device *tdev = dev->user;
+ fz_text_device *tdev = (fz_text_device*)dev;
fz_text_style *style;
- style = fz_lookup_text_style(dev->ctx, tdev->sheet, text, ctm, colorspace, color, alpha, NULL);
- fz_text_extract(dev->ctx, tdev, text, ctm, style);
+ style = fz_lookup_text_style(ctx, tdev->sheet, text, ctm, colorspace, color, alpha, NULL);
+ fz_text_extract(ctx, tdev, text, ctm, style);
}
static void
-fz_text_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
+fz_text_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- fz_text_device *tdev = dev->user;
+ fz_text_device *tdev = (fz_text_device*)dev;
fz_text_style *style;
- style = fz_lookup_text_style(dev->ctx, tdev->sheet, text, ctm, colorspace, color, alpha, stroke);
- fz_text_extract(dev->ctx, tdev, text, ctm, style);
+ style = fz_lookup_text_style(ctx, tdev->sheet, text, ctm, colorspace, color, alpha, stroke);
+ fz_text_extract(ctx, tdev, text, ctm, style);
}
static void
-fz_text_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
+fz_text_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
{
- fz_text_device *tdev = dev->user;
+ fz_text_device *tdev = (fz_text_device*)dev;
fz_text_style *style;
- style = fz_lookup_text_style(dev->ctx, tdev->sheet, text, ctm, NULL, NULL, 0, NULL);
- fz_text_extract(dev->ctx, tdev, text, ctm, style);
+ style = fz_lookup_text_style(ctx, tdev->sheet, text, ctm, NULL, NULL, 0, NULL);
+ fz_text_extract(ctx, tdev, text, ctm, style);
}
static void
-fz_text_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
+fz_text_clip_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
{
- fz_text_device *tdev = dev->user;
+ fz_text_device *tdev = (fz_text_device*)dev;
fz_text_style *style;
- style = fz_lookup_text_style(dev->ctx, tdev->sheet, text, ctm, NULL, NULL, 0, stroke);
- fz_text_extract(dev->ctx, tdev, text, ctm, style);
+ style = fz_lookup_text_style(ctx, tdev->sheet, text, ctm, NULL, NULL, 0, stroke);
+ fz_text_extract(ctx, tdev, text, ctm, style);
}
static void
-fz_text_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm)
+fz_text_ignore_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm)
{
- fz_text_device *tdev = dev->user;
+ fz_text_device *tdev = (fz_text_device*)dev;
fz_text_style *style;
- style = fz_lookup_text_style(dev->ctx, tdev->sheet, text, ctm, NULL, NULL, 0, NULL);
- fz_text_extract(dev->ctx, tdev, text, ctm, style);
+ style = fz_lookup_text_style(ctx, tdev->sheet, text, ctm, NULL, NULL, 0, NULL);
+ fz_text_extract(ctx, tdev, text, ctm, style);
}
static void
-fz_text_fill_image_mask(fz_device *dev, fz_image *img, const fz_matrix *ctm,
+fz_text_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *img, const fz_matrix *ctm,
fz_colorspace *cspace, float *color, float alpha)
{
- fz_text_device *tdev = dev->user;
+ fz_text_device *tdev = (fz_text_device*)dev;
fz_text_page *page = tdev->page;
fz_image_block *block;
- fz_context *ctx = dev->ctx;
/* If the alpha is less than 50% then it's probably a watermark or
* effect or something. Skip it */
@@ -865,9 +866,9 @@ fz_text_fill_image_mask(fz_device *dev, fz_image *img, const fz_matrix *ctm,
}
static void
-fz_text_fill_image(fz_device *dev, fz_image *img, const fz_matrix *ctm, float alpha)
+fz_text_fill_image(fz_context *ctx, fz_device *dev, fz_image *img, const fz_matrix *ctm, float alpha)
{
- fz_text_fill_image_mask(dev, img, ctm, NULL, NULL, alpha);
+ fz_text_fill_image_mask(ctx, dev, img, ctm, NULL, NULL, alpha);
}
static int
@@ -957,10 +958,9 @@ fz_bidi_reorder_text_page(fz_context *ctx, fz_text_page *page)
}
static void
-fz_text_begin_page(fz_device *dev, const fz_rect *mediabox, const fz_matrix *ctm)
+fz_text_begin_page(fz_context *ctx, fz_device *dev, const fz_rect *mediabox, const fz_matrix *ctm)
{
- fz_context *ctx = dev->ctx;
- fz_text_device *tdev = dev->user;
+ fz_text_device *tdev = (fz_text_device*)dev;
if (tdev->page->len)
{
@@ -975,16 +975,15 @@ fz_text_begin_page(fz_device *dev, const fz_rect *mediabox, const fz_matrix *ctm
}
static void
-fz_text_end_page(fz_device *dev)
+fz_text_end_page(fz_context *ctx, fz_device *dev)
{
- fz_context *ctx = dev->ctx;
- fz_text_device *tdev = dev->user;
+ fz_text_device *tdev = (fz_text_device*)dev;
- add_span_to_soup(tdev->spans, tdev->cur_span);
+ add_span_to_soup(ctx, tdev->spans, tdev->cur_span);
tdev->cur_span = NULL;
strain_soup(ctx, tdev);
- free_span_soup(tdev->spans);
+ free_span_soup(ctx, tdev->spans);
tdev->spans = NULL;
/* TODO: smart sorting of blocks in reading order */
@@ -994,37 +993,35 @@ fz_text_end_page(fz_device *dev)
}
static void
-fz_text_free_user(fz_device *dev)
+fz_text_drop_imp(fz_context *ctx, fz_device *dev)
{
- fz_text_device *tdev = dev->user;
- free_span_soup(tdev->spans);
- fz_free(dev->ctx, tdev);
+ fz_text_device *tdev = (fz_text_device*)dev;
+ free_span_soup(ctx, tdev->spans);
}
fz_device *
fz_new_text_device(fz_context *ctx, fz_text_sheet *sheet, fz_text_page *page)
{
- fz_device *dev;
-
- fz_text_device *tdev = fz_malloc_struct(ctx, fz_text_device);
- tdev->sheet = sheet;
- tdev->page = page;
- tdev->spans = NULL;
- tdev->cur_span = NULL;
- tdev->lastchar = ' ';
-
- dev = fz_new_device(ctx, tdev);
- dev->hints = FZ_IGNORE_IMAGE | FZ_IGNORE_SHADE;
- dev->begin_page = fz_text_begin_page;
- dev->end_page = fz_text_end_page;
- dev->free_user = fz_text_free_user;
- dev->fill_text = fz_text_fill_text;
- dev->stroke_text = fz_text_stroke_text;
- dev->clip_text = fz_text_clip_text;
- dev->clip_stroke_text = fz_text_clip_stroke_text;
- dev->ignore_text = fz_text_ignore_text;
- dev->fill_image = fz_text_fill_image;
- dev->fill_image_mask = fz_text_fill_image_mask;
-
- return dev;
+ fz_text_device *dev = fz_new_device(ctx, sizeof *dev);
+
+ dev->super.hints = FZ_IGNORE_IMAGE | FZ_IGNORE_SHADE;
+
+ dev->super.drop_imp = fz_text_drop_imp;
+ dev->super.begin_page = fz_text_begin_page;
+ dev->super.end_page = fz_text_end_page;
+ dev->super.fill_text = fz_text_fill_text;
+ dev->super.stroke_text = fz_text_stroke_text;
+ dev->super.clip_text = fz_text_clip_text;
+ dev->super.clip_stroke_text = fz_text_clip_stroke_text;
+ dev->super.ignore_text = fz_text_ignore_text;
+ dev->super.fill_image = fz_text_fill_image;
+ dev->super.fill_image_mask = fz_text_fill_image_mask;
+
+ dev->sheet = sheet;
+ dev->page = page;
+ dev->spans = NULL;
+ dev->cur_span = NULL;
+ dev->lastchar = ' ';
+
+ return (fz_device*)dev;
}
diff --git a/source/fitz/stext-output.c b/source/fitz/stext-output.c
index 6ed595fc..f090020d 100644
--- a/source/fitz/stext-output.c
+++ b/source/fitz/stext-output.c
@@ -29,39 +29,39 @@ static int font_is_italic(fz_font *font)
}
static void
-fz_print_style_begin(fz_output *out, fz_text_style *style)
+fz_print_style_begin(fz_context *ctx, fz_output *out, fz_text_style *style)
{
int script = style->script;
- fz_printf(out, "<span class=\"s%d\">", style->id);
+ fz_printf(ctx, out, "<span class=\"s%d\">", style->id);
while (script-- > 0)
- fz_printf(out, "<sup>");
+ fz_printf(ctx, out, "<sup>");
while (++script < 0)
- fz_printf(out, "<sub>");
+ fz_printf(ctx, out, "<sub>");
}
static void
-fz_print_style_end(fz_output *out, fz_text_style *style)
+fz_print_style_end(fz_context *ctx, fz_output *out, fz_text_style *style)
{
int script = style->script;
while (script-- > 0)
- fz_printf(out, "</sup>");
+ fz_printf(ctx, out, "</sup>");
while (++script < 0)
- fz_printf(out, "</sub>");
- fz_printf(out, "</span>");
+ fz_printf(ctx, out, "</sub>");
+ fz_printf(ctx, out, "</span>");
}
static void
-fz_print_style(fz_output *out, fz_text_style *style)
+fz_print_style(fz_context *ctx, fz_output *out, fz_text_style *style)
{
char *s = strchr(style->font->name, '+');
s = s ? s + 1 : style->font->name;
- fz_printf(out, "span.s%d{font-family:\"%s\";font-size:%gpt;",
+ fz_printf(ctx, out, "span.s%d{font-family:\"%s\";font-size:%gpt;",
style->id, s, style->size);
if (font_is_italic(style->font))
- fz_printf(out, "font-style:italic;");
+ fz_printf(ctx, out, "font-style:italic;");
if (font_is_bold(style->font))
- fz_printf(out, "font-weight:bold;");
- fz_printf(out, "}\n");
+ fz_printf(ctx, out, "font-weight:bold;");
+ fz_printf(ctx, out, "}\n");
}
void
@@ -69,11 +69,11 @@ fz_print_text_sheet(fz_context *ctx, fz_output *out, fz_text_sheet *sheet)
{
fz_text_style *style;
for (style = sheet->style; style; style = style->next)
- fz_print_style(out, style);
+ fz_print_style(ctx, out, style);
}
static void
-send_data_base64(fz_output *out, fz_buffer *buffer)
+send_data_base64(fz_context *ctx, fz_output *out, fz_buffer *buffer)
{
int i, len;
static const char set[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@@ -85,8 +85,8 @@ send_data_base64(fz_output *out, fz_buffer *buffer)
int d = buffer->data[3*i+1];
int e = buffer->data[3*i+2];
if ((i & 15) == 0)
- fz_printf(out, "\n");
- fz_printf(out, "%c%c%c%c", set[c>>2], set[((c&3)<<4)|(d>>4)], set[((d&15)<<2)|(e>>6)], set[e & 63]);
+ fz_printf(ctx, out, "\n");
+ fz_printf(ctx, out, "%c%c%c%c", set[c>>2], set[((c&3)<<4)|(d>>4)], set[((d&15)<<2)|(e>>6)], set[e & 63]);
}
i *= 3;
switch (buffer->len-i)
@@ -95,13 +95,13 @@ send_data_base64(fz_output *out, fz_buffer *buffer)
{
int c = buffer->data[i];
int d = buffer->data[i+1];
- fz_printf(out, "%c%c%c=", set[c>>2], set[((c&3)<<4)|(d>>4)], set[((d&15)<<2)]);
+ fz_printf(ctx, out, "%c%c%c=", set[c>>2], set[((c&3)<<4)|(d>>4)], set[((d&15)<<2)]);
break;
}
case 1:
{
int c = buffer->data[i];
- fz_printf(out, "%c%c==", set[c>>2], set[(c&3)<<4]);
+ fz_printf(ctx, out, "%c%c==", set[c>>2], set[(c&3)<<4]);
break;
}
default:
@@ -119,7 +119,7 @@ fz_print_text_page_html(fz_context *ctx, fz_output *out, fz_text_page *page)
fz_text_span *span;
void *last_region = NULL;
- fz_printf(out, "<div class=\"page\">\n");
+ fz_printf(ctx, out, "<div class=\"page\">\n");
for (block_n = 0; block_n < page->len; block_n++)
{
@@ -128,7 +128,7 @@ fz_print_text_page_html(fz_context *ctx, fz_output *out, fz_text_page *page)
case FZ_PAGE_BLOCK_TEXT:
{
fz_text_block * block = page->blocks[block_n].u.text;
- fz_printf(out, "<div class=\"block\"><p>\n");
+ fz_printf(ctx, out, "<div class=\"block\"><p>\n");
for (line_n = 0; line_n < block->len; line_n++)
{
int lastcol=-1;
@@ -138,16 +138,16 @@ fz_print_text_page_html(fz_context *ctx, fz_output *out, fz_text_page *page)
if (line->region != last_region)
{
if (last_region)
- fz_printf(out, "</div>");
- fz_printf(out, "<div class=\"metaline\">");
+ fz_printf(ctx, out, "</div>");
+ fz_printf(ctx, out, "<div class=\"metaline\">");
last_region = line->region;
}
- fz_printf(out, "<div class=\"line\"");
+ fz_printf(ctx, out, "<div class=\"line\"");
#ifdef DEBUG_INTERNALS
if (line->region)
- fz_printf(out, " region=\"%x\"", line->region);
+ fz_printf(ctx, out, " region=\"%x\"", line->region);
#endif
- fz_printf(out, ">");
+ fz_printf(ctx, out, ">");
for (span = line->first_span; span; span = span->next)
{
float size = fz_matrix_expansion(&span->transform);
@@ -157,17 +157,17 @@ fz_print_text_page_html(fz_context *ctx, fz_output *out, fz_text_page *page)
{
if (lastcol >= 0)
{
- fz_printf(out, "</div>");
+ fz_printf(ctx, out, "</div>");
}
/* If we skipped any columns then output some spacer spans */
while (lastcol < span->column-1)
{
- fz_printf(out, "<div class=\"cell\"></div>");
+ fz_printf(ctx, out, "<div class=\"cell\"></div>");
lastcol++;
}
lastcol++;
/* Now output the span to contain this entire column */
- fz_printf(out, "<div class=\"cell\" style=\"");
+ fz_printf(ctx, out, "<div class=\"cell\" style=\"");
{
fz_text_span *sn;
for (sn = span->next; sn; sn = sn->next)
@@ -175,103 +175,103 @@ fz_print_text_page_html(fz_context *ctx, fz_output *out, fz_text_page *page)
if (sn->column != lastcol)
break;
}
- fz_printf(out, "width:%g%%;align:%s", span->column_width, (span->align == 0 ? "left" : (span->align == 1 ? "center" : "right")));
+ fz_printf(ctx, out, "width:%g%%;align:%s", span->column_width, (span->align == 0 ? "left" : (span->align == 1 ? "center" : "right")));
}
if (span->indent > 1)
- fz_printf(out, ";padding-left:1em;text-indent:-1em");
+ fz_printf(ctx, out, ";padding-left:1em;text-indent:-1em");
if (span->indent < -1)
- fz_printf(out, ";text-indent:1em");
- fz_printf(out, "\">");
+ fz_printf(ctx, out, ";text-indent:1em");
+ fz_printf(ctx, out, "\">");
}
#ifdef DEBUG_INTERNALS
- fz_printf(out, "<span class=\"internal_span\"");
+ fz_printf(ctx, out, "<span class=\"internal_span\"");
if (span->column)
- fz_printf(out, " col=\"%x\"", span->column);
- fz_printf(out, ">");
+ fz_printf(ctx, out, " col=\"%x\"", span->column);
+ fz_printf(ctx, out, ">");
#endif
if (span->spacing >= 1)
- fz_printf(out, " ");
+ fz_printf(ctx, out, " ");
if (base_offset > SUBSCRIPT_OFFSET)
- fz_printf(out, "<sub>");
+ fz_printf(ctx, out, "<sub>");
else if (base_offset < SUPERSCRIPT_OFFSET)
- fz_printf(out, "<sup>");
+ fz_printf(ctx, out, "<sup>");
for (ch_n = 0; ch_n < span->len; ch_n++)
{
fz_text_char *ch = &span->text[ch_n];
if (style != ch->style)
{
if (style)
- fz_print_style_end(out, style);
- fz_print_style_begin(out, ch->style);
+ fz_print_style_end(ctx, out, style);
+ fz_print_style_begin(ctx, out, ch->style);
style = ch->style;
}
if (ch->c == '<')
- fz_printf(out, "&lt;");
+ fz_printf(ctx, out, "&lt;");
else if (ch->c == '>')
- fz_printf(out, "&gt;");
+ fz_printf(ctx, out, "&gt;");
else if (ch->c == '&')
- fz_printf(out, "&amp;");
+ fz_printf(ctx, out, "&amp;");
else if (ch->c >= 32 && ch->c <= 127)
- fz_printf(out, "%c", ch->c);
+ fz_printf(ctx, out, "%c", ch->c);
else
- fz_printf(out, "&#x%x;", ch->c);
+ fz_printf(ctx, out, "&#x%x;", ch->c);
}
if (style)
{
- fz_print_style_end(out, style);
+ fz_print_style_end(ctx, out, style);
style = NULL;
}
if (base_offset > SUBSCRIPT_OFFSET)
- fz_printf(out, "</sub>");
+ fz_printf(ctx, out, "</sub>");
else if (base_offset < SUPERSCRIPT_OFFSET)
- fz_printf(out, "</sup>");
+ fz_printf(ctx, out, "</sup>");
#ifdef DEBUG_INTERNALS
- fz_printf(out, "</span>");
+ fz_printf(ctx, out, "</span>");
#endif
}
/* Close our floating span */
- fz_printf(out, "</div>");
+ fz_printf(ctx, out, "</div>");
/* Close the line */
- fz_printf(out, "</div>");
- fz_printf(out, "\n");
+ fz_printf(ctx, out, "</div>");
+ fz_printf(ctx, out, "\n");
}
/* Close the metaline */
- fz_printf(out, "</div>");
+ fz_printf(ctx, out, "</div>");
last_region = NULL;
- fz_printf(out, "</p></div>\n");
+ fz_printf(ctx, out, "</p></div>\n");
break;
}
case FZ_PAGE_BLOCK_IMAGE:
{
fz_image_block *image = page->blocks[block_n].u.image;
- fz_printf(out, "<img width=%d height=%d src=\"data:", image->image->w, image->image->h);
+ fz_printf(ctx, out, "<img width=%d height=%d src=\"data:", image->image->w, image->image->h);
switch (image->image->buffer == NULL ? FZ_IMAGE_JPX : image->image->buffer->params.type)
{
case FZ_IMAGE_JPEG:
- fz_printf(out, "image/jpeg;base64,");
- send_data_base64(out, image->image->buffer->buffer);
+ fz_printf(ctx, out, "image/jpeg;base64,");
+ send_data_base64(ctx, out, image->image->buffer->buffer);
break;
case FZ_IMAGE_PNG:
- fz_printf(out, "image/png;base64,");
- send_data_base64(out, image->image->buffer->buffer);
+ fz_printf(ctx, out, "image/png;base64,");
+ send_data_base64(ctx, out, image->image->buffer->buffer);
break;
default:
{
fz_buffer *buf = fz_new_png_from_image(ctx, image->image, image->image->w, image->image->h);
- fz_printf(out, "image/png;base64,");
- send_data_base64(out, buf);
+ fz_printf(ctx, out, "image/png;base64,");
+ send_data_base64(ctx, out, buf);
fz_drop_buffer(ctx, buf);
break;
}
}
- fz_printf(out, "\">\n");
+ fz_printf(ctx, out, "\">\n");
break;
}
}
}
- fz_printf(out, "</div>\n");
+ fz_printf(ctx, out, "</div>\n");
}
void
@@ -279,7 +279,7 @@ fz_print_text_page_xml(fz_context *ctx, fz_output *out, fz_text_page *page)
{
int block_n;
- fz_printf(out, "<page width=\"%g\" height=\"%g\">\n",
+ fz_printf(ctx, out, "<page width=\"%g\" height=\"%g\">\n",
page->mediabox.x1 - page->mediabox.x0,
page->mediabox.y1 - page->mediabox.y0);
@@ -293,12 +293,12 @@ fz_print_text_page_xml(fz_context *ctx, fz_output *out, fz_text_page *page)
fz_text_line *line;
char *s;
- fz_printf(out, "<block bbox=\"%g %g %g %g\">\n",
+ fz_printf(ctx, out, "<block bbox=\"%g %g %g %g\">\n",
block->bbox.x0, block->bbox.y0, block->bbox.x1, block->bbox.y1);
for (line = block->lines; line < block->lines + block->len; line++)
{
fz_text_span *span;
- fz_printf(out, "<line bbox=\"%g %g %g %g\">\n",
+ fz_printf(ctx, out, "<line bbox=\"%g %g %g %g\">\n",
line->bbox.x0, line->bbox.y0, line->bbox.x1, line->bbox.y1);
for (span = line->first_span; span; span = span->next)
{
@@ -311,43 +311,43 @@ fz_print_text_page_xml(fz_context *ctx, fz_output *out, fz_text_page *page)
{
if (style)
{
- fz_printf(out, "</span>\n");
+ fz_printf(ctx, out, "</span>\n");
}
style = ch->style;
s = strchr(style->font->name, '+');
s = s ? s + 1 : style->font->name;
- fz_printf(out, "<span bbox=\"%g %g %g %g\" font=\"%s\" size=\"%g\">\n",
+ fz_printf(ctx, out, "<span bbox=\"%g %g %g %g\" font=\"%s\" size=\"%g\">\n",
span->bbox.x0, span->bbox.y0, span->bbox.x1, span->bbox.y1,
s, style->size);
}
{
fz_rect rect;
- fz_text_char_bbox(&rect, span, char_num);
- fz_printf(out, "<char bbox=\"%g %g %g %g\" x=\"%g\" y=\"%g\" c=\"",
+ fz_text_char_bbox(ctx, &rect, span, char_num);
+ fz_printf(ctx, out, "<char bbox=\"%g %g %g %g\" x=\"%g\" y=\"%g\" c=\"",
rect.x0, rect.y0, rect.x1, rect.y1, ch->p.x, ch->p.y);
}
switch (ch->c)
{
- case '<': fz_printf(out, "&lt;"); break;
- case '>': fz_printf(out, "&gt;"); break;
- case '&': fz_printf(out, "&amp;"); break;
- case '"': fz_printf(out, "&quot;"); break;
- case '\'': fz_printf(out, "&apos;"); break;
+ case '<': fz_printf(ctx, out, "&lt;"); break;
+ case '>': fz_printf(ctx, out, "&gt;"); break;
+ case '&': fz_printf(ctx, out, "&amp;"); break;
+ case '"': fz_printf(ctx, out, "&quot;"); break;
+ case '\'': fz_printf(ctx, out, "&apos;"); break;
default:
if (ch->c >= 32 && ch->c <= 127)
- fz_printf(out, "%c", ch->c);
+ fz_printf(ctx, out, "%c", ch->c);
else
- fz_printf(out, "&#x%x;", ch->c);
+ fz_printf(ctx, out, "&#x%x;", ch->c);
break;
}
- fz_printf(out, "\"/>\n");
+ fz_printf(ctx, out, "\"/>\n");
}
if (style)
- fz_printf(out, "</span>\n");
+ fz_printf(ctx, out, "</span>\n");
}
- fz_printf(out, "</line>\n");
+ fz_printf(ctx, out, "</line>\n");
}
- fz_printf(out, "</block>\n");
+ fz_printf(ctx, out, "</block>\n");
break;
}
case FZ_PAGE_BLOCK_IMAGE:
@@ -356,7 +356,7 @@ fz_print_text_page_xml(fz_context *ctx, fz_output *out, fz_text_page *page)
}
}
}
- fz_printf(out, "</page>\n");
+ fz_printf(ctx, out, "</page>\n");
}
void
@@ -385,12 +385,12 @@ fz_print_text_page(fz_context *ctx, fz_output *out, fz_text_page *page)
{
n = fz_runetochar(utf, ch->c);
for (i = 0; i < n; i++)
- fz_printf(out, "%c", utf[i]);
+ fz_printf(ctx, out, "%c", utf[i]);
}
}
- fz_printf(out, "\n");
+ fz_printf(ctx, out, "\n");
}
- fz_printf(out, "\n");
+ fz_printf(ctx, out, "\n");
break;
}
case FZ_PAGE_BLOCK_IMAGE:
diff --git a/source/fitz/stext-search.c b/source/fitz/stext-search.c
index 29f51e64..475c0c8a 100644
--- a/source/fitz/stext-search.c
+++ b/source/fitz/stext-search.c
@@ -14,7 +14,7 @@ static inline int iswhite(int c)
return c == ' ' || c == '\r' || c == '\n' || c == '\t' || c == 0xA0 || c == 0x2028 || c == 0x2029;
}
-fz_char_and_box *fz_text_char_at(fz_char_and_box *cab, fz_text_page *page, int idx)
+fz_char_and_box *fz_text_char_at(fz_context *ctx, fz_char_and_box *cab, fz_text_page *page, int idx)
{
int block_num;
int ofs = 0;
@@ -35,7 +35,7 @@ fz_char_and_box *fz_text_char_at(fz_char_and_box *cab, fz_text_page *page, int i
if (idx < ofs + span->len)
{
cab->c = span->text[idx - ofs].c;
- fz_text_char_bbox(&cab->bbox, span, idx - ofs);
+ fz_text_char_bbox(ctx, &cab->bbox, span, idx - ofs);
return cab;
}
ofs += span->len;
@@ -55,21 +55,21 @@ fz_char_and_box *fz_text_char_at(fz_char_and_box *cab, fz_text_page *page, int i
return cab;
}
-static int charat(fz_text_page *page, int idx)
+static int charat(fz_context *ctx, fz_text_page *page, int idx)
{
fz_char_and_box cab;
- return fz_text_char_at(&cab, page, idx)->c;
+ return fz_text_char_at(ctx, &cab, page, idx)->c;
}
-static fz_rect *bboxat(fz_text_page *page, int idx, fz_rect *bbox)
+static fz_rect *bboxat(fz_context *ctx, fz_text_page *page, int idx, fz_rect *bbox)
{
fz_char_and_box cab;
/* FIXME: Nasty extra copy */
- *bbox = fz_text_char_at(&cab, page, idx)->bbox;
+ *bbox = fz_text_char_at(ctx, &cab, page, idx)->bbox;
return bbox;
}
-static int textlen(fz_text_page *page)
+static int textlen(fz_context *ctx, fz_text_page *page)
{
int len = 0;
int block_num;
@@ -95,21 +95,21 @@ static int textlen(fz_text_page *page)
return len;
}
-static int match(fz_text_page *page, const char *s, int n)
+static int match(fz_context *ctx, fz_text_page *page, const char *s, int n)
{
int orig = n;
int c;
while (*s)
{
s += fz_chartorune(&c, (char *)s);
- if (iswhite(c) && iswhite(charat(page, n)))
+ if (iswhite(c) && iswhite(charat(ctx, page, n)))
{
const char *s_next;
/* Skip over whitespace in the document */
do
n++;
- while (iswhite(charat(page, n)));
+ while (iswhite(charat(ctx, page, n)));
/* Skip over multiple whitespace in the search string */
while (s_next = s + fz_chartorune(&c, (char *)s), iswhite(c))
@@ -117,7 +117,7 @@ static int match(fz_text_page *page, const char *s, int n)
}
else
{
- if (fz_tolower(c) != fz_tolower(charat(page, n)))
+ if (fz_tolower(c) != fz_tolower(charat(ctx, page, n)))
return 0;
n++;
}
@@ -134,17 +134,17 @@ fz_search_text_page(fz_context *ctx, fz_text_page *text, const char *needle, fz_
return 0;
hit_count = 0;
- len = textlen(text);
+ len = textlen(ctx, text);
for (pos = 0; pos < len; pos++)
{
- n = match(text, needle, pos);
+ n = match(ctx, text, needle, pos);
if (n)
{
fz_rect linebox = fz_empty_rect;
for (i = 0; i < n; i++)
{
fz_rect charbox;
- bboxat(text, pos + i, &charbox);
+ bboxat(ctx, text, pos + i, &charbox);
if (!fz_is_empty_rect(&charbox))
{
if (charbox.y0 != linebox.y0 || fz_abs(charbox.x0 - linebox.x1) > 5)
@@ -195,7 +195,7 @@ fz_highlight_selection(fz_context *ctx, fz_text_page *page, fz_rect rect, fz_rec
{
for (i = 0; i < span->len; i++)
{
- fz_text_char_bbox(&charbox, span, i);
+ fz_text_char_bbox(ctx, &charbox, span, i);
if (charbox.x1 >= x0 && charbox.x0 <= x1 && charbox.y1 >= y0 && charbox.y0 <= y1)
{
if (charbox.y0 != linebox.y0 || fz_abs(charbox.x0 - linebox.x1) > 5)
@@ -256,7 +256,7 @@ fz_copy_selection(fz_context *ctx, fz_text_page *page, fz_rect rect)
for (i = 0; i < span->len; i++)
{
- fz_text_char_bbox(&hitbox, span, i);
+ fz_text_char_bbox(ctx, &hitbox, span, i);
c = span->text[i].c;
if (c < 32)
c = '?';
diff --git a/source/fitz/store.c b/source/fitz/store.c
index cf0e3536..dd1cb784 100644
--- a/source/fitz/store.c
+++ b/source/fitz/store.c
@@ -56,39 +56,21 @@ fz_new_store_context(fz_context *ctx, unsigned int max)
void *
fz_keep_storable(fz_context *ctx, fz_storable *s)
{
- if (s == NULL)
- return NULL;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- if (s->refs > 0)
- s->refs++;
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- return s;
+ return fz_keep_imp(ctx, s, &s->refs);
}
void
fz_drop_storable(fz_context *ctx, fz_storable *s)
{
- int do_free = 0;
-
- if (s == NULL)
- return;
- fz_lock(ctx, FZ_LOCK_ALLOC);
- if (s->refs < 0)
- {
- /* It's a static object. Dropping does nothing. */
- }
- else if (--s->refs == 0)
- {
- /* If we are dropping the last reference to an object, then
- * it cannot possibly be in the store (as the store always
- * keeps a ref to everything in it, and doesn't drop via
- * this method. So we can simply drop the storable object
- * itself without any operations on the fz_store. */
- do_free = 1;
- }
- fz_unlock(ctx, FZ_LOCK_ALLOC);
- if (do_free)
- s->free(ctx, s);
+ /*
+ If we are dropping the last reference to an object, then
+ it cannot possibly be in the store (as the store always
+ keeps a ref to everything in it, and doesn't drop via
+ this method. So we can simply drop the storable object
+ itself without any operations on the fz_store.
+ */
+ if (fz_drop_imp(ctx, s, &s->refs))
+ s->drop(ctx, s);
}
static void
@@ -113,14 +95,14 @@ evict(fz_context *ctx, fz_item *item)
if (item->type->make_hash_key)
{
fz_store_hash hash = { NULL };
- hash.free = item->val->free;
- if (item->type->make_hash_key(&hash, item->key))
+ hash.drop = item->val->drop;
+ if (item->type->make_hash_key(ctx, &hash, item->key))
fz_hash_remove(ctx, store->hash, &hash);
}
fz_unlock(ctx, FZ_LOCK_ALLOC);
if (drop)
- item->val->free(ctx, item->val);
- /* Always drops the key and free the item */
+ item->val->drop(ctx, item->val);
+ /* Always drops the key and drop the item */
item->type->drop_key(ctx, item->key);
fz_free(ctx, item);
fz_lock(ctx, FZ_LOCK_ALLOC);
@@ -250,8 +232,8 @@ fz_store_item(fz_context *ctx, void *key, void *val_, unsigned int itemsize, fz_
if (type->make_hash_key)
{
- hash.free = val->free;
- use_hash = type->make_hash_key(&hash, key);
+ hash.drop = val->drop;
+ use_hash = type->make_hash_key(ctx, &hash, key);
}
type->keep_key(ctx, key);
@@ -347,7 +329,7 @@ fz_store_item(fz_context *ctx, void *key, void *val_, unsigned int itemsize, fz_
}
void *
-fz_find_item(fz_context *ctx, fz_store_free_fn *free, void *key, fz_store_type *type)
+fz_find_item(fz_context *ctx, fz_store_drop_fn *drop, void *key, fz_store_type *type)
{
fz_item *item;
fz_store *store = ctx->store;
@@ -362,8 +344,8 @@ fz_find_item(fz_context *ctx, fz_store_free_fn *free, void *key, fz_store_type *
if (type->make_hash_key)
{
- hash.free = free;
- use_hash = type->make_hash_key(&hash, key);
+ hash.drop = drop;
+ use_hash = type->make_hash_key(ctx, &hash, key);
}
fz_lock(ctx, FZ_LOCK_ALLOC);
@@ -377,7 +359,7 @@ fz_find_item(fz_context *ctx, fz_store_free_fn *free, void *key, fz_store_type *
/* Others we have to hunt for slowly */
for (item = store->head; item; item = item->next)
{
- if (item->val->free == free && !type->cmp_key(item->key, key))
+ if (item->val->drop == drop && !type->cmp_key(ctx, item->key, key))
break;
}
}
@@ -400,18 +382,18 @@ fz_find_item(fz_context *ctx, fz_store_free_fn *free, void *key, fz_store_type *
}
void
-fz_remove_item(fz_context *ctx, fz_store_free_fn *free, void *key, fz_store_type *type)
+fz_remove_item(fz_context *ctx, fz_store_drop_fn *drop, void *key, fz_store_type *type)
{
fz_item *item;
fz_store *store = ctx->store;
- int drop;
+ int dodrop;
fz_store_hash hash = { NULL };
int use_hash = 0;
if (type->make_hash_key)
{
- hash.free = free;
- use_hash = type->make_hash_key(&hash, key);
+ hash.drop = drop;
+ use_hash = type->make_hash_key(ctx, &hash, key);
}
fz_lock(ctx, FZ_LOCK_ALLOC);
@@ -426,7 +408,7 @@ fz_remove_item(fz_context *ctx, fz_store_free_fn *free, void *key, fz_store_type
{
/* Others we have to hunt for slowly */
for (item = store->head; item; item = item->next)
- if (item->val->free == free && !type->cmp_key(item->key, key))
+ if (item->val->drop == drop && !type->cmp_key(ctx, item->key, key))
break;
}
if (item)
@@ -445,10 +427,10 @@ fz_remove_item(fz_context *ctx, fz_store_free_fn *free, void *key, fz_store_type
else
store->head = item->next;
}
- drop = (item->val->refs > 0 && --item->val->refs == 0);
+ dodrop = (item->val->refs > 0 && --item->val->refs == 0);
fz_unlock(ctx, FZ_LOCK_ALLOC);
- if (drop)
- item->val->free(ctx, item->val);
+ if (dodrop)
+ item->val->drop(ctx, item->val);
type->drop_key(ctx, item->key);
fz_free(ctx, item);
}
@@ -497,7 +479,7 @@ fz_drop_store_context(fz_context *ctx)
return;
fz_empty_store(ctx);
- fz_free_hash(ctx, ctx->store->hash);
+ fz_drop_hash(ctx, ctx->store->hash);
fz_free(ctx, ctx->store);
ctx->store = NULL;
}
@@ -527,7 +509,7 @@ fz_print_store_locked(fz_context *ctx, FILE *out)
next->val->refs++;
fprintf(out, "store[*][refs=%d][size=%d] ", item->val->refs, item->size);
fz_unlock(ctx, FZ_LOCK_ALLOC);
- item->type->debug(out, item->key);
+ item->type->debug(ctx, out, item->key);
fprintf(out, " = %p\n", item->val);
fflush(out);
fz_lock(ctx, FZ_LOCK_ALLOC);
diff --git a/source/fitz/stream-open.c b/source/fitz/stream-open.c
index 3e51e733..fe8fc443 100644
--- a/source/fitz/stream-open.c
+++ b/source/fitz/stream-open.c
@@ -1,20 +1,7 @@
#include "mupdf/fitz.h"
-void fz_rebind_stream(fz_stream *stm, fz_context *ctx)
-{
- if (stm == NULL || stm->ctx == ctx)
- return;
- do {
- stm->ctx = ctx;
- stm = (stm->rebind == NULL ? NULL : stm->rebind(stm));
- } while (stm != NULL);
-}
-
fz_stream *
-fz_new_stream(fz_context *ctx, void *state,
- fz_stream_next_fn *next,
- fz_stream_close_fn *close,
- fz_stream_rebind_fn *rebind)
+fz_new_stream(fz_context *ctx, void *state, fz_stream_next_fn *next, fz_stream_close_fn *close)
{
fz_stream *stm;
@@ -43,14 +30,12 @@ fz_new_stream(fz_context *ctx, void *state,
stm->next = next;
stm->close = close;
stm->seek = NULL;
- stm->rebind = rebind;
- stm->ctx = ctx;
return stm;
}
fz_stream *
-fz_keep_stream(fz_stream *stm)
+fz_keep_stream(fz_context *ctx, fz_stream *stm)
{
if (stm)
stm->refs ++;
@@ -58,7 +43,7 @@ fz_keep_stream(fz_stream *stm)
}
void
-fz_close(fz_stream *stm)
+fz_drop_stream(fz_context *ctx, fz_stream *stm)
{
if (!stm)
return;
@@ -66,8 +51,8 @@ fz_close(fz_stream *stm)
if (stm->refs == 0)
{
if (stm->close)
- stm->close(stm->ctx, stm->state);
- fz_free(stm->ctx, stm);
+ stm->close(ctx, stm->state);
+ fz_free(ctx, stm);
}
}
@@ -79,14 +64,14 @@ typedef struct fz_file_stream_s
unsigned char buffer[4096];
} fz_file_stream;
-static int next_file(fz_stream *stm, int n)
+static int next_file(fz_context *ctx, fz_stream *stm, int n)
{
fz_file_stream *state = stm->state;
/* n is only a hint, that we can safely ignore */
n = read(state->file, state->buffer, sizeof(state->buffer));
if (n < 0)
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "read error: %s", strerror(errno));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "read error: %s", strerror(errno));
stm->rp = state->buffer;
stm->wp = state->buffer + n;
stm->pos += n;
@@ -96,12 +81,12 @@ static int next_file(fz_stream *stm, int n)
return *stm->rp++;
}
-static void seek_file(fz_stream *stm, int offset, int whence)
+static void seek_file(fz_context *ctx, fz_stream *stm, int offset, int whence)
{
fz_file_stream *state = stm->state;
int n = lseek(state->file, offset, whence);
if (n < 0)
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "cannot lseek: %s", strerror(errno));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot lseek: %s", strerror(errno));
stm->pos = n;
stm->rp = state->buffer;
stm->wp = state->buffer;
@@ -125,7 +110,7 @@ fz_open_fd(fz_context *ctx, int fd)
fz_try(ctx)
{
- stm = fz_new_stream(ctx, state, next_file, close_file, NULL);
+ stm = fz_new_stream(ctx, state, next_file, close_file);
}
fz_catch(ctx)
{
@@ -173,12 +158,12 @@ fz_open_file_w(fz_context *ctx, const wchar_t *name)
/* Memory stream */
-static int next_buffer(fz_stream *stm, int max)
+static int next_buffer(fz_context *ctx, fz_stream *stm, int max)
{
return EOF;
}
-static void seek_buffer(fz_stream *stm, int offset, int whence)
+static void seek_buffer(fz_context *ctx, fz_stream *stm, int offset, int whence)
{
int pos = stm->pos - (stm->wp - stm->rp);
/* Convert to absolute pos */
@@ -211,7 +196,7 @@ fz_open_buffer(fz_context *ctx, fz_buffer *buf)
fz_stream *stm;
fz_keep_buffer(ctx, buf);
- stm = fz_new_stream(ctx, buf, next_buffer, close_buffer, NULL);
+ stm = fz_new_stream(ctx, buf, next_buffer, close_buffer);
stm->seek = seek_buffer;
stm->rp = buf->data;
@@ -227,7 +212,7 @@ fz_open_memory(fz_context *ctx, unsigned char *data, int len)
{
fz_stream *stm;
- stm = fz_new_stream(ctx, NULL, next_buffer, close_buffer, NULL);
+ stm = fz_new_stream(ctx, NULL, next_buffer, close_buffer);
stm->seek = seek_buffer;
stm->rp = data;
diff --git a/source/fitz/stream-prog.c b/source/fitz/stream-prog.c
index 01f3e5ef..fbf42666 100644
--- a/source/fitz/stream-prog.c
+++ b/source/fitz/stream-prog.c
@@ -27,7 +27,7 @@ typedef struct prog_state
unsigned char buffer[4096];
} prog_state;
-static int next_prog(fz_stream *stm, int len)
+static int next_prog(fz_context *ctx, fz_stream *stm, int len)
{
prog_state *ps = (prog_state *)stm->state;
int n;
@@ -50,14 +50,14 @@ static int next_prog(fz_stream *stm, int len)
if (len <= 0)
{
show_progress(av, stm->pos);
- fz_throw(stm->ctx, FZ_ERROR_TRYLATER, "Not enough data yet");
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "Not enough data yet");
}
}
}
n = (len > 0 ? read(ps->fd, buf, len) : 0);
if (n < 0)
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "read error: %s", strerror(errno));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "read error: %s", strerror(errno));
stm->rp = ps->buffer + stm->pos;
stm->wp = ps->buffer + stm->pos + n;
stm->pos += n;
@@ -66,7 +66,7 @@ static int next_prog(fz_stream *stm, int len)
return *stm->rp++;
}
-static void seek_prog(fz_stream *stm, int offset, int whence)
+static void seek_prog(fz_context *ctx, fz_stream *stm, int offset, int whence)
{
prog_state *ps = (prog_state *)stm->state;
int n;
@@ -84,7 +84,7 @@ static void seek_prog(fz_stream *stm, int offset, int whence)
if (whence == SEEK_END)
{
show_progress(ps->available, ps->length);
- fz_throw(stm->ctx, FZ_ERROR_TRYLATER, "Not enough data to seek to end yet");
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "Not enough data to seek to end yet");
}
}
if (whence == SEEK_CUR)
@@ -94,7 +94,7 @@ static void seek_prog(fz_stream *stm, int offset, int whence)
if (offset > ps->available)
{
show_progress(ps->available, offset);
- fz_throw(stm->ctx, FZ_ERROR_TRYLATER, "Not enough data to seek (relatively) to offset yet");
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "Not enough data to seek (relatively) to offset yet");
}
}
if (whence == SEEK_SET)
@@ -102,13 +102,13 @@ static void seek_prog(fz_stream *stm, int offset, int whence)
if (offset > ps->available)
{
show_progress(ps->available, offset);
- fz_throw(stm->ctx, FZ_ERROR_TRYLATER, "Not enough data to seek to offset yet");
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "Not enough data to seek to offset yet");
}
}
n = lseek(ps->fd, offset, whence);
if (n < 0)
- fz_throw(stm->ctx, FZ_ERROR_GENERIC, "cannot lseek: %s", strerror(errno));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot lseek: %s", strerror(errno));
stm->pos = n;
stm->wp = stm->rp;
}
@@ -122,7 +122,7 @@ static void close_prog(fz_context *ctx, void *state)
fz_free(ctx, state);
}
-static int meta_prog(fz_stream *stm, int key, int size, void *ptr)
+static int meta_prog(fz_context *ctx, fz_stream *stm, int key, int size, void *ptr)
{
prog_state *ps = (prog_state *)stm->state;
switch(key)
@@ -153,7 +153,7 @@ fz_open_fd_progressive(fz_context *ctx, int fd, int bps)
fz_try(ctx)
{
- stm = fz_new_stream(ctx, state, next_prog, close_prog, NULL);
+ stm = fz_new_stream(ctx, state, next_prog, close_prog);
}
fz_catch(ctx)
{
diff --git a/source/fitz/stream-read.c b/source/fitz/stream-read.c
index 3144974e..75261ea5 100644
--- a/source/fitz/stream-read.c
+++ b/source/fitz/stream-read.c
@@ -3,14 +3,14 @@
#define MIN_BOMB (100 << 20)
int
-fz_read(fz_stream *stm, unsigned char *buf, int len)
+fz_read(fz_context *ctx, fz_stream *stm, unsigned char *buf, int len)
{
int count, n;
count = 0;
do
{
- n = fz_available(stm, len);
+ n = fz_available(ctx, stm, len);
if (n > len)
n = len;
if (n == 0)
@@ -28,17 +28,16 @@ fz_read(fz_stream *stm, unsigned char *buf, int len)
}
fz_buffer *
-fz_read_all(fz_stream *stm, int initial)
+fz_read_all(fz_context *ctx, fz_stream *stm, int initial)
{
- return fz_read_best(stm, initial, NULL);
+ return fz_read_best(ctx, stm, initial, NULL);
}
fz_buffer *
-fz_read_best(fz_stream *stm, int initial, int *truncated)
+fz_read_best(fz_context *ctx, fz_stream *stm, int initial, int *truncated)
{
fz_buffer *buf = NULL;
int n;
- fz_context *ctx = stm->ctx;
fz_var(buf);
@@ -62,7 +61,7 @@ fz_read_best(fz_stream *stm, int initial, int *truncated)
fz_throw(ctx, FZ_ERROR_GENERIC, "compression bomb detected");
}
- n = fz_read(stm, buf->data + buf->len, buf->cap - buf->len);
+ n = fz_read(ctx, stm, buf->data + buf->len, buf->cap - buf->len);
if (n == 0)
break;
@@ -91,19 +90,19 @@ fz_read_best(fz_stream *stm, int initial, int *truncated)
}
void
-fz_read_line(fz_stream *stm, char *mem, int n)
+fz_read_line(fz_context *ctx, fz_stream *stm, char *mem, int n)
{
char *s = mem;
int c = EOF;
while (n > 1)
{
- c = fz_read_byte(stm);
+ c = fz_read_byte(ctx, stm);
if (c == EOF)
break;
if (c == '\r') {
- c = fz_peek_byte(stm);
+ c = fz_peek_byte(ctx, stm);
if (c == '\n')
- fz_read_byte(stm);
+ fz_read_byte(ctx, stm);
break;
}
if (c == '\n')
@@ -116,50 +115,50 @@ fz_read_line(fz_stream *stm, char *mem, int n)
}
int
-fz_tell(fz_stream *stm)
+fz_tell(fz_context *ctx, fz_stream *stm)
{
return stm->pos - (stm->wp - stm->rp);
}
void
-fz_seek(fz_stream *stm, int offset, int whence)
+fz_seek(fz_context *ctx, fz_stream *stm, int offset, int whence)
{
stm->avail = 0; /* Reset bit reading */
if (stm->seek)
{
if (whence == 1)
{
- offset = fz_tell(stm) + offset;
+ offset = fz_tell(ctx, stm) + offset;
whence = 0;
}
- stm->seek(stm, offset, whence);
+ stm->seek(ctx, stm, offset, whence);
stm->eof = 0;
}
else if (whence != 2)
{
if (whence == 0)
- offset -= fz_tell(stm);
+ offset -= fz_tell(ctx, stm);
if (offset < 0)
- fz_warn(stm->ctx, "cannot seek backwards");
+ fz_warn(ctx, "cannot seek backwards");
/* dog slow, but rare enough */
while (offset-- > 0)
{
- if (fz_read_byte(stm) == EOF)
+ if (fz_read_byte(ctx, stm) == EOF)
{
- fz_warn(stm->ctx, "seek failed");
+ fz_warn(ctx, "seek failed");
break;
}
}
}
else
- fz_warn(stm->ctx, "cannot seek");
+ fz_warn(ctx, "cannot seek");
}
-int fz_stream_meta(fz_stream *stm, int key, int size, void *ptr)
+int fz_stream_meta(fz_context *ctx, fz_stream *stm, int key, int size, void *ptr)
{
if (!stm || !stm->meta)
return -1;
- return stm->meta(stm, key, size, ptr);
+ return stm->meta(ctx, stm, key, size, ptr);
}
fz_buffer *
@@ -173,11 +172,11 @@ fz_read_file(fz_context *ctx, const char *filename)
stm = fz_open_file(ctx, filename);
fz_try(ctx)
{
- buf = fz_read_all(stm, 0);
+ buf = fz_read_all(ctx, stm, 0);
}
fz_always(ctx)
{
- fz_close(stm);
+ fz_drop_stream(ctx, stm);
}
fz_catch(ctx)
{
diff --git a/source/fitz/svg-device.c b/source/fitz/svg-device.c
index f90557b5..4345c225 100644
--- a/source/fitz/svg-device.c
+++ b/source/fitz/svg-device.c
@@ -31,7 +31,8 @@ struct font_s
struct svg_device_s
{
- fz_context *ctx;
+ fz_device super;
+
fz_output *out;
fz_output *out_store;
fz_output *defs;
@@ -53,7 +54,7 @@ struct svg_device_s
* so we have to delay definitions until after the symbol definition ends. */
static fz_output *
-start_def(svg_device *sdev)
+start_def(fz_context *ctx, svg_device *sdev)
{
sdev->def_count++;
if (sdev->def_count == 2)
@@ -61,8 +62,8 @@ start_def(svg_device *sdev)
if (sdev->defs == NULL)
{
if (sdev->defs_buffer == NULL)
- sdev->defs_buffer = fz_new_buffer(sdev->ctx, 1024);
- sdev->defs = fz_new_output_with_buffer(sdev->ctx, sdev->defs_buffer);
+ sdev->defs_buffer = fz_new_buffer(ctx, 1024);
+ sdev->defs = fz_new_output_with_buffer(ctx, sdev->defs_buffer);
}
sdev->out = sdev->defs;
}
@@ -70,7 +71,7 @@ start_def(svg_device *sdev)
}
static fz_output *
-end_def(svg_device *sdev)
+end_def(fz_context *ctx, svg_device *sdev)
{
if (sdev->def_count > 0)
sdev->def_count--;
@@ -78,7 +79,7 @@ end_def(svg_device *sdev)
sdev->out = sdev->out_store;
if (sdev->def_count == 0 && sdev->defs_buffer != NULL)
{
- fz_write(sdev->out, sdev->defs_buffer->data, sdev->defs_buffer->len);
+ fz_write(ctx, sdev->out, sdev->defs_buffer->data, sdev->defs_buffer->len);
sdev->defs_buffer->len = 0;
}
return sdev->out;
@@ -87,12 +88,12 @@ end_def(svg_device *sdev)
/* Helper functions */
static void
-svg_dev_path(svg_device *sdev, fz_path *path)
+svg_dev_path(fz_context *ctx, svg_device *sdev, fz_path *path)
{
fz_output *out = sdev->out;
float x, y;
int i, k;
- fz_printf(out, " d=\"");
+ fz_printf(ctx, out, " d=\"");
for (i = 0, k = 0; i < path->cmd_len; i++)
{
switch (path->cmds[i])
@@ -100,46 +101,46 @@ svg_dev_path(svg_device *sdev, fz_path *path)
case FZ_MOVETO:
x = path->coords[k++];
y = path->coords[k++];
- fz_printf(out, "M %g %g ", x, y);
+ fz_printf(ctx, out, "M %g %g ", x, y);
break;
case FZ_LINETO:
x = path->coords[k++];
y = path->coords[k++];
- fz_printf(out, "L %g %g ", x, y);
+ fz_printf(ctx, out, "L %g %g ", x, y);
break;
case FZ_CURVETO:
x = path->coords[k++];
y = path->coords[k++];
- fz_printf(out, "C %g %g ", x, y);
+ fz_printf(ctx, out, "C %g %g ", x, y);
x = path->coords[k++];
y = path->coords[k++];
- fz_printf(out, "%g %g ", x, y);
+ fz_printf(ctx, out, "%g %g ", x, y);
x = path->coords[k++];
y = path->coords[k++];
- fz_printf(out, "%g %g ", x, y);
+ fz_printf(ctx, out, "%g %g ", x, y);
break;
case FZ_CLOSE_PATH:
- fz_printf(out, "Z ");
+ fz_printf(ctx, out, "Z ");
break;
}
}
- fz_printf(out, "\"");
+ fz_printf(ctx, out, "\"");
}
static void
-svg_dev_ctm(svg_device *sdev, const fz_matrix *ctm)
+svg_dev_ctm(fz_context *ctx, svg_device *sdev, const fz_matrix *ctm)
{
fz_output *out = sdev->out;
if (ctm->a != 1.0 || ctm->b != 0 || ctm->c != 0 || ctm->d != 1.0 || ctm->e != 0 || ctm->f != 0)
{
- fz_printf(out, " transform=\"matrix(%g,%g,%g,%g,%g,%g)\"",
+ fz_printf(ctx, out, " transform=\"matrix(%g,%g,%g,%g,%g,%g)\"",
ctm->a, ctm->b, ctm->c, ctm->d, ctm->e, ctm->f);
}
}
static void
-svg_dev_stroke_state(svg_device *sdev, fz_stroke_state *stroke_state, const fz_matrix *ctm)
+svg_dev_stroke_state(fz_context *ctx, svg_device *sdev, fz_stroke_state *stroke_state, const fz_matrix *ctm)
{
fz_output *out = sdev->out;
float exp;
@@ -148,31 +149,30 @@ svg_dev_stroke_state(svg_device *sdev, fz_stroke_state *stroke_state, const fz_m
if (exp == 0)
exp = 1;
- fz_printf(out, " stroke-width=\"%g\"", stroke_state->linewidth/exp);
- fz_printf(out, " stroke-linecap=\"%s\"",
+ fz_printf(ctx, out, " stroke-width=\"%g\"", stroke_state->linewidth/exp);
+ fz_printf(ctx, out, " stroke-linecap=\"%s\"",
(stroke_state->start_cap == FZ_LINECAP_SQUARE ? "square" :
(stroke_state->start_cap == FZ_LINECAP_ROUND ? "round" : "butt")));
if (stroke_state->dash_len != 0)
{
int i;
- fz_printf(out, " stroke-dasharray=");
+ fz_printf(ctx, out, " stroke-dasharray=");
for (i = 0; i < stroke_state->dash_len; i++)
- fz_printf(out, "%c%g", (i == 0 ? '\"' : ','), stroke_state->dash_list[i]);
- fz_printf(out, "\"");
+ fz_printf(ctx, out, "%c%g", (i == 0 ? '\"' : ','), stroke_state->dash_list[i]);
+ fz_printf(ctx, out, "\"");
if (stroke_state->dash_phase != 0)
- fz_printf(out, " stroke-dashoffset=\"%g\"", stroke_state->dash_phase);
+ fz_printf(ctx, out, " stroke-dashoffset=\"%g\"", stroke_state->dash_phase);
}
if (stroke_state->linejoin == FZ_LINEJOIN_MITER || stroke_state->linejoin == FZ_LINEJOIN_MITER_XPS)
- fz_printf(out, " stroke-miterlimit=\"%g\"", stroke_state->miterlimit);
- fz_printf(out, " stroke-linejoin=\"%s\"",
+ fz_printf(ctx, out, " stroke-miterlimit=\"%g\"", stroke_state->miterlimit);
+ fz_printf(ctx, out, " stroke-linejoin=\"%s\"",
(stroke_state->linejoin == FZ_LINEJOIN_BEVEL ? "bevel" :
(stroke_state->linejoin == FZ_LINEJOIN_ROUND ? "round" : "miter")));
}
static void
-svg_dev_fill_color(svg_device *sdev, fz_colorspace *colorspace, float *color, float alpha)
+svg_dev_fill_color(fz_context *ctx, svg_device *sdev, fz_colorspace *colorspace, float *color, float alpha)
{
- fz_context *ctx = sdev->ctx;
fz_output *out = sdev->out;
float rgb[FZ_MAX_COLORS];
@@ -188,15 +188,14 @@ svg_dev_fill_color(svg_device *sdev, fz_colorspace *colorspace, float *color, fl
/* don't send a fill, as it will be assumed to be black */
}
else
- fz_printf(out, " fill=\"rgb(%d,%d,%d)\"", (int)(255*color[0] + 0.5), (int)(255*color[1] + 0.5), (int)(255*color[2]+0.5));
+ fz_printf(ctx, out, " fill=\"rgb(%d,%d,%d)\"", (int)(255*color[0] + 0.5), (int)(255*color[1] + 0.5), (int)(255*color[2]+0.5));
if (alpha != 1)
- fz_printf(out, " fill-opacity=\"%g\"", alpha);
+ fz_printf(ctx, out, " fill-opacity=\"%g\"", alpha);
}
static void
-svg_dev_stroke_color(svg_device *sdev, fz_colorspace *colorspace, float *color, float alpha)
+svg_dev_stroke_color(fz_context *ctx, svg_device *sdev, fz_colorspace *colorspace, float *color, float alpha)
{
- fz_context *ctx = sdev->ctx;
fz_output *out = sdev->out;
float rgb[FZ_MAX_COLORS];
@@ -207,9 +206,9 @@ svg_dev_stroke_color(svg_device *sdev, fz_colorspace *colorspace, float *color,
color = rgb;
}
- fz_printf(out, " fill=\"none\" stroke=\"rgb(%d,%d,%d)\"", (int)(255*color[0] + 0.5), (int)(255*color[1] + 0.5), (int)(255*color[2]+0.5));
+ fz_printf(ctx, out, " fill=\"none\" stroke=\"rgb(%d,%d,%d)\"", (int)(255*color[0] + 0.5), (int)(255*color[1] + 0.5), (int)(255*color[2]+0.5));
if (alpha != 1)
- fz_printf(out, " stroke-opacity=\"%g\"", alpha);
+ fz_printf(ctx, out, " stroke-opacity=\"%g\"", alpha);
}
static inline int
@@ -222,9 +221,10 @@ is_xml_wspace(int c)
}
static void
-svg_dev_text(svg_device *sdev, const fz_matrix *ctm, fz_text *text)
+svg_dev_text(fz_context *ctx, svg_device *sdev, const fz_matrix *ctm, fz_text *text)
{
fz_output *out = sdev->out;
+
int i;
fz_matrix inverse;
fz_matrix local_trm;
@@ -242,10 +242,10 @@ svg_dev_text(svg_device *sdev, const fz_matrix *ctm, fz_text *text)
fz_invert_matrix(&inverse, &local_trm);
fz_concat(&local_trm, &local_trm, ctm);
- fz_printf(out, " transform=\"matrix(%g,%g,%g,%g,%g,%g)\"",
+ fz_printf(ctx, out, " transform=\"matrix(%g,%g,%g,%g,%g,%g)\"",
local_trm.a, local_trm.b, local_trm.c, local_trm.d, local_trm.e, local_trm.f);
- fz_printf(out, " font-size=\"%g\"", size);
- fz_printf(out, " font-family=\"%s\"", text->font->name);
+ fz_printf(ctx, out, " font-size=\"%g\"", size);
+ fz_printf(ctx, out, " font-family=\"%s\"", text->font->name);
/* Leading (and repeated) whitespace presents a problem for SVG
* text, so elide it here. */
@@ -256,7 +256,7 @@ svg_dev_text(svg_device *sdev, const fz_matrix *ctm, fz_text *text)
break;
}
- fz_printf(out, " x=");
+ fz_printf(ctx, out, " x=");
was_wspace = 0;
for (i=start; i < text->len; i++)
{
@@ -269,9 +269,9 @@ svg_dev_text(svg_device *sdev, const fz_matrix *ctm, fz_text *text)
p.x = it->x;
p.y = it->y;
fz_transform_point(&p, &inverse);
- fz_printf(out, "%c%g", i == start ? '\"' : ' ', p.x);
+ fz_printf(ctx, out, "%c%g", i == start ? '\"' : ' ', p.x);
}
- fz_printf(out, "\" y=");
+ fz_printf(ctx, out, "\" y=");
was_wspace = 0;
for (i=start; i < text->len; i++)
{
@@ -284,9 +284,9 @@ svg_dev_text(svg_device *sdev, const fz_matrix *ctm, fz_text *text)
p.x = it->x;
p.y = it->y;
fz_transform_point(&p, &inverse);
- fz_printf(out, "%c%g", i == start ? '\"' : ' ', p.y);
+ fz_printf(ctx, out, "%c%g", i == start ? '\"' : ' ', p.y);
}
- fz_printf(out, "\">\n");
+ fz_printf(ctx, out, "\">\n");
was_wspace = 0;
for (i=start; i < text->len; i++)
{
@@ -297,18 +297,17 @@ svg_dev_text(svg_device *sdev, const fz_matrix *ctm, fz_text *text)
continue;
was_wspace = is_wspace;
if (c >= 32 && c <= 127 && c != '<' && c != '&')
- fz_printf(out, "%c", c);
+ fz_printf(ctx, out, "%c", c);
else
- fz_printf(out, "&#x%04x;", c);
+ fz_printf(ctx, out, "&#x%04x;", c);
}
- fz_printf(out, "\n</text>\n");
+ fz_printf(ctx, out, "\n</text>\n");
}
static font *
-svg_dev_text_as_paths_defs(fz_device *dev, fz_text *text, const fz_matrix *ctm)
+svg_dev_text_as_paths_defs(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm)
{
- svg_device *sdev = dev->user;
- fz_context *ctx = sdev->ctx;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
int i, font_idx;
font *fnt;
@@ -360,30 +359,30 @@ svg_dev_text_as_paths_defs(fz_device *dev, fz_text *text, const fz_matrix *ctm)
/* Need to send this one */
fz_rect rect;
fz_path *path;
- path = fz_outline_glyph(sdev->ctx, text->font, gid, &fz_identity);
+ path = fz_outline_glyph(ctx, text->font, gid, &fz_identity);
if (path)
{
fz_bound_path(ctx, path, NULL, &fz_identity, &rect);
shift.e = -rect.x0;
shift.f = -rect.y0;
fz_transform_path(ctx, path, &shift);
- out = start_def(sdev);
- fz_printf(out, "<symbol id=\"font_%x_%x\">", fnt->id, gid);
- fz_printf(out, "<path");
- svg_dev_path(sdev, path);
- fz_printf(out, "/>\n");
+ out = start_def(ctx, sdev);
+ fz_printf(ctx, out, "<symbol id=\"font_%x_%x\">", fnt->id, gid);
+ fz_printf(ctx, out, "<path");
+ svg_dev_path(ctx, sdev, path);
+ fz_printf(ctx, out, "/>\n");
}
else
{
fz_bound_glyph(ctx, text->font, gid, &fz_identity, &rect);
shift.e = -rect.x0;
shift.f = -rect.y0;
- out = start_def(sdev);
- fz_printf(out, "<symbol id=\"font_%x_%x\">", fnt->id, gid);
+ out = start_def(ctx, sdev);
+ fz_printf(ctx, out, "<symbol id=\"font_%x_%x\">", fnt->id, gid);
fz_run_t3_glyph(ctx, text->font, gid, &shift, dev);
}
- fz_printf(out, "</symbol>");
- out = end_def(sdev);
+ fz_printf(ctx, out, "</symbol>");
+ out = end_def(ctx, sdev);
fnt->sentlist[gid].x_off = rect.x0;
fnt->sentlist[gid].y_off = rect.y0;
}
@@ -392,11 +391,12 @@ svg_dev_text_as_paths_defs(fz_device *dev, fz_text *text, const fz_matrix *ctm)
}
static void
-svg_dev_text_as_paths_fill(fz_device *dev, fz_text *text, const fz_matrix *ctm,
+svg_dev_text_as_paths_fill(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha, font *fnt)
{
- svg_device *sdev = dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
+
fz_matrix local_trm, local_trm2;
int i;
fz_matrix shift = { 1, 0, 0, 1, 0, 0};
@@ -423,20 +423,21 @@ svg_dev_text_as_paths_fill(fz_device *dev, fz_text *text, const fz_matrix *ctm,
local_trm.f = it->y;
fz_concat(&local_trm2, &local_trm, ctm);
fz_concat(&local_trm2, &shift, &local_trm2);
- fz_printf(out, "<use xlink:href=\"#font_%x_%x\"", fnt->id, gid);
- svg_dev_ctm(sdev, &local_trm2);
- svg_dev_fill_color(sdev, colorspace, color, alpha);
- fz_printf(out, "/>\n");
+ fz_printf(ctx, out, "<use xlink:href=\"#font_%x_%x\"", fnt->id, gid);
+ svg_dev_ctm(ctx, sdev, &local_trm2);
+ svg_dev_fill_color(ctx, sdev, colorspace, color, alpha);
+ fz_printf(ctx, out, "/>\n");
}
}
static void
-svg_dev_text_as_paths_stroke(fz_device *dev, fz_text *text,
+svg_dev_text_as_paths_stroke(fz_context *ctx, fz_device *dev, fz_text *text,
fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha, font *fnt)
{
- svg_device *sdev = dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
+
fz_matrix local_trm, local_trm2;
int i;
fz_matrix shift = { 1, 0, 0, 1, 0, 0};
@@ -463,127 +464,130 @@ svg_dev_text_as_paths_stroke(fz_device *dev, fz_text *text,
local_trm.f = it->y;
fz_concat(&local_trm2, &local_trm, ctm);
fz_concat(&local_trm2, &shift, &local_trm2);
- fz_printf(out, "<use xlink:href=\"#font_%x_%x\"", fnt->id, gid);
- svg_dev_stroke_state(sdev, stroke, &local_trm2);
- svg_dev_ctm(sdev, &local_trm2);
- svg_dev_stroke_color(sdev, colorspace, color, alpha);
- fz_printf(out, "/>\n");
+ fz_printf(ctx, out, "<use xlink:href=\"#font_%x_%x\"", fnt->id, gid);
+ svg_dev_stroke_state(ctx, sdev, stroke, &local_trm2);
+ svg_dev_ctm(ctx, sdev, &local_trm2);
+ svg_dev_stroke_color(ctx, sdev, colorspace, color, alpha);
+ fz_printf(ctx, out, "/>\n");
}
}
/* Entry points */
static void
-svg_dev_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
+svg_dev_fill_path(fz_context *ctx, fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- svg_device *sdev = dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
- fz_printf(out, "<path");
- svg_dev_ctm(sdev, ctm);
- svg_dev_path(sdev, path);
- svg_dev_fill_color(sdev, colorspace, color, alpha);
+ fz_printf(ctx, out, "<path");
+ svg_dev_ctm(ctx, sdev, ctm);
+ svg_dev_path(ctx, sdev, path);
+ svg_dev_fill_color(ctx, sdev, colorspace, color, alpha);
if (even_odd)
- fz_printf(out, " fill-rule=\"evenodd\"");
- fz_printf(out, "/>\n");
+ fz_printf(ctx, out, " fill-rule=\"evenodd\"");
+ fz_printf(ctx, out, "/>\n");
}
static void
-svg_dev_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm,
+svg_dev_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- svg_device *sdev = dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
- fz_printf(out, "<path");
- svg_dev_ctm(sdev, ctm);
- svg_dev_stroke_state(sdev, stroke, &fz_identity);
- svg_dev_stroke_color(sdev, colorspace, color, alpha);
- svg_dev_path(sdev, path);
- fz_printf(out, "/>\n");
+ fz_printf(ctx, out, "<path");
+ svg_dev_ctm(ctx, sdev, ctm);
+ svg_dev_stroke_state(ctx, sdev, stroke, &fz_identity);
+ svg_dev_stroke_color(ctx, sdev, colorspace, color, alpha);
+ svg_dev_path(ctx, sdev, path);
+ fz_printf(ctx, out, "/>\n");
}
static void
-svg_dev_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
+svg_dev_clip_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
{
- svg_device *sdev = dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out;
+
int num = sdev->id++;
- out = start_def(sdev);
- fz_printf(out, "<clipPath id=\"cp%d\">\n", num);
- fz_printf(out, "<path");
- svg_dev_ctm(sdev, ctm);
- svg_dev_path(sdev, path);
+ out = start_def(ctx, sdev);
+ fz_printf(ctx, out, "<clipPath id=\"cp%d\">\n", num);
+ fz_printf(ctx, out, "<path");
+ svg_dev_ctm(ctx, sdev, ctm);
+ svg_dev_path(ctx, sdev, path);
if (even_odd)
- fz_printf(out, " fill-rule=\"evenodd\"");
- fz_printf(out, "/>\n</clipPath>\n");
- out = end_def(sdev);
- fz_printf(out, "<g clip-path=\"url(#cp%d)\">\n", num);
+ fz_printf(ctx, out, " fill-rule=\"evenodd\"");
+ fz_printf(ctx, out, "/>\n</clipPath>\n");
+ out = end_def(ctx, sdev);
+ fz_printf(ctx, out, "<g clip-path=\"url(#cp%d)\">\n", num);
}
static void
-svg_dev_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
+svg_dev_clip_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
{
- svg_device *sdev = dev->user;
+ svg_device *sdev = (svg_device*)dev;
+
fz_output *out;
- fz_context *ctx = dev->ctx;
fz_rect bounds;
int num = sdev->id++;
float white[3] = { 1, 1, 1 };
fz_bound_path(ctx, path, stroke, ctm, &bounds);
- out = start_def(sdev);
- fz_printf(out, "<mask id=\"ma%d\" x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\" maskUnits=\"userSpaceOnUse\" maskContentUnits=\"userSpaceOnUse\">\n",
+ out = start_def(ctx, sdev);
+ fz_printf(ctx, out, "<mask id=\"ma%d\" x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\" maskUnits=\"userSpaceOnUse\" maskContentUnits=\"userSpaceOnUse\">\n",
num, bounds.x0, bounds.y0, bounds.x1 - bounds.x0, bounds.y1 - bounds.y0);
- fz_printf(out, "<path");
- svg_dev_ctm(sdev, ctm);
- svg_dev_stroke_state(sdev, stroke, &fz_identity);
- svg_dev_stroke_color(sdev, fz_device_rgb(ctx), white, 1);
- svg_dev_path(sdev, path);
- fz_printf(out, "/>\n</mask>\n");
- out = end_def(sdev);
- fz_printf(out, "<g mask=\"url(#ma%d)\">\n", num);
+ fz_printf(ctx, out, "<path");
+ svg_dev_ctm(ctx, sdev, ctm);
+ svg_dev_stroke_state(ctx, sdev, stroke, &fz_identity);
+ svg_dev_stroke_color(ctx, sdev, fz_device_rgb(ctx), white, 1);
+ svg_dev_path(ctx, sdev, path);
+ fz_printf(ctx, out, "/>\n</mask>\n");
+ out = end_def(ctx, sdev);
+ fz_printf(ctx, out, "<g mask=\"url(#ma%d)\">\n", num);
}
static void
-svg_dev_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm,
+svg_dev_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- svg_device *sdev = dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
+
font *fnt;
- fz_printf(out, "<text");
- svg_dev_fill_color(sdev, colorspace, color, 0.0f);
- svg_dev_text(sdev, ctm, text);
- fnt = svg_dev_text_as_paths_defs(dev, text, ctm);
- svg_dev_text_as_paths_fill(dev, text, ctm, colorspace, color, alpha, fnt);
+ fz_printf(ctx, out, "<text");
+ svg_dev_fill_color(ctx, sdev, colorspace, color, 0.0f);
+ svg_dev_text(ctx, sdev, ctm, text);
+ fnt = svg_dev_text_as_paths_defs(ctx, dev, text, ctm);
+ svg_dev_text_as_paths_fill(ctx, dev, text, ctm, colorspace, color, alpha, fnt);
}
static void
-svg_dev_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
+svg_dev_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- svg_device *sdev = dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
+
font *fnt;
- fz_printf(out, "<text");
- svg_dev_fill_color(sdev, colorspace, color, 0.0f);
- svg_dev_text(sdev, ctm, text);
- fnt = svg_dev_text_as_paths_defs(dev, text, ctm);
- svg_dev_text_as_paths_stroke(dev, text, stroke, ctm, colorspace, color, alpha, fnt);
+ fz_printf(ctx, out, "<text");
+ svg_dev_fill_color(ctx, sdev, colorspace, color, 0.0f);
+ svg_dev_text(ctx, sdev, ctm, text);
+ fnt = svg_dev_text_as_paths_defs(ctx, dev, text, ctm);
+ svg_dev_text_as_paths_stroke(ctx, dev, text, stroke, ctm, colorspace, color, alpha, fnt);
}
static void
-svg_dev_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
+svg_dev_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
{
- svg_device *sdev = dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
- fz_context *ctx = dev->ctx;
+
fz_rect bounds;
int num = sdev->id++;
float white[3] = { 1, 1, 1 };
@@ -591,25 +595,25 @@ svg_dev_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accum
fz_bound_text(ctx, text, NULL, ctm, &bounds);
- out = start_def(sdev);
- fz_printf(out, "<mask id=\"ma%d\" x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\" maskUnits=\"userSpaceOnUse\" maskContentUnits=\"userSpaceOnUse\">\n",
+ out = start_def(ctx, sdev);
+ fz_printf(ctx, out, "<mask id=\"ma%d\" x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\" maskUnits=\"userSpaceOnUse\" maskContentUnits=\"userSpaceOnUse\">\n",
num, bounds.x0, bounds.y0, bounds.x1 - bounds.x0, bounds.y1 - bounds.y0);
- fz_printf(out, "<text");
- svg_dev_fill_color(sdev, fz_device_rgb(ctx), white, 0.0f);
- svg_dev_text(sdev, ctm, text);
- fnt = svg_dev_text_as_paths_defs(dev, text, ctm);
- svg_dev_text_as_paths_fill(dev, text, ctm, fz_device_rgb(ctx), white, 1.0f, fnt);
- fz_printf(out, "</mask>\n");
- out = end_def(sdev);
- fz_printf(out, "<g mask=\"url(#ma%d)\">\n", num);
+ fz_printf(ctx, out, "<text");
+ svg_dev_fill_color(ctx, sdev, fz_device_rgb(ctx), white, 0.0f);
+ svg_dev_text(ctx, sdev, ctm, text);
+ fnt = svg_dev_text_as_paths_defs(ctx, dev, text, ctm);
+ svg_dev_text_as_paths_fill(ctx, dev, text, ctm, fz_device_rgb(ctx), white, 1.0f, fnt);
+ fz_printf(ctx, out, "</mask>\n");
+ out = end_def(ctx, sdev);
+ fz_printf(ctx, out, "<g mask=\"url(#ma%d)\">\n", num);
}
static void
-svg_dev_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
+svg_dev_clip_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
{
- svg_device *sdev = dev->user;
+ svg_device *sdev = (svg_device*)dev;
+
fz_output *out;
- fz_context *ctx = dev->ctx;
fz_rect bounds;
int num = sdev->id++;
float white[3] = { 255, 255, 255 };
@@ -617,34 +621,35 @@ svg_dev_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke,
fz_bound_text(ctx, text, NULL, ctm, &bounds);
- out = start_def(sdev);
- fz_printf(out, "<mask id=\"ma%d\" x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\" maskUnits=\"userSpaceOnUse\" maskContentUnits=\"userSpaceOnUse\">\n",
+ out = start_def(ctx, sdev);
+ fz_printf(ctx, out, "<mask id=\"ma%d\" x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\" maskUnits=\"userSpaceOnUse\" maskContentUnits=\"userSpaceOnUse\">\n",
num, bounds.x0, bounds.y0, bounds.x1 - bounds.x0, bounds.y1 - bounds.y0);
- fz_printf(out, "<text");
- svg_dev_stroke_state(sdev, stroke, &fz_identity);
- svg_dev_stroke_color(sdev, fz_device_rgb(ctx), white, 0.0f);
- svg_dev_text(sdev, ctm, text);
- fnt = svg_dev_text_as_paths_defs(dev, text, ctm);
- svg_dev_text_as_paths_stroke(dev, text, stroke, ctm, fz_device_rgb(ctx), white, 1.0f, fnt);
- fz_printf(out, "</mask>\n");
- out = end_def(sdev);
- fz_printf(out, "<g mask=\"url(#ma%d)\">\n", num);
+ fz_printf(ctx, out, "<text");
+ svg_dev_stroke_state(ctx, sdev, stroke, &fz_identity);
+ svg_dev_stroke_color(ctx, sdev, fz_device_rgb(ctx), white, 0.0f);
+ svg_dev_text(ctx, sdev, ctm, text);
+ fnt = svg_dev_text_as_paths_defs(ctx, dev, text, ctm);
+ svg_dev_text_as_paths_stroke(ctx, dev, text, stroke, ctm, fz_device_rgb(ctx), white, 1.0f, fnt);
+ fz_printf(ctx, out, "</mask>\n");
+ out = end_def(ctx, sdev);
+ fz_printf(ctx, out, "<g mask=\"url(#ma%d)\">\n", num);
}
static void
-svg_dev_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm)
+svg_dev_ignore_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm)
{
- svg_device *sdev = dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
+
float black[3] = { 0, 0, 0};
- fz_printf(out, "<text");
- svg_dev_fill_color(sdev, fz_device_rgb(sdev->ctx), black, 0.0f);
- svg_dev_text(sdev, ctm, text);
+ fz_printf(ctx, out, "<text");
+ svg_dev_fill_color(ctx, sdev, fz_device_rgb(ctx), black, 0.0f);
+ svg_dev_text(ctx, sdev, ctm, text);
}
static void
-send_data_base64(fz_output *out, fz_buffer *buffer)
+send_data_base64(fz_context *ctx, fz_output *out, fz_buffer *buffer)
{
int i, len;
static const char set[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@@ -656,8 +661,8 @@ send_data_base64(fz_output *out, fz_buffer *buffer)
int d = buffer->data[3*i+1];
int e = buffer->data[3*i+2];
if ((i & 15) == 0)
- fz_printf(out, "\n");
- fz_printf(out, "%c%c%c%c", set[c>>2], set[((c&3)<<4)|(d>>4)], set[((d&15)<<2)|(e>>6)], set[e & 63]);
+ fz_printf(ctx, out, "\n");
+ fz_printf(ctx, out, "%c%c%c%c", set[c>>2], set[((c&3)<<4)|(d>>4)], set[((d&15)<<2)|(e>>6)], set[e & 63]);
}
i *= 3;
switch (buffer->len-i)
@@ -666,13 +671,13 @@ send_data_base64(fz_output *out, fz_buffer *buffer)
{
int c = buffer->data[i];
int d = buffer->data[i+1];
- fz_printf(out, "%c%c%c=", set[c>>2], set[((c&3)<<4)|(d>>4)], set[((d&15)<<2)]);
+ fz_printf(ctx, out, "%c%c%c=", set[c>>2], set[((c&3)<<4)|(d>>4)], set[((d&15)<<2)]);
break;
}
case 1:
{
int c = buffer->data[i];
- fz_printf(out, "%c%c==", set[c>>2], set[(c&3)<<4]);
+ fz_printf(ctx, out, "%c%c==", set[c>>2], set[(c&3)<<4]);
break;
}
default:
@@ -682,11 +687,11 @@ send_data_base64(fz_output *out, fz_buffer *buffer)
}
static void
-svg_dev_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
+svg_dev_fill_image(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
{
- svg_device *sdev = (svg_device *)dev->user;
- fz_context *ctx = dev->ctx;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
+
fz_matrix local_ctm = *ctm;
fz_matrix scale = { 0 };
@@ -695,40 +700,40 @@ svg_dev_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float
fz_concat(&local_ctm, &scale, ctm);
if (alpha != 1.0f)
- fz_printf(out, "<g opacity=\"%g\">", alpha);
- fz_printf(out, "<image");
- svg_dev_ctm(sdev, &local_ctm);
- fz_printf(out, " width=\"%dpx\" height=\"%dpx\" xlink:href=\"data:", image->w, image->h);
+ fz_printf(ctx, out, "<g opacity=\"%g\">", alpha);
+ fz_printf(ctx, out, "<image");
+ svg_dev_ctm(ctx, sdev, &local_ctm);
+ fz_printf(ctx, out, " width=\"%dpx\" height=\"%dpx\" xlink:href=\"data:", image->w, image->h);
switch (image->buffer == NULL ? FZ_IMAGE_JPX : image->buffer->params.type)
{
case FZ_IMAGE_JPEG:
- fz_printf(out, "image/jpeg;base64,");
- send_data_base64(out, image->buffer->buffer);
+ fz_printf(ctx, out, "image/jpeg;base64,");
+ send_data_base64(ctx, out, image->buffer->buffer);
break;
case FZ_IMAGE_PNG:
- fz_printf(out, "image/png;base64,");
- send_data_base64(out, image->buffer->buffer);
+ fz_printf(ctx, out, "image/png;base64,");
+ send_data_base64(ctx, out, image->buffer->buffer);
break;
default:
{
fz_buffer *buf = fz_new_png_from_image(ctx, image, image->w, image->h);
- fz_printf(out, "image/png;base64,");
- send_data_base64(out, buf);
+ fz_printf(ctx, out, "image/png;base64,");
+ send_data_base64(ctx, out, buf);
fz_drop_buffer(ctx, buf);
break;
}
}
- fz_printf(out, "\"/>\n");
+ fz_printf(ctx, out, "\"/>\n");
if (alpha != 1.0f)
- fz_printf(out, "</g>");
+ fz_printf(ctx, out, "</g>");
}
static void
-svg_dev_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
+svg_dev_fill_shade(fz_context *ctx, fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
{
- svg_device *sdev = (svg_device *)dev->user;
- fz_context *ctx = dev->ctx;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
+
fz_rect rect;
fz_irect bbox;
fz_pixmap *pix;
@@ -750,12 +755,12 @@ svg_dev_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float
fz_paint_shade(ctx, shade, ctm, pix, &bbox);
buf = fz_new_png_from_pixmap(ctx, pix);
if (alpha != 1.0f)
- fz_printf(out, "<g opacity=\"%g\">", alpha);
- fz_printf(out, "<image x=\"%dpx\" y=\"%dpx\" width=\"%dpx\" height=\"%dpx\" xlink:href=\"data:image/png;base64,", pix->x, pix->y, pix->w, pix->h);
- send_data_base64(out, buf);
- fz_printf(out, "\"/>\n");
+ fz_printf(ctx, out, "<g opacity=\"%g\">", alpha);
+ fz_printf(ctx, out, "<image x=\"%dpx\" y=\"%dpx\" width=\"%dpx\" height=\"%dpx\" xlink:href=\"data:image/png;base64,", pix->x, pix->y, pix->w, pix->h);
+ send_data_base64(ctx, out, buf);
+ fz_printf(ctx, out, "\"/>\n");
if (alpha != 1.0f)
- fz_printf(out, "</g>");
+ fz_printf(ctx, out, "</g>");
}
fz_always(ctx)
{
@@ -769,11 +774,11 @@ svg_dev_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float
}
static void
-svg_dev_fill_image_mask(fz_device *dev, fz_image *image, const fz_matrix *ctm,
+svg_dev_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- svg_device *sdev = (svg_device *)dev->user;
- fz_context *ctx = dev->ctx;
+ svg_device *sdev = (svg_device*)dev;
+
fz_output *out;
fz_matrix local_ctm = *ctm;
fz_matrix scale = { 0 };
@@ -783,41 +788,40 @@ fz_colorspace *colorspace, float *color, float alpha)
scale.d = 1.0f / image->h;
fz_concat(&local_ctm, &scale, ctm);
- out = start_def(sdev);
- fz_printf(out, "<mask id=\"ma%d\"><image", mask);
- fz_printf(out, " width=\"%dpx\" height=\"%dpx\" xlink:href=\"data:", image->w, image->h);
+ out = start_def(ctx, sdev);
+ fz_printf(ctx, out, "<mask id=\"ma%d\"><image", mask);
+ fz_printf(ctx, out, " width=\"%dpx\" height=\"%dpx\" xlink:href=\"data:", image->w, image->h);
switch (image->buffer == NULL ? FZ_IMAGE_JPX : image->buffer->params.type)
{
case FZ_IMAGE_JPEG:
- fz_printf(out, "image/jpeg;base64,");
- send_data_base64(out, image->buffer->buffer);
+ fz_printf(ctx, out, "image/jpeg;base64,");
+ send_data_base64(ctx, out, image->buffer->buffer);
break;
case FZ_IMAGE_PNG:
- fz_printf(out, "image/png;base64,");
- send_data_base64(out, image->buffer->buffer);
+ fz_printf(ctx, out, "image/png;base64,");
+ send_data_base64(ctx, out, image->buffer->buffer);
break;
default:
{
fz_buffer *buf = fz_new_png_from_image(ctx, image, image->w, image->h);
- fz_printf(out, "image/png;base64,");
- send_data_base64(out, buf);
+ fz_printf(ctx, out, "image/png;base64,");
+ send_data_base64(ctx, out, buf);
fz_drop_buffer(ctx, buf);
break;
}
}
- fz_printf(out, "\"/></mask>\n");
- out = end_def(sdev);
- fz_printf(out, "<rect x=\"0\" y=\"0\" width=\"%d\" height=\"%d\"", image->w, image->h);
- svg_dev_fill_color(sdev, colorspace, color, alpha);
- svg_dev_ctm(sdev, &local_ctm);
- fz_printf(out, " mask=\"url(#ma%d)\"/>\n", mask);
+ fz_printf(ctx, out, "\"/></mask>\n");
+ out = end_def(ctx, sdev);
+ fz_printf(ctx, out, "<rect x=\"0\" y=\"0\" width=\"%d\" height=\"%d\"", image->w, image->h);
+ svg_dev_fill_color(ctx, sdev, colorspace, color, alpha);
+ svg_dev_ctm(ctx, sdev, &local_ctm);
+ fz_printf(ctx, out, " mask=\"url(#ma%d)\"/>\n", mask);
}
static void
-svg_dev_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
+svg_dev_clip_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
{
- svg_device *sdev = (svg_device *)dev->user;
- fz_context *ctx = dev->ctx;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out;
fz_matrix local_ctm = *ctm;
fz_matrix scale = { 0 };
@@ -827,99 +831,98 @@ svg_dev_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, co
scale.d = 1.0f / image->h;
fz_concat(&local_ctm, &scale, ctm);
- out = start_def(sdev);
- fz_printf(out, "<mask id=\"ma%d\"><image", mask);
- svg_dev_ctm(sdev, &local_ctm);
- fz_printf(out, " width=\"%dpx\" height=\"%dpx\" xlink:href=\"data:", image->w, image->h);
+ out = start_def(ctx, sdev);
+ fz_printf(ctx, out, "<mask id=\"ma%d\"><image", mask);
+ svg_dev_ctm(ctx, sdev, &local_ctm);
+ fz_printf(ctx, out, " width=\"%dpx\" height=\"%dpx\" xlink:href=\"data:", image->w, image->h);
switch (image->buffer == NULL ? FZ_IMAGE_JPX : image->buffer->params.type)
{
case FZ_IMAGE_JPEG:
- fz_printf(out, "image/jpeg;base64,");
- send_data_base64(out, image->buffer->buffer);
+ fz_printf(ctx, out, "image/jpeg;base64,");
+ send_data_base64(ctx, out, image->buffer->buffer);
break;
case FZ_IMAGE_PNG:
- fz_printf(out, "image/png;base64,");
- send_data_base64(out, image->buffer->buffer);
+ fz_printf(ctx, out, "image/png;base64,");
+ send_data_base64(ctx, out, image->buffer->buffer);
break;
default:
{
fz_buffer *buf = fz_new_png_from_image(ctx, image, image->w, image->h);
- fz_printf(out, "image/png;base64,");
- send_data_base64(out, buf);
+ fz_printf(ctx, out, "image/png;base64,");
+ send_data_base64(ctx, out, buf);
fz_drop_buffer(ctx, buf);
break;
}
}
- fz_printf(out, "\"/></mask>\n");
- out = end_def(sdev);
- fz_printf(out, "<g mask=\"url(#ma%d)\">\n", mask);
+ fz_printf(ctx, out, "\"/></mask>\n");
+ out = end_def(ctx, sdev);
+ fz_printf(ctx, out, "<g mask=\"url(#ma%d)\">\n", mask);
}
static void
-svg_dev_pop_clip(fz_device *dev)
+svg_dev_pop_clip(fz_context *ctx, fz_device *dev)
{
- svg_device *sdev = (svg_device *)dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
/* FIXME */
- fz_printf(out, "</g>\n");
+ fz_printf(ctx, out, "</g>\n");
}
static void
-svg_dev_begin_mask(fz_device *dev, const fz_rect *bbox, int luminosity, fz_colorspace *colorspace, float *color)
+svg_dev_begin_mask(fz_context *ctx, fz_device *dev, const fz_rect *bbox, int luminosity, fz_colorspace *colorspace, float *color)
{
- svg_device *sdev = (svg_device *)dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out;
int mask = sdev->id++;
- out = start_def(sdev);
- fz_printf(out, "<mask id=\"ma%d\">", mask);
+ out = start_def(ctx, sdev);
+ fz_printf(ctx, out, "<mask id=\"ma%d\">", mask);
if (dev->container_len > 0)
dev->container[dev->container_len-1].user = mask;
}
static void
-svg_dev_end_mask(fz_device *dev)
+svg_dev_end_mask(fz_context *ctx, fz_device *dev)
{
- svg_device *sdev = (svg_device *)dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
int mask = 0;
if (dev->container_len > 0)
mask = (int)dev->container[dev->container_len-1].user;
- fz_printf(out, "\"/></mask>\n");
- out = end_def(sdev);
- fz_printf(out, "<g mask=\"url(#ma%d)\">\n", mask);
+ fz_printf(ctx, out, "\"/></mask>\n");
+ out = end_def(ctx, sdev);
+ fz_printf(ctx, out, "<g mask=\"url(#ma%d)\">\n", mask);
}
static void
-svg_dev_begin_group(fz_device *dev, const fz_rect *bbox, int isolated, int knockout, int blendmode, float alpha)
+svg_dev_begin_group(fz_context *ctx, fz_device *dev, const fz_rect *bbox, int isolated, int knockout, int blendmode, float alpha)
{
- svg_device *sdev = (svg_device *)dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
/* SVG 1.1 doesn't support adequate blendmodes/knockout etc, so just ignore it for now */
- fz_printf(out, "<g>\n");
+ fz_printf(ctx, out, "<g>\n");
}
static void
-svg_dev_end_group(fz_device *dev)
+svg_dev_end_group(fz_context *ctx, fz_device *dev)
{
- svg_device *sdev = (svg_device *)dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
- fz_printf(out, "</g>\n");
+ fz_printf(ctx, out, "</g>\n");
}
static int
-svg_dev_begin_tile(fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
+svg_dev_begin_tile(fz_context *ctx, fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
{
- svg_device *sdev = (svg_device *)dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out;
- fz_context *ctx = dev->ctx;
int num;
tile *t;
@@ -950,16 +953,16 @@ svg_dev_begin_tile(fz_device *dev, const fz_rect *area, const fz_rect *view, flo
/* The first thing we do is to capture the contents of the pattern
* as a symbol we can reuse. */
- out = start_def(sdev);
- fz_printf(out, "<symbol id=\"pac%d\">\n", t->pattern);
+ out = start_def(ctx, sdev);
+ fz_printf(ctx, out, "<symbol id=\"pac%d\">\n", t->pattern);
return 0;
}
static void
-svg_dev_end_tile(fz_device *dev)
+svg_dev_end_tile(fz_context *ctx, fz_device *dev)
{
- svg_device *sdev = (svg_device *)dev->user;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
int num, cp = -1;
tile *t;
@@ -971,7 +974,7 @@ svg_dev_end_tile(fz_device *dev)
num = --sdev->num_tiles;
t = &sdev->tiles[num];
- fz_printf(out, "</symbol>\n");
+ fz_printf(ctx, out, "</symbol>\n");
/* In svg, the reference tile is taken from (x,y) to (x+width,y+height)
* and is repeated at (x+n*width,y+m*height) for all integer n and m.
@@ -981,133 +984,108 @@ svg_dev_end_tile(fz_device *dev)
* pattern tile, we need to render the pattern contents several times
* to ensure that the pattern tile contains everything. */
- fz_printf(out, "<pattern id=\"pa%d\" patternUnits=\"userSpaceOnUse\" patternContentUnits=\"userSpaceOnUse\"",
+ fz_printf(ctx, out, "<pattern id=\"pa%d\" patternUnits=\"userSpaceOnUse\" patternContentUnits=\"userSpaceOnUse\"",
t->pattern);
- fz_printf(out, " x=\"0\" y=\"0\" width=\"%g\" height=\"%g\">\n",
+ fz_printf(ctx, out, " x=\"0\" y=\"0\" width=\"%g\" height=\"%g\">\n",
t->step.x, t->step.y);
if (t->view.x0 > 0 || t->step.x < t->view.x1 || t->view.y0 > 0 || t->step.y < t->view.y1)
{
cp = sdev->id++;
- fz_printf(out, "<clipPath id=\"cp%d\">\n", cp);
- fz_printf(out, "<path d=\"M %g %g L %g %g L %g %g L %g %g Z\"/>",
+ fz_printf(ctx, out, "<clipPath id=\"cp%d\">\n", cp);
+ fz_printf(ctx, out, "<path d=\"M %g %g L %g %g L %g %g L %g %g Z\"/>",
t->view.x0, t->view.y0,
t->view.x1, t->view.y0,
t->view.x1, t->view.y1,
t->view.x0, t->view.y1);
- fz_printf(out, "</clipPath>\n");
- fz_printf(out, "<g clip-path=\"url(#cp%d)\">\n", cp);
+ fz_printf(ctx, out, "</clipPath>\n");
+ fz_printf(ctx, out, "<g clip-path=\"url(#cp%d)\">\n", cp);
}
/* All the pattern contents will have their own ctm applied. Let's
* undo the current one to allow for this */
fz_invert_matrix(&inverse, &t->ctm);
- fz_printf(out, "<g");
- svg_dev_ctm(sdev, &inverse);
- fz_printf(out, ">\n");
+ fz_printf(ctx, out, "<g");
+ svg_dev_ctm(ctx, sdev, &inverse);
+ fz_printf(ctx, out, ">\n");
w = t->view.x1 - t->view.x0;
h = t->view.y1 - t->view.y0;
for (x = 0; x > -w; x -= t->step.x)
for (y = 0; y > -h; y -= t->step.y)
- fz_printf(out, "<use x=\"%g\" y=\"%g\" xlink:href=\"#pac%d\"/>", x, y, t->pattern);
+ fz_printf(ctx, out, "<use x=\"%g\" y=\"%g\" xlink:href=\"#pac%d\"/>", x, y, t->pattern);
- fz_printf(out, "</g>\n");
+ fz_printf(ctx, out, "</g>\n");
if (cp != -1)
- fz_printf(out, "</g>\n");
- fz_printf(out, "</pattern>\n");
- out = end_def(sdev);
+ fz_printf(ctx, out, "</g>\n");
+ fz_printf(ctx, out, "</pattern>\n");
+ out = end_def(ctx, sdev);
/* Finally, fill a rectangle with the pattern. */
- fz_printf(out, "<rect");
- svg_dev_ctm(sdev, &t->ctm);
- fz_printf(out, " fill=\"url(#pa%d)\" x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\"/>\n",
+ fz_printf(ctx, out, "<rect");
+ svg_dev_ctm(ctx, sdev, &t->ctm);
+ fz_printf(ctx, out, " fill=\"url(#pa%d)\" x=\"%g\" y=\"%g\" width=\"%g\" height=\"%g\"/>\n",
t->pattern, t->area.x0, t->area.y0, t->area.x1 - t->area.x0, t->area.y1 - t->area.y0);
}
static void
-svg_dev_free_user(fz_device *dev)
+svg_dev_drop_imp(fz_context *ctx, fz_device *dev)
{
- svg_device *sdev = dev->user;
- fz_context *ctx = sdev->ctx;
+ svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
fz_free(ctx, sdev->tiles);
fz_drop_buffer(ctx, sdev->defs_buffer);
- fz_close_output(sdev->defs);
+ fz_drop_output(ctx, sdev->defs);
- fz_printf(out, "</svg>\n");
-
- fz_free(ctx, sdev);
-}
-
-void svg_rebind(fz_device *dev)
-{
- svg_device *sdev = dev->user;
-
- sdev->ctx = dev->ctx;
- fz_rebind_output(sdev->out, sdev->ctx);
- fz_rebind_output(sdev->out_store, sdev->ctx);
+ fz_printf(ctx, out, "</svg>\n");
}
fz_device *fz_new_svg_device(fz_context *ctx, fz_output *out, float page_width, float page_height)
{
- svg_device *sdev = fz_malloc_struct(ctx, svg_device);
- fz_device *dev;
+ svg_device *dev = fz_new_device(ctx, sizeof *dev);
- fz_try(ctx)
- {
- sdev->ctx = ctx;
- sdev->out = out;
- sdev->out_store = out;
- sdev->id = 0;
-
- dev = fz_new_device(ctx, sdev);
- }
- fz_catch(ctx)
- {
- fz_free(ctx, sdev);
- fz_rethrow(ctx);
- }
+ dev->super.drop_imp = svg_dev_drop_imp;
- dev->rebind = svg_rebind;
- dev->free_user = svg_dev_free_user;
+ dev->super.fill_path = svg_dev_fill_path;
+ dev->super.stroke_path = svg_dev_stroke_path;
+ dev->super.clip_path = svg_dev_clip_path;
+ dev->super.clip_stroke_path = svg_dev_clip_stroke_path;
- dev->fill_path = svg_dev_fill_path;
- dev->stroke_path = svg_dev_stroke_path;
- dev->clip_path = svg_dev_clip_path;
- dev->clip_stroke_path = svg_dev_clip_stroke_path;
+ dev->super.fill_text = svg_dev_fill_text;
+ dev->super.stroke_text = svg_dev_stroke_text;
+ dev->super.clip_text = svg_dev_clip_text;
+ dev->super.clip_stroke_text = svg_dev_clip_stroke_text;
+ dev->super.ignore_text = svg_dev_ignore_text;
- dev->fill_text = svg_dev_fill_text;
- dev->stroke_text = svg_dev_stroke_text;
- dev->clip_text = svg_dev_clip_text;
- dev->clip_stroke_text = svg_dev_clip_stroke_text;
- dev->ignore_text = svg_dev_ignore_text;
+ dev->super.fill_shade = svg_dev_fill_shade;
+ dev->super.fill_image = svg_dev_fill_image;
+ dev->super.fill_image_mask = svg_dev_fill_image_mask;
+ dev->super.clip_image_mask = svg_dev_clip_image_mask;
- dev->fill_shade = svg_dev_fill_shade;
- dev->fill_image = svg_dev_fill_image;
- dev->fill_image_mask = svg_dev_fill_image_mask;
- dev->clip_image_mask = svg_dev_clip_image_mask;
+ dev->super.pop_clip = svg_dev_pop_clip;
- dev->pop_clip = svg_dev_pop_clip;
+ dev->super.begin_mask = svg_dev_begin_mask;
+ dev->super.end_mask = svg_dev_end_mask;
+ dev->super.begin_group = svg_dev_begin_group;
+ dev->super.end_group = svg_dev_end_group;
- dev->begin_mask = svg_dev_begin_mask;
- dev->end_mask = svg_dev_end_mask;
- dev->begin_group = svg_dev_begin_group;
- dev->end_group = svg_dev_end_group;
+ dev->super.begin_tile = svg_dev_begin_tile;
+ dev->super.end_tile = svg_dev_end_tile;
- dev->begin_tile = svg_dev_begin_tile;
- dev->end_tile = svg_dev_end_tile;
+ dev->super.hints |= FZ_MAINTAIN_CONTAINER_STACK;
- dev->hints |= FZ_MAINTAIN_CONTAINER_STACK;
+ dev->out = out;
+ dev->out_store = out;
+ dev->id = 0;
- fz_printf(out, "<?xml version=\"1.0\" standalone=\"no\"?>\n");
- fz_printf(out, "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n");
- fz_printf(out, "<svg xmlns=\"http://www.w3.org/2000/svg\" "
+ fz_printf(ctx, out, "<?xml version=\"1.0\" standalone=\"no\"?>\n");
+ fz_printf(ctx, out, "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n");
+ fz_printf(ctx, out, "<svg xmlns=\"http://www.w3.org/2000/svg\" "
"xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" "
"width=\"%gcm\" height=\"%gcm\" viewBox=\"0 0 %g %g\">\n",
page_width*2.54/72, page_height*2.54/72, page_width, page_height);
- return dev;
+ return (fz_device*)dev;
}
diff --git a/source/fitz/test-device.c b/source/fitz/test-device.c
index 9c778ce1..d0bd08c7 100644
--- a/source/fitz/test-device.c
+++ b/source/fitz/test-device.c
@@ -1,10 +1,11 @@
#include <mupdf/fitz.h>
-struct test
+typedef struct fz_test_device_s
{
+ fz_device super;
int *is_color;
float threshold;
-};
+} fz_test_device;
static int
is_rgb_color(float threshold, float r, float g, float b)
@@ -25,10 +26,9 @@ is_rgb_color_u8(int threshold_u8, int r, int g, int b)
}
static void
-fz_test_color(fz_device *dev, fz_colorspace *colorspace, const float *color)
+fz_test_color(fz_context *ctx, fz_device *dev, fz_colorspace *colorspace, const float *color)
{
- fz_context *ctx = dev->ctx;
- struct test *t = dev->user;
+ fz_test_device *t = (fz_test_device*)dev;
if (!*t->is_color && colorspace && colorspace != fz_device_gray(ctx))
{
@@ -56,35 +56,35 @@ fz_test_color(fz_device *dev, fz_colorspace *colorspace, const float *color)
}
static void
-fz_test_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
+fz_test_fill_path(fz_context *ctx, fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
if (alpha != 0.0f)
- fz_test_color(dev, colorspace, color);
+ fz_test_color(ctx, dev, colorspace, color);
}
static void
-fz_test_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke,
+fz_test_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, fz_stroke_state *stroke,
const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha)
{
if (alpha != 0.0f)
- fz_test_color(dev, colorspace, color);
+ fz_test_color(ctx, dev, colorspace, color);
}
static void
-fz_test_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm,
+fz_test_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
if (alpha != 0.0f)
- fz_test_color(dev, colorspace, color);
+ fz_test_color(ctx, dev, colorspace, color);
}
static void
-fz_test_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke,
+fz_test_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke,
const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha)
{
if (alpha != 0.0f)
- fz_test_color(dev, colorspace, color);
+ fz_test_color(ctx, dev, colorspace, color);
}
struct shadearg
@@ -94,25 +94,23 @@ struct shadearg
};
static void
-prepare_vertex(void *arg0, fz_vertex *v, const float *color)
+prepare_vertex(fz_context *ctx, void *arg_, fz_vertex *v, const float *color)
{
- struct shadearg *arg = arg0;
+ struct shadearg *arg = arg_;
fz_device *dev = arg->dev;
fz_shade *shade = arg->shade;
if (!shade->use_function)
- fz_test_color(dev, shade->colorspace, color);
+ fz_test_color(ctx, dev, shade->colorspace, color);
}
static void
-fz_test_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
+fz_test_fill_shade(fz_context *ctx, fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
{
- fz_context *ctx = dev->ctx;
-
if (shade->use_function)
{
int i;
for (i = 0; i < 256; i++)
- fz_test_color(dev, shade->colorspace, shade->function[i]);
+ fz_test_color(ctx, dev, shade->colorspace, shade->function[i]);
}
else
{
@@ -124,10 +122,9 @@ fz_test_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float
}
static void
-fz_test_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
+fz_test_fill_image(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
{
- fz_context *ctx = dev->ctx;
- struct test *t = dev->user;
+ fz_test_device *t = (fz_test_device*)dev;
fz_pixmap *pix;
unsigned int count, i, k;
@@ -145,14 +142,14 @@ fz_test_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float
int threshold_u8 = t->threshold * 255;
for (i = 0; i < count; i++)
{
- int r = fz_read_byte(stream);
- int g = fz_read_byte(stream);
- int b = fz_read_byte(stream);
+ int r = fz_read_byte(ctx, stream);
+ int g = fz_read_byte(ctx, stream);
+ int b = fz_read_byte(ctx, stream);
if (is_rgb_color_u8(threshold_u8, r, g, b))
{
*t->is_color = 1;
dev->hints |= FZ_IGNORE_IMAGE;
- fz_close(stream);
+ fz_drop_stream(ctx, stream);
fz_throw(ctx, FZ_ERROR_ABORT, "Page found as color; stopping interpretation");
break;
}
@@ -170,9 +167,9 @@ fz_test_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float
float ds[FZ_MAX_COLORS];
for (k = 0; k < n; k++)
- cs[k] = fz_read_byte(stream) / 255.0f;
+ cs[k] = fz_read_byte(ctx, stream) / 255.0f;
- cc.convert(&cc, ds, cs);
+ cc.convert(ctx, &cc, ds, cs);
if (is_rgb_color(t->threshold, ds[0], ds[1], ds[2]))
{
@@ -181,9 +178,9 @@ fz_test_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float
break;
}
}
- fz_fin_cached_color_converter(&cc);
+ fz_fin_cached_color_converter(ctx, &cc);
}
- fz_close(stream);
+ fz_drop_stream(ctx, stream);
return;
}
@@ -226,7 +223,7 @@ fz_test_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float
if (*s++ == 0)
continue;
- cc.convert(&cc, ds, cs);
+ cc.convert(ctx, &cc, ds, cs);
if (is_rgb_color(t->threshold, ds[0], ds[1], ds[2]))
{
@@ -237,59 +234,37 @@ fz_test_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float
break;
}
}
- fz_fin_cached_color_converter(&cc);
+ fz_fin_cached_color_converter(ctx, &cc);
}
fz_drop_pixmap(ctx, pix);
}
static void
-fz_test_fill_image_mask(fz_device *dev, fz_image *image, const fz_matrix *ctm,
+fz_test_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
/* We assume that at least some of the image pixels are non-zero */
- fz_test_color(dev, colorspace, color);
-}
-
-static void
-fz_test_free(fz_device *dev)
-{
- if (dev == NULL)
- return;
- fz_free(dev->ctx, dev->user);
- dev->user = NULL;
+ fz_test_color(ctx, dev, colorspace, color);
}
fz_device *
fz_new_test_device(fz_context *ctx, int *is_color, float threshold)
{
- struct test *t;
- fz_device *dev;
-
- t = fz_malloc_struct(ctx, struct test);
- t->is_color = is_color;
- t->threshold = threshold;
+ fz_test_device *dev = fz_new_device(ctx, sizeof *dev);
- fz_try(ctx)
- {
- dev = fz_new_device(ctx, t);
- }
- fz_catch(ctx)
- {
- fz_free(ctx, t);
- fz_rethrow(ctx);
- }
+ dev->super.fill_path = fz_test_fill_path;
+ dev->super.stroke_path = fz_test_stroke_path;
+ dev->super.fill_text = fz_test_fill_text;
+ dev->super.stroke_text = fz_test_stroke_text;
+ dev->super.fill_shade = fz_test_fill_shade;
+ dev->super.fill_image = fz_test_fill_image;
+ dev->super.fill_image_mask = fz_test_fill_image_mask;
- dev->fill_path = fz_test_fill_path;
- dev->stroke_path = fz_test_stroke_path;
- dev->fill_text = fz_test_fill_text;
- dev->stroke_text = fz_test_stroke_text;
- dev->fill_shade = fz_test_fill_shade;
- dev->fill_image = fz_test_fill_image;
- dev->fill_image_mask = fz_test_fill_image_mask;
- dev->free_user = fz_test_free;
+ dev->is_color = is_color;
+ dev->threshold = threshold;
- *t->is_color = 0;
+ *dev->is_color = 0;
- return dev;
+ return (fz_device*)dev;
}
diff --git a/source/fitz/text.c b/source/fitz/text.c
index 81e2e1d0..466c869a 100644
--- a/source/fitz/text.c
+++ b/source/fitz/text.c
@@ -6,6 +6,7 @@ fz_new_text(fz_context *ctx, fz_font *font, const fz_matrix *trm, int wmode)
fz_text *text;
text = fz_malloc_struct(ctx, fz_text);
+ text->refs = 1;
text->font = fz_keep_font(ctx, font);
text->trm = *trm;
text->wmode = wmode;
@@ -16,40 +17,21 @@ fz_new_text(fz_context *ctx, fz_font *font, const fz_matrix *trm, int wmode)
return text;
}
-void
-fz_free_text(fz_context *ctx, fz_text *text)
+fz_text *
+fz_keep_text(fz_context *ctx, fz_text *text)
{
- if (text != NULL)
- {
- fz_drop_font(ctx, text->font);
- fz_free(ctx, text->items);
- }
- fz_free(ctx, text);
+ return fz_keep_imp(ctx, text, &text->refs);
}
-fz_text *
-fz_clone_text(fz_context *ctx, fz_text *old)
+void
+fz_drop_text(fz_context *ctx, fz_text *text)
{
- fz_text *text;
-
- text = fz_malloc_struct(ctx, fz_text);
- text->len = old->len;
- fz_try(ctx)
- {
- text->items = fz_malloc_array(ctx, text->len, sizeof(fz_text_item));
- }
- fz_catch(ctx)
+ if (fz_drop_imp(ctx, text, &text->refs))
{
+ fz_drop_font(ctx, text->font);
+ fz_free(ctx, text->items);
fz_free(ctx, text);
- fz_rethrow(ctx);
}
- memcpy(text->items, old->items, text->len * sizeof(fz_text_item));
- text->font = fz_keep_font(ctx, old->font);
- text->trm = old->trm;
- text->wmode = old->wmode;
- text->cap = text->len;
-
- return text;
}
fz_rect *
@@ -91,7 +73,7 @@ fz_bound_text(fz_context *ctx, fz_text *text, const fz_stroke_state *stroke, con
}
if (stroke)
- fz_adjust_rect_for_stroke(bbox, stroke, ctm);
+ fz_adjust_rect_for_stroke(ctx, bbox, stroke, ctm);
/* Compensate for the glyph cache limited positioning precision */
bbox->x0 -= 1;
@@ -117,6 +99,9 @@ fz_grow_text(fz_context *ctx, fz_text *text, int n)
void
fz_add_text(fz_context *ctx, fz_text *text, int gid, int ucs, float x, float y)
{
+ if (text->refs != 1)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot modify shared text objects");
+
fz_grow_text(ctx, text, 1);
text->items[text->len].ucs = ucs;
text->items[text->len].gid = gid;
diff --git a/source/fitz/trace-device.c b/source/fitz/trace-device.c
index d6c01323..97dd4f79 100644
--- a/source/fitz/trace-device.c
+++ b/source/fitz/trace-device.c
@@ -66,7 +66,7 @@ fz_trace_path(fz_path *path, int indent)
}
static void
-fz_trace_begin_page(fz_device *dev, const fz_rect *rect, const fz_matrix *ctm)
+fz_trace_begin_page(fz_context *ctx, fz_device *dev, const fz_rect *rect, const fz_matrix *ctm)
{
printf("<page mediabox=\"%g %g %g %g\"", rect->x0, rect->y0, rect->x1, rect->y1);
fz_trace_matrix(ctm);
@@ -74,13 +74,13 @@ fz_trace_begin_page(fz_device *dev, const fz_rect *rect, const fz_matrix *ctm)
}
static void
-fz_trace_end_page(fz_device *dev)
+fz_trace_end_page(fz_context *ctx, fz_device *dev)
{
printf("</page>\n");
}
static void
-fz_trace_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
+fz_trace_fill_path(fz_context *ctx, fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
printf("<fill_path");
@@ -96,7 +96,7 @@ fz_trace_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix
}
static void
-fz_trace_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm,
+fz_trace_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
int i;
@@ -125,7 +125,7 @@ fz_trace_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, con
}
static void
-fz_trace_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
+fz_trace_clip_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
{
printf("<clip_path");
if (even_odd)
@@ -142,7 +142,7 @@ fz_trace_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_
}
static void
-fz_trace_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
+fz_trace_clip_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
{
printf("<clip_stroke_path");
fz_trace_matrix(ctm);
@@ -152,7 +152,7 @@ fz_trace_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz
}
static void
-fz_trace_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm,
+fz_trace_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
printf("<fill_text font=\"%s\" wmode=\"%d\"", text->font->name, text->wmode);
@@ -160,12 +160,12 @@ fz_trace_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm,
fz_trace_matrix(ctm);
fz_trace_trm(&text->trm);
printf(">\n");
- fz_print_text(dev->ctx, stdout, text);
+ fz_print_text(ctx, stdout, text);
printf("</fill_text>\n");
}
static void
-fz_trace_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
+fz_trace_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
printf("<stroke_text font=\"%s\" wmode=\"%d\"", text->font->name, text->wmode);
@@ -173,46 +173,46 @@ fz_trace_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, con
fz_trace_matrix(ctm);
fz_trace_trm(&text->trm);
printf(">\n");
- fz_print_text(dev->ctx, stdout, text);
+ fz_print_text(ctx, stdout, text);
printf("</stroke_text>\n");
}
static void
-fz_trace_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
+fz_trace_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
{
printf("<clip_text font=\"%s\" wmode=\"%d\"", text->font->name, text->wmode);
printf(" accumulate=\"%d\"", accumulate);
fz_trace_matrix(ctm);
fz_trace_trm(&text->trm);
printf(">\n");
- fz_print_text(dev->ctx, stdout, text);
+ fz_print_text(ctx, stdout, text);
printf("</clip_text>\n");
}
static void
-fz_trace_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
+fz_trace_clip_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
{
printf("<clip_stroke_text font=\"%s\" wmode=\"%d\"", text->font->name, text->wmode);
fz_trace_matrix(ctm);
fz_trace_trm(&text->trm);
printf(">\n");
- fz_print_text(dev->ctx, stdout, text);
+ fz_print_text(ctx, stdout, text);
printf("</clip_stroke_text>\n");
}
static void
-fz_trace_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm)
+fz_trace_ignore_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm)
{
printf("<ignore_text font=\"%s\" wmode=\"%d\"", text->font->name, text->wmode);
fz_trace_matrix(ctm);
fz_trace_trm(&text->trm);
printf(">\n");
- fz_print_text(dev->ctx, stdout, text);
+ fz_print_text(ctx, stdout, text);
printf("</ignore_text>\n");
}
static void
-fz_trace_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
+fz_trace_fill_image(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
{
printf("<fill_image alpha=\"%g\"", alpha);
fz_trace_matrix(ctm);
@@ -221,7 +221,7 @@ fz_trace_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float
}
static void
-fz_trace_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
+fz_trace_fill_shade(fz_context *ctx, fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
{
printf("<fill_shade alpha=\"%g\"", alpha);
fz_trace_matrix(ctm);
@@ -229,7 +229,7 @@ fz_trace_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float
}
static void
-fz_trace_fill_image_mask(fz_device *dev, fz_image *image, const fz_matrix *ctm,
+fz_trace_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
printf("<fill_image_mask");
@@ -240,7 +240,7 @@ fz_colorspace *colorspace, float *color, float alpha)
}
static void
-fz_trace_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
+fz_trace_clip_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
{
printf("<clip_image_mask");
fz_trace_matrix(ctm);
@@ -249,13 +249,13 @@ fz_trace_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, c
}
static void
-fz_trace_pop_clip(fz_device *dev)
+fz_trace_pop_clip(fz_context *ctx, fz_device *dev)
{
printf("<pop_clip/>\n");
}
static void
-fz_trace_begin_mask(fz_device *dev, const fz_rect *bbox, int luminosity, fz_colorspace *colorspace, float *color)
+fz_trace_begin_mask(fz_context *ctx, fz_device *dev, const fz_rect *bbox, int luminosity, fz_colorspace *colorspace, float *color)
{
printf("<mask bbox=\"%g %g %g %g\" s=\"%s\"",
bbox->x0, bbox->y0, bbox->x1, bbox->y1,
@@ -264,13 +264,13 @@ fz_trace_begin_mask(fz_device *dev, const fz_rect *bbox, int luminosity, fz_colo
}
static void
-fz_trace_end_mask(fz_device *dev)
+fz_trace_end_mask(fz_context *ctx, fz_device *dev)
{
printf("</mask>\n");
}
static void
-fz_trace_begin_group(fz_device *dev, const fz_rect *bbox, int isolated, int knockout, int blendmode, float alpha)
+fz_trace_begin_group(fz_context *ctx, fz_device *dev, const fz_rect *bbox, int isolated, int knockout, int blendmode, float alpha)
{
printf("<group bbox=\"%g %g %g %g\" isolated=\"%d\" knockout=\"%d\" blendmode=\"%s\" alpha=\"%g\">\n",
bbox->x0, bbox->y0, bbox->x1, bbox->y1,
@@ -278,13 +278,13 @@ fz_trace_begin_group(fz_device *dev, const fz_rect *bbox, int isolated, int knoc
}
static void
-fz_trace_end_group(fz_device *dev)
+fz_trace_end_group(fz_context *ctx, fz_device *dev)
{
printf("</group>\n");
}
static int
-fz_trace_begin_tile(fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
+fz_trace_begin_tile(fz_context *ctx, fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
{
printf("<tile");
printf(" area=\"%g %g %g %g\"", area->x0, area->y0, area->x1, area->y1);
@@ -296,14 +296,14 @@ fz_trace_begin_tile(fz_device *dev, const fz_rect *area, const fz_rect *view, fl
}
static void
-fz_trace_end_tile(fz_device *dev)
+fz_trace_end_tile(fz_context *ctx, fz_device *dev)
{
printf("</tile>\n");
}
fz_device *fz_new_trace_device(fz_context *ctx)
{
- fz_device *dev = fz_new_device(ctx, NULL);
+ fz_device *dev = fz_new_device(ctx, sizeof *dev);
dev->begin_page = fz_trace_begin_page;
dev->end_page = fz_trace_end_page;
diff --git a/source/fitz/transition.c b/source/fitz/transition.c
index c71729a9..b4da6192 100644
--- a/source/fitz/transition.c
+++ b/source/fitz/transition.c
@@ -139,7 +139,7 @@ wipe_lr(fz_pixmap *tpix, fz_pixmap *opix, fz_pixmap *npix, int time)
return 1;
}
-int fz_generate_transition(fz_pixmap *tpix, fz_pixmap *opix, fz_pixmap *npix, int time, fz_transition *trans)
+int fz_generate_transition(fz_context *ctx, fz_pixmap *tpix, fz_pixmap *opix, fz_pixmap *npix, int time, fz_transition *trans)
{
switch (trans->type)
{
diff --git a/source/fitz/tree.c b/source/fitz/tree.c
index ca94a45b..18fb6548 100644
--- a/source/fitz/tree.c
+++ b/source/fitz/tree.c
@@ -89,17 +89,17 @@ fz_tree *fz_tree_insert(fz_context *ctx, fz_tree *node, const char *key, void *v
}
}
-void fz_free_tree(fz_context *ctx, fz_tree *node, void (*freefunc)(fz_context *ctx, void *value))
+void fz_drop_tree(fz_context *ctx, fz_tree *node, void (*dropfunc)(fz_context *ctx, void *value))
{
if (node)
{
if (node->left != &sentinel)
- fz_free_tree(ctx, node->left, freefunc);
+ fz_drop_tree(ctx, node->left, dropfunc);
if (node->right != &sentinel)
- fz_free_tree(ctx, node->right, freefunc);
+ fz_drop_tree(ctx, node->right, dropfunc);
fz_free(ctx, node->key);
- if (freefunc)
- freefunc(ctx, node->value);
+ if (dropfunc)
+ dropfunc(ctx, node->value);
}
}
diff --git a/source/fitz/unzip.c b/source/fitz/unzip.c
index 73905e81..23028d42 100644
--- a/source/fitz/unzip.c
+++ b/source/fitz/unzip.c
@@ -27,26 +27,26 @@ struct fz_archive_s
struct zip_entry *table;
};
-static inline int getshort(fz_stream *file)
+static inline int getshort(fz_context *ctx, fz_stream *file)
{
- int a = fz_read_byte(file);
- int b = fz_read_byte(file);
+ int a = fz_read_byte(ctx, file);
+ int b = fz_read_byte(ctx, file);
return a | b << 8;
}
-static inline int getlong(fz_stream *file)
+static inline int getlong(fz_context *ctx, fz_stream *file)
{
- int a = fz_read_byte(file);
- int b = fz_read_byte(file);
- int c = fz_read_byte(file);
- int d = fz_read_byte(file);
+ int a = fz_read_byte(ctx, file);
+ int b = fz_read_byte(ctx, file);
+ int c = fz_read_byte(ctx, file);
+ int d = fz_read_byte(ctx, file);
return a | b << 8 | c << 16 | d << 24;
}
-static inline int getlong64(fz_stream *file)
+static inline int getlong64(fz_context *ctx, fz_stream *file)
{
- int a = getlong(file);
- int b = getlong(file);
+ int a = getlong(ctx, file);
+ int b = getlong(ctx, file);
return b != 0 ? -1 : a;
}
@@ -106,50 +106,50 @@ static void read_zip_dir_imp(fz_context *ctx, fz_archive *zip, int start_offset)
int namesize, metasize, commentsize;
int i;
- fz_seek(file, start_offset, 0);
+ fz_seek(ctx, file, start_offset, 0);
- sig = getlong(file);
+ sig = getlong(ctx, file);
if (sig != ZIP_END_OF_CENTRAL_DIRECTORY_SIG)
fz_throw(ctx, FZ_ERROR_GENERIC, "wrong zip end of central directory signature (0x%x)", sig);
- (void) getshort(file); /* this disk */
- (void) getshort(file); /* start disk */
- (void) getshort(file); /* entries in this disk */
- count = getshort(file); /* entries in central directory disk */
- (void) getlong(file); /* size of central directory */
- offset = getlong(file); /* offset to central directory */
+ (void) getshort(ctx, file); /* this disk */
+ (void) getshort(ctx, file); /* start disk */
+ (void) getshort(ctx, file); /* entries in this disk */
+ count = getshort(ctx, file); /* entries in central directory disk */
+ (void) getlong(ctx, file); /* size of central directory */
+ offset = getlong(ctx, file); /* offset to central directory */
/* ZIP64 */
if (count == 0xFFFF || offset == 0xFFFFFFFF)
{
int offset64, count64;
- fz_seek(file, start_offset - 20, 0);
+ fz_seek(ctx, file, start_offset - 20, 0);
- sig = getlong(file);
+ sig = getlong(ctx, file);
if (sig != ZIP64_END_OF_CENTRAL_DIRECTORY_LOCATOR_SIG)
fz_throw(ctx, FZ_ERROR_GENERIC, "wrong zip64 end of central directory locator signature (0x%x)", sig);
- (void) getlong(file); /* start disk */
- offset64 = getlong64(file); /* offset to end of central directory record */
+ (void) getlong(ctx, file); /* start disk */
+ offset64 = getlong64(ctx, file); /* offset to end of central directory record */
if (offset64 < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "zip64 files larger than 2 GB aren't supported");
- fz_seek(file, offset64, 0);
+ fz_seek(ctx, file, offset64, 0);
- sig = getlong(file);
+ sig = getlong(ctx, file);
if (sig != ZIP64_END_OF_CENTRAL_DIRECTORY_SIG)
fz_throw(ctx, FZ_ERROR_GENERIC, "wrong zip64 end of central directory signature (0x%x)", sig);
- (void) getlong64(file); /* size of record */
- (void) getshort(file); /* version made by */
- (void) getshort(file); /* version to extract */
- (void) getlong(file); /* disk number */
- (void) getlong(file); /* disk number start */
- count64 = getlong64(file); /* entries in central directory disk */
- (void) getlong64(file); /* entries in central directory */
- (void) getlong64(file); /* size of central directory */
- offset64 = getlong64(file); /* offset to central directory */
+ (void) getlong64(ctx, file); /* size of record */
+ (void) getshort(ctx, file); /* version made by */
+ (void) getshort(ctx, file); /* version to extract */
+ (void) getlong(ctx, file); /* disk number */
+ (void) getlong(ctx, file); /* disk number start */
+ count64 = getlong64(ctx, file); /* entries in central directory disk */
+ (void) getlong64(ctx, file); /* entries in central directory */
+ (void) getlong64(ctx, file); /* size of central directory */
+ offset64 = getlong64(ctx, file); /* offset to central directory */
if (count == 0xFFFF)
count = count64;
@@ -163,66 +163,66 @@ static void read_zip_dir_imp(fz_context *ctx, fz_archive *zip, int start_offset)
zip->table = fz_malloc_array(ctx, count, sizeof *zip->table);
memset(zip->table, 0, count * sizeof *zip->table);
- fz_seek(file, offset, 0);
+ fz_seek(ctx, file, offset, 0);
for (i = 0; i < count; i++)
{
- sig = getlong(file);
+ sig = getlong(ctx, file);
if (sig != ZIP_CENTRAL_DIRECTORY_SIG)
fz_throw(ctx, FZ_ERROR_GENERIC, "wrong zip central directory signature (0x%x)", sig);
- (void) getshort(file); /* version made by */
- (void) getshort(file); /* version to extract */
- (void) getshort(file); /* general */
- (void) getshort(file); /* method */
- (void) getshort(file); /* last mod file time */
- (void) getshort(file); /* last mod file date */
- (void) getlong(file); /* crc-32 */
- zip->table[i].csize = getlong(file);
- zip->table[i].usize = getlong(file);
- namesize = getshort(file);
- metasize = getshort(file);
- commentsize = getshort(file);
- (void) getshort(file); /* disk number start */
- (void) getshort(file); /* int file atts */
- (void) getlong(file); /* ext file atts */
- zip->table[i].offset = getlong(file);
+ (void) getshort(ctx, file); /* version made by */
+ (void) getshort(ctx, file); /* version to extract */
+ (void) getshort(ctx, file); /* general */
+ (void) getshort(ctx, file); /* method */
+ (void) getshort(ctx, file); /* last mod file time */
+ (void) getshort(ctx, file); /* last mod file date */
+ (void) getlong(ctx, file); /* crc-32 */
+ zip->table[i].csize = getlong(ctx, file);
+ zip->table[i].usize = getlong(ctx, file);
+ namesize = getshort(ctx, file);
+ metasize = getshort(ctx, file);
+ commentsize = getshort(ctx, file);
+ (void) getshort(ctx, file); /* disk number start */
+ (void) getshort(ctx, file); /* int file atts */
+ (void) getlong(ctx, file); /* ext file atts */
+ zip->table[i].offset = getlong(ctx, file);
zip->table[i].name = fz_malloc(ctx, namesize + 1);
- fz_read(file, (unsigned char*)zip->table[i].name, namesize);
+ fz_read(ctx, file, (unsigned char*)zip->table[i].name, namesize);
zip->table[i].name[namesize] = 0;
while (metasize > 0)
{
- int type = getshort(file);
- int size = getshort(file);
+ int type = getshort(ctx, file);
+ int size = getshort(ctx, file);
if (type == ZIP64_EXTRA_FIELD_SIG)
{
int sizeleft = size;
if (zip->table[i].usize == 0xFFFFFFFF && sizeleft >= 8)
{
- zip->table[i].usize = getlong64(file);
+ zip->table[i].usize = getlong64(ctx, file);
sizeleft -= 8;
}
if (zip->table[i].csize == 0xFFFFFFFF && sizeleft >= 8)
{
- zip->table[i].csize = getlong64(file);
+ zip->table[i].csize = getlong64(ctx, file);
sizeleft -= 8;
}
if (zip->table[i].offset == 0xFFFFFFFF && sizeleft >= 8)
{
- zip->table[i].offset = getlong64(file);
+ zip->table[i].offset = getlong64(ctx, file);
sizeleft -= 8;
}
- fz_seek(file, sizeleft - size, 1);
+ fz_seek(ctx, file, sizeleft - size, 1);
}
- fz_seek(file, size, 1);
+ fz_seek(ctx, file, size, 1);
metasize -= 4 + size;
}
if (zip->table[i].usize < 0 || zip->table[i].csize < 0 || zip->table[i].offset < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "zip64 files larger than 2 GB are not supported");
- fz_seek(file, commentsize, 1);
+ fz_seek(ctx, file, commentsize, 1);
}
qsort(zip->table, count, sizeof *zip->table, case_compare_entries);
@@ -235,16 +235,16 @@ static void read_zip_dir(fz_context *ctx, fz_archive *zip)
int size, back, maxback;
int i, n;
- fz_seek(file, 0, SEEK_END);
- size = fz_tell(file);
+ fz_seek(ctx, file, 0, SEEK_END);
+ size = fz_tell(ctx, file);
maxback = fz_mini(size, 0xFFFF + sizeof buf);
back = fz_mini(maxback, sizeof buf);
while (back < maxback)
{
- fz_seek(file, size - back, 0);
- n = fz_read(file, buf, sizeof buf);
+ fz_seek(ctx, file, size - back, 0);
+ n = fz_read(ctx, file, buf, sizeof buf);
for (i = n - 4; i > 0; i--)
{
if (!memcmp(buf + i, "PK\5\6", 4))
@@ -264,27 +264,27 @@ static int read_zip_entry_header(fz_context *ctx, fz_archive *zip, struct zip_en
fz_stream *file = zip->file;
int sig, general, method, namelength, extralength;
- fz_seek(file, ent->offset, 0);
+ fz_seek(ctx, file, ent->offset, 0);
- sig = getlong(file);
+ sig = getlong(ctx, file);
if (sig != ZIP_LOCAL_FILE_SIG)
fz_throw(ctx, FZ_ERROR_GENERIC, "wrong zip local file signature (0x%x)", sig);
- (void) getshort(file); /* version */
- general = getshort(file); /* general */
+ (void) getshort(ctx, file); /* version */
+ general = getshort(ctx, file); /* general */
if (general & ZIP_ENCRYPTED_FLAG)
fz_throw(ctx, FZ_ERROR_GENERIC, "zip content is encrypted");
- method = getshort(file);
- (void) getshort(file); /* file time */
- (void) getshort(file); /* file date */
- (void) getlong(file); /* crc-32 */
- (void) getlong(file); /* csize */
- (void) getlong(file); /* usize */
- namelength = getshort(file);
- extralength = getshort(file);
+ method = getshort(ctx, file);
+ (void) getshort(ctx, file); /* file time */
+ (void) getshort(ctx, file); /* file date */
+ (void) getlong(ctx, file); /* crc-32 */
+ (void) getlong(ctx, file); /* csize */
+ (void) getlong(ctx, file); /* usize */
+ namelength = getshort(ctx, file);
+ extralength = getshort(ctx, file);
- fz_seek(file, namelength + extralength, 1);
+ fz_seek(ctx, file, namelength + extralength, 1);
return method;
}
@@ -294,9 +294,9 @@ static fz_stream *open_zip_entry(fz_context *ctx, fz_archive *zip, struct zip_en
fz_stream *file = zip->file;
int method = read_zip_entry_header(ctx, zip, ent);
if (method == 0)
- return fz_open_null(file, ent->usize, fz_tell(file));
+ return fz_open_null(ctx, file, ent->usize, fz_tell(ctx, file));
if (method == 8)
- return fz_open_flated(file, -15);
+ return fz_open_flated(ctx, file, -15);
fz_throw(ctx, FZ_ERROR_GENERIC, "unknown zip method: %d", method);
}
@@ -318,7 +318,7 @@ static fz_buffer *read_zip_entry(fz_context *ctx, fz_archive *zip, struct zip_en
{
fz_try(ctx)
{
- fz_read(file, ubuf->data, ent->usize);
+ fz_read(ctx, file, ubuf->data, ent->usize);
}
fz_catch(ctx)
{
@@ -333,7 +333,7 @@ static fz_buffer *read_zip_entry(fz_context *ctx, fz_archive *zip, struct zip_en
cbuf = fz_malloc(ctx, ent->csize);
fz_try(ctx)
{
- fz_read(file, cbuf, ent->csize);
+ fz_read(ctx, file, cbuf, ent->csize);
z.zalloc = (alloc_func) fz_malloc_array;
z.zfree = (free_func) fz_free;
@@ -372,6 +372,7 @@ static fz_buffer *read_zip_entry(fz_context *ctx, fz_archive *zip, struct zip_en
return ubuf;
}
+ fz_drop_buffer(ctx, ubuf);
fz_throw(ctx, FZ_ERROR_GENERIC, "unknown zip method: %d", method);
}
@@ -451,13 +452,13 @@ fz_list_archive_entry(fz_context *ctx, fz_archive *zip, int idx)
}
void
-fz_close_archive(fz_context *ctx, fz_archive *zip)
+fz_drop_archive(fz_context *ctx, fz_archive *zip)
{
int i;
if (zip)
{
fz_free(ctx, zip->directory);
- fz_close(zip->file);
+ fz_drop_stream(ctx, zip->file);
for (i = 0; i < zip->count; ++i)
fz_free(ctx, zip->table[i].name);
fz_free(ctx, zip->table);
@@ -465,13 +466,6 @@ fz_close_archive(fz_context *ctx, fz_archive *zip)
}
}
-void
-fz_rebind_archive(fz_archive *zip, fz_context *ctx)
-{
- if (zip->file)
- fz_rebind_stream(zip->file, ctx);
-}
-
fz_archive *
fz_open_directory(fz_context *ctx, const char *dirname)
{
@@ -486,7 +480,7 @@ fz_open_archive_with_stream(fz_context *ctx, fz_stream *file)
fz_archive *zip;
zip = fz_malloc_struct(ctx, fz_archive);
- zip->file = fz_keep_stream(file);
+ zip->file = fz_keep_stream(ctx, file);
zip->count = 0;
zip->table = NULL;
@@ -496,7 +490,7 @@ fz_open_archive_with_stream(fz_context *ctx, fz_stream *file)
}
fz_catch(ctx)
{
- fz_close_archive(ctx, zip);
+ fz_drop_archive(ctx, zip);
fz_rethrow(ctx);
}
@@ -510,18 +504,13 @@ fz_open_archive(fz_context *ctx, const char *filename)
fz_archive *zip;
file = fz_open_file(ctx, filename);
+
fz_try(ctx)
- {
zip = fz_open_archive_with_stream(ctx, file);
- }
fz_always(ctx)
- {
- fz_close(file);
- }
+ fz_drop_stream(ctx, file);
fz_catch(ctx)
- {
fz_rethrow(ctx);
- }
return zip;
}
diff --git a/source/fitz/xml.c b/source/fitz/xml.c
index 0d370331..6051caf5 100644
--- a/source/fitz/xml.c
+++ b/source/fitz/xml.c
@@ -66,7 +66,6 @@ static const struct { const char *ent; int ucs; } html_entities[] = {
struct parser
{
fz_xml *head;
- fz_context *ctx;
int preserve_white;
int depth;
};
@@ -205,7 +204,7 @@ static void xml_free_attribute(fz_context *ctx, struct attribute *att)
}
}
-void fz_free_xml(fz_context *ctx, fz_xml *item)
+void fz_drop_xml(fz_context *ctx, fz_xml *item)
{
while (item)
{
@@ -215,7 +214,7 @@ void fz_free_xml(fz_context *ctx, fz_xml *item)
if (item->atts)
xml_free_attribute(ctx, item->atts);
if (item->down)
- fz_free_xml(ctx, item->down);
+ fz_drop_xml(ctx, item->down);
fz_free(ctx, item);
item = next;
}
@@ -287,7 +286,7 @@ static inline int iswhite(int c)
return c == ' ' || c == '\r' || c == '\n' || c == '\t';
}
-static void xml_emit_open_tag(struct parser *parser, char *a, char *b)
+static void xml_emit_open_tag(fz_context *ctx, struct parser *parser, char *a, char *b)
{
fz_xml *head, *tail;
char *ns;
@@ -297,7 +296,7 @@ static void xml_emit_open_tag(struct parser *parser, char *a, char *b)
if (*ns == ':')
a = ns + 1;
- head = fz_malloc_struct(parser->ctx, fz_xml);
+ head = fz_malloc_struct(ctx, fz_xml);
if (b - a > sizeof(head->name) - 1)
b = a + sizeof(head->name) - 1;
memcpy(head->name, a, b - a);
@@ -325,12 +324,12 @@ static void xml_emit_open_tag(struct parser *parser, char *a, char *b)
parser->depth++;
}
-static void xml_emit_att_name(struct parser *parser, char *a, char *b)
+static void xml_emit_att_name(fz_context *ctx, struct parser *parser, char *a, char *b)
{
fz_xml *head = parser->head;
struct attribute *att;
- att = fz_malloc_struct(parser->ctx, struct attribute);
+ att = fz_malloc_struct(ctx, struct attribute);
if (b - a > sizeof(att->name) - 1)
b = a + sizeof(att->name) - 1;
memcpy(att->name, a, b - a);
@@ -340,7 +339,7 @@ static void xml_emit_att_name(struct parser *parser, char *a, char *b)
head->atts = att;
}
-static void xml_emit_att_value(struct parser *parser, char *a, char *b)
+static void xml_emit_att_value(fz_context *ctx, struct parser *parser, char *a, char *b)
{
fz_xml *head = parser->head;
struct attribute *att = head->atts;
@@ -348,7 +347,7 @@ static void xml_emit_att_value(struct parser *parser, char *a, char *b)
int c;
/* entities are all longer than UTFmax so runetochar is safe */
- s = att->value = fz_malloc(parser->ctx, b - a + 1);
+ s = att->value = fz_malloc(ctx, b - a + 1);
while (a < b) {
if (*a == '&') {
a += xml_parse_entity(&c, a);
@@ -361,14 +360,14 @@ static void xml_emit_att_value(struct parser *parser, char *a, char *b)
*s = 0;
}
-static void xml_emit_close_tag(struct parser *parser)
+static void xml_emit_close_tag(fz_context *ctx, struct parser *parser)
{
parser->depth--;
if (parser->head->up)
parser->head = parser->head->up;
}
-static void xml_emit_text(struct parser *parser, char *a, char *b)
+static void xml_emit_text(fz_context *ctx, struct parser *parser, char *a, char *b)
{
static char *empty = "";
fz_xml *head;
@@ -389,11 +388,11 @@ static void xml_emit_text(struct parser *parser, char *a, char *b)
return;
}
- xml_emit_open_tag(parser, empty, empty);
+ xml_emit_open_tag(ctx, parser, empty, empty);
head = parser->head;
/* entities are all longer than UTFmax so runetochar is safe */
- s = head->text = fz_malloc(parser->ctx, b - a + 1);
+ s = head->text = fz_malloc(ctx, b - a + 1);
while (a < b) {
if (*a == '&') {
a += xml_parse_entity(&c, a);
@@ -405,27 +404,27 @@ static void xml_emit_text(struct parser *parser, char *a, char *b)
}
*s = 0;
- xml_emit_close_tag(parser);
+ xml_emit_close_tag(ctx, parser);
}
-static void xml_emit_cdata(struct parser *parser, char *a, char *b)
+static void xml_emit_cdata(fz_context *ctx, struct parser *parser, char *a, char *b)
{
static char *empty = "";
fz_xml *head;
char *s;
- xml_emit_open_tag(parser, empty, empty);
+ xml_emit_open_tag(ctx, parser, empty, empty);
head = parser->head;
- s = head->text = fz_malloc(parser->ctx, b - a + 1);
+ s = head->text = fz_malloc(ctx, b - a + 1);
while (a < b)
*s++ = *a++;
*s = 0;
- xml_emit_close_tag(parser);
+ xml_emit_close_tag(ctx, parser);
}
-static char *xml_parse_document_imp(struct parser *x, char *p)
+static char *xml_parse_document_imp(fz_context *ctx, struct parser *parser, char *p)
{
char *mark;
int quote;
@@ -433,7 +432,7 @@ static char *xml_parse_document_imp(struct parser *x, char *p)
parse_text:
mark = p;
while (*p && *p != '<') ++p;
- if (mark != p) xml_emit_text(x, mark, p);
+ if (mark != p) xml_emit_text(ctx, parser, mark, p);
if (*p == '<') { ++p; goto parse_element; }
return NULL;
@@ -471,7 +470,7 @@ parse_cdata:
mark = p;
while (*p) {
if (p[0] == ']' && p[1] == ']' && p[2] == '>') {
- xml_emit_cdata(x, mark, p);
+ xml_emit_cdata(ctx, parser, mark, p);
p += 3;
goto parse_text;
}
@@ -495,17 +494,17 @@ parse_closing_element:
while (iswhite(*p)) ++p;
if (*p != '>')
return "syntax error in closing element";
- xml_emit_close_tag(x);
+ xml_emit_close_tag(ctx, parser);
++p;
goto parse_text;
parse_element_name:
mark = p;
while (isname(*p)) ++p;
- xml_emit_open_tag(x, mark, p);
+ xml_emit_open_tag(ctx, parser, mark, p);
if (*p == '>') { ++p; goto parse_text; }
if (p[0] == '/' && p[1] == '>') {
- xml_emit_close_tag(x);
+ xml_emit_close_tag(ctx, parser);
p += 2;
goto parse_text;
}
@@ -519,7 +518,7 @@ parse_attributes:
goto parse_attribute_name;
if (*p == '>') { ++p; goto parse_text; }
if (p[0] == '/' && p[1] == '>') {
- xml_emit_close_tag(x);
+ xml_emit_close_tag(ctx, parser);
p += 2;
goto parse_text;
}
@@ -528,7 +527,7 @@ parse_attributes:
parse_attribute_name:
mark = p;
while (isname(*p)) ++p;
- xml_emit_att_name(x, mark, p);
+ xml_emit_att_name(ctx, parser, mark, p);
while (iswhite(*p)) ++p;
if (*p == '=') { ++p; goto parse_attribute_value; }
return "syntax error after attribute name";
@@ -541,7 +540,7 @@ parse_attribute_value:
mark = p;
while (*p && *p != quote) ++p;
if (*p == quote) {
- xml_emit_att_value(x, mark, p++);
+ xml_emit_att_value(ctx, parser, mark, p++);
goto parse_attributes;
}
return "end of data in attribute value";
@@ -599,7 +598,6 @@ fz_parse_xml(fz_context *ctx, unsigned char *s, int n, int preserve_white)
memset(&root, 0, sizeof(root));
parser.head = &root;
- parser.ctx = ctx;
parser.preserve_white = preserve_white;
parser.depth = 0;
@@ -607,7 +605,7 @@ fz_parse_xml(fz_context *ctx, unsigned char *s, int n, int preserve_white)
fz_try(ctx)
{
- error = xml_parse_document_imp(&parser, p);
+ error = xml_parse_document_imp(ctx, &parser, p);
if (error)
fz_throw(ctx, FZ_ERROR_GENERIC, "%s", error);
}
@@ -618,7 +616,7 @@ fz_parse_xml(fz_context *ctx, unsigned char *s, int n, int preserve_white)
}
fz_catch(ctx)
{
- fz_free_xml(ctx, root.down);
+ fz_drop_xml(ctx, root.down);
fz_rethrow(ctx);
}
diff --git a/source/html/css-parse.c b/source/html/css-parse.c
index abe20e74..e3ddd48f 100644
--- a/source/html/css-parse.c
+++ b/source/html/css-parse.c
@@ -70,19 +70,19 @@ static fz_css_value *fz_new_css_value(fz_context *ctx, int type, const char *dat
return val;
}
-static void fz_free_css_value(fz_context *ctx, fz_css_value *val)
+static void fz_drop_css_value(fz_context *ctx, fz_css_value *val)
{
while (val)
{
fz_css_value *next = val->next;
- fz_free_css_value(ctx, val->args);
+ fz_drop_css_value(ctx, val->args);
fz_free(ctx, val->data);
fz_free(ctx, val);
val = next;
}
}
-static void fz_free_css_condition(fz_context *ctx, fz_css_condition *cond)
+static void fz_drop_css_condition(fz_context *ctx, fz_css_condition *cond)
{
while (cond)
{
@@ -94,40 +94,40 @@ static void fz_free_css_condition(fz_context *ctx, fz_css_condition *cond)
}
}
-static void fz_free_css_selector(fz_context *ctx, fz_css_selector *sel)
+static void fz_drop_css_selector(fz_context *ctx, fz_css_selector *sel)
{
while (sel)
{
fz_css_selector *next = sel->next;
fz_free(ctx, sel->name);
- fz_free_css_condition(ctx, sel->cond);
- fz_free_css_selector(ctx, sel->left);
- fz_free_css_selector(ctx, sel->right);
+ fz_drop_css_condition(ctx, sel->cond);
+ fz_drop_css_selector(ctx, sel->left);
+ fz_drop_css_selector(ctx, sel->right);
fz_free(ctx, sel);
sel = next;
}
}
-static void fz_free_css_property(fz_context *ctx, fz_css_property *prop)
+static void fz_drop_css_property(fz_context *ctx, fz_css_property *prop)
{
while (prop)
{
fz_css_property *next = prop->next;
fz_free(ctx, prop->name);
- fz_free_css_value(ctx, prop->value);
+ fz_drop_css_value(ctx, prop->value);
fz_free(ctx, prop);
prop = next;
}
}
-void fz_free_css(fz_context *ctx, fz_css_rule *rule)
+void fz_drop_css(fz_context *ctx, fz_css_rule *rule)
{
while (rule)
{
fz_css_rule *next = rule->next;
- fz_free_css_selector(ctx, rule->selector);
- fz_free_css_property(ctx, rule->declaration);
- fz_free_css_property(ctx, rule->garbage);
+ fz_drop_css_selector(ctx, rule->selector);
+ fz_drop_css_property(ctx, rule->declaration);
+ fz_drop_css_property(ctx, rule->garbage);
fz_free(ctx, rule);
rule = next;
}
diff --git a/source/html/epub-doc.c b/source/html/epub-doc.c
index 3aaedd33..69963ff0 100644
--- a/source/html/epub-doc.c
+++ b/source/html/epub-doc.c
@@ -11,7 +11,6 @@ typedef struct epub_page_s epub_page;
struct epub_document_s
{
fz_document super;
- fz_context *ctx;
fz_archive *zip;
fz_html_font_set *set;
float page_w, page_h, em;
@@ -26,10 +25,17 @@ struct epub_chapter_s
epub_chapter *next;
};
+struct epub_page_s
+{
+ fz_page super;
+ epub_document *doc;
+ int number;
+};
+
static void
-epub_layout(epub_document *doc, float w, float h, float em)
+epub_layout(fz_context *ctx, fz_document *doc_, float w, float h, float em)
{
- fz_context *ctx = doc->ctx;
+ epub_document *doc = (epub_document*)doc_;
epub_chapter *ch;
doc->page_w = w;
@@ -43,8 +49,9 @@ epub_layout(epub_document *doc, float w, float h, float em)
}
static int
-epub_count_pages(epub_document *doc)
+epub_count_pages(fz_context *ctx, fz_document *doc_)
{
+ epub_document *doc = (epub_document*)doc_;
epub_chapter *ch;
int count = 0;
for (ch = doc->spine; ch; ch = ch->next)
@@ -52,20 +59,16 @@ epub_count_pages(epub_document *doc)
return count;
}
-static epub_page *
-epub_load_page(epub_document *doc, int number)
-{
- return (void*)((intptr_t)number + 1);
-}
-
static void
-epub_free_page(epub_document *doc, epub_page *page)
+epub_drop_page_imp(fz_context *ctx, fz_page *page_)
{
}
static fz_rect *
-epub_bound_page(epub_document *doc, epub_page *page, fz_rect *bbox)
+epub_bound_page(fz_context *ctx, fz_page *page_, fz_rect *bbox)
{
+ epub_page *page = (epub_page*)page_;
+ epub_document *doc = page->doc;
bbox->x0 = 0;
bbox->y0 = 0;
bbox->x1 = doc->page_w;
@@ -74,11 +77,13 @@ epub_bound_page(epub_document *doc, epub_page *page, fz_rect *bbox)
}
static void
-epub_run_page(epub_document *doc, epub_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+epub_run_page(fz_context *ctx, fz_page *page_, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
+ epub_page *page = (epub_page*)page_;
+ epub_document *doc = page->doc;
epub_chapter *ch;
- int n = ((intptr_t)page) - 1;
+ int n = page->number;
+
int count = 0;
for (ch = doc->spine; ch; ch = ch->next)
{
@@ -92,21 +97,34 @@ epub_run_page(epub_document *doc, epub_page *page, fz_device *dev, const fz_matr
}
}
+static fz_page *
+epub_load_page(fz_context *ctx, fz_document *doc_, int number)
+{
+ epub_document *doc = (epub_document*)doc_;
+ epub_page *page = fz_new_page(ctx, sizeof *page);
+ page->super.bound_page = epub_bound_page;
+ page->super.run_page_contents = epub_run_page;
+ page->super.drop_page_imp = epub_drop_page_imp;
+ page->doc = doc;
+ page->number = number;
+ return (fz_page*)page;
+}
+
static void
-epub_close_document(epub_document *doc)
+epub_close_document(fz_context *ctx, fz_document *doc_)
{
- fz_context *ctx = doc->ctx;
+ epub_document *doc = (epub_document*)doc_;
epub_chapter *ch, *next;
ch = doc->spine;
while (ch)
{
next = ch->next;
- fz_free_html(ctx, ch->box);
+ fz_drop_html(ctx, ch->box);
fz_free(ctx, ch);
ch = next;
}
- fz_close_archive(ctx, doc->zip);
- fz_free_html_font_set(ctx, doc->set);
+ fz_drop_archive(ctx, doc->zip);
+ fz_drop_html_font_set(ctx, doc->set);
fz_free(ctx, doc);
}
@@ -143,9 +161,8 @@ path_from_idref(char *path, fz_xml *manifest, const char *base_uri, const char *
}
static epub_chapter *
-epub_parse_chapter(epub_document *doc, const char *path)
+epub_parse_chapter(fz_context *ctx, epub_document *doc, const char *path)
{
- fz_context *ctx = doc->ctx;
fz_archive *zip = doc->zip;
fz_buffer *buf;
epub_chapter *ch;
@@ -166,9 +183,8 @@ epub_parse_chapter(epub_document *doc, const char *path)
}
static void
-epub_parse_header(epub_document *doc)
+epub_parse_header(fz_context *ctx, epub_document *doc)
{
- fz_context *ctx = doc->ctx;
fz_archive *zip = doc->zip;
fz_buffer *buf;
fz_xml *container_xml, *content_opf;
@@ -222,9 +238,9 @@ epub_parse_header(epub_document *doc)
{
printf("epub: found spine %s\n", s);
if (!head)
- head = tail = epub_parse_chapter(doc, s);
+ head = tail = epub_parse_chapter(ctx, doc, s);
else
- tail = tail->next = epub_parse_chapter(doc, s);
+ tail = tail->next = epub_parse_chapter(ctx, doc, s);
}
itemref = fz_xml_find_next(itemref, "itemref");
}
@@ -233,8 +249,8 @@ epub_parse_header(epub_document *doc)
printf("epub: done.\n");
- fz_free_xml(ctx, container_xml);
- fz_free_xml(ctx, content_opf);
+ fz_drop_xml(ctx, container_xml);
+ fz_drop_xml(ctx, content_opf);
}
static epub_document *
@@ -243,26 +259,22 @@ epub_init(fz_context *ctx, fz_archive *zip)
epub_document *doc;
doc = fz_malloc_struct(ctx, epub_document);
- doc->ctx = ctx;
doc->zip = zip;
doc->set = fz_new_html_font_set(ctx);
- doc->super.close = (void*)epub_close_document;
- doc->super.layout = (void*)epub_layout;
- doc->super.count_pages = (void*)epub_count_pages;
- doc->super.load_page = (void*)epub_load_page;
- doc->super.bound_page = (void*)epub_bound_page;
- doc->super.run_page_contents = (void*)epub_run_page;
- doc->super.free_page = (void*)epub_free_page;
+ doc->super.close = epub_close_document;
+ doc->super.layout = epub_layout;
+ doc->super.count_pages = epub_count_pages;
+ doc->super.load_page = epub_load_page;
fz_try(ctx)
{
- epub_parse_header(doc);
- epub_layout(doc, DEFW, DEFH, DEFEM);
+ epub_parse_header(ctx, doc);
+ epub_layout(ctx, (fz_document*)doc, DEFW, DEFH, DEFEM);
}
fz_catch(ctx)
{
- epub_close_document(doc);
+ epub_close_document(ctx, (fz_document*)doc);
fz_rethrow(ctx);
}
diff --git a/source/html/html-doc.c b/source/html/html-doc.c
index ea5f7f3a..7217f74c 100644
--- a/source/html/html-doc.c
+++ b/source/html/html-doc.c
@@ -5,56 +5,62 @@
#define DEFEM (12)
typedef struct html_document_s html_document;
+typedef struct html_page_s html_page;
struct html_document_s
{
fz_document super;
- fz_context *ctx;
fz_archive *zip;
fz_html_font_set *set;
float page_w, page_h, em;
fz_html *box;
};
+struct html_page_s
+{
+ fz_page super;
+ html_document *doc;
+ int number;
+};
+
static void
-htdoc_close_document(html_document *doc)
+htdoc_close_document(fz_context *ctx, fz_document *doc_)
{
- fz_close_archive(doc->ctx, doc->zip);
- fz_free_html(doc->ctx, doc->box);
- fz_free_html_font_set(doc->ctx, doc->set);
- fz_free(doc->ctx, doc);
+ html_document *doc = (html_document*)doc_;
+ fz_drop_archive(ctx, doc->zip);
+ fz_drop_html(ctx, doc->box);
+ fz_drop_html_font_set(ctx, doc->set);
+ fz_free(ctx, doc);
}
static int
-htdoc_count_pages(html_document *doc)
+htdoc_count_pages(fz_context *ctx, fz_document *doc_)
{
+ html_document *doc = (html_document*)doc_;
int count = ceilf(doc->box->h / doc->page_h);
return count;
}
-static void *
-htdoc_load_page(html_document *doc, int number)
-{
- return (void*)((intptr_t)number + 1);
-}
-
static void
-htdoc_free_page(html_document *doc, void *page)
+htdoc_layout(fz_context *ctx, fz_document *doc_, float w, float h, float em)
{
+ html_document *doc = (html_document*)doc_;
+ doc->page_w = w;
+ doc->page_h = h;
+ doc->em = em;
+ fz_layout_html(ctx, doc->box, w, h, em);
}
static void
-htdoc_layout(html_document *doc, float w, float h, float em)
+htdoc_drop_page_imp(fz_context *ctx, fz_page *page_)
{
- doc->page_w = w;
- doc->page_h = h;
- doc->em = em;
- fz_layout_html(doc->ctx, doc->box, w, h, em);
}
static fz_rect *
-htdoc_bound_page(html_document *doc, void *page, fz_rect *bbox)
+htdoc_bound_page(fz_context *ctx, fz_page *page_, fz_rect *bbox)
{
+ html_page *page = (html_page*)page_;
+ html_document *doc = page->doc;
bbox->x0 = bbox->y0 = 0;
bbox->x1 = doc->page_w;
bbox->y1 = doc->page_h;
@@ -62,10 +68,25 @@ htdoc_bound_page(html_document *doc, void *page, fz_rect *bbox)
}
static void
-htdoc_run_page(html_document *doc, void *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+htdoc_run_page(fz_context *ctx, fz_page *page_, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+{
+ html_page *page = (html_page*)page_;
+ html_document *doc = page->doc;
+ int n = page->number;
+ fz_draw_html(ctx, doc->box, n * doc->page_h, (n+1) * doc->page_h, dev, ctm);
+}
+
+static fz_page *
+htdoc_load_page(fz_context *ctx, fz_document *doc_, int number)
{
- int n = ((intptr_t)page) - 1;
- fz_draw_html(doc->ctx, doc->box, n * doc->page_h, (n+1) * doc->page_h, dev, ctm);
+ html_document *doc = (html_document*)doc_;
+ html_page *page = fz_new_page(ctx, sizeof *page);
+ page->super.bound_page = htdoc_bound_page;
+ page->super.run_page_contents = htdoc_run_page;
+ page->super.drop_page_imp = htdoc_drop_page_imp;
+ page->doc = doc;
+ page->number = number;
+ return (fz_page*)page;
}
static html_document *
@@ -75,24 +96,20 @@ htdoc_open_document_with_stream(fz_context *ctx, fz_stream *file)
fz_buffer *buf;
doc = fz_malloc_struct(ctx, html_document);
- doc->ctx = ctx;
doc->zip = fz_open_directory(ctx, ".");
doc->set = fz_new_html_font_set(ctx);
- doc->super.close = (void*)htdoc_close_document;
- doc->super.layout = (void*)htdoc_layout;
- doc->super.count_pages = (void*)htdoc_count_pages;
- doc->super.load_page = (void*)htdoc_load_page;
- doc->super.bound_page = (void*)htdoc_bound_page;
- doc->super.run_page_contents = (void*)htdoc_run_page;
- doc->super.free_page = (void*)htdoc_free_page;
+ doc->super.close = htdoc_close_document;
+ doc->super.layout = htdoc_layout;
+ doc->super.count_pages = htdoc_count_pages;
+ doc->super.load_page = htdoc_load_page;
- buf = fz_read_all(file, 0);
+ buf = fz_read_all(ctx, file, 0);
fz_write_buffer_byte(ctx, buf, 0);
doc->box = fz_parse_html(ctx, doc->set, doc->zip, ".", buf, NULL);
fz_drop_buffer(ctx, buf);
- htdoc_layout(doc, DEFW, DEFH, DEFEM);
+ htdoc_layout(ctx, (fz_document*)doc, DEFW, DEFH, DEFEM);
return doc;
}
@@ -107,24 +124,20 @@ htdoc_open_document(fz_context *ctx, const char *filename)
fz_dirname(dirname, filename, sizeof dirname);
doc = fz_malloc_struct(ctx, html_document);
- doc->ctx = ctx;
doc->zip = fz_open_directory(ctx, dirname);
doc->set = fz_new_html_font_set(ctx);
- doc->super.close = (void*)htdoc_close_document;
- doc->super.layout = (void*)htdoc_layout;
- doc->super.count_pages = (void*)htdoc_count_pages;
- doc->super.load_page = (void*)htdoc_load_page;
- doc->super.bound_page = (void*)htdoc_bound_page;
- doc->super.run_page_contents = (void*)htdoc_run_page;
- doc->super.free_page = (void*)htdoc_free_page;
+ doc->super.close = htdoc_close_document;
+ doc->super.layout = htdoc_layout;
+ doc->super.count_pages = htdoc_count_pages;
+ doc->super.load_page = htdoc_load_page;
buf = fz_read_file(ctx, filename);
fz_write_buffer_byte(ctx, buf, 0);
doc->box = fz_parse_html(ctx, doc->set, doc->zip, ".", buf, NULL);
fz_drop_buffer(ctx, buf);
- htdoc_layout(doc, DEFW, DEFH, DEFEM);
+ htdoc_layout(ctx, (fz_document*)doc, DEFW, DEFH, DEFEM);
return doc;
}
diff --git a/source/html/html-font.c b/source/html/html-font.c
index c7b1cf3c..ae6568c9 100644
--- a/source/html/html-font.c
+++ b/source/html/html-font.c
@@ -24,7 +24,7 @@ fz_load_html_font(fz_context *ctx, fz_html_font_set *set,
int idx = is_mono * 8 + is_sans * 4 + is_bold * 2 + is_italic;
if (!set->fonts[idx])
{
- data = pdf_lookup_builtin_font(font_names[idx], &size);
+ data = pdf_lookup_builtin_font(ctx, font_names[idx], &size);
if (!data)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load html font: %s", font_names[idx]);
set->fonts[idx] = fz_new_font_from_memory(ctx, font_names[idx], data, size, 0, 1);
@@ -38,7 +38,7 @@ fz_html_font_set *fz_new_html_font_set(fz_context *ctx)
return fz_malloc_struct(ctx, fz_html_font_set);
}
-void fz_free_html_font_set(fz_context *ctx, fz_html_font_set *set)
+void fz_drop_html_font_set(fz_context *ctx, fz_html_font_set *set)
{
int i;
for (i = 0; i < nelem(set->fonts); ++i)
diff --git a/source/html/html-layout.c b/source/html/html-layout.c
index 0f304616..5a1a3157 100644
--- a/source/html/html-layout.c
+++ b/source/html/html-layout.c
@@ -39,7 +39,7 @@ static int iswhite(int c)
return c == ' ' || c == '\t' || c == '\r' || c == '\n';
}
-static void fz_free_html_flow(fz_context *ctx, fz_html_flow *flow)
+static void fz_drop_html_flow(fz_context *ctx, fz_html_flow *flow)
{
while (flow)
{
@@ -163,13 +163,13 @@ static void init_box(fz_context *ctx, fz_html *box)
fz_default_css_style(ctx, &box->style);
}
-void fz_free_html(fz_context *ctx, fz_html *box)
+void fz_drop_html(fz_context *ctx, fz_html *box)
{
while (box)
{
fz_html *next = box->next;
- fz_free_html_flow(ctx, box->flow_head);
- fz_free_html(ctx, box->down);
+ fz_drop_html_flow(ctx, box->flow_head);
+ fz_drop_html(ctx, box->down);
fz_free(ctx, box);
box = next;
}
@@ -704,16 +704,16 @@ static void draw_flow_box(fz_context *ctx, fz_html *box, float page_top, float p
color[1] = node->style->color.g / 255.0f;
color[2] = node->style->color.b / 255.0f;
- fz_fill_text(dev, text, ctm, fz_device_rgb(ctx), color, 1);
+ fz_fill_text(ctx, dev, text, ctm, fz_device_rgb(ctx), color, 1);
- fz_free_text(ctx, text);
+ fz_drop_text(ctx, text);
}
else if (node->type == FLOW_IMAGE)
{
fz_matrix local_ctm = *ctm;
fz_pre_translate(&local_ctm, node->x, node->y);
fz_pre_scale(&local_ctm, node->w, node->h);
- fz_fill_image(dev, node->image, &local_ctm, 1);
+ fz_fill_image(ctx, dev, node->image, &local_ctm, 1);
}
}
}
@@ -728,9 +728,9 @@ static void draw_rect(fz_context *ctx, fz_device *dev, const fz_matrix *ctm, flo
fz_lineto(ctx, path, x0, y1);
fz_closepath(ctx, path);
- fz_fill_path(dev, path, 0, ctm, fz_device_rgb(ctx), rgba, rgba[3]);
+ fz_fill_path(ctx, dev, path, 0, ctm, fz_device_rgb(ctx), rgba, rgba[3]);
- fz_free_path(ctx, path);
+ fz_drop_path(ctx, path);
}
static void draw_block_box(fz_context *ctx, fz_html *box, float page_top, float page_bot, fz_device *dev, const fz_matrix *ctm)
@@ -902,8 +902,8 @@ fz_parse_html(fz_context *ctx, fz_html_font_set *set, fz_archive *zip, const cha
generate_boxes(ctx, set, zip, base_uri, xml, box, css, &match);
- fz_free_css(ctx, css);
- fz_free_xml(ctx, xml);
+ fz_drop_css(ctx, css);
+ fz_drop_xml(ctx, xml);
return box;
}
diff --git a/source/img/muimage.c b/source/img/muimage.c
deleted file mode 100644
index d545068f..00000000
--- a/source/img/muimage.c
+++ /dev/null
@@ -1,184 +0,0 @@
-#include "mupdf/img.h"
-
-#include <ctype.h> /* for tolower */
-
-#define DPI 72.0f
-
-static void image_init_document(image_document *doc);
-
-struct image_document_s
-{
- fz_document super;
-
- fz_context *ctx;
- fz_stream *file;
- fz_image *image;
-};
-
-image_document *
-image_open_document_with_stream(fz_context *ctx, fz_stream *file)
-{
- image_document *doc;
- fz_buffer *buffer = NULL;
-
- doc = fz_malloc_struct(ctx, image_document);
- image_init_document(doc);
- doc->ctx = ctx;
- doc->file = fz_keep_stream(file);
-
- fz_var(buffer);
-
- fz_try(ctx)
- {
- buffer = fz_read_all(doc->file, 1024);
- doc->image = fz_new_image_from_buffer(ctx, buffer);
- }
- fz_always(ctx)
- {
- fz_drop_buffer(ctx, buffer);
- }
- fz_catch(ctx)
- {
- image_close_document(doc);
- fz_rethrow(ctx);
- }
-
- return doc;
-}
-
-image_document *
-image_open_document(fz_context *ctx, const char *filename)
-{
- fz_stream *file;
- image_document *doc;
-
- file = fz_open_file(ctx, filename);
- if (!file)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot open file '%s': %s", filename, strerror(errno));
-
- fz_try(ctx)
- {
- doc = image_open_document_with_stream(ctx, file);
- }
- fz_always(ctx)
- {
- fz_close(file);
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
- }
-
- return doc;
-}
-
-void
-image_close_document(image_document *doc)
-{
- fz_context *ctx = doc->ctx;
- fz_drop_image(ctx, doc->image);
- fz_close(doc->file);
- fz_free(ctx, doc);
-}
-
-int
-image_count_pages(image_document *doc)
-{
- return 1;
-}
-
-image_page *
-image_load_page(image_document *doc, int number)
-{
- if (number != 0)
- return NULL;
-
- return (image_page *)doc->image;
-}
-
-void
-image_free_page(image_document *doc, image_page *page)
-{
-}
-
-fz_rect *
-image_bound_page(image_document *doc, image_page *page, fz_rect *bbox)
-{
- fz_image *image = (fz_image *)page;
- bbox->x0 = bbox->y0 = 0;
- bbox->x1 = image->w * DPI / image->xres;
- bbox->y1 = image->h * DPI / image->yres;
- return bbox;
-}
-
-void
-image_run_page(image_document *doc, image_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
-{
- fz_matrix local_ctm = *ctm;
- fz_image *image = (fz_image *)page;
- float w = image->w * DPI / image->xres;
- float h = image->h * DPI / image->yres;
- fz_pre_scale(&local_ctm, w, h);
- fz_fill_image(dev, image, &local_ctm, 1);
-}
-
-static int
-image_meta(image_document *doc, int key, void *ptr, int size)
-{
- switch(key)
- {
- case FZ_META_FORMAT_INFO:
- sprintf((char *)ptr, "IMAGE");
- return FZ_META_OK;
- default:
- return FZ_META_UNKNOWN_KEY;
- }
-}
-
-static void
-image_rebind(image_document *doc, fz_context *ctx)
-{
- doc->ctx = ctx;
- fz_rebind_stream(doc->file, ctx);
-}
-
-static void
-image_init_document(image_document *doc)
-{
- doc->super.close = (fz_document_close_fn *)image_close_document;
- doc->super.count_pages = (fz_document_count_pages_fn *)image_count_pages;
- doc->super.load_page = (fz_document_load_page_fn *)image_load_page;
- doc->super.bound_page = (fz_document_bound_page_fn *)image_bound_page;
- doc->super.run_page_contents = (fz_document_run_page_contents_fn *)image_run_page;
- doc->super.free_page = (fz_document_free_page_fn *)image_free_page;
- doc->super.meta = (fz_document_meta_fn *)image_meta;
- doc->super.rebind = (fz_document_rebind_fn *)image_rebind;
-}
-
-static int
-image_recognize(fz_context *doc, const char *magic)
-{
- char *ext = strrchr(magic, '.');
-
- if (ext)
- {
- if (!fz_strcasecmp(ext, ".png") || !fz_strcasecmp(ext, ".jpg") ||
- !fz_strcasecmp(ext, ".jpeg") || !fz_strcasecmp(ext, ".jfif") ||
- !fz_strcasecmp(ext, ".jfif-tbnl") || !fz_strcasecmp(ext, ".jpe"))
- return 100;
- }
- if (!strcmp(magic, "png") || !strcmp(magic, "image/png") ||
- !strcmp(magic, "jpg") || !strcmp(magic, "image/jpeg") ||
- !strcmp(magic, "jpeg") || !strcmp(magic, "image/pjpeg") ||
- !strcmp(magic, "jpe") || !strcmp(magic, "jfif"))
- return 100;
-
- return 0;
-}
-
-fz_document_handler img_document_handler =
-{
- (fz_document_recognize_fn *)&image_recognize,
- (fz_document_open_fn *)&image_open_document,
- (fz_document_open_with_stream_fn *)&image_open_document_with_stream
-};
diff --git a/source/pdf/js/pdf-js-none.c b/source/pdf/js/pdf-js-none.c
index 37597b53..7cce12be 100644
--- a/source/pdf/js/pdf-js-none.c
+++ b/source/pdf/js/pdf-js-none.c
@@ -1,14 +1,14 @@
#include "mupdf/pdf.h"
-void pdf_enable_js(pdf_document *doc)
+void pdf_enable_js(fz_context *ctx, pdf_document *doc)
{
}
-void pdf_disable_js(pdf_document *doc)
+void pdf_disable_js(fz_context *ctx, pdf_document *doc)
{
}
-int pdf_js_supported(pdf_document *doc)
+int pdf_js_supported(fz_context *ctx, pdf_document *doc)
{
return 0;
}
diff --git a/source/pdf/js/pdf-js.c b/source/pdf/js/pdf-js.c
index 8364fc95..84a14381 100644
--- a/source/pdf/js/pdf-js.c
+++ b/source/pdf/js/pdf-js.c
@@ -1,7 +1,11 @@
#include "mupdf/pdf.h"
+/* TODO: js->doc -> doc */
+/* TODO: js->ctx -> ctx */
+
struct pdf_js_s
{
+ fz_context *ctx;
pdf_document *doc;
pdf_obj *form;
pdf_js_event event;
@@ -15,7 +19,7 @@ struct pdf_js_s
static pdf_jsimp_obj *app_alert(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_jsimp_obj *cMsg_obj = NULL;
pdf_jsimp_obj *nIcon_obj = NULL;
pdf_jsimp_obj *nType_obj = NULL;
@@ -77,7 +81,7 @@ static pdf_jsimp_obj *app_alert(void *jsctx, void *obj, int argc, pdf_jsimp_obj
if (cTitle_obj)
event.title = pdf_jsimp_to_string(js->imp, cTitle_obj);
- pdf_event_issue_alert(js->doc, &event);
+ pdf_event_issue_alert(ctx, js->doc, &event);
nButton_obj = pdf_jsimp_from_number(js->imp, (double)event.button_pressed);
}
fz_always(ctx)
@@ -102,7 +106,7 @@ static pdf_jsimp_obj *app_execDialog(void *jsctx, void *obj, int argc, pdf_jsimp
{
pdf_js *js = (pdf_js *)jsctx;
- pdf_event_issue_exec_dialog(js->doc);
+ pdf_event_issue_exec_dialog(js->ctx, js->doc);
return NULL;
}
@@ -112,7 +116,7 @@ static pdf_jsimp_obj *app_execMenuItem(void *jsctx, void *obj, int argc, pdf_jsi
pdf_js *js = (pdf_js *)jsctx;
if (argc == 1)
- pdf_event_issue_exec_menu_item(js->doc, pdf_jsimp_to_string(js->imp, args[0]));
+ pdf_event_issue_exec_menu_item(js->ctx, js->doc, pdf_jsimp_to_string(js->imp, args[0]));
return NULL;
}
@@ -133,19 +137,18 @@ static pdf_jsimp_obj *app_launchURL(void *jsctx, void *obj, int argc, pdf_jsimp_
cUrl = pdf_jsimp_to_string(js->imp, args[0]);
}
- pdf_event_issue_launch_url(js->doc, cUrl, bNewFrame);
+ pdf_event_issue_launch_url(js->ctx, js->doc, cUrl, bNewFrame);
return NULL;
}
-static pdf_obj *load_color(pdf_document *doc, pdf_jsimp *imp, pdf_jsimp_obj *val)
+static pdf_obj *load_color(fz_context *ctx, pdf_document *doc, pdf_jsimp *imp, pdf_jsimp_obj *val)
{
pdf_obj *col = NULL;
pdf_obj *comp = NULL;
pdf_jsimp_obj *jscomp = NULL;
int i;
int n;
- fz_context *ctx = doc->ctx;
n = pdf_jsimp_array_len(imp, val);
@@ -155,7 +158,7 @@ static pdf_obj *load_color(pdf_document *doc, pdf_jsimp *imp, pdf_jsimp_obj *val
if (n <= 1)
return NULL;
- col = pdf_new_array(doc, n-1);
+ col = pdf_new_array(ctx, doc, n-1);
fz_var(comp);
fz_var(jscomp);
@@ -164,19 +167,19 @@ static pdf_obj *load_color(pdf_document *doc, pdf_jsimp *imp, pdf_jsimp_obj *val
for (i = 0; i < n-1; i++)
{
jscomp = pdf_jsimp_array_item(imp, val, i+1);
- comp = pdf_new_real(doc, pdf_jsimp_to_number(imp, jscomp));
- pdf_array_push(col, comp);
+ comp = pdf_new_real(ctx, doc, pdf_jsimp_to_number(imp, jscomp));
+ pdf_array_push(ctx, col, comp);
pdf_jsimp_drop_obj(imp, jscomp);
jscomp = NULL;
- pdf_drop_obj(comp);
+ pdf_drop_obj(ctx, comp);
comp = NULL;
}
}
fz_catch(ctx)
{
pdf_jsimp_drop_obj(imp, jscomp);
- pdf_drop_obj(comp);
- pdf_drop_obj(col);
+ pdf_drop_obj(ctx, comp);
+ pdf_drop_obj(ctx, col);
fz_rethrow(ctx);
}
@@ -193,7 +196,7 @@ static pdf_jsimp_obj *field_buttonSetCaption(void *jsctx, void *obj, int argc, p
return NULL;
name = pdf_jsimp_to_string(js->imp, args[0]);
- pdf_field_set_button_caption(js->doc, field, name);
+ pdf_field_set_button_caption(js->ctx, js->doc, field, name);
return NULL;
}
@@ -201,7 +204,7 @@ static pdf_jsimp_obj *field_buttonSetCaption(void *jsctx, void *obj, int argc, p
static pdf_jsimp_obj *field_getName(void *jsctx, void *obj)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_obj *field = (pdf_obj *)obj;
char *name;
pdf_jsimp_obj *oname = NULL;
@@ -209,7 +212,7 @@ static pdf_jsimp_obj *field_getName(void *jsctx, void *obj)
if (field == NULL)
return NULL;
- name = pdf_field_name(js->doc, field);
+ name = pdf_field_name(ctx, js->doc, field);
fz_try(ctx)
{
oname = pdf_jsimp_from_string(js->imp, name);
@@ -229,7 +232,7 @@ static pdf_jsimp_obj *field_getName(void *jsctx, void *obj)
static void field_setName(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to field_setName");
+ fz_warn(js->ctx, "Unexpected call to field_setName");
}
static pdf_jsimp_obj *field_getDisplay(void *jsctx, void *obj)
@@ -237,7 +240,7 @@ static pdf_jsimp_obj *field_getDisplay(void *jsctx, void *obj)
pdf_js *js = (pdf_js *)jsctx;
pdf_obj *field = (pdf_obj *)obj;
- return field ? pdf_jsimp_from_number(js->imp, (double)pdf_field_display(js->doc, field)) : NULL;
+ return field ? pdf_jsimp_from_number(js->imp, (double)pdf_field_display(js->ctx, js->doc, field)) : NULL;
}
static void field_setDisplay(void *jsctx, void *obj, pdf_jsimp_obj *val)
@@ -245,7 +248,7 @@ static void field_setDisplay(void *jsctx, void *obj, pdf_jsimp_obj *val)
pdf_js *js = (pdf_js *)jsctx;
pdf_obj *field = (pdf_obj *)obj;
if (field)
- pdf_field_set_display(js->doc, field, (int)pdf_jsimp_to_number(js->imp, val));
+ pdf_field_set_display(js->ctx, js->doc, field, (int)pdf_jsimp_to_number(js->imp, val));
}
static pdf_jsimp_obj *field_getFillColor(void *jsctx, void *obj)
@@ -256,21 +259,21 @@ static pdf_jsimp_obj *field_getFillColor(void *jsctx, void *obj)
static void field_setFillColor(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_obj *field = (pdf_obj *)obj;
pdf_obj *col;
if (!field)
return;
- col = load_color(js->doc, js->imp, val);
+ col = load_color(ctx, js->doc, js->imp, val);
fz_try(ctx)
{
- pdf_field_set_fill_color(js->doc, field, col);
+ pdf_field_set_fill_color(ctx, js->doc, field, col);
}
fz_always(ctx)
{
- pdf_drop_obj(col);
+ pdf_drop_obj(ctx, col);
}
fz_catch(ctx)
{
@@ -286,21 +289,21 @@ static pdf_jsimp_obj *field_getTextColor(void *jsctx, void *obj)
static void field_setTextColor(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_obj *field = (pdf_obj *)obj;
pdf_obj *col;
if (!field)
return;
- col = load_color(js->doc, js->imp, val);
+ col = load_color(ctx, js->doc, js->imp, val);
fz_try(ctx)
{
- pdf_field_set_text_color(js->doc, field, col);
+ pdf_field_set_text_color(ctx, js->doc, field, col);
}
fz_always(ctx)
{
- pdf_drop_obj(col);
+ pdf_drop_obj(ctx, col);
}
fz_catch(ctx)
{
@@ -313,7 +316,7 @@ static pdf_jsimp_obj *field_getBorderStyle(void *jsctx, void *obj)
pdf_js *js = (pdf_js *)jsctx;
pdf_obj *field = (pdf_obj *)obj;
- return field ? pdf_jsimp_from_string(js->imp, pdf_field_border_style(js->doc, field)) : NULL;
+ return field ? pdf_jsimp_from_string(js->imp, pdf_field_border_style(js->ctx, js->doc, field)) : NULL;
}
static void field_setBorderStyle(void *jsctx, void *obj, pdf_jsimp_obj *val)
@@ -322,7 +325,7 @@ static void field_setBorderStyle(void *jsctx, void *obj, pdf_jsimp_obj *val)
pdf_obj *field = (pdf_obj *)obj;
if (field)
- pdf_field_set_border_style(js->doc, field, pdf_jsimp_to_string(js->imp, val));
+ pdf_field_set_border_style(js->ctx, js->doc, field, pdf_jsimp_to_string(js->imp, val));
}
static pdf_jsimp_obj *field_getValue(void *jsctx, void *obj)
@@ -334,7 +337,8 @@ static pdf_jsimp_obj *field_getValue(void *jsctx, void *obj)
if (!field)
return NULL;
- fval = pdf_field_value(js->doc, field);
+ fval = pdf_field_value(js->ctx, js->doc, field);
+ /* TODO: free fval! */
return pdf_jsimp_from_string(js->imp, fval?fval:"");
}
@@ -344,7 +348,7 @@ static void field_setValue(void *jsctx, void *obj, pdf_jsimp_obj *val)
pdf_obj *field = (pdf_obj *)obj;
if (field)
- (void)pdf_field_set_value(js->doc, field, pdf_jsimp_to_string(js->imp, val));
+ (void)pdf_field_set_value(js->ctx, js->doc, field, pdf_jsimp_to_string(js->imp, val));
}
static pdf_jsimp_obj *event_getTarget(void *jsctx, void *obj)
@@ -357,7 +361,7 @@ static pdf_jsimp_obj *event_getTarget(void *jsctx, void *obj)
static void event_setTarget(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to event_setTarget");
+ fz_warn(js->ctx, "Unexpected call to event_setTarget");
}
static pdf_jsimp_obj *event_getValue(void *jsctx, void *obj)
@@ -371,7 +375,7 @@ static pdf_jsimp_obj *event_getValue(void *jsctx, void *obj)
static void event_setValue(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
fz_free(ctx, js->event.value);
js->event.value = NULL;
js->event.value = fz_strdup(ctx, pdf_jsimp_to_string(js->imp, val));
@@ -387,7 +391,7 @@ static pdf_jsimp_obj *event_getWillCommit(void *jsctx, void *obj)
static void event_setWillCommit(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to event_setWillCommit");
+ fz_warn(js->ctx, "Unexpected call to event_setWillCommit");
}
static pdf_jsimp_obj *event_getRC(void *jsctx, void *obj)
@@ -414,7 +418,7 @@ static pdf_jsimp_obj *doc_getEvent(void *jsctx, void *obj)
static void doc_setEvent(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to doc_setEvent");
+ fz_warn(js->ctx, "Unexpected call to doc_setEvent");
}
static pdf_jsimp_obj *doc_getApp(void *jsctx, void *obj)
@@ -427,7 +431,7 @@ static pdf_jsimp_obj *doc_getApp(void *jsctx, void *obj)
static void doc_setApp(void *jsctx, void *obj, pdf_jsimp_obj *val)
{
pdf_js *js = (pdf_js *)jsctx;
- fz_warn(js->doc->ctx, "Unexpected call to doc_setApp");
+ fz_warn(js->ctx, "Unexpected call to doc_setApp");
}
static char *utf8_to_pdf(fz_context *ctx, char *utf8)
@@ -466,7 +470,7 @@ static char *utf8_to_pdf(fz_context *ctx, char *utf8)
static pdf_jsimp_obj *doc_getField(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_obj *dict = NULL;
char *utf8;
char *name = NULL;
@@ -483,7 +487,7 @@ static pdf_jsimp_obj *doc_getField(void *jsctx, void *obj, int argc, pdf_jsimp_o
if (utf8)
{
name = utf8_to_pdf(ctx, utf8);
- dict = pdf_lookup_field(js->form, name);
+ dict = pdf_lookup_field(js->ctx, js->form, name);
}
}
fz_always(ctx)
@@ -502,7 +506,7 @@ static pdf_jsimp_obj *doc_getField(void *jsctx, void *obj, int argc, pdf_jsimp_o
static void reset_field(pdf_js *js, pdf_jsimp_obj *item)
{
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
char *name = NULL;
char *utf8 = pdf_jsimp_to_string(js->imp, item);
@@ -514,9 +518,9 @@ static void reset_field(pdf_js *js, pdf_jsimp_obj *item)
fz_try(ctx)
{
name = utf8_to_pdf(ctx, utf8);
- field = pdf_lookup_field(js->form, name);
+ field = pdf_lookup_field(js->ctx, js->form, name);
if (field)
- pdf_field_reset(js->doc, field);
+ pdf_field_reset(js->ctx, js->doc, field);
}
fz_always(ctx)
{
@@ -532,7 +536,7 @@ static void reset_field(pdf_js *js, pdf_jsimp_obj *item)
static pdf_jsimp_obj *doc_resetForm(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_jsimp_obj *arr = NULL;
pdf_jsimp_obj *elem = NULL;
@@ -583,10 +587,10 @@ static pdf_jsimp_obj *doc_resetForm(void *jsctx, void *obj, int argc, pdf_jsimp_
else
{
/* No argument or null passed in means reset all. */
- int i, n = pdf_array_len(js->form);
+ int i, n = pdf_array_len(ctx, js->form);
for (i = 0; i < n; i++)
- pdf_field_reset(js->doc, pdf_array_get(js->form, i));
+ pdf_field_reset(js->ctx, js->doc, pdf_array_get(ctx, js->form, i));
}
}
fz_catch(ctx)
@@ -601,7 +605,7 @@ static pdf_jsimp_obj *doc_print(void *jsctx, void *obj, int argc, pdf_jsimp_obj
{
pdf_js *js = (pdf_js *)jsctx;
- pdf_event_issue_print(js->doc);
+ pdf_event_issue_print(js->ctx, js->doc);
return NULL;
}
@@ -609,7 +613,7 @@ static pdf_jsimp_obj *doc_print(void *jsctx, void *obj, int argc, pdf_jsimp_obj
static pdf_jsimp_obj *doc_mailDoc(void *jsctx, void *obj, int argc, pdf_jsimp_obj *args[])
{
pdf_js *js = (pdf_js *)jsctx;
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_jsimp_obj *bUI_obj = NULL;
pdf_jsimp_obj *cTo_obj = NULL;
pdf_jsimp_obj *cCc_obj = NULL;
@@ -684,7 +688,7 @@ static pdf_jsimp_obj *doc_mailDoc(void *jsctx, void *obj, int argc, pdf_jsimp_ob
if (cMessage_obj)
event.message = pdf_jsimp_to_string(js->imp, cMessage_obj);
- pdf_event_issue_mail_doc(js->doc, &event);
+ pdf_event_issue_mail_doc(js->ctx, js->doc, &event);
}
fz_always(ctx)
{
@@ -774,7 +778,7 @@ static void pdf_drop_js(pdf_js *js)
{
if (js)
{
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
fz_free(ctx, js->event.value);
pdf_jsimp_drop_type(js->imp, js->apptype);
pdf_jsimp_drop_type(js->imp, js->eventtype);
@@ -785,9 +789,8 @@ static void pdf_drop_js(pdf_js *js)
}
}
-static pdf_js *pdf_new_js(pdf_document *doc)
+static pdf_js *pdf_new_js(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
pdf_js *js = NULL;
fz_var(js);
@@ -796,12 +799,13 @@ static pdf_js *pdf_new_js(pdf_document *doc)
pdf_obj *root, *acroform;
js = fz_malloc_struct(ctx, pdf_js);
+ js->ctx = ctx;
js->doc = doc;
/* Find the form array */
- root = pdf_dict_gets(pdf_trailer(doc), "Root");
- acroform = pdf_dict_gets(root, "AcroForm");
- js->form = pdf_dict_gets(acroform, "Fields");
+ root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ acroform = pdf_dict_gets(ctx, root, "AcroForm");
+ js->form = pdf_dict_gets(ctx, acroform, "Fields");
/* Initialise the javascript engine, passing the main context
* for use in memory allocation and exception handling. Also
@@ -823,7 +827,7 @@ static pdf_js *pdf_new_js(pdf_document *doc)
static void pdf_js_load_document_level(pdf_js *js)
{
pdf_document *doc = js->doc;
- fz_context *ctx = doc->ctx;
+ fz_context *ctx = js->ctx;
pdf_obj *javascript = NULL;
char *codebuf = NULL;
@@ -833,18 +837,18 @@ static void pdf_js_load_document_level(pdf_js *js)
{
int len, i;
- javascript = pdf_load_name_tree(doc, "JavaScript");
- len = pdf_dict_len(javascript);
+ javascript = pdf_load_name_tree(ctx, doc, "JavaScript");
+ len = pdf_dict_len(ctx, javascript);
for (i = 0; i < len; i++)
{
- pdf_obj *fragment = pdf_dict_get_val(javascript, i);
- pdf_obj *code = pdf_dict_gets(fragment, "JS");
+ pdf_obj *fragment = pdf_dict_get_val(ctx, javascript, i);
+ pdf_obj *code = pdf_dict_gets(ctx, fragment, "JS");
fz_var(codebuf);
fz_try(ctx)
{
- codebuf = pdf_to_utf8(doc, code);
+ codebuf = pdf_to_utf8(ctx, doc, code);
pdf_jsimp_execute(js->imp, codebuf);
}
fz_always(ctx)
@@ -861,7 +865,7 @@ static void pdf_js_load_document_level(pdf_js *js)
}
fz_always(ctx)
{
- pdf_drop_obj(javascript);
+ pdf_drop_obj(ctx, javascript);
}
fz_catch(ctx)
{
@@ -873,7 +877,7 @@ void pdf_js_setup_event(pdf_js *js, pdf_js_event *e)
{
if (js)
{
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
char *ev = e->value ? e->value : "";
char *v = fz_strdup(ctx, ev);
@@ -894,7 +898,7 @@ void pdf_js_execute(pdf_js *js, char *code)
{
if (js)
{
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
fz_try(ctx)
{
pdf_jsimp_execute(js->imp, code);
@@ -909,7 +913,7 @@ void pdf_js_execute_count(pdf_js *js, char *code, int count)
{
if (js)
{
- fz_context *ctx = js->doc->ctx;
+ fz_context *ctx = js->ctx;
fz_try(ctx)
{
pdf_jsimp_execute_count(js->imp, code, count);
@@ -920,23 +924,23 @@ void pdf_js_execute_count(pdf_js *js, char *code, int count)
}
}
-void pdf_enable_js(pdf_document *doc)
+void pdf_enable_js(fz_context *ctx, pdf_document *doc)
{
if (!doc->js) {
- doc->js = pdf_new_js(doc);
+ doc->js = pdf_new_js(ctx, doc);
doc->drop_js = pdf_drop_js;
pdf_js_load_document_level(doc->js);
}
}
-void pdf_disable_js(pdf_document *doc)
+void pdf_disable_js(fz_context *ctx, pdf_document *doc)
{
if (doc->js)
doc->drop_js(doc->js);
doc->js = NULL;
}
-int pdf_js_supported(pdf_document *doc)
+int pdf_js_supported(fz_context *ctx, pdf_document *doc)
{
return doc->js != NULL;
}
diff --git a/source/pdf/js/pdf-jsimp-mu.c b/source/pdf/js/pdf-jsimp-mu.c
index 37a5cc76..2fd918cf 100644
--- a/source/pdf/js/pdf-jsimp-mu.c
+++ b/source/pdf/js/pdf-jsimp-mu.c
@@ -32,7 +32,7 @@ pdf_jsimp *pdf_new_jsimp(fz_context *ctx, void *jsctx)
js_State *J;
pdf_jsimp *imp;
- J = js_newstate(alloc, ctx);
+ J = js_newstate(alloc, ctx, 0);
js_setcontext(J, jsctx);
imp = fz_malloc_struct(ctx, pdf_jsimp);
@@ -184,12 +184,12 @@ void pdf_jsimp_addmethod(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf_j
js_newcfunction(J, wrapmethod, name, 0);
{
js_pushnull(J);
- js_newuserdata(J, "method", meth);
+ js_newuserdata(J, "method", meth, NULL);
js_defproperty(J, -2, "__call", JS_READONLY | JS_DONTENUM | JS_DONTCONF);
js_pushstring(J, (const char *)type);
js_defproperty(J, -2, "__type", JS_READONLY | JS_DONTENUM | JS_DONTCONF);
}
- js_defproperty(J, -2, name, JS_READONLY | JS_DONTENUM | JS_DONTCONF);
+ js_defproperty(J, -2, name, JS_READONLY | JS_DONTCONF);
}
js_pop(J, 1);
}
@@ -202,7 +202,7 @@ void pdf_jsimp_addproperty(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf
js_newcfunction(J, wrapgetter, name, 0);
{
js_pushnull(J);
- js_newuserdata(J, "getter", get);
+ js_newuserdata(J, "getter", get, NULL);
js_defproperty(J, -2, "__get", JS_READONLY | JS_DONTENUM | JS_DONTCONF);
js_pushstring(J, (const char *)type);
js_defproperty(J, -2, "__type", JS_READONLY | JS_DONTENUM | JS_DONTCONF);
@@ -210,12 +210,12 @@ void pdf_jsimp_addproperty(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf
js_newcfunction(J, wrapsetter, name, 0);
{
js_pushnull(J);
- js_newuserdata(J, "setter", set);
+ js_newuserdata(J, "setter", set, NULL);
js_defproperty(J, -2, "__set", JS_READONLY | JS_DONTENUM | JS_DONTCONF);
js_pushstring(J, (const char *)type);
js_defproperty(J, -2, "__type", JS_READONLY | JS_DONTENUM | JS_DONTCONF);
}
- js_defaccessor(J, -3, name, JS_READONLY | JS_DONTENUM | JS_DONTCONF);
+ js_defaccessor(J, -3, name, JS_READONLY | JS_DONTCONF);
}
js_pop(J, 1);
}
@@ -223,17 +223,22 @@ void pdf_jsimp_addproperty(pdf_jsimp *imp, pdf_jsimp_type *type, char *name, pdf
void pdf_jsimp_set_global_type(pdf_jsimp *imp, pdf_jsimp_type *type)
{
js_State *J = imp->J;
+ const char *name;
+
js_getregistry(J, (const char *)type);
- js_setglobal(J, "global");
- js_dostring(J, "Object.getOwnPropertyNames(global).forEach(function(k){this[k]=global[k]}, this)", 0);
- js_dostring(J, "delete global", 0);
+ js_pushiterator(J, -1, 1);
+ while ((name = js_nextiterator(J, -1)))
+ {
+ js_getproperty(J, -2, name);
+ js_setglobal(J, name);
+ }
}
pdf_jsimp_obj *pdf_jsimp_new_obj(pdf_jsimp *imp, pdf_jsimp_type *type, void *natobj)
{
js_State *J = imp->J;
js_getregistry(J, (const char *)type);
- js_newuserdata(J, (const char *)type, natobj);
+ js_newuserdata(J, (const char *)type, natobj, NULL);
return NEWOBJ(J, -1);
}
diff --git a/source/pdf/pdf-annot-edit.c b/source/pdf/pdf-annot-edit.c
index 1e82accb..565e3171 100644
--- a/source/pdf/pdf-annot-edit.c
+++ b/source/pdf/pdf-annot-edit.c
@@ -36,48 +36,47 @@ static const char *annot_type_str(fz_annot_type type)
}
void
-pdf_update_annot(pdf_document *doc, pdf_annot *annot)
+pdf_update_annot(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
pdf_obj *obj, *ap, *as, *n;
- fz_context *ctx = doc->ctx;
if (doc->update_appearance)
- doc->update_appearance(doc, annot);
+ doc->update_appearance(ctx, doc, annot);
obj = annot->obj;
- ap = pdf_dict_gets(obj, "AP");
- as = pdf_dict_gets(obj, "AS");
+ ap = pdf_dict_gets(ctx, obj, "AP");
+ as = pdf_dict_gets(ctx, obj, "AS");
- if (pdf_is_dict(ap))
+ if (pdf_is_dict(ctx, ap))
{
pdf_hotspot *hp = &doc->hotspot;
n = NULL;
- if (hp->num == pdf_to_num(obj)
- && hp->gen == pdf_to_gen(obj)
+ if (hp->num == pdf_to_num(ctx, obj)
+ && hp->gen == pdf_to_gen(ctx, obj)
&& (hp->state & HOTSPOT_POINTER_DOWN))
{
- n = pdf_dict_gets(ap, "D"); /* down state */
+ n = pdf_dict_gets(ctx, ap, "D"); /* down state */
}
if (n == NULL)
- n = pdf_dict_gets(ap, "N"); /* normal state */
+ n = pdf_dict_gets(ctx, ap, "N"); /* normal state */
/* lookup current state in sub-dictionary */
- if (!pdf_is_stream(doc, pdf_to_num(n), pdf_to_gen(n)))
- n = pdf_dict_get(n, as);
+ if (!pdf_is_stream(ctx, doc, pdf_to_num(ctx, n), pdf_to_gen(ctx, n)))
+ n = pdf_dict_get(ctx, n, as);
pdf_drop_xobject(ctx, annot->ap);
annot->ap = NULL;
- if (pdf_is_stream(doc, pdf_to_num(n), pdf_to_gen(n)))
+ if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, n), pdf_to_gen(ctx, n)))
{
fz_try(ctx)
{
- annot->ap = pdf_load_xobject(doc, n);
- pdf_transform_annot(annot);
+ annot->ap = pdf_load_xobject(ctx, doc, n);
+ pdf_transform_annot(ctx, annot);
annot->ap_iteration = annot->ap->iteration;
}
fz_catch(ctx)
@@ -90,11 +89,10 @@ pdf_update_annot(pdf_document *doc, pdf_annot *annot)
}
pdf_annot *
-pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type)
+pdf_create_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_annot_type type)
{
- fz_context *ctx = doc->ctx;
pdf_annot *annot = NULL;
- pdf_obj *annot_obj = pdf_new_dict(doc, 0);
+ pdf_obj *annot_obj = pdf_new_dict(ctx, doc, 0);
pdf_obj *ind_obj = NULL;
fz_var(annot);
@@ -104,20 +102,20 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type)
int ind_obj_num;
fz_rect rect = {0.0, 0.0, 0.0, 0.0};
const char *type_str = annot_type_str(type);
- pdf_obj *annot_arr = pdf_dict_gets(page->me, "Annots");
+ pdf_obj *annot_arr = pdf_dict_gets(ctx, page->me, "Annots");
if (annot_arr == NULL)
{
- annot_arr = pdf_new_array(doc, 0);
- pdf_dict_puts_drop(page->me, "Annots", annot_arr);
+ annot_arr = pdf_new_array(ctx, doc, 0);
+ pdf_dict_puts_drop(ctx, page->me, "Annots", annot_arr);
}
- pdf_dict_puts_drop(annot_obj, "Type", pdf_new_name(doc, "Annot"));
+ pdf_dict_puts_drop(ctx, annot_obj, "Type", pdf_new_name(ctx, doc, "Annot"));
- pdf_dict_puts_drop(annot_obj, "Subtype", pdf_new_name(doc, type_str));
- pdf_dict_puts_drop(annot_obj, "Rect", pdf_new_rect(doc, &rect));
+ pdf_dict_puts_drop(ctx, annot_obj, "Subtype", pdf_new_name(ctx, doc, type_str));
+ pdf_dict_puts_drop(ctx, annot_obj, "Rect", pdf_new_rect(ctx, doc, &rect));
/* Make printable as default */
- pdf_dict_puts_drop(annot_obj, "F", pdf_new_int(doc, F_Print));
+ pdf_dict_puts_drop(ctx, annot_obj, "F", pdf_new_int(ctx, doc, F_Print));
annot = fz_malloc_struct(ctx, pdf_annot);
annot->page = page;
@@ -132,15 +130,15 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type)
Insert the object in the hierarchy and the structure in the
page's array.
*/
- ind_obj_num = pdf_create_object(doc);
- pdf_update_object(doc, ind_obj_num, annot_obj);
- ind_obj = pdf_new_indirect(doc, ind_obj_num, 0);
- pdf_array_push(annot_arr, ind_obj);
- annot->obj = pdf_keep_obj(ind_obj);
+ ind_obj_num = pdf_create_object(ctx, doc);
+ pdf_update_object(ctx, doc, ind_obj_num, annot_obj);
+ ind_obj = pdf_new_indirect(ctx, doc, ind_obj_num, 0);
+ pdf_array_push(ctx, annot_arr, ind_obj);
+ annot->obj = pdf_keep_obj(ctx, ind_obj);
/*
Linking must be done after any call that might throw because
- pdf_free_annot below actually frees a list. Put the new annot
+ pdf_drop_annot below actually frees a list. Put the new annot
at the end of the list, so that it will be drawn last.
*/
*page->annot_tailp = annot;
@@ -150,12 +148,12 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type)
}
fz_always(ctx)
{
- pdf_drop_obj(annot_obj);
- pdf_drop_obj(ind_obj);
+ pdf_drop_obj(ctx, annot_obj);
+ pdf_drop_obj(ctx, ind_obj);
}
fz_catch(ctx)
{
- pdf_free_annot(ctx, annot);
+ pdf_drop_annot(ctx, annot);
fz_rethrow(ctx);
}
@@ -163,9 +161,8 @@ pdf_create_annot(pdf_document *doc, pdf_page *page, fz_annot_type type)
}
void
-pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot)
+pdf_delete_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot)
{
- fz_context *ctx = doc->ctx;
pdf_annot **annotptr;
pdf_obj *old_annot_arr;
pdf_obj *annot_arr;
@@ -197,34 +194,34 @@ pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot)
annot->ap = NULL;
/* Recreate the "Annots" array with this annot removed */
- old_annot_arr = pdf_dict_gets(page->me, "Annots");
+ old_annot_arr = pdf_dict_gets(ctx, page->me, "Annots");
if (old_annot_arr)
{
- int i, n = pdf_array_len(old_annot_arr);
- annot_arr = pdf_new_array(doc, n?(n-1):0);
+ int i, n = pdf_array_len(ctx, old_annot_arr);
+ annot_arr = pdf_new_array(ctx, doc, n?(n-1):0);
fz_try(ctx)
{
for (i = 0; i < n; i++)
{
- pdf_obj *obj = pdf_array_get(old_annot_arr, i);
+ pdf_obj *obj = pdf_array_get(ctx, old_annot_arr, i);
if (obj != annot->obj)
- pdf_array_push(annot_arr, obj);
+ pdf_array_push(ctx, annot_arr, obj);
}
- if (pdf_is_indirect(old_annot_arr))
- pdf_update_object(doc, pdf_to_num(old_annot_arr), annot_arr);
+ if (pdf_is_indirect(ctx, old_annot_arr))
+ pdf_update_object(ctx, doc, pdf_to_num(ctx, old_annot_arr), annot_arr);
else
- pdf_dict_puts(page->me, "Annots", annot_arr);
+ pdf_dict_puts(ctx, page->me, "Annots", annot_arr);
- if (pdf_is_indirect(annot->obj))
- pdf_delete_object(doc, pdf_to_num(annot->obj));
+ if (pdf_is_indirect(ctx, annot->obj))
+ pdf_delete_object(ctx, doc, pdf_to_num(ctx, annot->obj));
}
fz_always(ctx)
{
- pdf_drop_obj(annot_arr);
+ pdf_drop_obj(ctx, annot_arr);
}
fz_catch(ctx)
{
@@ -232,21 +229,21 @@ pdf_delete_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot)
}
}
- pdf_drop_obj(annot->obj);
+ pdf_drop_obj(ctx, annot->obj);
annot->obj = NULL;
doc->dirty = 1;
}
void
-pdf_set_markup_annot_quadpoints(pdf_document *doc, pdf_annot *annot, fz_point *qp, int n)
+pdf_set_markup_annot_quadpoints(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *qp, int n)
{
fz_matrix ctm;
- pdf_obj *arr = pdf_new_array(doc, n*2);
+ pdf_obj *arr = pdf_new_array(ctx, doc, n*2);
int i;
fz_invert_matrix(&ctm, &annot->page->ctm);
- pdf_dict_puts_drop(annot->obj, "QuadPoints", arr);
+ pdf_dict_puts_drop(ctx, annot->obj, "QuadPoints", arr);
for (i = 0; i < n; i++)
{
@@ -254,40 +251,39 @@ pdf_set_markup_annot_quadpoints(pdf_document *doc, pdf_annot *annot, fz_point *q
pdf_obj *r;
fz_transform_point(&pt, &ctm);
- r = pdf_new_real(doc, pt.x);
- pdf_array_push_drop(arr, r);
- r = pdf_new_real(doc, pt.y);
- pdf_array_push_drop(arr, r);
+ r = pdf_new_real(ctx, doc, pt.x);
+ pdf_array_push_drop(ctx, arr, r);
+ r = pdf_new_real(ctx, doc, pt.y);
+ pdf_array_push_drop(ctx, arr, r);
}
}
static void update_rect(fz_context *ctx, pdf_annot *annot)
{
- pdf_to_rect(ctx, pdf_dict_gets(annot->obj, "Rect"), &annot->rect);
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, annot->obj, "Rect"), &annot->rect);
annot->pagerect = annot->rect;
fz_transform_rect(&annot->pagerect, &annot->page->ctm);
}
void
-pdf_set_ink_annot_list(pdf_document *doc, pdf_annot *annot, fz_point *pts, int *counts, int ncount, float color[3], float thickness)
+pdf_set_ink_annot_list(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *pts, int *counts, int ncount, float color[3], float thickness)
{
- fz_context *ctx = doc->ctx;
fz_matrix ctm;
- pdf_obj *list = pdf_new_array(doc, ncount);
+ pdf_obj *list = pdf_new_array(ctx, doc, ncount);
pdf_obj *bs, *col;
fz_rect rect;
int i, k = 0;
fz_invert_matrix(&ctm, &annot->page->ctm);
- pdf_dict_puts_drop(annot->obj, "InkList", list);
+ pdf_dict_puts_drop(ctx, annot->obj, "InkList", list);
for (i = 0; i < ncount; i++)
{
int j;
- pdf_obj *arc = pdf_new_array(doc, counts[i]);
+ pdf_obj *arc = pdf_new_array(ctx, doc, counts[i]);
- pdf_array_push_drop(list, arc);
+ pdf_array_push_drop(ctx, list, arc);
for (j = 0; j < counts[i]; j++)
{
@@ -305,8 +301,8 @@ pdf_set_ink_annot_list(pdf_document *doc, pdf_annot *annot, fz_point *pts, int *
fz_include_point_in_rect(&rect, &pt);
}
- pdf_array_push_drop(arc, pdf_new_real(doc, pt.x));
- pdf_array_push_drop(arc, pdf_new_real(doc, pt.y));
+ pdf_array_push_drop(ctx, arc, pdf_new_real(ctx, doc, pt.x));
+ pdf_array_push_drop(ctx, arc, pdf_new_real(ctx, doc, pt.y));
k++;
}
}
@@ -324,20 +320,20 @@ pdf_set_ink_annot_list(pdf_document *doc, pdf_annot *annot, fz_point *pts, int *
rect.y1 += thickness;
}
- pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(doc, &rect));
+ pdf_dict_puts_drop(ctx, annot->obj, "Rect", pdf_new_rect(ctx, doc, &rect));
update_rect(ctx, annot);
- bs = pdf_new_dict(doc, 1);
- pdf_dict_puts_drop(annot->obj, "BS", bs);
- pdf_dict_puts_drop(bs, "W", pdf_new_real(doc, thickness));
+ bs = pdf_new_dict(ctx, doc, 1);
+ pdf_dict_puts_drop(ctx, annot->obj, "BS", bs);
+ pdf_dict_puts_drop(ctx, bs, "W", pdf_new_real(ctx, doc, thickness));
- col = pdf_new_array(doc, 3);
- pdf_dict_puts_drop(annot->obj, "C", col);
+ col = pdf_new_array(ctx, doc, 3);
+ pdf_dict_puts_drop(ctx, annot->obj, "C", col);
for (i = 0; i < 3; i++)
- pdf_array_push_drop(col, pdf_new_real(doc, color[i]));
+ pdf_array_push_drop(ctx, col, pdf_new_real(ctx, doc, color[i]));
}
-static void find_free_font_name(pdf_obj *fdict, char *buf, int buf_size)
+static void find_free_font_name(fz_context *ctx, pdf_obj *fdict, char *buf, int buf_size)
{
int i;
@@ -346,12 +342,12 @@ static void find_free_font_name(pdf_obj *fdict, char *buf, int buf_size)
{
snprintf(buf, buf_size, "F%d", i);
- if (!pdf_dict_gets(fdict, buf))
+ if (!pdf_dict_gets(ctx, fdict, buf))
break;
}
}
-void pdf_set_text_annot_position(pdf_document *doc, pdf_annot *annot, fz_point pt)
+void pdf_set_text_annot_position(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point pt)
{
fz_matrix ctm;
fz_rect rect;
@@ -364,28 +360,27 @@ void pdf_set_text_annot_position(pdf_document *doc, pdf_annot *annot, fz_point p
rect.y1 = pt.y + TEXT_ANNOT_SIZE;
fz_transform_rect(&rect, &ctm);
- pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(doc, &rect));
+ pdf_dict_puts_drop(ctx, annot->obj, "Rect", pdf_new_rect(ctx, doc, &rect));
- flags = pdf_to_int(pdf_dict_gets(annot->obj, "F"));
+ flags = pdf_to_int(ctx, pdf_dict_gets(ctx, annot->obj, "F"));
flags |= (F_NoZoom|F_NoRotate);
- pdf_dict_puts_drop(annot->obj, "F", pdf_new_int(doc, flags));
+ pdf_dict_puts_drop(ctx, annot->obj, "F", pdf_new_int(ctx, doc, flags));
- update_rect(doc->ctx, annot);
+ update_rect(ctx, annot);
}
-void pdf_set_annot_contents(pdf_document *doc, pdf_annot *annot, char *text)
+void pdf_set_annot_contents(fz_context *ctx, pdf_document *doc, pdf_annot *annot, char *text)
{
- pdf_dict_puts_drop(annot->obj, "Contents", pdf_new_string(doc, text, strlen(text)));
+ pdf_dict_puts_drop(ctx, annot->obj, "Contents", pdf_new_string(ctx, doc, text, strlen(text)));
}
-char *pdf_annot_contents(pdf_document *doc, pdf_annot *annot)
+char *pdf_annot_contents(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
- return pdf_to_str_buf(pdf_dict_getp(annot->obj, "Contents"));
+ return pdf_to_str_buf(ctx, pdf_dict_getp(ctx, annot->obj, "Contents"));
}
-void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *pos, char *text, char *font_name, float font_size, float color[3])
+void pdf_set_free_text_details(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_point *pos, char *text, char *font_name, float font_size, float color[3])
{
- fz_context *ctx = doc->ctx;
char nbuf[32];
pdf_obj *dr;
pdf_obj *form_fonts;
@@ -399,19 +394,19 @@ void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *po
fz_invert_matrix(&ctm, &annot->page->ctm);
- dr = pdf_dict_gets(annot->page->me, "Resources");
+ dr = pdf_dict_gets(ctx, annot->page->me, "Resources");
if (!dr)
{
- dr = pdf_new_dict(doc, 1);
- pdf_dict_putp_drop(annot->page->me, "Resources", dr);
+ dr = pdf_new_dict(ctx, doc, 1);
+ pdf_dict_putp_drop(ctx, annot->page->me, "Resources", dr);
}
/* Ensure the resource dictionary includes a font dict */
- form_fonts = pdf_dict_gets(dr, "Font");
+ form_fonts = pdf_dict_gets(ctx, dr, "Font");
if (!form_fonts)
{
- form_fonts = pdf_new_dict(doc, 1);
- pdf_dict_puts_drop(dr, "Font", form_fonts);
+ form_fonts = pdf_new_dict(ctx, doc, 1);
+ pdf_dict_puts_drop(ctx, dr, "Font", form_fonts);
/* form_fonts is still valid if execution continues past the above call */
}
@@ -423,16 +418,16 @@ void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *po
int da_len;
fz_rect bounds;
- find_free_font_name(form_fonts, nbuf, sizeof(nbuf));
+ find_free_font_name(ctx, form_fonts, nbuf, sizeof(nbuf));
- font = pdf_new_dict(doc, 5);
- ref = pdf_new_ref(doc, font);
- pdf_dict_puts_drop(form_fonts, nbuf, ref);
+ font = pdf_new_dict(ctx, doc, 5);
+ ref = pdf_new_ref(ctx, doc, font);
+ pdf_dict_puts_drop(ctx, form_fonts, nbuf, ref);
- pdf_dict_puts_drop(font, "Type", pdf_new_name(doc, "Font"));
- pdf_dict_puts_drop(font, "Subtype", pdf_new_name(doc, "Type1"));
- pdf_dict_puts_drop(font, "BaseFont", pdf_new_name(doc, font_name));
- pdf_dict_puts_drop(font, "Encoding", pdf_new_name(doc, "WinAnsiEncoding"));
+ pdf_dict_puts_drop(ctx, font, "Type", pdf_new_name(ctx, doc, "Font"));
+ pdf_dict_puts_drop(ctx, font, "Subtype", pdf_new_name(ctx, doc, "Type1"));
+ pdf_dict_puts_drop(ctx, font, "BaseFont", pdf_new_name(ctx, doc, font_name));
+ pdf_dict_puts_drop(ctx, font, "Encoding", pdf_new_name(ctx, doc, "WinAnsiEncoding"));
memcpy(da_info.col, color, sizeof(float)*3);
da_info.col_size = 3;
@@ -443,12 +438,12 @@ void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *po
pdf_fzbuf_print_da(ctx, fzbuf, &da_info);
da_len = fz_buffer_storage(ctx, fzbuf, &da_str);
- pdf_dict_puts_drop(annot->obj, "DA", pdf_new_string(doc, (char *)da_str, da_len));
+ pdf_dict_puts_drop(ctx, annot->obj, "DA", pdf_new_string(ctx, doc, (char *)da_str, da_len));
/* FIXME: should convert to WinAnsiEncoding */
- pdf_dict_puts_drop(annot->obj, "Contents", pdf_new_string(doc, text, strlen(text)));
+ pdf_dict_puts_drop(ctx, annot->obj, "Contents", pdf_new_string(ctx, doc, text, strlen(text)));
- font_desc = pdf_load_font(doc, NULL, font, 0);
+ font_desc = pdf_load_font(ctx, doc, NULL, font, 0);
pdf_measure_text(ctx, font_desc, (unsigned char *)text, strlen(text), &bounds);
page_pos = *pos;
@@ -464,12 +459,12 @@ void pdf_set_free_text_details(pdf_document *doc, pdf_annot *annot, fz_point *po
bounds.y0 += page_pos.y;
bounds.y1 += page_pos.y;
- pdf_dict_puts_drop(annot->obj, "Rect", pdf_new_rect(doc, &bounds));
+ pdf_dict_puts_drop(ctx, annot->obj, "Rect", pdf_new_rect(ctx, doc, &bounds));
update_rect(ctx, annot);
}
fz_always(ctx)
{
- pdf_drop_obj(font);
+ pdf_drop_obj(ctx, font);
fz_drop_buffer(ctx, fzbuf);
pdf_drop_font(ctx, font_desc);
}
diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c
index 6b786985..b25c24df 100644
--- a/source/pdf/pdf-annot.c
+++ b/source/pdf/pdf-annot.c
@@ -1,47 +1,47 @@
#include "mupdf/pdf.h"
static pdf_obj *
-resolve_dest_rec(pdf_document *doc, pdf_obj *dest, fz_link_kind kind, int depth)
+resolve_dest_rec(fz_context *ctx, pdf_document *doc, pdf_obj *dest, fz_link_kind kind, int depth)
{
if (depth > 10) /* Arbitrary to avoid infinite recursion */
return NULL;
- if (pdf_is_name(dest) || pdf_is_string(dest))
+ if (pdf_is_name(ctx, dest) || pdf_is_string(ctx, dest))
{
if (kind == FZ_LINK_GOTO)
{
- dest = pdf_lookup_dest(doc, dest);
- dest = resolve_dest_rec(doc, dest, kind, depth+1);
+ dest = pdf_lookup_dest(ctx, doc, dest);
+ dest = resolve_dest_rec(ctx, doc, dest, kind, depth+1);
}
return dest;
}
- else if (pdf_is_array(dest))
+ else if (pdf_is_array(ctx, dest))
{
return dest;
}
- else if (pdf_is_dict(dest))
+ else if (pdf_is_dict(ctx, dest))
{
- dest = pdf_dict_gets(dest, "D");
- return resolve_dest_rec(doc, dest, kind, depth+1);
+ dest = pdf_dict_gets(ctx, dest, "D");
+ return resolve_dest_rec(ctx, doc, dest, kind, depth+1);
}
- else if (pdf_is_indirect(dest))
+ else if (pdf_is_indirect(ctx, dest))
return dest;
return NULL;
}
static pdf_obj *
-resolve_dest(pdf_document *doc, pdf_obj *dest, fz_link_kind kind)
+resolve_dest(fz_context *ctx, pdf_document *doc, pdf_obj *dest, fz_link_kind kind)
{
- return resolve_dest_rec(doc, dest, kind, 0);
+ return resolve_dest_rec(ctx, doc, dest, kind, 0);
}
fz_link_dest
-pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest)
+pdf_parse_link_dest(fz_context *ctx, pdf_document *doc, fz_link_kind kind, pdf_obj *dest)
{
fz_link_dest ld;
pdf_obj *obj;
@@ -63,65 +63,65 @@ pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest)
ld.ld.gotor.page = -1;
ld.ld.gotor.dest = NULL;
- dest = resolve_dest(doc, dest, kind);
+ dest = resolve_dest(ctx, doc, dest, kind);
if (dest == NULL)
{
- fz_warn(doc->ctx, "undefined link destination");
+ fz_warn(ctx, "undefined link destination");
return ld;
}
- if (pdf_is_name(dest))
+ if (pdf_is_name(ctx, dest))
{
- ld.ld.gotor.dest = pdf_to_name(dest);
+ ld.ld.gotor.dest = pdf_to_name(ctx, dest);
return ld;
}
- else if (pdf_is_string(dest))
+ else if (pdf_is_string(ctx, dest))
{
- ld.ld.gotor.dest = pdf_to_str_buf(dest);
+ ld.ld.gotor.dest = pdf_to_str_buf(ctx, dest);
return ld;
}
- obj = pdf_array_get(dest, 0);
- if (pdf_is_int(obj))
- ld.ld.gotor.page = pdf_to_int(obj);
+ obj = pdf_array_get(ctx, dest, 0);
+ if (pdf_is_int(ctx, obj))
+ ld.ld.gotor.page = pdf_to_int(ctx, obj);
else
{
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- ld.ld.gotor.page = pdf_lookup_page_number(doc, obj);
+ ld.ld.gotor.page = pdf_lookup_page_number(ctx, doc, obj);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
ld.kind = FZ_LINK_NONE;
return ld;
}
}
- obj = pdf_array_get(dest, 1);
- if (!pdf_is_name(obj))
+ obj = pdf_array_get(ctx, dest, 1);
+ if (!pdf_is_name(ctx, obj))
return ld;
- if (!strcmp("XYZ", pdf_to_name(obj)))
+ if (!strcmp("XYZ", pdf_to_name(ctx, obj)))
{
l_from_2 = t_from_3 = z_from_4 = 1;
ld.ld.gotor.flags |= fz_link_flag_r_is_zoom;
}
- else if ((!strcmp("Fit", pdf_to_name(obj))) || (!strcmp("FitB", pdf_to_name(obj))))
+ else if ((!strcmp("Fit", pdf_to_name(ctx, obj))) || (!strcmp("FitB", pdf_to_name(ctx, obj))))
{
ld.ld.gotor.flags |= fz_link_flag_fit_h;
ld.ld.gotor.flags |= fz_link_flag_fit_v;
}
- else if ((!strcmp("FitH", pdf_to_name(obj))) || (!strcmp("FitBH", pdf_to_name(obj))))
+ else if ((!strcmp("FitH", pdf_to_name(ctx, obj))) || (!strcmp("FitBH", pdf_to_name(ctx, obj))))
{
t_from_2 = 1;
ld.ld.gotor.flags |= fz_link_flag_fit_h;
}
- else if ((!strcmp("FitV", pdf_to_name(obj))) || (!strcmp("FitBV", pdf_to_name(obj))))
+ else if ((!strcmp("FitV", pdf_to_name(ctx, obj))) || (!strcmp("FitBV", pdf_to_name(ctx, obj))))
{
l_from_2 = 1;
ld.ld.gotor.flags |= fz_link_flag_fit_v;
}
- else if (!strcmp("FitR", pdf_to_name(obj)))
+ else if (!strcmp("FitR", pdf_to_name(ctx, obj)))
{
l_from_2 = b_from_3 = r_from_4 = t_from_5 = 1;
ld.ld.gotor.flags |= fz_link_flag_fit_h;
@@ -130,77 +130,77 @@ pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest)
if (l_from_2)
{
- obj = pdf_array_get(dest, 2);
- if (pdf_is_int(obj))
+ obj = pdf_array_get(ctx, dest, 2);
+ if (pdf_is_int(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_l_valid;
- ld.ld.gotor.lt.x = pdf_to_int(obj);
+ ld.ld.gotor.lt.x = pdf_to_int(ctx, obj);
}
- else if (pdf_is_real(obj))
+ else if (pdf_is_real(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_l_valid;
- ld.ld.gotor.lt.x = pdf_to_real(obj);
+ ld.ld.gotor.lt.x = pdf_to_real(ctx, obj);
}
}
if (b_from_3)
{
- obj = pdf_array_get(dest, 3);
- if (pdf_is_int(obj))
+ obj = pdf_array_get(ctx, dest, 3);
+ if (pdf_is_int(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_b_valid;
- ld.ld.gotor.rb.y = pdf_to_int(obj);
+ ld.ld.gotor.rb.y = pdf_to_int(ctx, obj);
}
- else if (pdf_is_real(obj))
+ else if (pdf_is_real(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_b_valid;
- ld.ld.gotor.rb.y = pdf_to_real(obj);
+ ld.ld.gotor.rb.y = pdf_to_real(ctx, obj);
}
}
if (r_from_4)
{
- obj = pdf_array_get(dest, 4);
- if (pdf_is_int(obj))
+ obj = pdf_array_get(ctx, dest, 4);
+ if (pdf_is_int(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_r_valid;
- ld.ld.gotor.rb.x = pdf_to_int(obj);
+ ld.ld.gotor.rb.x = pdf_to_int(ctx, obj);
}
- else if (pdf_is_real(obj))
+ else if (pdf_is_real(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_r_valid;
- ld.ld.gotor.rb.x = pdf_to_real(obj);
+ ld.ld.gotor.rb.x = pdf_to_real(ctx, obj);
}
}
if (t_from_5 || t_from_3 || t_from_2)
{
if (t_from_5)
- obj = pdf_array_get(dest, 5);
+ obj = pdf_array_get(ctx, dest, 5);
else if (t_from_3)
- obj = pdf_array_get(dest, 3);
+ obj = pdf_array_get(ctx, dest, 3);
else
- obj = pdf_array_get(dest, 2);
- if (pdf_is_int(obj))
+ obj = pdf_array_get(ctx, dest, 2);
+ if (pdf_is_int(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_t_valid;
- ld.ld.gotor.lt.y = pdf_to_int(obj);
+ ld.ld.gotor.lt.y = pdf_to_int(ctx, obj);
}
- else if (pdf_is_real(obj))
+ else if (pdf_is_real(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_t_valid;
- ld.ld.gotor.lt.y = pdf_to_real(obj);
+ ld.ld.gotor.lt.y = pdf_to_real(ctx, obj);
}
}
if (z_from_4)
{
- obj = pdf_array_get(dest, 4);
- if (pdf_is_int(obj))
+ obj = pdf_array_get(ctx, dest, 4);
+ if (pdf_is_int(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_r_valid;
- ld.ld.gotor.rb.x = pdf_to_int(obj);
+ ld.ld.gotor.rb.x = pdf_to_int(ctx, obj);
}
- else if (pdf_is_real(obj))
+ else if (pdf_is_real(ctx, obj))
{
ld.ld.gotor.flags |= fz_link_flag_r_valid;
- ld.ld.gotor.rb.x = pdf_to_real(obj);
+ ld.ld.gotor.rb.x = pdf_to_real(ctx, obj);
}
}
@@ -218,26 +218,25 @@ pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest)
}
static char *
-pdf_parse_file_spec(pdf_document *doc, pdf_obj *file_spec)
+pdf_parse_file_spec(fz_context *ctx, pdf_document *doc, pdf_obj *file_spec)
{
- fz_context *ctx = doc->ctx;
pdf_obj *filename;
- if (pdf_is_string(file_spec))
- return pdf_to_utf8(doc, file_spec);
+ if (pdf_is_string(ctx, file_spec))
+ return pdf_to_utf8(ctx, doc, file_spec);
- if (pdf_is_dict(file_spec)) {
- filename = pdf_dict_gets(file_spec, "UF");
+ if (pdf_is_dict(ctx, file_spec)) {
+ filename = pdf_dict_gets(ctx, file_spec, "UF");
if (!filename)
- filename = pdf_dict_gets(file_spec, "F");
+ filename = pdf_dict_gets(ctx, file_spec, "F");
if (!filename)
- filename = pdf_dict_gets(file_spec, "Unix");
+ filename = pdf_dict_gets(ctx, file_spec, "Unix");
if (!filename)
- filename = pdf_dict_gets(file_spec, "Mac");
+ filename = pdf_dict_gets(ctx, file_spec, "Mac");
if (!filename)
- filename = pdf_dict_gets(file_spec, "DOS");
+ filename = pdf_dict_gets(ctx, file_spec, "DOS");
- return pdf_to_utf8(doc, filename);
+ return pdf_to_utf8(ctx, doc, filename);
}
fz_warn(ctx, "cannot parse file specification");
@@ -245,65 +244,61 @@ pdf_parse_file_spec(pdf_document *doc, pdf_obj *file_spec)
}
fz_link_dest
-pdf_parse_action(pdf_document *doc, pdf_obj *action)
+pdf_parse_action(fz_context *ctx, pdf_document *doc, pdf_obj *action)
{
fz_link_dest ld;
pdf_obj *obj, *dest, *file_spec;
- fz_context *ctx = doc->ctx;
-
- UNUSED(ctx);
ld.kind = FZ_LINK_NONE;
if (!action)
return ld;
- obj = pdf_dict_gets(action, "S");
- if (!strcmp(pdf_to_name(obj), "GoTo"))
+ obj = pdf_dict_gets(ctx, action, "S");
+ if (!strcmp(pdf_to_name(ctx, obj), "GoTo"))
{
- dest = pdf_dict_gets(action, "D");
- ld = pdf_parse_link_dest(doc, FZ_LINK_GOTO, dest);
+ dest = pdf_dict_gets(ctx, action, "D");
+ ld = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTO, dest);
}
- else if (!strcmp(pdf_to_name(obj), "URI"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "URI"))
{
ld.kind = FZ_LINK_URI;
- ld.ld.uri.is_map = pdf_to_bool(pdf_dict_gets(action, "IsMap"));
- ld.ld.uri.uri = pdf_to_utf8(doc, pdf_dict_gets(action, "URI"));
+ ld.ld.uri.is_map = pdf_to_bool(ctx, pdf_dict_gets(ctx, action, "IsMap"));
+ ld.ld.uri.uri = pdf_to_utf8(ctx, doc, pdf_dict_gets(ctx, action, "URI"));
}
- else if (!strcmp(pdf_to_name(obj), "Launch"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "Launch"))
{
ld.kind = FZ_LINK_LAUNCH;
- file_spec = pdf_dict_gets(action, "F");
- ld.ld.launch.file_spec = pdf_parse_file_spec(doc, file_spec);
- ld.ld.launch.new_window = pdf_to_int(pdf_dict_gets(action, "NewWindow"));
- ld.ld.launch.is_uri = !strcmp(pdf_to_name(pdf_dict_gets(file_spec, "FS")), "URL");
+ file_spec = pdf_dict_gets(ctx, action, "F");
+ ld.ld.launch.file_spec = pdf_parse_file_spec(ctx, doc, file_spec);
+ ld.ld.launch.new_window = pdf_to_int(ctx, pdf_dict_gets(ctx, action, "NewWindow"));
+ ld.ld.launch.is_uri = !strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, file_spec, "FS")), "URL");
}
- else if (!strcmp(pdf_to_name(obj), "Named"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "Named"))
{
ld.kind = FZ_LINK_NAMED;
- ld.ld.named.named = fz_strdup(ctx, pdf_to_name(pdf_dict_gets(action, "N")));
+ ld.ld.named.named = fz_strdup(ctx, pdf_to_name(ctx, pdf_dict_gets(ctx, action, "N")));
}
- else if (!strcmp(pdf_to_name(obj), "GoToR"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "GoToR"))
{
- dest = pdf_dict_gets(action, "D");
- file_spec = pdf_dict_gets(action, "F");
- ld = pdf_parse_link_dest(doc, FZ_LINK_GOTOR, dest);
- ld.ld.gotor.file_spec = pdf_parse_file_spec(doc, file_spec);
- ld.ld.gotor.new_window = pdf_to_int(pdf_dict_gets(action, "NewWindow"));
+ dest = pdf_dict_gets(ctx, action, "D");
+ file_spec = pdf_dict_gets(ctx, action, "F");
+ ld = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTOR, dest);
+ ld.ld.gotor.file_spec = pdf_parse_file_spec(ctx, doc, file_spec);
+ ld.ld.gotor.new_window = pdf_to_int(ctx, pdf_dict_gets(ctx, action, "NewWindow"));
}
return ld;
}
static fz_link *
-pdf_load_link(pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm)
+pdf_load_link(fz_context *ctx, pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm)
{
pdf_obj *action;
pdf_obj *obj;
fz_rect bbox;
- fz_context *ctx = doc->ctx;
fz_link_dest ld;
- obj = pdf_dict_gets(dict, "Rect");
+ obj = pdf_dict_gets(ctx, dict, "Rect");
if (obj)
pdf_to_rect(ctx, obj, &bbox);
else
@@ -311,17 +306,17 @@ pdf_load_link(pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm)
fz_transform_rect(&bbox, page_ctm);
- obj = pdf_dict_gets(dict, "Dest");
+ obj = pdf_dict_gets(ctx, dict, "Dest");
if (obj)
- ld = pdf_parse_link_dest(doc, FZ_LINK_GOTO, obj);
+ ld = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTO, obj);
else
{
- action = pdf_dict_gets(dict, "A");
+ action = pdf_dict_gets(ctx, dict, "A");
/* fall back to additional action button's down/up action */
if (!action)
- action = pdf_dict_getsa(pdf_dict_gets(dict, "AA"), "U", "D");
+ action = pdf_dict_getsa(ctx, pdf_dict_gets(ctx, dict, "AA"), "U", "D");
- ld = pdf_parse_action(doc, action);
+ ld = pdf_parse_action(ctx, doc, action);
}
if (ld.kind == FZ_LINK_NONE)
return NULL;
@@ -329,7 +324,7 @@ pdf_load_link(pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm)
}
fz_link *
-pdf_load_link_annots(pdf_document *doc, pdf_obj *annots, const fz_matrix *page_ctm)
+pdf_load_link_annots(fz_context *ctx, pdf_document *doc, pdf_obj *annots, const fz_matrix *page_ctm)
{
fz_link *link, *head, *tail;
pdf_obj *obj;
@@ -338,18 +333,18 @@ pdf_load_link_annots(pdf_document *doc, pdf_obj *annots, const fz_matrix *page_c
head = tail = NULL;
link = NULL;
- n = pdf_array_len(annots);
+ n = pdf_array_len(ctx, annots);
for (i = 0; i < n; i++)
{
/* FIXME: Move the try/catch out of the loop for performance? */
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- obj = pdf_array_get(annots, i);
- link = pdf_load_link(doc, obj, page_ctm);
+ obj = pdf_array_get(ctx, annots, i);
+ link = pdf_load_link(ctx, doc, obj, page_ctm);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
link = NULL;
}
@@ -369,7 +364,7 @@ pdf_load_link_annots(pdf_document *doc, pdf_obj *annots, const fz_matrix *page_c
}
void
-pdf_free_annot(fz_context *ctx, pdf_annot *annot)
+pdf_drop_annot(fz_context *ctx, pdf_annot *annot)
{
pdf_annot *next;
@@ -378,14 +373,14 @@ pdf_free_annot(fz_context *ctx, pdf_annot *annot)
next = annot->next;
if (annot->ap)
pdf_drop_xobject(ctx, annot->ap);
- pdf_drop_obj(annot->obj);
+ pdf_drop_obj(ctx, annot->obj);
fz_free(ctx, annot);
annot = next;
}
}
void
-pdf_transform_annot(pdf_annot *annot)
+pdf_transform_annot(fz_context *ctx, pdf_annot *annot)
{
fz_rect bbox = annot->ap->bbox;
fz_rect rect = annot->rect;
@@ -406,9 +401,9 @@ pdf_transform_annot(pdf_annot *annot)
fz_pre_scale(fz_translate(&annot->matrix, x, y), w, h);
}
-fz_annot_type pdf_annot_obj_type(pdf_obj *obj)
+fz_annot_type pdf_annot_obj_type(fz_context *ctx, pdf_obj *obj)
{
- char *subtype = pdf_to_name(pdf_dict_gets(obj, "Subtype"));
+ char *subtype = pdf_to_name(ctx, pdf_dict_gets(ctx, obj, "Subtype"));
if (!strcmp(subtype, "Text"))
return FZ_ANNOT_TEXT;
else if (!strcmp(subtype, "Link"))
@@ -464,12 +459,11 @@ fz_annot_type pdf_annot_obj_type(pdf_obj *obj)
}
void
-pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
+pdf_load_annots(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_obj *annots)
{
pdf_annot *annot, **itr;
pdf_obj *obj, *ap, *as, *n, *rect;
int i, len, keep_annot;
- fz_context *ctx = doc->ctx;
fz_var(annot);
fz_var(itr);
@@ -477,7 +471,7 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
itr = &page->annots;
- len = pdf_array_len(annots);
+ len = pdf_array_len(ctx, annots);
/*
Create an initial linked list of pdf_annot structures with only the obj field
filled in. We do this because update_appearance has the potential to change
@@ -488,9 +482,9 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
{
for (i = 0; i < len; i++)
{
- obj = pdf_array_get(annots, i);
+ obj = pdf_array_get(ctx, annots, i);
annot = fz_malloc_struct(ctx, pdf_annot);
- annot->obj = pdf_keep_obj(obj);
+ annot->obj = pdf_keep_obj(ctx, obj);
annot->page = page;
annot->next = NULL;
@@ -500,7 +494,7 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
}
fz_catch(ctx)
{
- pdf_free_annot(ctx, page->annots);
+ pdf_drop_annot(ctx, page->annots);
page->annots = NULL;
fz_rethrow(ctx);
}
@@ -521,45 +515,45 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
n = NULL;
if (doc->update_appearance)
- doc->update_appearance(doc, annot);
+ doc->update_appearance(ctx, doc, annot);
obj = annot->obj;
- rect = pdf_dict_gets(obj, "Rect");
- ap = pdf_dict_gets(obj, "AP");
- as = pdf_dict_gets(obj, "AS");
+ rect = pdf_dict_gets(ctx, obj, "Rect");
+ ap = pdf_dict_gets(ctx, obj, "AP");
+ as = pdf_dict_gets(ctx, obj, "AS");
/* We only collect annotations with an appearance
* stream into this list, so remove any that don't
* (such as links) and continue. */
- keep_annot = pdf_is_dict(ap);
+ keep_annot = pdf_is_dict(ctx, ap);
if (!keep_annot)
break;
- if (hp->num == pdf_to_num(obj)
- && hp->gen == pdf_to_gen(obj)
+ if (hp->num == pdf_to_num(ctx, obj)
+ && hp->gen == pdf_to_gen(ctx, obj)
&& (hp->state & HOTSPOT_POINTER_DOWN))
{
- n = pdf_dict_gets(ap, "D"); /* down state */
+ n = pdf_dict_gets(ctx, ap, "D"); /* down state */
}
if (n == NULL)
- n = pdf_dict_gets(ap, "N"); /* normal state */
+ n = pdf_dict_gets(ctx, ap, "N"); /* normal state */
/* lookup current state in sub-dictionary */
- if (!pdf_is_stream(doc, pdf_to_num(n), pdf_to_gen(n)))
- n = pdf_dict_get(n, as);
+ if (!pdf_is_stream(ctx, doc, pdf_to_num(ctx, n), pdf_to_gen(ctx, n)))
+ n = pdf_dict_get(ctx, n, as);
pdf_to_rect(ctx, rect, &annot->rect);
annot->pagerect = annot->rect;
fz_transform_rect(&annot->pagerect, &page->ctm);
annot->ap = NULL;
- annot->annot_type = pdf_annot_obj_type(obj);
- annot->widget_type = annot->annot_type == FZ_ANNOT_WIDGET ? pdf_field_type(doc, obj) : PDF_WIDGET_TYPE_NOT_WIDGET;
+ annot->annot_type = pdf_annot_obj_type(ctx, obj);
+ annot->widget_type = annot->annot_type == FZ_ANNOT_WIDGET ? pdf_field_type(ctx, doc, obj) : PDF_WIDGET_TYPE_NOT_WIDGET;
- if (pdf_is_stream(doc, pdf_to_num(n), pdf_to_gen(n)))
+ if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, n), pdf_to_gen(ctx, n)))
{
- annot->ap = pdf_load_xobject(doc, n);
- pdf_transform_annot(annot);
+ annot->ap = pdf_load_xobject(ctx, doc, n);
+ pdf_transform_annot(ctx, annot);
annot->ap_iteration = annot->ap->iteration;
}
@@ -573,7 +567,7 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
{
if (fz_caught(ctx) == FZ_ERROR_TRYLATER)
{
- pdf_free_annot(ctx, page->annots);
+ pdf_drop_annot(ctx, page->annots);
page->annots = NULL;
fz_rethrow(ctx);
}
@@ -584,8 +578,8 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
{
/* Move to next item in the linked list, dropping this one */
*itr = annot->next;
- annot->next = NULL; /* Required because pdf_free_annot follows the "next" chain */
- pdf_free_annot(ctx, annot);
+ annot->next = NULL; /* Required because pdf_drop_annot follows the "next" chain */
+ pdf_drop_annot(ctx, annot);
}
}
@@ -593,19 +587,19 @@ pdf_load_annots(pdf_document *doc, pdf_page *page, pdf_obj *annots)
}
pdf_annot *
-pdf_first_annot(pdf_document *doc, pdf_page *page)
+pdf_first_annot(fz_context *ctx, pdf_page *page)
{
return page ? page->annots : NULL;
}
pdf_annot *
-pdf_next_annot(pdf_document *doc, pdf_annot *annot)
+pdf_next_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot)
{
return annot ? annot->next : NULL;
}
fz_rect *
-pdf_bound_annot(pdf_document *doc, pdf_annot *annot, fz_rect *rect)
+pdf_bound_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot, fz_rect *rect)
{
if (rect == NULL)
return NULL;
@@ -618,7 +612,7 @@ pdf_bound_annot(pdf_document *doc, pdf_annot *annot, fz_rect *rect)
}
fz_annot_type
-pdf_annot_type(pdf_annot *annot)
+pdf_annot_type(fz_context *ctx, pdf_annot *annot)
{
return annot->annot_type;
}
diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c
index db11c32a..ce9bdb1f 100644
--- a/source/pdf/pdf-appearance.c
+++ b/source/pdf/pdf-appearance.c
@@ -93,7 +93,7 @@ void pdf_parse_da(fz_context *ctx, char *da, pdf_da_info *di)
fz_var(name);
fz_try(ctx)
{
- for (tok = pdf_lex(str, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str, &lbuf))
+ for (tok = pdf_lex(ctx, str, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str, &lbuf))
{
switch (tok)
{
@@ -147,8 +147,8 @@ void pdf_parse_da(fz_context *ctx, char *da, pdf_da_info *di)
fz_always(ctx)
{
fz_free(ctx, name);
- fz_close(str);
- pdf_lexbuf_fin(&lbuf);
+ fz_drop_stream(ctx, str);
+ pdf_lexbuf_fin(ctx, &lbuf);
}
fz_catch(ctx)
{
@@ -156,16 +156,15 @@ void pdf_parse_da(fz_context *ctx, char *da, pdf_da_info *di)
}
}
-static void get_font_info(pdf_document *doc, pdf_obj *dr, char *da, font_info *font_rec)
+static void get_font_info(fz_context *ctx, pdf_document *doc, pdf_obj *dr, char *da, font_info *font_rec)
{
- fz_context *ctx = doc->ctx;
pdf_font_desc *font;
pdf_parse_da(ctx, da, &font_rec->da_rec);
if (font_rec->da_rec.font_name == NULL)
fz_throw(ctx, FZ_ERROR_GENERIC, "No font name in default appearance");
- font_rec->font = font = pdf_load_font(doc, dr, pdf_dict_gets(pdf_dict_gets(dr, "Font"), font_rec->da_rec.font_name), 0);
+ font_rec->font = font = pdf_load_font(ctx, doc, dr, pdf_dict_gets(ctx, pdf_dict_gets(ctx, dr, "Font"), font_rec->da_rec.font_name), 0);
font_rec->lineheight = 1.0;
if (font && font->ascent != 0.0f && font->descent != 0.0f)
font_rec->lineheight = (font->ascent - font->descent) / 1000.0;
@@ -178,24 +177,24 @@ static void font_info_fin(fz_context *ctx, font_info *font_rec)
pdf_da_info_fin(ctx, &font_rec->da_rec);
}
-static void get_text_widget_info(pdf_document *doc, pdf_obj *widget, text_widget_info *info)
+static void get_text_widget_info(fz_context *ctx, pdf_document *doc, pdf_obj *widget, text_widget_info *info)
{
- char *da = pdf_to_str_buf(pdf_get_inheritable(doc, widget, "DA"));
- int ff = pdf_get_field_flags(doc, widget);
- pdf_obj *ml = pdf_get_inheritable(doc, widget, "MaxLen");
+ char *da = pdf_to_str_buf(ctx, pdf_get_inheritable(ctx, doc, widget, "DA"));
+ int ff = pdf_get_field_flags(ctx, doc, widget);
+ pdf_obj *ml = pdf_get_inheritable(ctx, doc, widget, "MaxLen");
- info->dr = pdf_get_inheritable(doc, widget, "DR");
- info->col = pdf_dict_getp(widget, "MK/BG");
- info->q = pdf_to_int(pdf_get_inheritable(doc, widget, "Q"));
+ info->dr = pdf_get_inheritable(ctx, doc, widget, "DR");
+ info->col = pdf_dict_getp(ctx, widget, "MK/BG");
+ info->q = pdf_to_int(ctx, pdf_get_inheritable(ctx, doc, widget, "Q"));
info->multiline = (ff & Ff_Multiline) != 0;
info->comb = (ff & (Ff_Multiline|Ff_Password|Ff_FileSelect|Ff_Comb)) == Ff_Comb;
if (ml == NULL)
info->comb = 0;
else
- info->max_len = pdf_to_int(ml);
+ info->max_len = pdf_to_int(ctx, ml);
- get_font_info(doc, info->dr, da, &info->font_rec);
+ get_font_info(ctx, doc, info->dr, da, &info->font_rec);
}
void pdf_fzbuf_print_da(fz_context *ctx, fz_buffer *fzbuf, pdf_da_info *di)
@@ -223,9 +222,9 @@ void pdf_fzbuf_print_da(fz_context *ctx, fz_buffer *fzbuf, pdf_da_info *di)
}
}
-static fz_rect *measure_text(pdf_document *doc, font_info *font_rec, const fz_matrix *tm, char *text, fz_rect *bbox)
+static fz_rect *measure_text(fz_context *ctx, pdf_document *doc, font_info *font_rec, const fz_matrix *tm, char *text, fz_rect *bbox)
{
- pdf_measure_text(doc->ctx, font_rec->font, (unsigned char *)text, strlen(text), bbox);
+ pdf_measure_text(ctx, font_rec->font, (unsigned char *)text, strlen(text), bbox);
bbox->x0 *= font_rec->da_rec.font_size * tm->a;
bbox->y0 *= font_rec->da_rec.font_size * tm->d;
@@ -237,24 +236,24 @@ static fz_rect *measure_text(pdf_document *doc, font_info *font_rec, const fz_ma
static void fzbuf_print_color(fz_context *ctx, fz_buffer *fzbuf, pdf_obj *arr, int stroke, float adj)
{
- switch (pdf_array_len(arr))
+ switch (pdf_array_len(ctx, arr))
{
case 1:
fz_buffer_printf(ctx, fzbuf, stroke?"%f G\n":"%f g\n",
- pdf_to_real(pdf_array_get(arr, 0)) + adj);
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 0)) + adj);
break;
case 3:
fz_buffer_printf(ctx, fzbuf, stroke?"%f %f %f RG\n":"%f %f %f rg\n",
- pdf_to_real(pdf_array_get(arr, 0)) + adj,
- pdf_to_real(pdf_array_get(arr, 1)) + adj,
- pdf_to_real(pdf_array_get(arr, 2)) + adj);
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 0)) + adj,
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 1)) + adj,
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 2)) + adj);
break;
case 4:
fz_buffer_printf(ctx, fzbuf, stroke?"%f %f %f %f K\n":"%f %f %f %f k\n",
- pdf_to_real(pdf_array_get(arr, 0)),
- pdf_to_real(pdf_array_get(arr, 1)),
- pdf_to_real(pdf_array_get(arr, 2)),
- pdf_to_real(pdf_array_get(arr, 3)));
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 0)),
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 1)),
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 2)),
+ pdf_to_real(ctx, pdf_array_get(ctx, arr, 3)));
break;
}
}
@@ -310,25 +309,23 @@ static fz_buffer *create_text_buffer(fz_context *ctx, const fz_rect *clip, text_
return fzbuf;
}
-static fz_buffer *create_aligned_text_buffer(pdf_document *doc, const fz_rect *clip, text_widget_info *info, const fz_matrix *tm, char *text)
+static fz_buffer *create_aligned_text_buffer(fz_context *ctx, pdf_document *doc, const fz_rect *clip, text_widget_info *info, const fz_matrix *tm, char *text)
{
- fz_context *ctx = doc->ctx;
fz_matrix atm = *tm;
if (info->q != Q_Left)
{
fz_rect rect;
- measure_text(doc, &info->font_rec, tm, text, &rect);
+ measure_text(ctx, doc, &info->font_rec, tm, text, &rect);
atm.e -= info->q == Q_Right ? rect.x1 : (rect.x1 - rect.x0) / 2;
}
return create_text_buffer(ctx, clip, info, &atm, text);
}
-static void measure_ascent_descent(pdf_document *doc, font_info *finf, char *text, float *ascent, float *descent)
+static void measure_ascent_descent(fz_context *ctx, pdf_document *doc, font_info *finf, char *text, float *ascent, float *descent)
{
- fz_context *ctx = doc->ctx;
char *testtext = NULL;
fz_rect bbox;
font_info tinf = *finf;
@@ -342,7 +339,7 @@ static void measure_ascent_descent(pdf_document *doc, font_info *finf, char *tex
strcpy(testtext, "My");
strcat(testtext, text);
tinf.da_rec.font_size = 1;
- measure_text(doc, &tinf, &fz_identity, testtext, &bbox);
+ measure_text(ctx, doc, &tinf, &fz_identity, testtext, &bbox);
*descent = -bbox.y0;
*ascent = bbox.y1;
}
@@ -572,9 +569,8 @@ static void fzbuf_print_text_word(fz_context *ctx, fz_buffer *fzbuf, float x, fl
fz_buffer_printf(ctx, fzbuf, ") Tj\n");
}
-static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox, const fz_matrix *oldtm, text_widget_info *info, char *text)
+static fz_buffer *create_text_appearance(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const fz_matrix *oldtm, text_widget_info *info, char *text)
{
- fz_context *ctx = doc->ctx;
int fontsize;
int variable;
float height, width, full_width;
@@ -610,7 +606,7 @@ static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox,
info->font_rec.da_rec.font_size = fontsize;
- measure_ascent_descent(doc, &info->font_rec, text, &ascent, &descent);
+ measure_ascent_descent(ctx, doc, &info->font_rec, text, &ascent, &descent);
if (info->multiline)
{
@@ -709,7 +705,7 @@ static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox,
if (variable)
{
- measure_text(doc, &info->font_rec, &tm, text, &tbox);
+ measure_text(ctx, doc, &info->font_rec, &tm, text, &tbox);
if (tbox.x1 - tbox.x0 > width)
{
@@ -720,7 +716,7 @@ static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox,
}
}
- fzbuf = create_aligned_text_buffer(doc, &rect, info, &tm, text);
+ fzbuf = create_aligned_text_buffer(ctx, doc, &rect, info, &tm, text);
}
}
fz_always(ctx)
@@ -736,14 +732,13 @@ static fz_buffer *create_text_appearance(pdf_document *doc, const fz_rect *bbox,
return fzbuf;
}
-static int get_matrix(pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt)
+static int get_matrix(fz_context *ctx, pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt)
{
- fz_context *ctx = doc->ctx;
int found = 0;
pdf_lexbuf lbuf;
fz_stream *str;
- str = pdf_open_stream(doc, pdf_to_num(form->contents), pdf_to_gen(form->contents));
+ str = pdf_open_stream(ctx, doc, pdf_to_num(ctx, form->contents), pdf_to_gen(ctx, form->contents));
pdf_lexbuf_init(ctx, &lbuf, PDF_LEXBUF_SMALL);
@@ -754,7 +749,7 @@ static int get_matrix(pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt
int coef_i = 0;
/* Look for the text matrix Tm in the stream */
- for (tok = pdf_lex(str, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str, &lbuf))
+ for (tok = pdf_lex(ctx, str, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str, &lbuf))
{
if (tok == PDF_TOK_INT || tok == PDF_TOK_REAL)
{
@@ -789,7 +784,7 @@ static int get_matrix(pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt
if (found)
{
fz_rect bbox;
- pdf_to_rect(ctx, pdf_dict_gets(form->contents, "BBox"), &bbox);
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, form->contents, "BBox"), &bbox);
switch (q)
{
@@ -809,8 +804,8 @@ static int get_matrix(pdf_document *doc, pdf_xobject *form, int q, fz_matrix *mt
}
fz_always(ctx)
{
- fz_close(str);
- pdf_lexbuf_fin(&lbuf);
+ fz_drop_stream(ctx, str);
+ pdf_lexbuf_fin(ctx, &lbuf);
}
fz_catch(ctx)
{
@@ -912,23 +907,22 @@ static void account_for_rot(fz_rect *rect, fz_matrix *mat, int rot)
}
}
-static void copy_resources(pdf_obj *dst, pdf_obj *src)
+static void copy_resources(fz_context *ctx, pdf_obj *dst, pdf_obj *src)
{
int i, len;
- len = pdf_dict_len(src);
+ len = pdf_dict_len(ctx, src);
for (i = 0; i < len; i++)
{
- pdf_obj *key = pdf_dict_get_key(src, i);
+ pdf_obj *key = pdf_dict_get_key(ctx, src, i);
- if (!pdf_dict_get(dst, key))
- pdf_dict_put(dst, key, pdf_dict_get_val(src, i));
+ if (!pdf_dict_get(ctx, dst, key))
+ pdf_dict_put(ctx, dst, key, pdf_dict_get_val(ctx, src, i));
}
}
-static pdf_xobject *load_or_create_form(pdf_document *doc, pdf_obj *obj, fz_rect *rect)
+static pdf_xobject *load_or_create_form(fz_context *ctx, pdf_document *doc, pdf_obj *obj, fz_rect *rect)
{
- fz_context *ctx = doc->ctx;
pdf_obj *ap = NULL;
fz_matrix mat;
int rot;
@@ -943,36 +937,36 @@ static pdf_xobject *load_or_create_form(pdf_document *doc, pdf_obj *obj, fz_rect
fz_var(fzbuf);
fz_try(ctx)
{
- rot = pdf_to_int(pdf_dict_getp(obj, "MK/R"));
- pdf_to_rect(ctx, pdf_dict_gets(obj, "Rect"), rect);
+ rot = pdf_to_int(ctx, pdf_dict_getp(ctx, obj, "MK/R"));
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, obj, "Rect"), rect);
rect->x1 -= rect->x0;
rect->y1 -= rect->y0;
rect->x0 = rect->y0 = 0;
account_for_rot(rect, &mat, rot);
- ap = pdf_dict_gets(obj, "AP");
+ ap = pdf_dict_gets(ctx, obj, "AP");
if (ap == NULL)
{
- ap = pdf_new_dict(doc, 1);
- pdf_dict_puts_drop(obj, "AP", ap);
+ ap = pdf_new_dict(ctx, doc, 1);
+ pdf_dict_puts_drop(ctx, obj, "AP", ap);
}
- formobj = pdf_dict_gets(ap, dn);
+ formobj = pdf_dict_gets(ctx, ap, dn);
if (formobj == NULL)
{
- formobj = pdf_new_xobject(doc, rect, &mat);
- pdf_dict_puts_drop(ap, dn, formobj);
+ formobj = pdf_new_xobject(ctx, doc, rect, &mat);
+ pdf_dict_puts_drop(ctx, ap, dn, formobj);
create_form = 1;
}
- form = pdf_load_xobject(doc, formobj);
+ form = pdf_load_xobject(ctx, doc, formobj);
if (create_form)
{
fzbuf = fz_new_buffer(ctx, 1);
- pdf_update_xobject_contents(doc, form, fzbuf);
+ pdf_update_xobject_contents(ctx, doc, form, fzbuf);
}
- copy_resources(form->resources, pdf_get_inheritable(doc, obj, "DR"));
+ copy_resources(ctx, form->resources, pdf_get_inheritable(ctx, doc, obj, "DR"));
}
fz_always(ctx)
{
@@ -987,9 +981,8 @@ static pdf_xobject *load_or_create_form(pdf_document *doc, pdf_obj *obj, fz_rect
return form;
}
-static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffer *fzbuf)
+static void update_marked_content(fz_context *ctx, pdf_document *doc, pdf_xobject *form, fz_buffer *fzbuf)
{
- fz_context *ctx = doc->ctx;
pdf_token tok;
pdf_lexbuf lbuf;
fz_stream *str_outer = NULL;
@@ -1009,12 +1002,12 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe
int first = 1;
newbuf = fz_new_buffer(ctx, 0);
- str_outer = pdf_open_stream(doc, pdf_to_num(form->contents), pdf_to_gen(form->contents));
+ str_outer = pdf_open_stream(ctx, doc, pdf_to_num(ctx, form->contents), pdf_to_gen(ctx, form->contents));
len = fz_buffer_storage(ctx, fzbuf, &buf);
str_inner = fz_open_memory(ctx, buf, len);
/* Copy the existing appearance stream to newbuf while looking for BMC */
- for (tok = pdf_lex(str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str_outer, &lbuf))
+ for (tok = pdf_lex(ctx, str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str_outer, &lbuf))
{
if (first)
first = 0;
@@ -1031,12 +1024,12 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe
if (bmc_found)
{
/* Drop Tx BMC from the replacement appearance stream */
- (void)pdf_lex(str_inner, &lbuf);
- (void)pdf_lex(str_inner, &lbuf);
+ (void)pdf_lex(ctx, str_inner, &lbuf);
+ (void)pdf_lex(ctx, str_inner, &lbuf);
}
/* Copy the replacement appearance stream to newbuf */
- for (tok = pdf_lex(str_inner, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str_inner, &lbuf))
+ for (tok = pdf_lex(ctx, str_inner, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str_inner, &lbuf))
{
fz_buffer_printf(ctx, newbuf, " ");
pdf_print_token(ctx, newbuf, tok, &lbuf);
@@ -1045,14 +1038,14 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe
if (bmc_found)
{
/* Drop the rest of the existing appearance stream until EMC found */
- for (tok = pdf_lex(str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str_outer, &lbuf))
+ for (tok = pdf_lex(ctx, str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str_outer, &lbuf))
{
if (tok == PDF_TOK_KEYWORD && !strcmp(lbuf.scratch, "EMC"))
break;
}
/* Copy the rest of the existing appearance stream to newbuf */
- for (tok = pdf_lex(str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(str_outer, &lbuf))
+ for (tok = pdf_lex(ctx, str_outer, &lbuf); tok != PDF_TOK_EOF; tok = pdf_lex(ctx, str_outer, &lbuf))
{
fz_buffer_printf(ctx, newbuf, " ");
pdf_print_token(ctx, newbuf, tok, &lbuf);
@@ -1060,14 +1053,14 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe
}
/* Use newbuf in place of the existing appearance stream */
- pdf_update_xobject_contents(doc, form, newbuf);
+ pdf_update_xobject_contents(ctx, doc, form, newbuf);
}
fz_always(ctx)
{
- fz_close(str_outer);
- fz_close(str_inner);
+ fz_drop_stream(ctx, str_outer);
+ fz_drop_stream(ctx, str_inner);
fz_drop_buffer(ctx, newbuf);
- pdf_lexbuf_fin(&lbuf);
+ pdf_lexbuf_fin(ctx, &lbuf);
}
fz_catch(ctx)
{
@@ -1075,9 +1068,9 @@ static void update_marked_content(pdf_document *doc, pdf_xobject *form, fz_buffe
}
}
-static int get_border_style(pdf_obj *obj)
+static int get_border_style(fz_context *ctx, pdf_obj *obj)
{
- char *sname = pdf_to_name(pdf_dict_getp(obj, "BS/S"));
+ char *sname = pdf_to_name(ctx, pdf_dict_getp(ctx, obj, "BS/S"));
if (!strcmp(sname, "D"))
return BS_Dashed;
@@ -1091,15 +1084,14 @@ static int get_border_style(pdf_obj *obj)
return BS_Solid;
}
-static float get_border_width(pdf_obj *obj)
+static float get_border_width(fz_context *ctx, pdf_obj *obj)
{
- float w = pdf_to_real(pdf_dict_getp(obj, "BS/W"));
+ float w = pdf_to_real(ctx, pdf_dict_getp(ctx, obj, "BS/W"));
return w == 0.0 ? 1.0 : w;
}
-void pdf_update_text_appearance(pdf_document *doc, pdf_obj *obj, char *eventValue)
+void pdf_update_text_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *eventValue)
{
- fz_context *ctx = doc->ctx;
text_widget_info info;
pdf_xobject *form = NULL;
fz_buffer *fzbuf = NULL;
@@ -1116,19 +1108,19 @@ void pdf_update_text_appearance(pdf_document *doc, pdf_obj *obj, char *eventValu
fz_var(text);
fz_try(ctx)
{
- get_text_widget_info(doc, obj, &info);
+ get_text_widget_info(ctx, doc, obj, &info);
if (eventValue)
text = to_font_encoding(ctx, info.font_rec.font, eventValue);
else
- text = pdf_field_value(doc, obj);
+ text = pdf_field_value(ctx, doc, obj);
- form = load_or_create_form(doc, obj, &rect);
+ form = load_or_create_form(ctx, doc, obj, &rect);
- has_tm = get_matrix(doc, form, info.q, &tm);
- fzbuf = create_text_appearance(doc, &form->bbox, has_tm ? &tm : NULL, &info,
+ has_tm = get_matrix(ctx, doc, form, info.q, &tm);
+ fzbuf = create_text_appearance(ctx, doc, &form->bbox, has_tm ? &tm : NULL, &info,
text?text:"");
- update_marked_content(doc, form, fzbuf);
+ update_marked_content(ctx, doc, form, fzbuf);
}
fz_always(ctx)
{
@@ -1143,9 +1135,8 @@ void pdf_update_text_appearance(pdf_document *doc, pdf_obj *obj, char *eventValu
}
}
-void pdf_update_combobox_appearance(pdf_document *doc, pdf_obj *obj)
+void pdf_update_combobox_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
text_widget_info info;
pdf_xobject *form = NULL;
fz_buffer *fzbuf = NULL;
@@ -1162,24 +1153,24 @@ void pdf_update_combobox_appearance(pdf_document *doc, pdf_obj *obj)
fz_var(fzbuf);
fz_try(ctx)
{
- get_text_widget_info(doc, obj, &info);
+ get_text_widget_info(ctx, doc, obj, &info);
- val = pdf_get_inheritable(doc, obj, "V");
+ val = pdf_get_inheritable(ctx, doc, obj, "V");
- if (pdf_is_array(val))
- val = pdf_array_get(val, 0);
+ if (pdf_is_array(ctx, val))
+ val = pdf_array_get(ctx, val, 0);
- text = pdf_to_str_buf(val);
+ text = pdf_to_str_buf(ctx, val);
if (!text)
text = "";
- form = load_or_create_form(doc, obj, &rect);
+ form = load_or_create_form(ctx, doc, obj, &rect);
- has_tm = get_matrix(doc, form, info.q, &tm);
- fzbuf = create_text_appearance(doc, &form->bbox, has_tm ? &tm : NULL, &info,
+ has_tm = get_matrix(ctx, doc, form, info.q, &tm);
+ fzbuf = create_text_appearance(ctx, doc, &form->bbox, has_tm ? &tm : NULL, &info,
text?text:"");
- update_marked_content(doc, form, fzbuf);
+ update_marked_content(ctx, doc, form, fzbuf);
}
fz_always(ctx)
{
@@ -1193,9 +1184,8 @@ void pdf_update_combobox_appearance(pdf_document *doc, pdf_obj *obj)
}
}
-void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj)
+void pdf_update_pushbutton_appearance(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
fz_rect rect;
pdf_xobject *form = NULL;
fz_buffer *fzbuf = NULL;
@@ -1212,18 +1202,18 @@ void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj)
fz_var(fzbuf);
fz_try(ctx)
{
- form = load_or_create_form(doc, obj, &rect);
+ form = load_or_create_form(ctx, doc, obj, &rect);
fzbuf = fz_new_buffer(ctx, 0);
- tobj = pdf_dict_getp(obj, "MK/BG");
- if (pdf_is_array(tobj))
+ tobj = pdf_dict_getp(ctx, obj, "MK/BG");
+ if (pdf_is_array(ctx, tobj))
{
fzbuf_print_color(ctx, fzbuf, tobj, 0, 0.0);
fz_buffer_printf(ctx, fzbuf, fmt_re,
rect.x0, rect.y0, rect.x1, rect.y1);
fz_buffer_printf(ctx, fzbuf, fmt_f);
}
- bstyle = get_border_style(obj);
- bwidth = get_border_width(obj);
+ bstyle = get_border_style(ctx, obj);
+ bwidth = get_border_width(ctx, obj);
btotal = bwidth;
if (bstyle == BS_Beveled || bstyle == BS_Inset)
{
@@ -1253,7 +1243,7 @@ void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj)
fz_buffer_printf(ctx, fzbuf, fmt_f);
}
- tobj = pdf_dict_getp(obj, "MK/BC");
+ tobj = pdf_dict_getp(ctx, obj, "MK/BC");
if (tobj)
{
fzbuf_print_color(ctx, fzbuf, tobj, 1, 0.0);
@@ -1264,27 +1254,27 @@ void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj)
fz_buffer_printf(ctx, fzbuf, fmt_s);
}
- tobj = pdf_dict_getp(obj, "MK/CA");
+ tobj = pdf_dict_getp(ctx, obj, "MK/CA");
if (tobj)
{
fz_rect clip = rect;
fz_rect bounds;
fz_matrix mat;
- char *da = pdf_to_str_buf(pdf_get_inheritable(doc, obj, "DA"));
- char *text = pdf_to_str_buf(tobj);
+ char *da = pdf_to_str_buf(ctx, pdf_get_inheritable(ctx, doc, obj, "DA"));
+ char *text = pdf_to_str_buf(ctx, tobj);
clip.x0 += btotal;
clip.y0 += btotal;
clip.x1 -= btotal;
clip.y1 -= btotal;
- get_font_info(doc, form->resources, da, &font_rec);
- measure_text(doc, &font_rec, &fz_identity, text, &bounds);
+ get_font_info(ctx, doc, form->resources, da, &font_rec);
+ measure_text(ctx, doc, &font_rec, &fz_identity, text, &bounds);
fz_translate(&mat, (rect.x1 - bounds.x1)/2, (rect.y1 - bounds.y1)/2);
fzbuf_print_text(ctx, fzbuf, &clip, NULL, &font_rec, &mat, text);
}
- pdf_update_xobject_contents(doc, form, fzbuf);
+ pdf_update_xobject_contents(ctx, doc, form, fzbuf);
}
fz_always(ctx)
{
@@ -1298,7 +1288,7 @@ void pdf_update_pushbutton_appearance(pdf_document *doc, pdf_obj *obj)
}
}
-void pdf_update_text_markup_appearance(pdf_document *doc, pdf_annot *annot, fz_annot_type type)
+void pdf_update_text_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_annot_type type)
{
float color[3];
float alpha;
@@ -1335,19 +1325,18 @@ void pdf_update_text_markup_appearance(pdf_document *doc, pdf_annot *annot, fz_a
return;
}
- pdf_set_markup_appearance(doc, annot, color, alpha, line_thickness, line_height);
+ pdf_set_markup_appearance(ctx, doc, annot, color, alpha, line_thickness, line_height);
}
static void update_rect(fz_context *ctx, pdf_annot *annot)
{
- pdf_to_rect(ctx, pdf_dict_gets(annot->obj, "Rect"), &annot->rect);
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, annot->obj, "Rect"), &annot->rect);
annot->pagerect = annot->rect;
fz_transform_rect(&annot->pagerect, &annot->page->ctm);
}
-void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect, fz_display_list *disp_list)
+void pdf_set_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, fz_rect *rect, fz_display_list *disp_list)
{
- fz_context *ctx = doc->ctx;
pdf_obj *obj = annot->obj;
const fz_matrix *page_ctm = &annot->page->ctm;
fz_matrix ctm;
@@ -1365,32 +1354,32 @@ void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect
fz_transform_rect(&trect, &ctm);
- pdf_dict_puts_drop(obj, "Rect", pdf_new_rect(doc, &trect));
+ pdf_dict_puts_drop(ctx, obj, "Rect", pdf_new_rect(ctx, doc, &trect));
/* See if there is a current normal appearance */
- ap_obj = pdf_dict_getp(obj, "AP/N");
- if (!pdf_is_stream(doc, pdf_to_num(ap_obj), pdf_to_gen(ap_obj)))
+ ap_obj = pdf_dict_getp(ctx, obj, "AP/N");
+ if (!pdf_is_stream(ctx, doc, pdf_to_num(ctx, ap_obj), pdf_to_gen(ctx, ap_obj)))
ap_obj = NULL;
if (ap_obj == NULL)
{
- ap_obj = pdf_new_xobject(doc, &trect, &mat);
- pdf_dict_putp_drop(obj, "AP/N", ap_obj);
+ ap_obj = pdf_new_xobject(ctx, doc, &trect, &mat);
+ pdf_dict_putp_drop(ctx, obj, "AP/N", ap_obj);
}
else
{
- pdf_xref_ensure_incremental_object(doc, pdf_to_num(ap_obj));
+ pdf_xref_ensure_incremental_object(ctx, doc, pdf_to_num(ctx, ap_obj));
/* Update bounding box and matrix in reused xobject obj */
- pdf_dict_puts_drop(ap_obj, "BBox", pdf_new_rect(doc, &trect));
- pdf_dict_puts_drop(ap_obj, "Matrix", pdf_new_matrix(doc, &mat));
+ pdf_dict_puts_drop(ctx, ap_obj, "BBox", pdf_new_rect(ctx, doc, &trect));
+ pdf_dict_puts_drop(ctx, ap_obj, "Matrix", pdf_new_matrix(ctx, doc, &mat));
}
- dev = pdf_new_pdf_device(doc, ap_obj, pdf_dict_gets(ap_obj, "Resources"), &mat);
- fz_run_display_list(disp_list, dev, &ctm, &fz_infinite_rect, NULL);
- fz_free_device(dev);
+ dev = pdf_new_pdf_device(ctx, doc, ap_obj, pdf_dict_gets(ctx, ap_obj, "Resources"), &mat);
+ fz_run_display_list(ctx, disp_list, dev, &ctm, &fz_infinite_rect, NULL);
+ fz_drop_device(ctx, dev);
/* Mark the appearance as changed - required for partial update */
- xobj = pdf_load_xobject(doc, ap_obj);
+ xobj = pdf_load_xobject(ctx, doc, ap_obj);
if (xobj)
{
/* Update bounding box and matrix also in the xobject structure */
@@ -1406,23 +1395,22 @@ void pdf_set_annot_appearance(pdf_document *doc, pdf_annot *annot, fz_rect *rect
}
fz_catch(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
fz_rethrow(ctx);
}
}
static fz_point *
-quadpoints(pdf_document *doc, pdf_obj *annot, int *nout)
+quadpoints(fz_context *ctx, pdf_document *doc, pdf_obj *annot, int *nout)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *quad = pdf_dict_gets(annot, "QuadPoints");
+ pdf_obj *quad = pdf_dict_gets(ctx, annot, "QuadPoints");
fz_point *qp = NULL;
int i, n;
if (!quad)
return NULL;
- n = pdf_array_len(quad);
+ n = pdf_array_len(ctx, quad);
if (n%8 != 0)
return NULL;
@@ -1434,8 +1422,8 @@ quadpoints(pdf_document *doc, pdf_obj *annot, int *nout)
for (i = 0; i < n; i += 2)
{
- qp[i/2].x = pdf_to_real(pdf_array_get(quad, i));
- qp[i/2].y = pdf_to_real(pdf_array_get(quad, i+1));
+ qp[i/2].x = pdf_to_real(ctx, pdf_array_get(ctx, quad, i));
+ qp[i/2].y = pdf_to_real(ctx, pdf_array_get(ctx, quad, i+1));
}
}
fz_catch(ctx)
@@ -1449,16 +1437,15 @@ quadpoints(pdf_document *doc, pdf_obj *annot, int *nout)
return qp;
}
-void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[3], float alpha, float line_thickness, float line_height)
+void pdf_set_markup_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, float color[3], float alpha, float line_thickness, float line_height)
{
- fz_context *ctx = doc->ctx;
const fz_matrix *page_ctm = &annot->page->ctm;
fz_path *path = NULL;
fz_stroke_state *stroke = NULL;
fz_device *dev = NULL;
fz_display_list *strike_list = NULL;
int i, n;
- fz_point *qp = quadpoints(doc, annot->obj, &n);
+ fz_point *qp = quadpoints(ctx, doc, annot->obj, &n);
if (!qp || n <= 0)
return;
@@ -1501,10 +1488,10 @@ void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[
if (stroke)
{
// assert(path)
- fz_stroke_path(dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha);
+ fz_stroke_path(ctx, dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha);
fz_drop_stroke_state(ctx, stroke);
stroke = NULL;
- fz_free_path(ctx, path);
+ fz_drop_path(ctx, path);
path = NULL;
}
@@ -1519,18 +1506,18 @@ void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[
if (stroke)
{
- fz_stroke_path(dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha);
+ fz_stroke_path(ctx, dev, path, stroke, page_ctm, fz_device_rgb(ctx), color, alpha);
}
fz_transform_rect(&rect, page_ctm);
- pdf_set_annot_appearance(doc, annot, &rect, strike_list);
+ pdf_set_annot_appearance(ctx, doc, annot, &rect, strike_list);
}
fz_always(ctx)
{
fz_free(ctx, qp);
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_stroke_state(ctx, stroke);
- fz_free_path(ctx, path);
+ fz_drop_path(ctx, path);
fz_drop_display_list(ctx, strike_list);
}
fz_catch(ctx)
@@ -1539,28 +1526,27 @@ void pdf_set_markup_appearance(pdf_document *doc, pdf_annot *annot, float color[
}
}
-static fz_colorspace *pdf_to_color(pdf_document *doc, pdf_obj *col, float color[4])
+static fz_colorspace *pdf_to_color(fz_context *ctx, pdf_document *doc, pdf_obj *col, float color[4])
{
fz_colorspace *cs;
- int i, ncol = pdf_array_len(col);
+ int i, ncol = pdf_array_len(ctx, col);
switch (ncol)
{
- case 1: cs = fz_device_gray(doc->ctx); break;
- case 3: cs = fz_device_rgb(doc->ctx); break;
- case 4: cs = fz_device_cmyk(doc->ctx); break;
+ case 1: cs = fz_device_gray(ctx); break;
+ case 3: cs = fz_device_rgb(ctx); break;
+ case 4: cs = fz_device_cmyk(ctx); break;
default: return NULL;
}
for (i = 0; i < ncol; i++)
- color[i] = pdf_to_real(pdf_array_get(col, i));
+ color[i] = pdf_to_real(ctx, pdf_array_get(ctx, col, i));
return cs;
}
-void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot)
+void pdf_update_ink_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
- fz_context *ctx = doc->ctx;
const fz_matrix *page_ctm = &annot->page->ctm;
fz_path *path = NULL;
fz_stroke_state *stroke = NULL;
@@ -1582,7 +1568,7 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot)
int n, m, i, j;
int empty = 1;
- cs = pdf_to_color(doc, pdf_dict_gets(annot->obj, "C"), color);
+ cs = pdf_to_color(ctx, doc, pdf_dict_gets(ctx, annot->obj, "C"), color);
if (!cs)
{
cs = fz_device_rgb(ctx);
@@ -1591,13 +1577,13 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot)
color[2] = 0.0f;
}
- width = pdf_to_real(pdf_dict_gets(pdf_dict_gets(annot->obj, "BS"), "W"));
+ width = pdf_to_real(ctx, pdf_dict_gets(ctx, pdf_dict_gets(ctx, annot->obj, "BS"), "W"));
if (width == 0.0f)
width = 1.0f;
- list = pdf_dict_gets(annot->obj, "InkList");
+ list = pdf_dict_gets(ctx, annot->obj, "InkList");
- n = pdf_array_len(list);
+ n = pdf_array_len(ctx, list);
strike_list = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, strike_list);
@@ -1610,14 +1596,14 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot)
for (i = 0; i < n; i ++)
{
fz_point pt_last;
- pdf_obj *arc = pdf_array_get(list, i);
- m = pdf_array_len(arc);
+ pdf_obj *arc = pdf_array_get(ctx, list, i);
+ m = pdf_array_len(ctx, arc);
for (j = 0; j < m-1; j += 2)
{
fz_point pt;
- pt.x = pdf_to_real(pdf_array_get(arc, j));
- pt.y = pdf_to_real(pdf_array_get(arc, j+1));
+ pt.x = pdf_to_real(ctx, pdf_array_get(ctx, arc, j));
+ pt.y = pdf_to_real(ctx, pdf_array_get(ctx, arc, j+1));
if (i == 0 && j == 0)
{
@@ -1639,7 +1625,7 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot)
fz_lineto(ctx, path, pt_last.x, pt_last.y);
}
- fz_stroke_path(dev, path, stroke, page_ctm, cs, color, 1.0f);
+ fz_stroke_path(ctx, dev, path, stroke, page_ctm, cs, color, 1.0f);
fz_expand_rect(&rect, width);
/*
@@ -1657,14 +1643,14 @@ void pdf_update_ink_appearance(pdf_document *doc, pdf_annot *annot)
fz_transform_rect(&rect, page_ctm);
- pdf_set_annot_appearance(doc, annot, &rect, strike_list);
+ pdf_set_annot_appearance(ctx, doc, annot, &rect, strike_list);
}
fz_always(ctx)
{
fz_drop_colorspace(ctx, cs);
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_stroke_state(ctx, stroke);
- fz_free_path(ctx, path);
+ fz_drop_path(ctx, path);
fz_drop_display_list(ctx, strike_list);
}
fz_catch(ctx)
@@ -1706,7 +1692,7 @@ static fz_text *layout_text(fz_context *ctx, font_info *font_rec, char *str, flo
}
fz_catch(ctx)
{
- fz_free_text(ctx, text);
+ fz_drop_text(ctx, text);
fz_rethrow(ctx);
}
@@ -1739,8 +1725,7 @@ static fz_text *fit_text(fz_context *ctx, font_info *font_rec, char *str, fz_rec
float x = 0.0;
float y = 0.0;
-
- fz_free_text(ctx, text);
+ fz_drop_text(ctx, text);
text = NULL;
font_size = font_rec->da_rec.font_size;
fz_scale(&tm, font_size, font_size);
@@ -1790,7 +1775,7 @@ static fz_text *fit_text(fz_context *ctx, font_info *font_rec, char *str, fz_rec
}
fz_catch(ctx)
{
- fz_free_text(ctx, text);
+ fz_drop_text(ctx, text);
fz_rethrow(ctx);
}
@@ -1848,12 +1833,12 @@ static void draw_speech_bubble(fz_context *ctx, fz_path *path)
fz_closepath(ctx, path);
}
-void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
+void pdf_update_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
static float white[3] = {1.0, 1.0, 1.0};
static float yellow[3] = {1.0, 1.0, 0.0};
static float black[3] = {0.0, 0.0, 0.0};
- fz_context *ctx = doc->ctx;
+
const fz_matrix *page_ctm = &annot->page->ctm;
fz_display_list *dlist = NULL;
fz_device *dev = NULL;
@@ -1872,7 +1857,7 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
fz_rect bounds;
fz_matrix tm;
- pdf_to_rect(ctx, pdf_dict_gets(annot->obj, "Rect"), &rect);
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, annot->obj, "Rect"), &rect);
dlist = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, dlist);
stroke = fz_new_stroke_state(ctx);
@@ -1886,18 +1871,18 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
center_rect_within_rect(&bounds, &rect, &tm);
fz_concat(&tm, &tm, page_ctm);
cs = fz_device_rgb(ctx);
- fz_fill_path(dev, path, 0, &tm, cs, yellow, 1.0f);
- fz_stroke_path(dev, path, stroke, &tm, cs, black, 1.0f);
- fz_free_path(ctx, path);
+ fz_fill_path(ctx, dev, path, 0, &tm, cs, yellow, 1.0f);
+ fz_stroke_path(ctx, dev, path, stroke, &tm, cs, black, 1.0f);
+ fz_drop_path(ctx, path);
path = NULL;
path = fz_new_path(ctx);
draw_speech_bubble(ctx, path);
- fz_fill_path(dev, path, 0, &tm, cs, white, 1.0f);
- fz_stroke_path(dev, path, stroke, &tm, cs, black, 1.0f);
+ fz_fill_path(ctx, dev, path, 0, &tm, cs, white, 1.0f);
+ fz_stroke_path(ctx, dev, path, stroke, &tm, cs, black, 1.0f);
fz_transform_rect(&rect, page_ctm);
- pdf_set_annot_appearance(doc, annot, &rect, dlist);
+ pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist);
/* Drop the cached xobject from the annotation structure to
* force a redraw on next pdf_update_page call */
@@ -1906,10 +1891,10 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_display_list(ctx, dlist);
fz_drop_stroke_state(ctx, stroke);
- fz_free_path(ctx, path);
+ fz_drop_path(ctx, path);
fz_drop_colorspace(ctx, cs);
}
fz_catch(ctx)
@@ -1918,12 +1903,11 @@ void pdf_update_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
}
}
-void pdf_update_free_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
+void pdf_update_free_text_annot_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
- fz_context *ctx = doc->ctx;
const fz_matrix *page_ctm = &annot->page->ctm;
pdf_obj *obj = annot->obj;
- pdf_obj *dr = pdf_dict_getp(annot->page->me, "Resources");
+ pdf_obj *dr = pdf_dict_getp(ctx, annot->page->me, "Resources");
fz_display_list *dlist = NULL;
fz_device *dev = NULL;
font_info font_rec;
@@ -1942,18 +1926,18 @@ void pdf_update_free_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
fz_var(cs);
fz_try(ctx)
{
- char *contents = pdf_to_str_buf(pdf_dict_gets(obj, "Contents"));
- char *da = pdf_to_str_buf(pdf_dict_gets(obj, "DA"));
+ char *contents = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, obj, "Contents"));
+ char *da = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, obj, "DA"));
fz_rect rect = annot->rect;
fz_point pos;
- get_font_info(doc, dr, da, &font_rec);
+ get_font_info(ctx, doc, dr, da, &font_rec);
switch (font_rec.da_rec.col_size)
{
- default: cs = fz_device_gray(doc->ctx); break;
- case 3: cs = fz_device_rgb(doc->ctx); break;
- case 4: cs = fz_device_cmyk(doc->ctx); break;
+ default: cs = fz_device_gray(ctx); break;
+ case 3: cs = fz_device_rgb(ctx); break;
+ case 4: cs = fz_device_cmyk(ctx); break;
}
/* Adjust for the descender */
@@ -1964,17 +1948,17 @@ void pdf_update_free_text_annot_appearance(pdf_document *doc, pdf_annot *annot)
dlist = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, dlist);
- fz_fill_text(dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
+ fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
fz_transform_rect(&rect, page_ctm);
- pdf_set_annot_appearance(doc, annot, &rect, dlist);
+ pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist);
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_display_list(ctx, dlist);
font_info_fin(ctx, &font_rec);
- fz_free_text(ctx, text);
+ fz_drop_text(ctx, text);
fz_drop_colorspace(ctx, cs);
}
fz_catch(ctx)
@@ -2043,17 +2027,16 @@ static void draw_logo(fz_context *ctx, fz_path *path)
fz_closepath(ctx, path);
};
-static void insert_signature_appearance_layers(pdf_document *doc, pdf_annot *annot)
+static void insert_signature_appearance_layers(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *ap = pdf_dict_getp(annot->obj, "AP/N");
+ pdf_obj *ap = pdf_dict_getp(ctx, annot->obj, "AP/N");
pdf_obj *main_ap = NULL;
pdf_obj *frm = NULL;
pdf_obj *n0 = NULL;
fz_rect bbox;
fz_buffer *fzbuf = NULL;
- pdf_to_rect(ctx, pdf_dict_gets(ap, "BBox"), &bbox);
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, ap, "BBox"), &bbox);
fz_var(main_ap);
fz_var(frm);
@@ -2061,41 +2044,41 @@ static void insert_signature_appearance_layers(pdf_document *doc, pdf_annot *ann
fz_var(fzbuf);
fz_try(ctx)
{
- main_ap = pdf_new_xobject(doc, &bbox, &fz_identity);
- frm = pdf_new_xobject(doc, &bbox, &fz_identity);
- n0 = pdf_new_xobject(doc, &bbox, &fz_identity);
+ main_ap = pdf_new_xobject(ctx, doc, &bbox, &fz_identity);
+ frm = pdf_new_xobject(ctx, doc, &bbox, &fz_identity);
+ n0 = pdf_new_xobject(ctx, doc, &bbox, &fz_identity);
- pdf_dict_putp(main_ap, "Resources/XObject/FRM", frm);
+ pdf_dict_putp(ctx, main_ap, "Resources/XObject/FRM", frm);
fzbuf = fz_new_buffer(ctx, 8);
fz_buffer_printf(ctx, fzbuf, "/FRM Do");
- pdf_update_stream(doc, pdf_to_num(main_ap), fzbuf);
- pdf_dict_puts_drop(main_ap, "Length", pdf_new_int(doc, fzbuf->len));
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, main_ap), fzbuf);
+ pdf_dict_puts_drop(ctx, main_ap, "Length", pdf_new_int(ctx, doc, fzbuf->len));
fz_drop_buffer(ctx, fzbuf);
fzbuf = NULL;
- pdf_dict_putp(frm, "Resources/XObject/n0", n0);
- pdf_dict_putp(frm, "Resources/XObject/n2", ap);
+ pdf_dict_putp(ctx, frm, "Resources/XObject/n0", n0);
+ pdf_dict_putp(ctx, frm, "Resources/XObject/n2", ap);
fzbuf = fz_new_buffer(ctx, 8);
fz_buffer_printf(ctx, fzbuf, "q 1 0 0 1 0 0 cm /n0 Do Q q 1 0 0 1 0 0 cm /n2 Do Q");
- pdf_update_stream(doc, pdf_to_num(frm), fzbuf);
- pdf_dict_puts_drop(frm, "Length", pdf_new_int(doc, fzbuf->len));
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, frm), fzbuf);
+ pdf_dict_puts_drop(ctx, frm, "Length", pdf_new_int(ctx, doc, fzbuf->len));
fz_drop_buffer(ctx, fzbuf);
fzbuf = NULL;
fzbuf = fz_new_buffer(ctx, 8);
fz_buffer_printf(ctx, fzbuf, "%% DSBlank");
- pdf_update_stream(doc, pdf_to_num(n0), fzbuf);
- pdf_dict_puts_drop(n0, "Length", pdf_new_int(doc, fzbuf->len));
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, n0), fzbuf);
+ pdf_dict_puts_drop(ctx, n0, "Length", pdf_new_int(ctx, doc, fzbuf->len));
fz_drop_buffer(ctx, fzbuf);
fzbuf = NULL;
- pdf_dict_putp(annot->obj, "AP/N", main_ap);
+ pdf_dict_putp(ctx, annot->obj, "AP/N", main_ap);
}
fz_always(ctx)
{
- pdf_drop_obj(main_ap);
- pdf_drop_obj(frm);
- pdf_drop_obj(n0);
+ pdf_drop_obj(ctx, main_ap);
+ pdf_drop_obj(ctx, frm);
+ pdf_drop_obj(ctx, n0);
}
fz_catch(ctx)
{
@@ -2107,12 +2090,11 @@ static void insert_signature_appearance_layers(pdf_document *doc, pdf_annot *ann
/* MuPDF blue */
static float logo_color[3] = {(float)0x25/(float)0xFF, (float)0x72/(float)0xFF, (float)0xAC/(float)0xFF};
-void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *name, char *dn, char *date)
+void pdf_set_signature_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot, char *name, char *dn, char *date)
{
- fz_context *ctx = doc->ctx;
const fz_matrix *page_ctm = &annot->page->ctm;
pdf_obj *obj = annot->obj;
- pdf_obj *dr = pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/DR");
+ pdf_obj *dr = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/DR");
fz_display_list *dlist = NULL;
fz_device *dev = NULL;
font_info font_rec;
@@ -2122,7 +2104,7 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
fz_buffer *fzbuf = NULL;
if (!dr)
- pdf_dict_putp_drop(pdf_trailer(doc), "Root/AcroForm/DR", pdf_new_dict(doc, 1));
+ pdf_dict_putp_drop(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/DR", pdf_new_dict(ctx, doc, 1));
memset(&font_rec, 0, sizeof(font_rec));
@@ -2134,7 +2116,7 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
fz_var(fzbuf);
fz_try(ctx)
{
- char *da = pdf_to_str_buf(pdf_dict_gets(obj, "DA"));
+ char *da = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, obj, "DA"));
fz_rect rect = annot->rect;
fz_rect logo_bounds;
fz_matrix logo_tm;
@@ -2149,11 +2131,11 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
center_rect_within_rect(&logo_bounds, &rect, &logo_tm);
fz_concat(&logo_tm, &logo_tm, page_ctm);
cs = fz_device_rgb(ctx);
- fz_fill_path(dev, path, 0, &logo_tm, cs, logo_color, 1.0f);
+ fz_fill_path(ctx, dev, path, 0, &logo_tm, cs, logo_color, 1.0f);
fz_drop_colorspace(ctx, cs);
cs = NULL;
- get_font_info(doc, dr, da, &font_rec);
+ get_font_info(ctx, doc, dr, da, &font_rec);
switch (font_rec.da_rec.col_size)
{
@@ -2165,8 +2147,8 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
/* Display the name in the left-hand half of the form field */
rect.x1 = (rect.x0 + rect.x1)/2.0f;
text = fit_text(ctx, &font_rec, name, &rect);
- fz_fill_text(dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
- fz_free_text(ctx, text);
+ fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
+ fz_drop_text(ctx, text);
text = NULL;
/* Display the distinguished name in the right-hand half */
@@ -2179,26 +2161,26 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
rect = annot->rect;
rect.x0 = (rect.x0 + rect.x1)/2.0f;
text = fit_text(ctx, &font_rec, (char *)bufstr, &rect);
- fz_fill_text(dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
+ fz_fill_text(ctx, dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);
rect = annot->rect;
fz_transform_rect(&rect, page_ctm);
- pdf_set_annot_appearance(doc, annot, &rect, dlist);
+ pdf_set_annot_appearance(ctx, doc, annot, &rect, dlist);
/* Drop the cached xobject from the annotation structure to
* force a redraw on next pdf_update_page call */
pdf_drop_xobject(ctx, annot->ap);
annot->ap = NULL;
- insert_signature_appearance_layers(doc, annot);
+ insert_signature_appearance_layers(ctx, doc, annot);
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
fz_drop_display_list(ctx, dlist);
font_info_fin(ctx, &font_rec);
- fz_free_path(ctx, path);
- fz_free_text(ctx, text);
+ fz_drop_path(ctx, path);
+ fz_drop_text(ctx, text);
fz_drop_colorspace(ctx, cs);
fz_drop_buffer(ctx, fzbuf);
}
@@ -2208,29 +2190,27 @@ void pdf_set_signature_appearance(pdf_document *doc, pdf_annot *annot, char *nam
}
}
-void pdf_update_appearance(pdf_document *doc, pdf_annot *annot)
+void pdf_update_appearance(fz_context *ctx, pdf_document *doc, pdf_annot *annot)
{
pdf_obj *obj = annot->obj;
- if (!pdf_dict_gets(obj, "AP") || pdf_obj_is_dirty(obj))
+ if (!pdf_dict_gets(ctx, obj, "AP") || pdf_obj_is_dirty(ctx, obj))
{
- fz_annot_type type = pdf_annot_obj_type(obj);
+ fz_annot_type type = pdf_annot_obj_type(ctx, obj);
switch (type)
{
case FZ_ANNOT_WIDGET:
- switch (pdf_field_type(doc, obj))
+ switch (pdf_field_type(ctx, doc, obj))
{
case PDF_WIDGET_TYPE_TEXT:
{
#if 0
- pdf_obj *formatting = pdf_dict_getp(obj, "AA/F");
+ pdf_obj *formatting = pdf_dict_getp(ctx, obj, "AA/F");
if (formatting && doc->js)
{
/* Apply formatting */
pdf_js_event e;
- fz_context *ctx = doc->ctx;
-
e.target = obj;
- e.value = pdf_field_value(doc, obj);
+ e.value = pdf_field_value(ctx, doc, obj);
fz_try(ctx)
{
pdf_js_setup_event(doc->js, &e);
@@ -2243,47 +2223,47 @@ void pdf_update_appearance(pdf_document *doc, pdf_annot *annot)
{
fz_rethrow(ctx);
}
- execute_action(doc, obj, formatting);
+ execute_action(ctx, doc, obj, formatting);
/* Update appearance from JS event.value */
- pdf_update_text_appearance(doc, obj, pdf_js_get_event(doc->js)->value);
+ pdf_update_text_appearance(ctx, doc, obj, pdf_js_get_event(doc->js)->value);
}
else
#endif
{
/* Update appearance from field value */
- pdf_update_text_appearance(doc, obj, NULL);
+ pdf_update_text_appearance(ctx, doc, obj, NULL);
}
}
break;
case PDF_WIDGET_TYPE_PUSHBUTTON:
- pdf_update_pushbutton_appearance(doc, obj);
+ pdf_update_pushbutton_appearance(ctx, doc, obj);
break;
case PDF_WIDGET_TYPE_LISTBOX:
case PDF_WIDGET_TYPE_COMBOBOX:
/* Treating listbox and combobox identically for now,
* and the behaviour is most appropriate for a combobox */
- pdf_update_combobox_appearance(doc, obj);
+ pdf_update_combobox_appearance(ctx, doc, obj);
break;
}
break;
case FZ_ANNOT_TEXT:
- pdf_update_text_annot_appearance(doc, annot);
+ pdf_update_text_annot_appearance(ctx, doc, annot);
break;
case FZ_ANNOT_FREETEXT:
- pdf_update_free_text_annot_appearance(doc, annot);
+ pdf_update_free_text_annot_appearance(ctx, doc, annot);
break;
case FZ_ANNOT_STRIKEOUT:
case FZ_ANNOT_UNDERLINE:
case FZ_ANNOT_HIGHLIGHT:
- pdf_update_text_markup_appearance(doc, annot, type);
+ pdf_update_text_markup_appearance(ctx, doc, annot, type);
break;
case FZ_ANNOT_INK:
- pdf_update_ink_appearance(doc, annot);
+ pdf_update_ink_appearance(ctx, doc, annot);
break;
default:
break;
}
- pdf_clean_obj(obj);
+ pdf_clean_obj(ctx, obj);
}
}
diff --git a/source/pdf/pdf-clean.c b/source/pdf/pdf-clean.c
index 51a8b6de..89926832 100644
--- a/source/pdf/pdf-clean.c
+++ b/source/pdf/pdf-clean.c
@@ -1,9 +1,8 @@
#include "pdf-interpret-imp.h"
static void
-pdf_clean_stream_object(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie, int own_res)
+pdf_clean_stream_object(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie, int own_res)
{
- fz_context *ctx = doc->ctx;
pdf_process process, process2;
fz_buffer *buffer;
int num;
@@ -22,33 +21,33 @@ pdf_clean_stream_object(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_c
{
if (own_res)
{
- pdf_obj *r = pdf_dict_gets(obj, "Resources");
+ pdf_obj *r = pdf_dict_gets(ctx, obj, "Resources");
if (r)
orig_res = r;
}
- res = pdf_new_dict(doc, 1);
+ res = pdf_new_dict(ctx, doc, 1);
- pdf_process_buffer(&process2, ctx, buffer);
- pdf_process_filter(&process, ctx, &process2, res);
+ pdf_init_process_buffer(ctx, &process2, buffer);
+ pdf_init_process_filter(ctx, &process, &process2, res);
- pdf_process_stream_object(doc, obj, &process, orig_res, cookie);
+ pdf_process_stream_object(ctx, doc, obj, &process, orig_res, cookie);
- num = pdf_to_num(obj);
- pdf_dict_dels(obj, "Filter");
- pdf_update_stream(doc, num, buffer);
+ num = pdf_to_num(ctx, obj);
+ pdf_dict_dels(ctx, obj, "Filter");
+ pdf_update_stream(ctx, doc, num, buffer);
if (own_res)
{
- ref = pdf_new_ref(doc, res);
- pdf_dict_puts(obj, "Resources", ref);
+ ref = pdf_new_ref(ctx, doc, res);
+ pdf_dict_puts(ctx, obj, "Resources", ref);
}
}
fz_always(ctx)
{
fz_drop_buffer(ctx, buffer);
- pdf_drop_obj(res);
- pdf_drop_obj(ref);
+ pdf_drop_obj(ctx, res);
+ pdf_drop_obj(ctx, ref);
}
fz_catch(ctx)
{
@@ -57,9 +56,8 @@ pdf_clean_stream_object(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_c
}
static void
-pdf_clean_type3(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie)
+pdf_clean_type3(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
pdf_process process, process2;
fz_buffer *buffer;
int num, i, l;
@@ -72,46 +70,46 @@ pdf_clean_type3(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *c
fz_try(ctx)
{
- res = pdf_dict_gets(obj, "Resources");
+ res = pdf_dict_gets(ctx, obj, "Resources");
if (res)
orig_res = res;
res = NULL;
- res = pdf_new_dict(doc, 1);
+ res = pdf_new_dict(ctx, doc, 1);
- charprocs = pdf_dict_gets(obj, "CharProcs");
- l = pdf_dict_len(charprocs);
+ charprocs = pdf_dict_gets(ctx, obj, "CharProcs");
+ l = pdf_dict_len(ctx, charprocs);
for (i = 0; i < l; i++)
{
- pdf_obj *key = pdf_dict_get_key(charprocs, i);
- pdf_obj *val = pdf_dict_get_val(charprocs, i);
+ pdf_obj *key = pdf_dict_get_key(ctx, charprocs, i);
+ pdf_obj *val = pdf_dict_get_val(ctx, charprocs, i);
buffer = fz_new_buffer(ctx, 1024);
- pdf_process_buffer(&process2, ctx, buffer);
- pdf_process_filter(&process, ctx, &process2, res);
+ pdf_init_process_buffer(ctx, &process2, buffer);
+ pdf_init_process_filter(ctx, &process, &process2, res);
- pdf_process_stream_object(doc, val, &process, orig_res, cookie);
+ pdf_process_stream_object(ctx, doc, val, &process, orig_res, cookie);
- num = pdf_to_num(val);
- pdf_dict_dels(val, "Filter");
- pdf_update_stream(doc, num, buffer);
- pdf_dict_put(charprocs, key, val);
+ num = pdf_to_num(ctx, val);
+ pdf_dict_dels(ctx, val, "Filter");
+ pdf_update_stream(ctx, doc, num, buffer);
+ pdf_dict_put(ctx, charprocs, key, val);
fz_drop_buffer(ctx, buffer);
buffer = NULL;
}
/* ProcSet - no cleaning possible. Inherit this from the old dict. */
- pdf_dict_puts(res, "ProcSet", pdf_dict_gets(orig_res, "ProcSet"));
+ pdf_dict_puts(ctx, res, "ProcSet", pdf_dict_gets(ctx, orig_res, "ProcSet"));
- ref = pdf_new_ref(doc, res);
- pdf_dict_puts(obj, "Resources", ref);
+ ref = pdf_new_ref(ctx, doc, res);
+ pdf_dict_puts(ctx, obj, "Resources", ref);
}
fz_always(ctx)
{
fz_drop_buffer(ctx, buffer);
- pdf_drop_obj(res);
- pdf_drop_obj(ref);
+ pdf_drop_obj(ctx, res);
+ pdf_drop_obj(ctx, ref);
}
fz_catch(ctx)
{
@@ -119,9 +117,8 @@ pdf_clean_type3(pdf_document *doc, pdf_obj *obj, pdf_obj *orig_res, fz_cookie *c
}
}
-void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cookie)
+void pdf_clean_page_contents(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
pdf_process process, process2;
fz_buffer *buffer = fz_new_buffer(ctx, 1024);
int num;
@@ -139,37 +136,37 @@ void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cooki
fz_try(ctx)
{
- res = pdf_new_dict(doc, 1);
+ res = pdf_new_dict(ctx, doc, 1);
- pdf_process_buffer(&process2, ctx, buffer);
- pdf_process_filter(&process, ctx, &process2, res);
+ pdf_init_process_buffer(ctx, &process2, buffer);
+ pdf_init_process_filter(ctx, &process, &process2, res);
- pdf_process_stream_object(doc, page->contents, &process, page->resources, cookie);
+ pdf_process_stream_object(ctx, doc, page->contents, &process, page->resources, cookie);
contents = page->contents;
- if (pdf_is_array(contents))
+ if (pdf_is_array(ctx, contents))
{
- int n = pdf_array_len(contents);
+ int n = pdf_array_len(ctx, contents);
int i;
for (i = n-1; i > 0; i--)
- pdf_array_delete(contents, i);
+ pdf_array_delete(ctx, contents, i);
/* We cannot rewrite the 0th entry of contents
* directly as it may occur in other pages content
* dictionaries too. We therefore clone it and make
* a new object reference. */
- new_obj = pdf_copy_dict(pdf_array_get(contents, 0));
- new_ref = pdf_new_ref(doc, new_obj);
- num = pdf_to_num(new_ref);
- pdf_array_put(contents, 0, new_ref);
- pdf_dict_dels(new_obj, "Filter");
+ new_obj = pdf_copy_dict(ctx, pdf_array_get(ctx, contents, 0));
+ new_ref = pdf_new_ref(ctx, doc, new_obj);
+ num = pdf_to_num(ctx, new_ref);
+ pdf_array_put(ctx, contents, 0, new_ref);
+ pdf_dict_dels(ctx, new_obj, "Filter");
}
else
{
- num = pdf_to_num(contents);
- pdf_dict_dels(contents, "Filter");
+ num = pdf_to_num(ctx, contents);
+ pdf_dict_dels(ctx, contents, "Filter");
}
- pdf_update_stream(doc, num, buffer);
+ pdf_update_stream(ctx, doc, num, buffer);
/* Now deal with resources. The spec allows for Type3 fonts and form
* XObjects to omit a resource dictionary and look in the parent.
@@ -177,104 +174,104 @@ void pdf_clean_page_contents(pdf_document *doc, pdf_page *page, fz_cookie *cooki
* conceivably cause changes in rendering, but we don't care. */
/* ExtGState */
- obj = pdf_dict_gets(res, "ExtGState");
+ obj = pdf_dict_gets(ctx, res, "ExtGState");
if (obj)
{
int i, l;
- l = pdf_dict_len(obj);
+ l = pdf_dict_len(ctx, obj);
for (i = 0; i < l; i++)
{
- pdf_obj *o = pdf_dict_gets(pdf_dict_get_val(obj, i), "SMask");
+ pdf_obj *o = pdf_dict_gets(ctx, pdf_dict_get_val(ctx, obj, i), "SMask");
if (!o)
continue;
- o = pdf_dict_gets(o, "G");
+ o = pdf_dict_gets(ctx, o, "G");
if (!o)
continue;
/* Transparency group XObject */
- pdf_clean_stream_object(doc, o, page->resources, cookie, 1);
+ pdf_clean_stream_object(ctx, doc, o, page->resources, cookie, 1);
}
}
/* ColorSpace - no cleaning possible */
/* Pattern */
- obj = pdf_dict_gets(res, "Pattern");
+ obj = pdf_dict_gets(ctx, res, "Pattern");
if (obj)
{
int i, l;
- l = pdf_dict_len(obj);
+ l = pdf_dict_len(ctx, obj);
for (i = 0; i < l; i++)
{
- pdf_obj *pat = pdf_dict_get_val(obj, i);
+ pdf_obj *pat = pdf_dict_get_val(ctx, obj, i);
if (!pat)
continue;
- if (pdf_to_int(pdf_dict_gets(pat, "PatternType")) == 1)
- pdf_clean_stream_object(doc, pat, page->resources, cookie, 0);
+ if (pdf_to_int(ctx, pdf_dict_gets(ctx, pat, "PatternType")) == 1)
+ pdf_clean_stream_object(ctx, doc, pat, page->resources, cookie, 0);
}
}
/* Shading - no cleaning possible */
/* XObject */
- obj = pdf_dict_gets(res, "XObject");
+ obj = pdf_dict_gets(ctx, res, "XObject");
if (obj)
{
int i, l;
- l = pdf_dict_len(obj);
+ l = pdf_dict_len(ctx, obj);
for (i = 0; i < l; i++)
{
- pdf_obj *xobj = pdf_dict_get_val(obj, i);
+ pdf_obj *xobj = pdf_dict_get_val(ctx, obj, i);
- if (strcmp(pdf_to_name(pdf_dict_gets(xobj, "Subtype")), "Form"))
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, xobj, "Subtype")), "Form"))
continue;
- pdf_clean_stream_object(doc, xobj, page->resources, cookie, 1);
+ pdf_clean_stream_object(ctx, doc, xobj, page->resources, cookie, 1);
}
}
/* Font */
- obj = pdf_dict_gets(res, "Font");
+ obj = pdf_dict_gets(ctx, res, "Font");
if (obj)
{
int i, l;
- l = pdf_dict_len(obj);
+ l = pdf_dict_len(ctx, obj);
for (i = 0; i < l; i++)
{
- pdf_obj *o = pdf_dict_get_val(obj, i);
+ pdf_obj *o = pdf_dict_get_val(ctx, obj, i);
- if (!strcmp(pdf_to_name(pdf_dict_gets(o, "Subtype")), "Type3"))
+ if (!strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, o, "Subtype")), "Type3"))
{
- pdf_clean_type3(doc, o, page->resources, cookie);
+ pdf_clean_type3(ctx, doc, o, page->resources, cookie);
}
}
}
/* ProcSet - no cleaning possible. Inherit this from the old dict. */
- obj = pdf_dict_gets(page->resources, "ProcSet");
+ obj = pdf_dict_gets(ctx, page->resources, "ProcSet");
if (obj)
- pdf_dict_puts(res, "ProcSet", obj);
+ pdf_dict_puts(ctx, res, "ProcSet", obj);
/* Properties - no cleaning possible. */
- pdf_drop_obj(page->resources);
- ref = pdf_new_ref(doc, res);
- page->resources = pdf_keep_obj(ref);
- pdf_dict_puts(page->me, "Resources", ref);
+ pdf_drop_obj(ctx, page->resources);
+ ref = pdf_new_ref(ctx, doc, res);
+ page->resources = pdf_keep_obj(ctx, ref);
+ pdf_dict_puts(ctx, page->me, "Resources", ref);
}
fz_always(ctx)
{
fz_drop_buffer(ctx, buffer);
- pdf_drop_obj(new_obj);
- pdf_drop_obj(new_ref);
- pdf_drop_obj(res);
- pdf_drop_obj(ref);
+ pdf_drop_obj(ctx, new_obj);
+ pdf_drop_obj(ctx, new_ref);
+ pdf_drop_obj(ctx, res);
+ pdf_drop_obj(ctx, ref);
}
fz_catch(ctx)
{
diff --git a/source/pdf/pdf-cmap-load.c b/source/pdf/pdf-cmap-load.c
index 2e431215..46338539 100644
--- a/source/pdf/pdf-cmap-load.c
+++ b/source/pdf/pdf-cmap-load.c
@@ -18,14 +18,13 @@ pdf_cmap_size(fz_context *ctx, pdf_cmap *cmap)
* Load CMap stream in PDF file
*/
pdf_cmap *
-pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *stmobj)
+pdf_load_embedded_cmap(fz_context *ctx, pdf_document *doc, pdf_obj *stmobj)
{
fz_stream *file = NULL;
pdf_cmap *cmap = NULL;
pdf_cmap *usecmap;
pdf_obj *wmode;
pdf_obj *obj = NULL;
- fz_context *ctx = doc->ctx;
int phase = 0;
fz_var(phase);
@@ -33,39 +32,39 @@ pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *stmobj)
fz_var(file);
fz_var(cmap);
- if (pdf_obj_marked(stmobj))
+ if (pdf_obj_marked(ctx, stmobj))
fz_throw(ctx, FZ_ERROR_GENERIC, "Recursion in embedded cmap");
- if ((cmap = pdf_find_item(ctx, pdf_free_cmap_imp, stmobj)) != NULL)
+ if ((cmap = pdf_find_item(ctx, pdf_drop_cmap_imp, stmobj)) != NULL)
{
return cmap;
}
fz_try(ctx)
{
- file = pdf_open_stream(doc, pdf_to_num(stmobj), pdf_to_gen(stmobj));
+ file = pdf_open_stream(ctx, doc, pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj));
phase = 1;
cmap = pdf_load_cmap(ctx, file);
phase = 2;
- fz_close(file);
+ fz_drop_stream(ctx, file);
file = NULL;
- wmode = pdf_dict_gets(stmobj, "WMode");
- if (pdf_is_int(wmode))
- pdf_set_cmap_wmode(ctx, cmap, pdf_to_int(wmode));
- obj = pdf_dict_gets(stmobj, "UseCMap");
- if (pdf_is_name(obj))
+ wmode = pdf_dict_gets(ctx, stmobj, "WMode");
+ if (pdf_is_int(ctx, wmode))
+ pdf_set_cmap_wmode(ctx, cmap, pdf_to_int(ctx, wmode));
+ obj = pdf_dict_gets(ctx, stmobj, "UseCMap");
+ if (pdf_is_name(ctx, obj))
{
- usecmap = pdf_load_system_cmap(ctx, pdf_to_name(obj));
+ usecmap = pdf_load_system_cmap(ctx, pdf_to_name(ctx, obj));
pdf_set_usecmap(ctx, cmap, usecmap);
pdf_drop_cmap(ctx, usecmap);
}
- else if (pdf_is_indirect(obj))
+ else if (pdf_is_indirect(ctx, obj))
{
phase = 3;
- pdf_mark_obj(obj);
- usecmap = pdf_load_embedded_cmap(doc, obj);
- pdf_unmark_obj(obj);
+ pdf_mark_obj(ctx, obj);
+ usecmap = pdf_load_embedded_cmap(ctx, doc, obj);
+ pdf_unmark_obj(ctx, obj);
phase = 4;
pdf_set_usecmap(ctx, cmap, usecmap);
pdf_drop_cmap(ctx, usecmap);
@@ -76,20 +75,20 @@ pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *stmobj)
fz_catch(ctx)
{
if (file)
- fz_close(file);
+ fz_drop_stream(ctx, file);
if (cmap)
pdf_drop_cmap(ctx, cmap);
if (phase < 1)
- fz_rethrow_message(ctx, "cannot open cmap stream (%d %d R)", pdf_to_num(stmobj), pdf_to_gen(stmobj));
+ fz_rethrow_message(ctx, "cannot open cmap stream (%d %d R)", pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj));
else if (phase < 2)
- fz_rethrow_message(ctx, "cannot parse cmap stream (%d %d R)", pdf_to_num(stmobj), pdf_to_gen(stmobj));
+ fz_rethrow_message(ctx, "cannot parse cmap stream (%d %d R)", pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj));
else if (phase < 3)
- fz_rethrow_message(ctx, "cannot load system usecmap '%s'", pdf_to_name(obj));
+ fz_rethrow_message(ctx, "cannot load system usecmap '%s'", pdf_to_name(ctx, obj));
else
{
if (phase == 3)
- pdf_unmark_obj(obj);
- fz_rethrow_message(ctx, "cannot load embedded usecmap (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ pdf_unmark_obj(ctx, obj);
+ fz_rethrow_message(ctx, "cannot load embedded usecmap (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
}
diff --git a/source/pdf/pdf-cmap-parse.c b/source/pdf/pdf-cmap-parse.c
index 361c512f..c502ffe5 100644
--- a/source/pdf/pdf-cmap-parse.c
+++ b/source/pdf/pdf-cmap-parse.c
@@ -18,7 +18,7 @@ pdf_parse_cmap_name(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
{
pdf_token tok;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_NAME)
fz_strlcpy(cmap->cmap_name, buf->scratch, sizeof(cmap->cmap_name));
@@ -31,7 +31,7 @@ pdf_parse_wmode(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf *bu
{
pdf_token tok;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_INT)
pdf_set_cmap_wmode(ctx, cmap, buf->i);
@@ -47,7 +47,7 @@ pdf_parse_codespace_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endcodespacerange"))
return;
@@ -55,7 +55,7 @@ pdf_parse_codespace_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_
else if (tok == PDF_TOK_STRING)
{
lo = pdf_code_from_string(buf->scratch, buf->len);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_STRING)
{
hi = pdf_code_from_string(buf->scratch, buf->len);
@@ -78,7 +78,7 @@ pdf_parse_cid_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endcidrange"))
return;
@@ -88,13 +88,13 @@ pdf_parse_cid_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
lo = pdf_code_from_string(buf->scratch, buf->len);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_STRING)
fz_throw(ctx, FZ_ERROR_GENERIC, "expected string");
hi = pdf_code_from_string(buf->scratch, buf->len);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_INT)
fz_throw(ctx, FZ_ERROR_GENERIC, "expected integer");
@@ -112,7 +112,7 @@ pdf_parse_cid_char(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endcidchar"))
return;
@@ -122,7 +122,7 @@ pdf_parse_cid_char(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
src = pdf_code_from_string(buf->scratch, buf->len);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_INT)
fz_throw(ctx, FZ_ERROR_GENERIC, "expected integer");
@@ -141,7 +141,7 @@ pdf_parse_bf_range_array(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_l
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_CLOSE_ARRAY)
return;
@@ -171,7 +171,7 @@ pdf_parse_bf_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endbfrange"))
return;
@@ -181,7 +181,7 @@ pdf_parse_bf_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
lo = pdf_code_from_string(buf->scratch, buf->len);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_STRING)
fz_throw(ctx, FZ_ERROR_GENERIC, "expected string");
@@ -192,7 +192,7 @@ pdf_parse_bf_range(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf
return;
}
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_STRING)
{
@@ -244,7 +244,7 @@ pdf_parse_bf_char(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf *
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "endbfchar"))
return;
@@ -254,7 +254,7 @@ pdf_parse_bf_char(fz_context *ctx, pdf_cmap *cmap, fz_stream *file, pdf_lexbuf *
src = pdf_code_from_string(buf->scratch, buf->len);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
/* Note: does not handle /dstName */
if (tok != PDF_TOK_STRING)
fz_throw(ctx, FZ_ERROR_GENERIC, "expected string");
@@ -286,7 +286,7 @@ pdf_load_cmap(fz_context *ctx, fz_stream *file)
{
while (1)
{
- tok = pdf_lex(file, &buf);
+ tok = pdf_lex(ctx, file, &buf);
if (tok == PDF_TOK_EOF)
break;
@@ -332,7 +332,7 @@ pdf_load_cmap(fz_context *ctx, fz_stream *file)
}
fz_always(ctx)
{
- pdf_lexbuf_fin(&buf);
+ pdf_lexbuf_fin(ctx, &buf);
}
fz_catch(ctx)
{
diff --git a/source/pdf/pdf-cmap.c b/source/pdf/pdf-cmap.c
index e9eb25b2..16167439 100644
--- a/source/pdf/pdf-cmap.c
+++ b/source/pdf/pdf-cmap.c
@@ -5,7 +5,7 @@
*/
void
-pdf_free_cmap_imp(fz_context *ctx, fz_storable *cmap_)
+pdf_drop_cmap_imp(fz_context *ctx, fz_storable *cmap_)
{
pdf_cmap *cmap = (pdf_cmap *)cmap_;
if (cmap->usecmap)
@@ -20,7 +20,7 @@ pdf_cmap *
pdf_new_cmap(fz_context *ctx)
{
pdf_cmap *cmap = fz_malloc_struct(ctx, pdf_cmap);
- FZ_INIT_STORABLE(cmap, 1, pdf_free_cmap_imp);
+ FZ_INIT_STORABLE(cmap, 1, pdf_drop_cmap_imp);
return cmap;
}
diff --git a/source/pdf/pdf-colorspace.c b/source/pdf/pdf-colorspace.c
index 4b250f6c..a58dc961 100644
--- a/source/pdf/pdf-colorspace.c
+++ b/source/pdf/pdf-colorspace.c
@@ -3,14 +3,13 @@
/* ICCBased */
static fz_colorspace *
-load_icc_based(pdf_document *doc, pdf_obj *dict)
+load_icc_based(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
int n;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
- n = pdf_to_int(pdf_dict_gets(dict, "N"));
- obj = pdf_dict_gets(dict, "Alternate");
+ n = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "N"));
+ obj = pdf_dict_gets(ctx, dict, "Alternate");
if (obj)
{
@@ -18,7 +17,7 @@ load_icc_based(pdf_document *doc, pdf_obj *dict)
fz_try(ctx)
{
- cs_alt = pdf_load_colorspace(doc, obj);
+ cs_alt = pdf_load_colorspace(ctx, doc, obj);
if (cs_alt->n != n)
{
fz_drop_colorspace(ctx, cs_alt);
@@ -84,7 +83,7 @@ rgb_to_lab(fz_context *ctx, fz_colorspace *cs, const float *rgb, float *lab)
lab[2] = rgb[2];
}
-static fz_colorspace k_device_lab = { {-1, fz_free_colorspace_imp}, 0, "Lab", 3, lab_to_rgb, rgb_to_lab };
+static fz_colorspace k_device_lab = { {-1, fz_drop_colorspace_imp}, 0, "Lab", 3, lab_to_rgb, rgb_to_lab };
static fz_colorspace *fz_device_lab = &k_device_lab;
/* Separation and DeviceN */
@@ -114,14 +113,13 @@ free_separation(fz_context *ctx, fz_colorspace *cs)
}
static fz_colorspace *
-load_separation(pdf_document *doc, pdf_obj *array)
+load_separation(fz_context *ctx, pdf_document *doc, pdf_obj *array)
{
fz_colorspace *cs;
struct separation *sep = NULL;
- fz_context *ctx = doc->ctx;
- pdf_obj *nameobj = pdf_array_get(array, 1);
- pdf_obj *baseobj = pdf_array_get(array, 2);
- pdf_obj *tintobj = pdf_array_get(array, 3);
+ pdf_obj *nameobj = pdf_array_get(ctx, array, 1);
+ pdf_obj *baseobj = pdf_array_get(ctx, array, 2);
+ pdf_obj *tintobj = pdf_array_get(ctx, array, 3);
fz_colorspace *base;
fz_function *tint = NULL;
int n;
@@ -129,21 +127,21 @@ load_separation(pdf_document *doc, pdf_obj *array)
fz_var(tint);
fz_var(sep);
- if (pdf_is_array(nameobj))
- n = pdf_array_len(nameobj);
+ if (pdf_is_array(ctx, nameobj))
+ n = pdf_array_len(ctx, nameobj);
else
n = 1;
if (n > FZ_MAX_COLORS)
fz_throw(ctx, FZ_ERROR_GENERIC, "too many components in colorspace");
- base = pdf_load_colorspace(doc, baseobj);
+ base = pdf_load_colorspace(ctx, doc, baseobj);
fz_try(ctx)
{
- tint = pdf_load_function(doc, tintobj, n, base->n);
+ tint = pdf_load_function(ctx, doc, tintobj, n, base->n);
/* RJW: fz_drop_colorspace(ctx, base);
- * "cannot load tint function (%d %d R)", pdf_to_num(tintobj), pdf_to_gen(tintobj) */
+ * "cannot load tint function (%d %d R)", pdf_to_num(ctx, tintobj), pdf_to_gen(ctx, tintobj) */
sep = fz_malloc_struct(ctx, struct separation);
sep->base = base;
@@ -153,7 +151,7 @@ load_separation(pdf_document *doc, pdf_obj *array)
cs->to_rgb = separation_to_rgb;
cs->free_data = free_separation;
cs->data = sep;
- cs->size += sizeof(struct separation) + (base ? base->size : 0) + fz_function_size(tint);
+ cs->size += sizeof(struct separation) + (base ? base->size : 0) + fz_function_size(ctx, tint);
}
fz_catch(ctx)
{
@@ -167,7 +165,7 @@ load_separation(pdf_document *doc, pdf_obj *array)
}
int
-pdf_is_tint_colorspace(fz_colorspace *cs)
+pdf_is_tint_colorspace(fz_context *ctx, fz_colorspace *cs)
{
return cs && cs->to_rgb == separation_to_rgb;
}
@@ -175,12 +173,11 @@ pdf_is_tint_colorspace(fz_colorspace *cs)
/* Indexed */
static fz_colorspace *
-load_indexed(pdf_document *doc, pdf_obj *array)
+load_indexed(fz_context *ctx, pdf_document *doc, pdf_obj *array)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *baseobj = pdf_array_get(array, 1);
- pdf_obj *highobj = pdf_array_get(array, 2);
- pdf_obj *lookupobj = pdf_array_get(array, 3);
+ pdf_obj *baseobj = pdf_array_get(ctx, array, 1);
+ pdf_obj *highobj = pdf_array_get(ctx, array, 2);
+ pdf_obj *lookupobj = pdf_array_get(ctx, array, 3);
fz_colorspace *base = NULL;
fz_colorspace *cs;
int i, n, high;
@@ -191,20 +188,20 @@ load_indexed(pdf_document *doc, pdf_obj *array)
fz_try(ctx)
{
- base = pdf_load_colorspace(doc, baseobj);
+ base = pdf_load_colorspace(ctx, doc, baseobj);
- high = pdf_to_int(highobj);
+ high = pdf_to_int(ctx, highobj);
high = fz_clampi(high, 0, 255);
n = base->n * (high + 1);
lookup = fz_malloc_array(ctx, 1, n);
- if (pdf_is_string(lookupobj) && pdf_to_str_len(lookupobj) >= n)
+ if (pdf_is_string(ctx, lookupobj) && pdf_to_str_len(ctx, lookupobj) >= n)
{
- unsigned char *buf = (unsigned char *) pdf_to_str_buf(lookupobj);
+ unsigned char *buf = (unsigned char *) pdf_to_str_buf(ctx, lookupobj);
for (i = 0; i < n; i++)
lookup[i] = buf[i];
}
- else if (pdf_is_indirect(lookupobj))
+ else if (pdf_is_indirect(ctx, lookupobj))
{
fz_stream *file = NULL;
@@ -212,18 +209,18 @@ load_indexed(pdf_document *doc, pdf_obj *array)
fz_try(ctx)
{
- file = pdf_open_stream(doc, pdf_to_num(lookupobj), pdf_to_gen(lookupobj));
- i = fz_read(file, lookup, n);
+ file = pdf_open_stream(ctx, doc, pdf_to_num(ctx, lookupobj), pdf_to_gen(ctx, lookupobj));
+ i = fz_read(ctx, file, lookup, n);
if (i < n)
memset(lookup+i, 0, n-i);
}
fz_always(ctx)
{
- fz_close(file);
+ fz_drop_stream(ctx, file);
}
fz_catch(ctx)
{
- fz_rethrow_message(ctx, "cannot open colorspace lookup table (%d 0 R)", pdf_to_num(lookupobj));
+ fz_rethrow_message(ctx, "cannot open colorspace lookup table (%d 0 R)", pdf_to_num(ctx, lookupobj));
}
}
else
@@ -246,16 +243,15 @@ load_indexed(pdf_document *doc, pdf_obj *array)
/* Parse and create colorspace from PDF object */
static fz_colorspace *
-pdf_load_colorspace_imp(pdf_document *doc, pdf_obj *obj)
+pdf_load_colorspace_imp(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
- if (pdf_obj_marked(obj))
+ if (pdf_obj_marked(ctx, obj))
fz_throw(ctx, FZ_ERROR_GENERIC, "Recursion in colorspace definition");
- if (pdf_is_name(obj))
+ if (pdf_is_name(ctx, obj))
{
- const char *str = pdf_to_name(obj);
+ const char *str = pdf_to_name(ctx, obj);
if (!strcmp(str, "Pattern"))
return fz_device_gray(ctx);
else if (!strcmp(str, "G"))
@@ -271,15 +267,15 @@ pdf_load_colorspace_imp(pdf_document *doc, pdf_obj *obj)
else if (!strcmp(str, "DeviceCMYK"))
return fz_device_cmyk(ctx);
else
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown colorspace: %s", pdf_to_name(obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown colorspace: %s", pdf_to_name(ctx, obj));
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
- pdf_obj *name = pdf_array_get(obj, 0);
- const char *str = pdf_to_name(name);
+ pdf_obj *name = pdf_array_get(ctx, obj, 0);
+ const char *str = pdf_to_name(ctx, name);
- if (pdf_is_name(name))
+ if (pdf_is_name(ctx, name))
{
/* load base colorspace instead */
if (!strcmp(str, "G"))
@@ -307,39 +303,39 @@ pdf_load_colorspace_imp(pdf_document *doc, pdf_obj *obj)
fz_colorspace *cs;
fz_try(ctx)
{
- pdf_mark_obj(obj);
+ pdf_mark_obj(ctx, obj);
if (!strcmp(str, "ICCBased"))
- cs = load_icc_based(doc, pdf_array_get(obj, 1));
+ cs = load_icc_based(ctx, doc, pdf_array_get(ctx, obj, 1));
else if (!strcmp(str, "Indexed"))
- cs = load_indexed(doc, obj);
+ cs = load_indexed(ctx, doc, obj);
else if (!strcmp(str, "I"))
- cs = load_indexed(doc, obj);
+ cs = load_indexed(ctx, doc, obj);
else if (!strcmp(str, "Separation"))
- cs = load_separation(doc, obj);
+ cs = load_separation(ctx, doc, obj);
else if (!strcmp(str, "DeviceN"))
- cs = load_separation(doc, obj);
+ cs = load_separation(ctx, doc, obj);
else if (!strcmp(str, "Pattern"))
{
pdf_obj *pobj;
- pobj = pdf_array_get(obj, 1);
+ pobj = pdf_array_get(ctx, obj, 1);
if (!pobj)
{
cs = fz_device_gray(ctx);
break;
}
- cs = pdf_load_colorspace(doc, pobj);
+ cs = pdf_load_colorspace(ctx, doc, pobj);
}
else
fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: unknown colorspace %s", str);
}
fz_always(ctx)
{
- pdf_unmark_obj(obj);
+ pdf_unmark_obj(ctx, obj);
}
fz_catch(ctx)
{
@@ -350,21 +346,20 @@ pdf_load_colorspace_imp(pdf_document *doc, pdf_obj *obj)
}
}
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "syntaxerror: could not parse color space (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: could not parse color space (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
fz_colorspace *
-pdf_load_colorspace(pdf_document *doc, pdf_obj *obj)
+pdf_load_colorspace(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
fz_colorspace *cs;
- if ((cs = pdf_find_item(ctx, fz_free_colorspace_imp, obj)) != NULL)
+ if ((cs = pdf_find_item(ctx, fz_drop_colorspace_imp, obj)) != NULL)
{
return cs;
}
- cs = pdf_load_colorspace_imp(doc, obj);
+ cs = pdf_load_colorspace_imp(ctx, doc, obj);
pdf_store_item(ctx, obj, cs, cs->size);
diff --git a/source/pdf/pdf-crypt.c b/source/pdf/pdf-crypt.c
index d502c378..4519657f 100644
--- a/source/pdf/pdf-crypt.c
+++ b/source/pdf/pdf-crypt.c
@@ -55,33 +55,33 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
/* Common to all security handlers (PDF 1.7 table 3.18) */
- obj = pdf_dict_gets(dict, "Filter");
- if (!pdf_is_name(obj))
+ obj = pdf_dict_gets(ctx, dict, "Filter");
+ if (!pdf_is_name(ctx, obj))
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "unspecified encryption handler");
}
- if (strcmp(pdf_to_name(obj), "Standard") != 0)
+ if (strcmp(pdf_to_name(ctx, obj), "Standard") != 0)
{
- pdf_free_crypt(ctx, crypt);
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown encryption handler: '%s'", pdf_to_name(obj));
+ pdf_drop_crypt(ctx, crypt);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown encryption handler: '%s'", pdf_to_name(ctx, obj));
}
crypt->v = 0;
- obj = pdf_dict_gets(dict, "V");
- if (pdf_is_int(obj))
- crypt->v = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "V");
+ if (pdf_is_int(ctx, obj))
+ crypt->v = pdf_to_int(ctx, obj);
if (crypt->v != 1 && crypt->v != 2 && crypt->v != 4 && crypt->v != 5)
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "unknown encryption version");
}
/* Standard security handler (PDF 1.7 table 3.19) */
- obj = pdf_dict_gets(dict, "R");
- if (pdf_is_int(obj))
- crypt->r = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "R");
+ if (pdf_is_int(ctx, obj))
+ crypt->r = pdf_to_int(ctx, obj);
else if (crypt->v <= 4)
{
fz_warn(ctx, "encryption dictionary missing revision value, guessing...");
@@ -94,48 +94,48 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
}
else
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing version and revision value");
}
if (crypt->r < 1 || crypt->r > 6)
{
int r = crypt->r;
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "unknown crypt revision %d", r);
}
- obj = pdf_dict_gets(dict, "O");
- if (pdf_is_string(obj) && pdf_to_str_len(obj) == 32)
- memcpy(crypt->o, pdf_to_str_buf(obj), 32);
+ obj = pdf_dict_gets(ctx, dict, "O");
+ if (pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) == 32)
+ memcpy(crypt->o, pdf_to_str_buf(ctx, obj), 32);
/* /O and /U are supposed to be 48 bytes long for revision 5 and 6, they're often longer, though */
- else if (crypt->r >= 5 && pdf_is_string(obj) && pdf_to_str_len(obj) >= 48)
- memcpy(crypt->o, pdf_to_str_buf(obj), 48);
+ else if (crypt->r >= 5 && pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) >= 48)
+ memcpy(crypt->o, pdf_to_str_buf(ctx, obj), 48);
else
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing owner password");
}
- obj = pdf_dict_gets(dict, "U");
- if (pdf_is_string(obj) && pdf_to_str_len(obj) == 32)
- memcpy(crypt->u, pdf_to_str_buf(obj), 32);
+ obj = pdf_dict_gets(ctx, dict, "U");
+ if (pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) == 32)
+ memcpy(crypt->u, pdf_to_str_buf(ctx, obj), 32);
/* /O and /U are supposed to be 48 bytes long for revision 5 and 6, they're often longer, though */
- else if (crypt->r >= 5 && pdf_is_string(obj) && pdf_to_str_len(obj) >= 48)
- memcpy(crypt->u, pdf_to_str_buf(obj), 48);
- else if (pdf_is_string(obj) && pdf_to_str_len(obj) < 32)
+ else if (crypt->r >= 5 && pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) >= 48)
+ memcpy(crypt->u, pdf_to_str_buf(ctx, obj), 48);
+ else if (pdf_is_string(ctx, obj) && pdf_to_str_len(ctx, obj) < 32)
{
- fz_warn(ctx, "encryption password key too short (%d)", pdf_to_str_len(obj));
- memcpy(crypt->u, pdf_to_str_buf(obj), pdf_to_str_len(obj));
+ fz_warn(ctx, "encryption password key too short (%d)", pdf_to_str_len(ctx, obj));
+ memcpy(crypt->u, pdf_to_str_buf(ctx, obj), pdf_to_str_len(ctx, obj));
}
else
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing user password");
}
- obj = pdf_dict_gets(dict, "P");
- if (pdf_is_int(obj))
- crypt->p = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "P");
+ if (pdf_is_int(ctx, obj))
+ crypt->p = pdf_to_int(ctx, obj);
else
{
fz_warn(ctx, "encryption dictionary missing permissions");
@@ -144,35 +144,35 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
if (crypt->r == 5 || crypt->r == 6)
{
- obj = pdf_dict_gets(dict, "OE");
- if (!pdf_is_string(obj) || pdf_to_str_len(obj) != 32)
+ obj = pdf_dict_gets(ctx, dict, "OE");
+ if (!pdf_is_string(ctx, obj) || pdf_to_str_len(ctx, obj) != 32)
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing owner encryption key");
}
- memcpy(crypt->oe, pdf_to_str_buf(obj), 32);
+ memcpy(crypt->oe, pdf_to_str_buf(ctx, obj), 32);
- obj = pdf_dict_gets(dict, "UE");
- if (!pdf_is_string(obj) || pdf_to_str_len(obj) != 32)
+ obj = pdf_dict_gets(ctx, dict, "UE");
+ if (!pdf_is_string(ctx, obj) || pdf_to_str_len(ctx, obj) != 32)
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "encryption dictionary missing user encryption key");
}
- memcpy(crypt->ue, pdf_to_str_buf(obj), 32);
+ memcpy(crypt->ue, pdf_to_str_buf(ctx, obj), 32);
}
crypt->encrypt_metadata = 1;
- obj = pdf_dict_gets(dict, "EncryptMetadata");
- if (pdf_is_bool(obj))
- crypt->encrypt_metadata = pdf_to_bool(obj);
+ obj = pdf_dict_gets(ctx, dict, "EncryptMetadata");
+ if (pdf_is_bool(ctx, obj))
+ crypt->encrypt_metadata = pdf_to_bool(ctx, obj);
/* Extract file identifier string */
- if (pdf_is_array(id) && pdf_array_len(id) == 2)
+ if (pdf_is_array(ctx, id) && pdf_array_len(ctx, id) == 2)
{
- obj = pdf_array_get(id, 0);
- if (pdf_is_string(obj))
- crypt->id = pdf_keep_obj(obj);
+ obj = pdf_array_get(ctx, id, 0);
+ if (pdf_is_string(ctx, obj))
+ crypt->id = pdf_keep_obj(ctx, obj);
}
else
fz_warn(ctx, "missing file identifier, may not be able to do decryption");
@@ -182,9 +182,9 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
crypt->length = 40;
if (crypt->v == 2 || crypt->v == 4)
{
- obj = pdf_dict_gets(dict, "Length");
- if (pdf_is_int(obj))
- crypt->length = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "Length");
+ if (pdf_is_int(ctx, obj))
+ crypt->length = pdf_to_int(ctx, obj);
/* work-around for pdf generators that assume length is in bytes */
if (crypt->length < 40)
@@ -192,12 +192,12 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
if (crypt->length % 8 != 0)
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "invalid encryption key length");
}
if (crypt->length < 40 || crypt->length > 128)
{
- pdf_free_crypt(ctx, crypt);
+ pdf_drop_crypt(ctx, crypt);
fz_throw(ctx, FZ_ERROR_GENERIC, "invalid encryption key length");
}
}
@@ -222,10 +222,10 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
crypt->strf.method = PDF_CRYPT_NONE;
crypt->strf.length = crypt->length;
- obj = pdf_dict_gets(dict, "CF");
- if (pdf_is_dict(obj))
+ obj = pdf_dict_gets(ctx, dict, "CF");
+ if (pdf_is_dict(ctx, obj))
{
- crypt->cf = pdf_keep_obj(obj);
+ crypt->cf = pdf_keep_obj(ctx, obj);
}
else
{
@@ -234,18 +234,18 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
fz_try(ctx)
{
- obj = pdf_dict_gets(dict, "StmF");
- if (pdf_is_name(obj))
- pdf_parse_crypt_filter(ctx, &crypt->stmf, crypt, pdf_to_name(obj));
+ obj = pdf_dict_gets(ctx, dict, "StmF");
+ if (pdf_is_name(ctx, obj))
+ pdf_parse_crypt_filter(ctx, &crypt->stmf, crypt, pdf_to_name(ctx, obj));
- obj = pdf_dict_gets(dict, "StrF");
- if (pdf_is_name(obj))
- pdf_parse_crypt_filter(ctx, &crypt->strf, crypt, pdf_to_name(obj));
+ obj = pdf_dict_gets(ctx, dict, "StrF");
+ if (pdf_is_name(ctx, obj))
+ pdf_parse_crypt_filter(ctx, &crypt->strf, crypt, pdf_to_name(ctx, obj));
}
fz_catch(ctx)
{
- pdf_free_crypt(ctx, crypt);
- fz_rethrow_message(ctx, "cannot parse string crypt filter (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ pdf_drop_crypt(ctx, crypt);
+ fz_rethrow_message(ctx, "cannot parse string crypt filter (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
/* in crypt revision 4, the crypt filter determines the key length */
@@ -257,10 +257,10 @@ pdf_new_crypt(fz_context *ctx, pdf_obj *dict, pdf_obj *id)
}
void
-pdf_free_crypt(fz_context *ctx, pdf_crypt *crypt)
+pdf_drop_crypt(fz_context *ctx, pdf_crypt *crypt)
{
- pdf_drop_obj(crypt->id);
- pdf_drop_obj(crypt->cf);
+ pdf_drop_obj(ctx, crypt->id);
+ pdf_drop_obj(ctx, crypt->cf);
fz_free(ctx, crypt);
}
@@ -277,7 +277,7 @@ pdf_parse_crypt_filter(fz_context *ctx, pdf_crypt_filter *cf, pdf_crypt *crypt,
int is_stdcf = (!is_identity && (strcmp(name, "StdCF") == 0));
if (!is_identity && !is_stdcf)
- fz_throw(ctx, FZ_ERROR_GENERIC, "Crypt Filter not Identity or StdCF (%d %d R)", pdf_to_num(crypt->cf), pdf_to_gen(crypt->cf));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Crypt Filter not Identity or StdCF (%d %d R)", pdf_to_num(ctx, crypt->cf), pdf_to_gen(ctx, crypt->cf));
cf->method = PDF_CRYPT_NONE;
cf->length = crypt->length;
@@ -288,28 +288,28 @@ pdf_parse_crypt_filter(fz_context *ctx, pdf_crypt_filter *cf, pdf_crypt *crypt,
return;
}
- dict = pdf_dict_gets(crypt->cf, name);
- if (!pdf_is_dict(dict))
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse crypt filter (%d %d R)", pdf_to_num(crypt->cf), pdf_to_gen(crypt->cf));
+ dict = pdf_dict_gets(ctx, crypt->cf, name);
+ if (!pdf_is_dict(ctx, dict))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse crypt filter (%d %d R)", pdf_to_num(ctx, crypt->cf), pdf_to_gen(ctx, crypt->cf));
- obj = pdf_dict_gets(dict, "CFM");
- if (pdf_is_name(obj))
+ obj = pdf_dict_gets(ctx, dict, "CFM");
+ if (pdf_is_name(ctx, obj))
{
- if (!strcmp(pdf_to_name(obj), "None"))
+ if (!strcmp(pdf_to_name(ctx, obj), "None"))
cf->method = PDF_CRYPT_NONE;
- else if (!strcmp(pdf_to_name(obj), "V2"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "V2"))
cf->method = PDF_CRYPT_RC4;
- else if (!strcmp(pdf_to_name(obj), "AESV2"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "AESV2"))
cf->method = PDF_CRYPT_AESV2;
- else if (!strcmp(pdf_to_name(obj), "AESV3"))
+ else if (!strcmp(pdf_to_name(ctx, obj), "AESV3"))
cf->method = PDF_CRYPT_AESV3;
else
- fz_warn(ctx, "unknown encryption method: %s", pdf_to_name(obj));
+ fz_warn(ctx, "unknown encryption method: %s", pdf_to_name(ctx, obj));
}
- obj = pdf_dict_gets(dict, "Length");
- if (pdf_is_int(obj))
- cf->length = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "Length");
+ if (pdf_is_int(ctx, obj))
+ cf->length = pdf_to_int(ctx, obj);
/* the length for crypt filters is supposed to be in bytes not bits */
if (cf->length < 40)
@@ -338,7 +338,7 @@ static const unsigned char padding[32] =
};
static void
-pdf_compute_encryption_key(pdf_crypt *crypt, unsigned char *password, int pwlen, unsigned char *key)
+pdf_compute_encryption_key(fz_context *ctx, pdf_crypt *crypt, unsigned char *password, int pwlen, unsigned char *key)
{
unsigned char buf[32];
unsigned int p;
@@ -369,7 +369,7 @@ pdf_compute_encryption_key(pdf_crypt *crypt, unsigned char *password, int pwlen,
fz_md5_update(&md5, buf, 4);
/* Step 5 - pass first element of ID array */
- fz_md5_update(&md5, (unsigned char *)pdf_to_str_buf(crypt->id), pdf_to_str_len(crypt->id));
+ fz_md5_update(&md5, (unsigned char *)pdf_to_str_buf(ctx, crypt->id), pdf_to_str_len(ctx, crypt->id));
/* Step 6 (revision 4 or greater) - if metadata is not encrypted pass 0xFFFFFFFF */
if (crypt->r >= 4)
@@ -558,7 +558,7 @@ pdf_compute_user_password(fz_context *ctx, pdf_crypt *crypt, unsigned char *pass
{
fz_arc4 arc4;
- pdf_compute_encryption_key(crypt, password, pwlen, crypt->key);
+ pdf_compute_encryption_key(ctx, crypt, password, pwlen, crypt->key);
fz_arc4_init(&arc4, crypt->key, crypt->length / 8);
fz_arc4_encrypt(&arc4, output, padding, 32);
}
@@ -573,11 +573,11 @@ pdf_compute_user_password(fz_context *ctx, pdf_crypt *crypt, unsigned char *pass
n = crypt->length / 8;
- pdf_compute_encryption_key(crypt, password, pwlen, crypt->key);
+ pdf_compute_encryption_key(ctx, crypt, password, pwlen, crypt->key);
fz_md5_init(&md5);
fz_md5_update(&md5, padding, 32);
- fz_md5_update(&md5, (unsigned char*)pdf_to_str_buf(crypt->id), pdf_to_str_len(crypt->id));
+ fz_md5_update(&md5, (unsigned char*)pdf_to_str_buf(ctx, crypt->id), pdf_to_str_len(ctx, crypt->id));
fz_md5_final(&md5, digest);
fz_arc4_init(&arc4, crypt->key, n);
@@ -730,7 +730,7 @@ static void pdf_saslprep_from_utf8(char *password, const char *utf8, int n)
}
int
-pdf_authenticate_password(pdf_document *doc, const char *pwd_utf8)
+pdf_authenticate_password(fz_context *ctx, pdf_document *doc, const char *pwd_utf8)
{
char password[2048];
@@ -745,9 +745,9 @@ pdf_authenticate_password(pdf_document *doc, const char *pwd_utf8)
pdf_saslprep_from_utf8(password, pwd_utf8, sizeof password);
}
- if (pdf_authenticate_user_password(doc->ctx, doc->crypt, (unsigned char *)password, strlen(password)))
+ if (pdf_authenticate_user_password(ctx, doc->crypt, (unsigned char *)password, strlen(password)))
return 1;
- if (pdf_authenticate_owner_password(doc->ctx, doc->crypt, (unsigned char *)password, strlen(password)))
+ if (pdf_authenticate_owner_password(ctx, doc->crypt, (unsigned char *)password, strlen(password)))
return 1;
return 0;
}
@@ -755,17 +755,17 @@ pdf_authenticate_password(pdf_document *doc, const char *pwd_utf8)
}
int
-pdf_needs_password(pdf_document *doc)
+pdf_needs_password(fz_context *ctx, pdf_document *doc)
{
if (!doc->crypt)
return 0;
- if (pdf_authenticate_password(doc, ""))
+ if (pdf_authenticate_password(ctx, doc, ""))
return 0;
return 1;
}
int
-pdf_has_permission(pdf_document *doc, int p)
+pdf_has_permission(fz_context *ctx, pdf_document *doc, int p)
{
if (!doc->crypt)
return 1;
@@ -773,7 +773,7 @@ pdf_has_permission(pdf_document *doc, int p)
}
unsigned char *
-pdf_crypt_key(pdf_document *doc)
+pdf_crypt_key(fz_context *ctx, pdf_document *doc)
{
if (doc->crypt)
return doc->crypt->key;
@@ -781,14 +781,14 @@ pdf_crypt_key(pdf_document *doc)
}
int
-pdf_crypt_version(pdf_document *doc)
+pdf_crypt_version(fz_context *ctx, pdf_document *doc)
{
if (doc->crypt)
return doc->crypt->v;
return 0;
}
-int pdf_crypt_revision(pdf_document *doc)
+int pdf_crypt_revision(fz_context *ctx, pdf_document *doc)
{
if (doc->crypt)
return doc->crypt->r;
@@ -796,7 +796,7 @@ int pdf_crypt_revision(pdf_document *doc)
}
char *
-pdf_crypt_method(pdf_document *doc)
+pdf_crypt_method(fz_context *ctx, pdf_document *doc)
{
if (doc->crypt)
{
@@ -813,7 +813,7 @@ pdf_crypt_method(pdf_document *doc)
}
int
-pdf_crypt_length(pdf_document *doc)
+pdf_crypt_length(fz_context *ctx, pdf_document *doc)
{
if (doc->crypt)
return doc->crypt->length;
@@ -878,13 +878,13 @@ pdf_crypt_obj_imp(fz_context *ctx, pdf_crypt *crypt, pdf_obj *obj, unsigned char
unsigned char *s;
int i, n;
- if (pdf_is_indirect(obj))
+ if (pdf_is_indirect(ctx, obj))
return;
- if (pdf_is_string(obj))
+ if (pdf_is_string(ctx, obj))
{
- s = (unsigned char *)pdf_to_str_buf(obj);
- n = pdf_to_str_len(obj);
+ s = (unsigned char *)pdf_to_str_buf(ctx, obj);
+ n = pdf_to_str_len(ctx, obj);
if (crypt->strf.method == PDF_CRYPT_RC4)
{
@@ -913,26 +913,26 @@ pdf_crypt_obj_imp(fz_context *ctx, pdf_crypt *crypt, pdf_obj *obj, unsigned char
if (s[n - 17] < 1 || s[n - 17] > 16)
fz_warn(ctx, "aes padding out of range");
else
- pdf_set_str_len(obj, n - 16 - s[n - 17]);
+ pdf_set_str_len(ctx, obj, n - 16 - s[n - 17]);
}
}
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
- n = pdf_array_len(obj);
+ n = pdf_array_len(ctx, obj);
for (i = 0; i < n; i++)
{
- pdf_crypt_obj_imp(ctx, crypt, pdf_array_get(obj, i), key, keylen);
+ pdf_crypt_obj_imp(ctx, crypt, pdf_array_get(ctx, obj, i), key, keylen);
}
}
- else if (pdf_is_dict(obj))
+ else if (pdf_is_dict(ctx, obj))
{
- n = pdf_dict_len(obj);
+ n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
{
- pdf_crypt_obj_imp(ctx, crypt, pdf_dict_get_val(obj, i), key, keylen);
+ pdf_crypt_obj_imp(ctx, crypt, pdf_dict_get_val(ctx, obj, i), key, keylen);
}
}
}
@@ -954,7 +954,7 @@ pdf_crypt_obj(fz_context *ctx, pdf_crypt *crypt, pdf_obj *obj, int num, int gen)
* Create filter suitable for de/encrypting a stream.
*/
static fz_stream *
-pdf_open_crypt_imp(fz_stream *chain, pdf_crypt *crypt, pdf_crypt_filter *stmf, int num, int gen)
+pdf_open_crypt_imp(fz_context *ctx, fz_stream *chain, pdf_crypt *crypt, pdf_crypt_filter *stmf, int num, int gen)
{
unsigned char key[32];
int len;
@@ -962,34 +962,34 @@ pdf_open_crypt_imp(fz_stream *chain, pdf_crypt *crypt, pdf_crypt_filter *stmf, i
len = pdf_compute_object_key(crypt, stmf, num, gen, key, 32);
if (stmf->method == PDF_CRYPT_RC4)
- return fz_open_arc4(chain, key, len);
+ return fz_open_arc4(ctx, chain, key, len);
if (stmf->method == PDF_CRYPT_AESV2 || stmf->method == PDF_CRYPT_AESV3)
- return fz_open_aesd(chain, key, len);
+ return fz_open_aesd(ctx, chain, key, len);
- return fz_open_copy(chain);
+ return fz_open_copy(ctx, chain);
}
fz_stream *
-pdf_open_crypt(fz_stream *chain, pdf_crypt *crypt, int num, int gen)
+pdf_open_crypt(fz_context *ctx, fz_stream *chain, pdf_crypt *crypt, int num, int gen)
{
- return pdf_open_crypt_imp(chain, crypt, &crypt->stmf, num, gen);
+ return pdf_open_crypt_imp(ctx, chain, crypt, &crypt->stmf, num, gen);
}
fz_stream *
-pdf_open_crypt_with_filter(fz_stream *chain, pdf_crypt *crypt, char *name, int num, int gen)
+pdf_open_crypt_with_filter(fz_context *ctx, fz_stream *chain, pdf_crypt *crypt, char *name, int num, int gen)
{
if (strcmp(name, "Identity"))
{
pdf_crypt_filter cf;
- pdf_parse_crypt_filter(chain->ctx, &cf, crypt, name);
- return pdf_open_crypt_imp(chain, crypt, &cf, num, gen);
+ pdf_parse_crypt_filter(ctx, &cf, crypt, name);
+ return pdf_open_crypt_imp(ctx, chain, crypt, &cf, num, gen);
}
return chain;
}
#ifndef NDEBUG
-void pdf_print_crypt(pdf_crypt *crypt)
+void pdf_print_crypt(fz_context *ctx, pdf_crypt *crypt)
{
int i;
diff --git a/source/pdf/pdf-device.c b/source/pdf/pdf-device.c
index 139c4363..b5db7e3a 100644
--- a/source/pdf/pdf-device.c
+++ b/source/pdf/pdf-device.c
@@ -16,7 +16,7 @@ struct gstate_s
* they are recorded here as they are fundamentally intertwined with
* the push/pulling of the gstates. */
fz_buffer *buf;
- void (*on_pop)(pdf_device*,void *);
+ void (*on_pop)(fz_context*,pdf_device*,void *);
void *on_pop_arg;
/* The graphics state proper */
fz_colorspace *colorspace[2];
@@ -72,7 +72,8 @@ struct group_entry_s
struct pdf_device_s
{
- fz_context *ctx;
+ fz_device super;
+
pdf_document *doc;
pdf_obj *contents;
pdf_obj *resources;
@@ -108,9 +109,8 @@ struct pdf_device_s
/* Helper functions */
static int
-send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
+send_image(fz_context *ctx, pdf_device *pdev, fz_image *image, int mask, int smask)
{
- fz_context *ctx = pdev->ctx;
fz_pixmap *pixmap = NULL;
pdf_obj *imobj = NULL;
pdf_obj *imref = NULL;
@@ -197,21 +197,21 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
memcpy(pdev->images[num].digest,digest,16);
pdev->images[num].ref = NULL; /* Will be filled in later */
- imobj = pdf_new_dict(doc, 3);
- pdf_dict_puts_drop(imobj, "Type", pdf_new_name(doc, "XObject"));
- pdf_dict_puts_drop(imobj, "Subtype", pdf_new_name(doc, "Image"));
- pdf_dict_puts_drop(imobj, "Width", pdf_new_int(doc, image->w));
- pdf_dict_puts_drop(imobj, "Height", pdf_new_int(doc, image->h));
+ imobj = pdf_new_dict(ctx, doc, 3);
+ pdf_dict_puts_drop(ctx, imobj, "Type", pdf_new_name(ctx, doc, "XObject"));
+ pdf_dict_puts_drop(ctx, imobj, "Subtype", pdf_new_name(ctx, doc, "Image"));
+ pdf_dict_puts_drop(ctx, imobj, "Width", pdf_new_int(ctx, doc, image->w));
+ pdf_dict_puts_drop(ctx, imobj, "Height", pdf_new_int(ctx, doc, image->h));
if (mask)
{}
else if (!colorspace || colorspace->n == 1)
- pdf_dict_puts_drop(imobj, "ColorSpace", pdf_new_name(doc, "DeviceGray"));
+ pdf_dict_puts_drop(ctx, imobj, "ColorSpace", pdf_new_name(ctx, doc, "DeviceGray"));
else if (colorspace->n == 3)
- pdf_dict_puts_drop(imobj, "ColorSpace", pdf_new_name(doc, "DeviceRGB"));
+ pdf_dict_puts_drop(ctx, imobj, "ColorSpace", pdf_new_name(ctx, doc, "DeviceRGB"));
else if (colorspace->n == 4)
- pdf_dict_puts_drop(imobj, "ColorSpace", pdf_new_name(doc, "DeviceCMYK"));
+ pdf_dict_puts_drop(ctx, imobj, "ColorSpace", pdf_new_name(ctx, doc, "DeviceCMYK"));
if (!mask)
- pdf_dict_puts_drop(imobj, "BitsPerComponent", pdf_new_int(doc, image->bpc));
+ pdf_dict_puts_drop(ctx, imobj, "BitsPerComponent", pdf_new_int(ctx, doc, image->bpc));
switch (cp ? cp->type : FZ_IMAGE_UNKNOWN)
{
case FZ_IMAGE_UNKNOWN: /* Unknown also means raw */
@@ -219,32 +219,32 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
break;
case FZ_IMAGE_JPEG:
if (cp->u.jpeg.color_transform != -1)
- pdf_dict_puts_drop(imobj, "ColorTransform", pdf_new_int(doc, cp->u.jpeg.color_transform));
- pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "DCTDecode"));
+ pdf_dict_puts_drop(ctx, imobj, "ColorTransform", pdf_new_int(ctx, doc, cp->u.jpeg.color_transform));
+ pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "DCTDecode"));
break;
case FZ_IMAGE_JPX:
if (cp->u.jpx.smask_in_data)
- pdf_dict_puts_drop(imobj, "SMaskInData", pdf_new_int(doc, cp->u.jpx.smask_in_data));
- pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "JPXDecode"));
+ pdf_dict_puts_drop(ctx, imobj, "SMaskInData", pdf_new_int(ctx, doc, cp->u.jpx.smask_in_data));
+ pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "JPXDecode"));
break;
case FZ_IMAGE_FAX:
if (cp->u.fax.columns)
- pdf_dict_puts_drop(imobj, "Columns", pdf_new_int(doc, cp->u.fax.columns));
+ pdf_dict_puts_drop(ctx, imobj, "Columns", pdf_new_int(ctx, doc, cp->u.fax.columns));
if (cp->u.fax.rows)
- pdf_dict_puts_drop(imobj, "Rows", pdf_new_int(doc, cp->u.fax.rows));
+ pdf_dict_puts_drop(ctx, imobj, "Rows", pdf_new_int(ctx, doc, cp->u.fax.rows));
if (cp->u.fax.k)
- pdf_dict_puts_drop(imobj, "K", pdf_new_int(doc, cp->u.fax.k));
+ pdf_dict_puts_drop(ctx, imobj, "K", pdf_new_int(ctx, doc, cp->u.fax.k));
if (cp->u.fax.end_of_line)
- pdf_dict_puts_drop(imobj, "EndOfLine", pdf_new_int(doc, cp->u.fax.end_of_line));
+ pdf_dict_puts_drop(ctx, imobj, "EndOfLine", pdf_new_int(ctx, doc, cp->u.fax.end_of_line));
if (cp->u.fax.encoded_byte_align)
- pdf_dict_puts_drop(imobj, "EncodedByteAlign", pdf_new_int(doc, cp->u.fax.encoded_byte_align));
+ pdf_dict_puts_drop(ctx, imobj, "EncodedByteAlign", pdf_new_int(ctx, doc, cp->u.fax.encoded_byte_align));
if (cp->u.fax.end_of_block)
- pdf_dict_puts_drop(imobj, "EndOfBlock", pdf_new_int(doc, cp->u.fax.end_of_block));
+ pdf_dict_puts_drop(ctx, imobj, "EndOfBlock", pdf_new_int(ctx, doc, cp->u.fax.end_of_block));
if (cp->u.fax.black_is_1)
- pdf_dict_puts_drop(imobj, "BlackIs1", pdf_new_int(doc, cp->u.fax.black_is_1));
+ pdf_dict_puts_drop(ctx, imobj, "BlackIs1", pdf_new_int(ctx, doc, cp->u.fax.black_is_1));
if (cp->u.fax.damaged_rows_before_error)
- pdf_dict_puts_drop(imobj, "DamagedRowsBeforeError", pdf_new_int(doc, cp->u.fax.damaged_rows_before_error));
- pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "CCITTFaxDecode"));
+ pdf_dict_puts_drop(ctx, imobj, "DamagedRowsBeforeError", pdf_new_int(ctx, doc, cp->u.fax.damaged_rows_before_error));
+ pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "CCITTFaxDecode"));
break;
case FZ_IMAGE_JBIG2:
/* FIXME - jbig2globals */
@@ -252,68 +252,67 @@ send_image(pdf_device *pdev, fz_image *image, int mask, int smask)
break;
case FZ_IMAGE_FLATE:
if (cp->u.flate.columns)
- pdf_dict_puts_drop(imobj, "Columns", pdf_new_int(doc, cp->u.flate.columns));
+ pdf_dict_puts_drop(ctx, imobj, "Columns", pdf_new_int(ctx, doc, cp->u.flate.columns));
if (cp->u.flate.colors)
- pdf_dict_puts_drop(imobj, "Colors", pdf_new_int(doc, cp->u.flate.colors));
+ pdf_dict_puts_drop(ctx, imobj, "Colors", pdf_new_int(ctx, doc, cp->u.flate.colors));
if (cp->u.flate.predictor)
- pdf_dict_puts_drop(imobj, "Predictor", pdf_new_int(doc, cp->u.flate.predictor));
- pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "FlateDecode"));
- pdf_dict_puts_drop(imobj, "BitsPerComponent", pdf_new_int(doc, image->bpc));
+ pdf_dict_puts_drop(ctx, imobj, "Predictor", pdf_new_int(ctx, doc, cp->u.flate.predictor));
+ pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "FlateDecode"));
+ pdf_dict_puts_drop(ctx, imobj, "BitsPerComponent", pdf_new_int(ctx, doc, image->bpc));
break;
case FZ_IMAGE_LZW:
if (cp->u.lzw.columns)
- pdf_dict_puts_drop(imobj, "Columns", pdf_new_int(doc, cp->u.lzw.columns));
+ pdf_dict_puts_drop(ctx, imobj, "Columns", pdf_new_int(ctx, doc, cp->u.lzw.columns));
if (cp->u.lzw.colors)
- pdf_dict_puts_drop(imobj, "Colors", pdf_new_int(doc, cp->u.lzw.colors));
+ pdf_dict_puts_drop(ctx, imobj, "Colors", pdf_new_int(ctx, doc, cp->u.lzw.colors));
if (cp->u.lzw.predictor)
- pdf_dict_puts_drop(imobj, "Predictor", pdf_new_int(doc, cp->u.lzw.predictor));
+ pdf_dict_puts_drop(ctx, imobj, "Predictor", pdf_new_int(ctx, doc, cp->u.lzw.predictor));
if (cp->u.lzw.early_change)
- pdf_dict_puts_drop(imobj, "EarlyChange", pdf_new_int(doc, cp->u.lzw.early_change));
- pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "LZWDecode"));
+ pdf_dict_puts_drop(ctx, imobj, "EarlyChange", pdf_new_int(ctx, doc, cp->u.lzw.early_change));
+ pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "LZWDecode"));
break;
case FZ_IMAGE_RLD:
- pdf_dict_puts_drop(imobj, "Filter", pdf_new_name(doc, "RunLengthDecode"));
+ pdf_dict_puts_drop(ctx, imobj, "Filter", pdf_new_name(ctx, doc, "RunLengthDecode"));
break;
}
if (mask)
{
- pdf_dict_puts_drop(imobj, "ImageMask", pdf_new_bool(doc, 1));
+ pdf_dict_puts_drop(ctx, imobj, "ImageMask", pdf_new_bool(ctx, doc, 1));
}
if (image->mask)
{
- int smasknum = send_image(pdev, image->mask, 0, 1);
- pdf_dict_puts(imobj, "SMask", pdev->images[smasknum].ref);
+ int smasknum = send_image(ctx, pdev, image->mask, 0, 1);
+ pdf_dict_puts(ctx, imobj, "SMask", pdev->images[smasknum].ref);
}
- imref = pdf_new_ref(doc, imobj);
- pdf_update_stream(doc, pdf_to_num(imref), buffer);
- pdf_dict_puts_drop(imobj, "Length", pdf_new_int(doc, buffer->len));
+ imref = pdf_new_ref(ctx, doc, imobj);
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, imref), buffer);
+ pdf_dict_puts_drop(ctx, imobj, "Length", pdf_new_int(ctx, doc, buffer->len));
{
char text[32];
snprintf(text, sizeof(text), "XObject/Img%d", num);
- pdf_dict_putp(pdev->resources, text, imref);
+ pdf_dict_putp(ctx, pdev->resources, text, imref);
}
pdev->images[num].ref = imref;
}
fz_always(ctx)
{
fz_drop_buffer(ctx, buffer);
- pdf_drop_obj(imobj);
+ pdf_drop_obj(ctx, imobj);
fz_drop_pixmap(ctx, pixmap);
}
fz_catch(ctx)
{
- pdf_drop_obj(imref);
+ pdf_drop_obj(ctx, imref);
fz_rethrow(ctx);
}
return num;
}
static void
-pdf_dev_stroke_state(pdf_device *pdev, fz_stroke_state *stroke_state)
+pdf_dev_stroke_state(fz_context *ctx, pdf_device *pdev, fz_stroke_state *stroke_state)
{
- fz_context *ctx = pdev->ctx;
gstate *gs = CURRENT_GSTATE(pdev);
if (stroke_state == gs->stroke_state)
@@ -361,9 +360,8 @@ pdf_dev_stroke_state(pdf_device *pdev, fz_stroke_state *stroke_state)
}
static void
-pdf_dev_path(pdf_device *pdev, fz_path *path)
+pdf_dev_path(fz_context *ctx, pdf_device *pdev, fz_path *path)
{
- fz_context *ctx = pdev->ctx;
gstate *gs = CURRENT_GSTATE(pdev);
float x, y;
int i = 0, k = 0;
@@ -400,7 +398,7 @@ pdf_dev_path(pdf_device *pdev, fz_path *path)
}
static void
-pdf_dev_ctm(pdf_device *pdev, const fz_matrix *ctm)
+pdf_dev_ctm(fz_context *ctx, pdf_device *pdev, const fz_matrix *ctm)
{
fz_matrix inverse;
gstate *gs = CURRENT_GSTATE(pdev);
@@ -410,16 +408,15 @@ pdf_dev_ctm(pdf_device *pdev, const fz_matrix *ctm)
fz_invert_matrix(&inverse, &gs->ctm);
fz_concat(&inverse, ctm, &inverse);
memcpy(&gs->ctm, ctm, sizeof(*ctm));
- fz_buffer_printf(pdev->ctx, gs->buf, "%f %f %f %f %f %f cm\n", inverse.a, inverse.b, inverse.c, inverse.d, inverse.e, inverse.f);
+ fz_buffer_printf(ctx, gs->buf, "%f %f %f %f %f %f cm\n", inverse.a, inverse.b, inverse.c, inverse.d, inverse.e, inverse.f);
}
static void
-pdf_dev_color(pdf_device *pdev, fz_colorspace *colorspace, float *color, int stroke)
+pdf_dev_color(fz_context *ctx, pdf_device *pdev, fz_colorspace *colorspace, float *color, int stroke)
{
int diff = 0;
int i;
int cspace = 0;
- fz_context *ctx = pdev->ctx;
float rgb[FZ_MAX_COLORS];
gstate *gs = CURRENT_GSTATE(pdev);
@@ -478,10 +475,9 @@ pdf_dev_color(pdf_device *pdev, fz_colorspace *colorspace, float *color, int str
}
static void
-pdf_dev_alpha(pdf_device *pdev, float alpha, int stroke)
+pdf_dev_alpha(fz_context *ctx, pdf_device *pdev, float alpha, int stroke)
{
int i;
- fz_context *ctx = pdev->ctx;
pdf_document *doc = pdev->doc;
gstate *gs = CURRENT_GSTATE(pdev);
@@ -513,19 +509,19 @@ pdf_dev_alpha(pdf_device *pdev, float alpha, int stroke)
pdev->alphas[i].alpha = alpha;
pdev->alphas[i].stroke = stroke;
- o = pdf_new_dict(doc, 1);
+ o = pdf_new_dict(ctx, doc, 1);
fz_try(ctx)
{
char text[32];
- pdf_dict_puts_drop(o, (stroke ? "CA" : "ca"), pdf_new_real(doc, alpha));
- ref = pdf_new_ref(doc, o);
+ pdf_dict_puts_drop(ctx, o, (stroke ? "CA" : "ca"), pdf_new_real(ctx, doc, alpha));
+ ref = pdf_new_ref(ctx, doc, o);
snprintf(text, sizeof(text), "ExtGState/Alp%d", i);
- pdf_dict_putp(pdev->resources, text, ref);
+ pdf_dict_putp(ctx, pdev->resources, text, ref);
}
fz_always(ctx)
{
- pdf_drop_obj(o);
- pdf_drop_obj(ref);
+ pdf_drop_obj(ctx, o);
+ pdf_drop_obj(ctx, ref);
}
fz_catch(ctx)
{
@@ -537,11 +533,10 @@ pdf_dev_alpha(pdf_device *pdev, float alpha, int stroke)
}
static void
-pdf_dev_font(pdf_device *pdev, fz_font *font, float size)
+pdf_dev_font(fz_context *ctx, pdf_device *pdev, fz_font *font, float size)
{
int i;
pdf_document *doc = pdev->doc;
- fz_context *ctx = pdev->ctx;
gstate *gs = CURRENT_GSTATE(pdev);
/* If the font is unchanged, nothing to do */
@@ -549,7 +544,7 @@ pdf_dev_font(pdf_device *pdev, fz_font *font, float size)
return;
if (font->ft_buffer != NULL || font->ft_substitute)
- fz_throw(pdev->ctx, FZ_ERROR_GENERIC, "pdf device supports only base 14 fonts currently");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "pdf device supports only base 14 fonts currently");
/* Have we sent such a font before? */
for (i = 0; i < pdev->num_fonts; i++)
@@ -574,22 +569,22 @@ pdf_dev_font(pdf_device *pdev, fz_font *font, float size)
}
pdev->fonts[i].font = fz_keep_font(ctx, font);
- o = pdf_new_dict(doc, 3);
+ o = pdf_new_dict(ctx, doc, 3);
fz_try(ctx)
{
char text[32];
- pdf_dict_puts_drop(o, "Type", pdf_new_name(doc, "Font"));
- pdf_dict_puts_drop(o, "Subtype", pdf_new_name(doc, "Type1"));
- pdf_dict_puts_drop(o, "BaseFont", pdf_new_name(doc, font->name));
- pdf_dict_puts_drop(o, "Encoding", pdf_new_name(doc, "WinAnsiEncoding"));
- ref = pdf_new_ref(doc, o);
+ pdf_dict_puts_drop(ctx, o, "Type", pdf_new_name(ctx, doc, "Font"));
+ pdf_dict_puts_drop(ctx, o, "Subtype", pdf_new_name(ctx, doc, "Type1"));
+ pdf_dict_puts_drop(ctx, o, "BaseFont", pdf_new_name(ctx, doc, font->name));
+ pdf_dict_puts_drop(ctx, o, "Encoding", pdf_new_name(ctx, doc, "WinAnsiEncoding"));
+ ref = pdf_new_ref(ctx, doc, o);
snprintf(text, sizeof(text), "Font/F%d", i);
- pdf_dict_putp(pdev->resources, text, ref);
+ pdf_dict_putp(ctx, pdev->resources, text, ref);
}
fz_always(ctx)
{
- pdf_drop_obj(o);
- pdf_drop_obj(ref);
+ pdf_drop_obj(ctx, o);
+ pdf_drop_obj(ctx, ref);
}
fz_catch(ctx)
{
@@ -601,21 +596,19 @@ pdf_dev_font(pdf_device *pdev, fz_font *font, float size)
}
static void
-pdf_dev_tm(pdf_device *pdev, const fz_matrix *tm)
+pdf_dev_tm(fz_context *ctx, pdf_device *pdev, const fz_matrix *tm)
{
gstate *gs = CURRENT_GSTATE(pdev);
if (memcmp(&gs->tm, tm, sizeof(*tm)) == 0)
return;
- fz_buffer_printf(pdev->ctx, gs->buf, "%f %f %f %f %f %f Tm\n", tm->a, tm->b, tm->c, tm->d, tm->e, tm->f);
+ fz_buffer_printf(ctx, gs->buf, "%f %f %f %f %f %f Tm\n", tm->a, tm->b, tm->c, tm->d, tm->e, tm->f);
gs->tm = *tm;
}
static void
-pdf_dev_push_new_buf(pdf_device *pdev, fz_buffer *buf, void (*on_pop)(pdf_device*,void *), void *on_pop_arg)
+pdf_dev_push_new_buf(fz_context *ctx, pdf_device *pdev, fz_buffer *buf, void (*on_pop)(fz_context*,pdf_device*,void*), void *on_pop_arg)
{
- fz_context *ctx = pdev->ctx;
-
if (pdev->num_gstates == pdev->max_gstates)
{
int newmax = pdev->max_gstates*2;
@@ -636,21 +629,20 @@ pdf_dev_push_new_buf(pdf_device *pdev, fz_buffer *buf, void (*on_pop)(pdf_device
}
static void
-pdf_dev_push(pdf_device *pdev)
+pdf_dev_push(fz_context *ctx, pdf_device *pdev)
{
- pdf_dev_push_new_buf(pdev, NULL, NULL, NULL);
+ pdf_dev_push_new_buf(ctx, pdev, NULL, NULL, NULL);
}
static void *
-pdf_dev_pop(pdf_device *pdev)
+pdf_dev_pop(fz_context *ctx, pdf_device *pdev)
{
- fz_context *ctx = pdev->ctx;
gstate *gs = CURRENT_GSTATE(pdev);
void *arg = gs->on_pop_arg;
- fz_buffer_printf(pdev->ctx, gs->buf, "Q\n");
+ fz_buffer_printf(ctx, gs->buf, "Q\n");
if (gs->on_pop)
- gs->on_pop(pdev, arg);
+ gs->on_pop(ctx, pdev, arg);
pdev->num_gstates--;
fz_drop_stroke_state(ctx, pdev->gstates[pdev->num_gstates].stroke_state);
fz_drop_buffer(ctx, pdev->gstates[pdev->num_gstates].buf);
@@ -658,7 +650,7 @@ pdf_dev_pop(pdf_device *pdev)
}
static void
-pdf_dev_text(pdf_device *pdev, fz_text *text, float size)
+pdf_dev_text(fz_context *ctx, pdf_device *pdev, fz_text *text, float size)
{
int mask = FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM;
int i;
@@ -689,7 +681,7 @@ pdf_dev_text(pdf_device *pdev, fz_text *text, float size)
fz_transform_point(&delta, &inverse);
if (delta.x != 0 || delta.y != 0)
{
- fz_buffer_printf(pdev->ctx, gs->buf, "%f %f Td ", delta.x, delta.y);
+ fz_buffer_printf(ctx, gs->buf, "%f %f Td ", delta.x, delta.y);
trm.e = it->x;
trm.f = it->y;
}
@@ -711,38 +703,38 @@ pdf_dev_text(pdf_device *pdev, fz_text *text, float size)
}
}
- fz_buffer_printf(pdev->ctx, gs->buf, "<");
+ fz_buffer_printf(ctx, gs->buf, "<");
for (/* i from its current value */; i < j; i++)
{
/* FIXME: should use it->gid, rather than it->ucs, and convert
* to the correct encoding */
- fz_buffer_printf(pdev->ctx, gs->buf, "%02x", text->items[i].ucs);
+ fz_buffer_printf(ctx, gs->buf, "%02x", text->items[i].ucs);
}
- fz_buffer_printf(pdev->ctx, gs->buf, "> Tj\n");
+ fz_buffer_printf(ctx, gs->buf, "> Tj\n");
}
gs->tm.e = trm.e;
gs->tm.f = trm.f;
}
static void
-pdf_dev_trm(pdf_device *pdev, int trm)
+pdf_dev_trm(fz_context *ctx, pdf_device *pdev, int trm)
{
gstate *gs = CURRENT_GSTATE(pdev);
if (gs->text_rendering_mode == trm)
return;
gs->text_rendering_mode = trm;
- fz_buffer_printf(pdev->ctx, gs->buf, "%d Tr\n", trm);
+ fz_buffer_printf(ctx, gs->buf, "%d Tr\n", trm);
}
static void
-pdf_dev_begin_text(pdf_device *pdev, const fz_matrix *tm, int trm)
+pdf_dev_begin_text(fz_context *ctx, pdf_device *pdev, const fz_matrix *tm, int trm)
{
- pdf_dev_trm(pdev, trm);
+ pdf_dev_trm(ctx, pdev, trm);
if (!pdev->in_text)
{
gstate *gs = CURRENT_GSTATE(pdev);
- fz_buffer_printf(pdev->ctx, gs->buf, "BT\n");
+ fz_buffer_printf(ctx, gs->buf, "BT\n");
gs->tm.a = 1;
gs->tm.b = 0;
gs->tm.c = 0;
@@ -751,24 +743,23 @@ pdf_dev_begin_text(pdf_device *pdev, const fz_matrix *tm, int trm)
gs->tm.f = 0;
pdev->in_text = 1;
}
- pdf_dev_tm(pdev, tm);
+ pdf_dev_tm(ctx, pdev, tm);
}
static void
-pdf_dev_end_text(pdf_device *pdev)
+pdf_dev_end_text(fz_context *ctx, pdf_device *pdev)
{
gstate *gs = CURRENT_GSTATE(pdev);
if (!pdev->in_text)
return;
pdev->in_text = 0;
- fz_buffer_printf(pdev->ctx, gs->buf, "ET\n");
+ fz_buffer_printf(ctx, gs->buf, "ET\n");
}
static int
-pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int isolated, int knockout, float alpha, fz_colorspace *colorspace)
+pdf_dev_new_form(fz_context *ctx, pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int isolated, int knockout, float alpha, fz_colorspace *colorspace)
{
- fz_context *ctx = pdev->ctx;
pdf_document *doc = pdev->doc;
int num;
pdf_obj *group_ref;
@@ -805,26 +796,26 @@ pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int
pdev->groups[num].alpha = alpha;
pdev->groups[num].colorspace = fz_keep_colorspace(ctx, colorspace);
pdev->groups[num].ref = NULL;
- group = pdf_new_dict(doc, 5);
+ group = pdf_new_dict(ctx, doc, 5);
fz_try(ctx)
{
- pdf_dict_puts_drop(group, "Type", pdf_new_name(doc, "Group"));
- pdf_dict_puts_drop(group, "S", pdf_new_name(doc, "Transparency"));
- pdf_dict_puts_drop(group, "K", pdf_new_bool(doc, knockout));
- pdf_dict_puts_drop(group, "I", pdf_new_bool(doc, isolated));
+ pdf_dict_puts_drop(ctx, group, "Type", pdf_new_name(ctx, doc, "Group"));
+ pdf_dict_puts_drop(ctx, group, "S", pdf_new_name(ctx, doc, "Transparency"));
+ pdf_dict_puts_drop(ctx, group, "K", pdf_new_bool(ctx, doc, knockout));
+ pdf_dict_puts_drop(ctx, group, "I", pdf_new_bool(ctx, doc, isolated));
if (!colorspace)
{}
else if (colorspace->n == 1)
- pdf_dict_puts_drop(group, "CS", pdf_new_name(doc, "DeviceGray"));
+ pdf_dict_puts_drop(ctx, group, "CS", pdf_new_name(ctx, doc, "DeviceGray"));
else if (colorspace->n == 4)
- pdf_dict_puts_drop(group, "CS", pdf_new_name(doc, "DeviceCMYK"));
+ pdf_dict_puts_drop(ctx, group, "CS", pdf_new_name(ctx, doc, "DeviceCMYK"));
else
- pdf_dict_puts_drop(group, "CS", pdf_new_name(doc, "DeviceRGB"));
- group_ref = pdev->groups[num].ref = pdf_new_ref(doc, group);
+ pdf_dict_puts_drop(ctx, group, "CS", pdf_new_name(ctx, doc, "DeviceRGB"));
+ group_ref = pdev->groups[num].ref = pdf_new_ref(ctx, doc, group);
}
fz_always(ctx)
{
- pdf_drop_obj(group);
+ pdf_drop_obj(ctx, group);
}
fz_catch(ctx)
{
@@ -834,18 +825,18 @@ pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int
/* Make us a new Forms object that points to that group, and change
* to writing into the buffer for that Forms object. */
- form = pdf_new_dict(doc, 4);
+ form = pdf_new_dict(ctx, doc, 4);
fz_try(ctx)
{
- pdf_dict_puts_drop(form, "Subtype", pdf_new_name(doc, "Form"));
- pdf_dict_puts(form, "Group", group_ref);
- pdf_dict_puts_drop(form, "FormType", pdf_new_int(doc, 1));
- pdf_dict_puts_drop(form, "BBox", pdf_new_rect(doc, bbox));
- *form_ref = pdf_new_ref(doc, form);
+ pdf_dict_puts_drop(ctx, form, "Subtype", pdf_new_name(ctx, doc, "Form"));
+ pdf_dict_puts(ctx, form, "Group", group_ref);
+ pdf_dict_puts_drop(ctx, form, "FormType", pdf_new_int(ctx, doc, 1));
+ pdf_dict_puts_drop(ctx, form, "BBox", pdf_new_rect(ctx, doc, bbox));
+ *form_ref = pdf_new_ref(ctx, doc, form);
}
fz_catch(ctx)
{
- pdf_drop_obj(form);
+ pdf_drop_obj(ctx, form);
fz_rethrow(ctx);
}
@@ -854,7 +845,7 @@ pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int
char text[32];
num = pdev->num_forms++;
snprintf(text, sizeof(text), "XObject/Fm%d", num);
- pdf_dict_putp(pdev->resources, text, *form_ref);
+ pdf_dict_putp(ctx, pdev->resources, text, *form_ref);
}
return num;
@@ -863,223 +854,222 @@ pdf_dev_new_form(pdf_obj **form_ref, pdf_device *pdev, const fz_rect *bbox, int
/* Entry points */
static void
-pdf_dev_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
+pdf_dev_fill_path(fz_context *ctx, fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- pdf_device *pdev = dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
gstate *gs = CURRENT_GSTATE(pdev);
- pdf_dev_end_text(pdev);
- pdf_dev_alpha(pdev, alpha, 0);
- pdf_dev_color(pdev, colorspace, color, 0);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_path(pdev, path);
- fz_buffer_printf(dev->ctx, gs->buf, (even_odd ? "f*\n" : "f\n"));
+ pdf_dev_end_text(ctx, pdev);
+ pdf_dev_alpha(ctx, pdev, alpha, 0);
+ pdf_dev_color(ctx, pdev, colorspace, color, 0);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_path(ctx, pdev, path);
+ fz_buffer_printf(ctx, gs->buf, (even_odd ? "f*\n" : "f\n"));
}
static void
-pdf_dev_stroke_path(fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm,
+pdf_dev_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- pdf_device *pdev = dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
gstate *gs = CURRENT_GSTATE(pdev);
- pdf_dev_end_text(pdev);
- pdf_dev_alpha(pdev, alpha, 1);
- pdf_dev_color(pdev, colorspace, color, 1);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_stroke_state(pdev, stroke);
- pdf_dev_path(pdev, path);
- fz_buffer_printf(dev->ctx, gs->buf, "S\n");
+ pdf_dev_end_text(ctx, pdev);
+ pdf_dev_alpha(ctx, pdev, alpha, 1);
+ pdf_dev_color(ctx, pdev, colorspace, color, 1);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_stroke_state(ctx, pdev, stroke);
+ pdf_dev_path(ctx, pdev, path);
+ fz_buffer_printf(ctx, gs->buf, "S\n");
}
static void
-pdf_dev_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
+pdf_dev_clip_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, const fz_matrix *ctm)
{
- pdf_device *pdev = dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
gstate *gs;
- pdf_dev_end_text(pdev);
- pdf_dev_push(pdev);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_path(pdev, path);
+ pdf_dev_end_text(ctx, pdev);
+ pdf_dev_push(ctx, pdev);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_path(ctx, pdev, path);
gs = CURRENT_GSTATE(pdev);
- fz_buffer_printf(dev->ctx, gs->buf, (even_odd ? "W* n\n" : "W n\n"));
+ fz_buffer_printf(ctx, gs->buf, (even_odd ? "W* n\n" : "W n\n"));
}
static void
-pdf_dev_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
+pdf_dev_clip_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect *rect, fz_stroke_state *stroke, const fz_matrix *ctm)
{
- pdf_device *pdev = dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
gstate *gs;
- pdf_dev_end_text(pdev);
- pdf_dev_push(pdev);
+ pdf_dev_end_text(ctx, pdev);
+ pdf_dev_push(ctx, pdev);
/* FIXME: Need to push a group, select a pattern (or shading) here,
* stroke with the pattern/shading. Then move to defining that pattern
* with the next calls to the device interface until the next pop
* when we pop the group. */
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_path(pdev, path);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_path(ctx, pdev, path);
gs = CURRENT_GSTATE(pdev);
- fz_buffer_printf(dev->ctx, gs->buf, "W n\n");
+ fz_buffer_printf(ctx, gs->buf, "W n\n");
}
static void
-pdf_dev_fill_text(fz_device *dev, fz_text *text, const fz_matrix *ctm,
+pdf_dev_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- pdf_device *pdev = dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
fz_matrix trm = text->trm;
float size = fz_matrix_expansion(&trm);
fz_pre_scale(&trm, 1/size, 1/size);
- pdf_dev_begin_text(pdev, &trm, 0);
- pdf_dev_font(pdev, text->font, size);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_alpha(pdev, alpha, 0);
- pdf_dev_color(pdev, colorspace, color, 0);
- pdf_dev_text(pdev, text, size);
+ pdf_dev_begin_text(ctx, pdev, &trm, 0);
+ pdf_dev_font(ctx, pdev, text->font, size);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_alpha(ctx, pdev, alpha, 0);
+ pdf_dev_color(ctx, pdev, colorspace, color, 0);
+ pdf_dev_text(ctx, pdev, text, size);
}
static void
-pdf_dev_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
+pdf_dev_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- pdf_device *pdev = dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
fz_matrix trm = text->trm;
float size = fz_matrix_expansion(&trm);
fz_pre_scale(&trm, 1/size, 1/size);
- pdf_dev_begin_text(pdev, &text->trm, 1);
- pdf_dev_font(pdev, text->font, 1);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_alpha(pdev, alpha, 1);
- pdf_dev_color(pdev, colorspace, color, 1);
- pdf_dev_text(pdev, text, size);
+ pdf_dev_begin_text(ctx, pdev, &text->trm, 1);
+ pdf_dev_font(ctx, pdev, text->font, 1);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_alpha(ctx, pdev, alpha, 1);
+ pdf_dev_color(ctx, pdev, colorspace, color, 1);
+ pdf_dev_text(ctx, pdev, text, size);
}
static void
-pdf_dev_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
+pdf_dev_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate)
{
- pdf_device *pdev = dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
fz_matrix trm = text->trm;
float size = fz_matrix_expansion(&trm);
fz_pre_scale(&trm, 1/size, 1/size);
- pdf_dev_begin_text(pdev, &text->trm, 0);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_font(pdev, text->font, 7);
- pdf_dev_text(pdev, text, size);
+ pdf_dev_begin_text(ctx, pdev, &text->trm, 0);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_font(ctx, pdev, text->font, 7);
+ pdf_dev_text(ctx, pdev, text, size);
}
static void
-pdf_dev_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
+pdf_dev_clip_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state *stroke, const fz_matrix *ctm)
{
- pdf_device *pdev = dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
fz_matrix trm = text->trm;
float size = fz_matrix_expansion(&trm);
fz_pre_scale(&trm, 1/size, 1/size);
- pdf_dev_begin_text(pdev, &text->trm, 0);
- pdf_dev_font(pdev, text->font, 5);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_text(pdev, text, size);
+ pdf_dev_begin_text(ctx, pdev, &text->trm, 0);
+ pdf_dev_font(ctx, pdev, text->font, 5);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_text(ctx, pdev, text, size);
}
static void
-pdf_dev_ignore_text(fz_device *dev, fz_text *text, const fz_matrix *ctm)
+pdf_dev_ignore_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm)
{
- pdf_device *pdev = dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
fz_matrix trm = text->trm;
float size = fz_matrix_expansion(&trm);
fz_pre_scale(&trm, 1/size, 1/size);
- pdf_dev_begin_text(pdev, &text->trm, 0);
- pdf_dev_ctm(pdev, ctm);
- pdf_dev_font(pdev, text->font, 3);
- pdf_dev_text(pdev, text, size);
+ pdf_dev_begin_text(ctx, pdev, &text->trm, 0);
+ pdf_dev_ctm(ctx, pdev, ctm);
+ pdf_dev_font(ctx, pdev, text->font, 3);
+ pdf_dev_text(ctx, pdev, text, size);
}
static void
-pdf_dev_fill_image(fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
+pdf_dev_fill_image(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm, float alpha)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
int num;
gstate *gs = CURRENT_GSTATE(pdev);
fz_matrix local_ctm = *ctm;
- pdf_dev_end_text(pdev);
- num = send_image(pdev, image, 0, 0);
- pdf_dev_alpha(pdev, alpha, 0);
+ pdf_dev_end_text(ctx, pdev);
+ num = send_image(ctx, pdev, image, 0, 0);
+ pdf_dev_alpha(ctx, pdev, alpha, 0);
/* PDF images are upside down, so fiddle the ctm */
fz_pre_scale(&local_ctm, 1, -1);
fz_pre_translate(&local_ctm, 0, -1);
- pdf_dev_ctm(pdev, &local_ctm);
- fz_buffer_printf(dev->ctx, gs->buf, "/Img%d Do\n", num);
+ pdf_dev_ctm(ctx, pdev, &local_ctm);
+ fz_buffer_printf(ctx, gs->buf, "/Img%d Do\n", num);
}
static void
-pdf_dev_fill_shade(fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
+pdf_dev_fill_shade(fz_context *ctx, fz_device *dev, fz_shade *shade, const fz_matrix *ctm, float alpha)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
/* FIXME */
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
}
static void
-pdf_dev_fill_image_mask(fz_device *dev, fz_image *image, const fz_matrix *ctm,
+pdf_dev_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_matrix *ctm,
fz_colorspace *colorspace, float *color, float alpha)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
gstate *gs = CURRENT_GSTATE(pdev);
int num;
fz_matrix local_ctm = *ctm;
- pdf_dev_end_text(pdev);
- num = send_image(pdev, image, 1, 0);
- fz_buffer_printf(dev->ctx, gs->buf, "q\n");
- pdf_dev_alpha(pdev, alpha, 0);
- pdf_dev_color(pdev, colorspace, color, 0);
+ pdf_dev_end_text(ctx, pdev);
+ num = send_image(ctx, pdev, image, 1, 0);
+ fz_buffer_printf(ctx, gs->buf, "q\n");
+ pdf_dev_alpha(ctx, pdev, alpha, 0);
+ pdf_dev_color(ctx, pdev, colorspace, color, 0);
/* PDF images are upside down, so fiddle the ctm */
fz_pre_scale(&local_ctm, 1, -1);
fz_pre_translate(&local_ctm, 0, -1);
- pdf_dev_ctm(pdev, &local_ctm);
- fz_buffer_printf(dev->ctx, gs->buf, "/Img%d Do Q\n", num);
+ pdf_dev_ctm(ctx, pdev, &local_ctm);
+ fz_buffer_printf(ctx, gs->buf, "/Img%d Do Q\n", num);
}
static void
-pdf_dev_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
+pdf_dev_clip_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const fz_rect *rect, const fz_matrix *ctm)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
/* FIXME */
- pdf_dev_end_text(pdev);
- pdf_dev_push(pdev);
+ pdf_dev_end_text(ctx, pdev);
+ pdf_dev_push(ctx, pdev);
}
static void
-pdf_dev_pop_clip(fz_device *dev)
+pdf_dev_pop_clip(fz_context *ctx, fz_device *dev)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
/* FIXME */
- pdf_dev_end_text(pdev);
- pdf_dev_pop(pdev);
+ pdf_dev_end_text(ctx, pdev);
+ pdf_dev_pop(ctx, pdev);
}
static void
-pdf_dev_begin_mask(fz_device *dev, const fz_rect *bbox, int luminosity, fz_colorspace *colorspace, float *color)
+pdf_dev_begin_mask(fz_context *ctx, fz_device *dev, const fz_rect *bbox, int luminosity, fz_colorspace *colorspace, float *color)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
pdf_document *doc = pdev->doc;
- fz_context *ctx = pdev->ctx;
gstate *gs;
pdf_obj *smask = NULL;
pdf_obj *egs = NULL;
@@ -1092,163 +1082,159 @@ pdf_dev_begin_mask(fz_device *dev, const fz_rect *bbox, int luminosity, fz_color
fz_var(egs);
fz_var(color_obj);
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
/* Make a new form to contain the contents of the softmask */
- pdf_dev_new_form(&form_ref, pdev, bbox, 0, 0, 1, colorspace);
+ pdf_dev_new_form(ctx, &form_ref, pdev, bbox, 0, 0, 1, colorspace);
fz_try(ctx)
{
- smask = pdf_new_dict(doc, 4);
- pdf_dict_puts_drop(smask, "Type", pdf_new_name(doc, "Mask"));
- pdf_dict_puts_drop(smask, "S", pdf_new_name(doc, (luminosity ? "Luminosity" : "Alpha")));
- pdf_dict_puts(smask, "G", form_ref);
- color_obj = pdf_new_array(doc, colorspace->n);
+ smask = pdf_new_dict(ctx, doc, 4);
+ pdf_dict_puts_drop(ctx, smask, "Type", pdf_new_name(ctx, doc, "Mask"));
+ pdf_dict_puts_drop(ctx, smask, "S", pdf_new_name(ctx, doc, (luminosity ? "Luminosity" : "Alpha")));
+ pdf_dict_puts(ctx, smask, "G", form_ref);
+ color_obj = pdf_new_array(ctx, doc, colorspace->n);
for (i = 0; i < colorspace->n; i++)
- pdf_array_push(color_obj, pdf_new_real(doc, color[i]));
- pdf_dict_puts_drop(smask, "BC", color_obj);
+ pdf_array_push(ctx, color_obj, pdf_new_real(ctx, doc, color[i]));
+ pdf_dict_puts_drop(ctx, smask, "BC", color_obj);
color_obj = NULL;
- egs = pdf_new_dict(doc, 5);
- pdf_dict_puts_drop(egs, "Type", pdf_new_name(doc, "ExtGState"));
- pdf_dict_puts_drop(egs, "SMask", pdf_new_ref(doc, smask));
- egs_ref = pdf_new_ref(doc, egs);
+ egs = pdf_new_dict(ctx, doc, 5);
+ pdf_dict_puts_drop(ctx, egs, "Type", pdf_new_name(ctx, doc, "ExtGState"));
+ pdf_dict_puts_drop(ctx, egs, "SMask", pdf_new_ref(ctx, doc, smask));
+ egs_ref = pdf_new_ref(ctx, doc, egs);
{
char text[32];
snprintf(text, sizeof(text), "ExtGState/SM%d", pdev->num_smasks++);
- pdf_dict_putp(pdev->resources, text, egs_ref);
- pdf_drop_obj(egs_ref);
+ pdf_dict_putp(ctx, pdev->resources, text, egs_ref);
+ pdf_drop_obj(ctx, egs_ref);
}
gs = CURRENT_GSTATE(pdev);
- fz_buffer_printf(dev->ctx, gs->buf, "/SM%d gs\n", pdev->num_smasks-1);
+ fz_buffer_printf(ctx, gs->buf, "/SM%d gs\n", pdev->num_smasks-1);
}
fz_always(ctx)
{
- pdf_drop_obj(smask);
+ pdf_drop_obj(ctx, smask);
}
fz_catch(ctx)
{
- pdf_drop_obj(form_ref);
- pdf_drop_obj(color_obj);
+ pdf_drop_obj(ctx, form_ref);
+ pdf_drop_obj(ctx, color_obj);
fz_rethrow(ctx);
}
/* Now, everything we get until the end_mask needs to go into a
* new buffer, which will be the stream contents for the form. */
- pdf_dev_push_new_buf(pdev, fz_new_buffer(ctx, 1024), NULL, form_ref);
+ pdf_dev_push_new_buf(ctx, pdev, fz_new_buffer(ctx, 1024), NULL, form_ref);
}
static void
-pdf_dev_end_mask(fz_device *dev)
+pdf_dev_end_mask(fz_context *ctx, fz_device *dev)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
pdf_document *doc = pdev->doc;
- fz_context *ctx = pdev->ctx;
gstate *gs = CURRENT_GSTATE(pdev);
fz_buffer *buf = fz_keep_buffer(ctx, gs->buf);
pdf_obj *form_ref = (pdf_obj *)gs->on_pop_arg;
/* Here we do part of the pop, but not all of it. */
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
fz_buffer_printf(ctx, buf, "Q\n");
- pdf_dict_puts_drop(form_ref, "Length", pdf_new_int(doc, buf->len));
- pdf_update_stream(doc, pdf_to_num(form_ref), buf);
+ pdf_dict_puts_drop(ctx, form_ref, "Length", pdf_new_int(ctx, doc, buf->len));
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, form_ref), buf);
fz_drop_buffer(ctx, buf);
gs->buf = fz_keep_buffer(ctx, gs[-1].buf);
gs->on_pop_arg = NULL;
- pdf_drop_obj(form_ref);
+ pdf_drop_obj(ctx, form_ref);
fz_buffer_printf(ctx, gs->buf, "q\n");
}
static void
-pdf_dev_begin_group(fz_device *dev, const fz_rect *bbox, int isolated, int knockout, int blendmode, float alpha)
+pdf_dev_begin_group(fz_context *ctx, fz_device *dev, const fz_rect *bbox, int isolated, int knockout, int blendmode, float alpha)
{
- pdf_device *pdev = (pdf_device *)dev->user;
- fz_context *ctx = pdev->ctx;
+ pdf_device *pdev = (pdf_device*)dev;
pdf_document *doc = pdev->doc;
int num;
pdf_obj *form_ref;
gstate *gs;
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
- num = pdf_dev_new_form(&form_ref, pdev, bbox, isolated, knockout, alpha, NULL);
+ num = pdf_dev_new_form(ctx, &form_ref, pdev, bbox, isolated, knockout, alpha, NULL);
/* Do we have an appropriate blending extgstate already? */
{
char text[32];
pdf_obj *obj;
snprintf(text, sizeof(text), "ExtGState/BlendMode%d", blendmode);
- obj = pdf_dict_getp(pdev->resources, text);
+ obj = pdf_dict_getp(ctx, pdev->resources, text);
if (obj == NULL)
{
/* No, better make one */
- obj = pdf_new_dict(pdev->doc, 2);
- pdf_dict_puts_drop(obj, "Type", pdf_new_name(doc, "ExtGState"));
- pdf_dict_puts_drop(obj, "BM", pdf_new_name(doc, fz_blendmode_name(blendmode)));
- pdf_dict_putp_drop(pdev->resources, text, obj);
+ obj = pdf_new_dict(ctx, doc, 2);
+ pdf_dict_puts_drop(ctx, obj, "Type", pdf_new_name(ctx, doc, "ExtGState"));
+ pdf_dict_puts_drop(ctx, obj, "BM", pdf_new_name(ctx, doc, fz_blendmode_name(blendmode)));
+ pdf_dict_putp_drop(ctx, pdev->resources, text, obj);
}
}
/* Add the call to this group */
gs = CURRENT_GSTATE(pdev);
- fz_buffer_printf(dev->ctx, gs->buf, "/BlendMode%d gs /Fm%d Do\n", blendmode, num);
+ fz_buffer_printf(ctx, gs->buf, "/BlendMode%d gs /Fm%d Do\n", blendmode, num);
/* Now, everything we get until the end of group needs to go into a
* new buffer, which will be the stream contents for the form. */
- pdf_dev_push_new_buf(pdev, fz_new_buffer(ctx, 1024), NULL, form_ref);
+ pdf_dev_push_new_buf(ctx, pdev, fz_new_buffer(ctx, 1024), NULL, form_ref);
}
static void
-pdf_dev_end_group(fz_device *dev)
+pdf_dev_end_group(fz_context *ctx, fz_device *dev)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
pdf_document *doc = pdev->doc;
gstate *gs = CURRENT_GSTATE(pdev);
- fz_context *ctx = pdev->ctx;
fz_buffer *buf = fz_keep_buffer(ctx, gs->buf);
pdf_obj *form_ref;
- pdf_dev_end_text(pdev);
- form_ref = (pdf_obj *)pdf_dev_pop(pdev);
- pdf_dict_puts_drop(form_ref, "Length", pdf_new_int(doc, gs->buf->len));
- pdf_update_stream(doc, pdf_to_num(form_ref), buf);
+ pdf_dev_end_text(ctx, pdev);
+ form_ref = (pdf_obj *)pdf_dev_pop(ctx, pdev);
+ pdf_dict_puts_drop(ctx, form_ref, "Length", pdf_new_int(ctx, doc, gs->buf->len));
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, form_ref), buf);
fz_drop_buffer(ctx, buf);
- pdf_drop_obj(form_ref);
+ pdf_drop_obj(ctx, form_ref);
}
static int
-pdf_dev_begin_tile(fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
+pdf_dev_begin_tile(fz_context *ctx, fz_device *dev, const fz_rect *area, const fz_rect *view, float xstep, float ystep, const fz_matrix *ctm, int id)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
/* FIXME */
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
return 0;
}
static void
-pdf_dev_end_tile(fz_device *dev)
+pdf_dev_end_tile(fz_context *ctx, fz_device *dev)
{
- pdf_device *pdev = (pdf_device *)dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
/* FIXME */
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
}
static void
-pdf_dev_free_user(fz_device *dev)
+pdf_dev_drop_imp(fz_context *ctx, fz_device *dev)
{
- pdf_device *pdev = dev->user;
+ pdf_device *pdev = (pdf_device*)dev;
pdf_document *doc = pdev->doc;
- fz_context *ctx = pdev->ctx;
gstate *gs = CURRENT_GSTATE(pdev);
int i;
- pdf_dev_end_text(pdev);
+ pdf_dev_end_text(ctx, pdev);
- pdf_dict_puts_drop(pdev->contents, "Length", pdf_new_int(doc, gs->buf->len));
+ pdf_dict_puts_drop(ctx, pdev->contents, "Length", pdf_new_int(ctx, doc, gs->buf->len));
for (i = pdev->num_gstates-1; i >= 0; i--)
{
@@ -1262,121 +1248,105 @@ pdf_dev_free_user(fz_device *dev)
for (i = pdev->num_imgs-1; i >= 0; i--)
{
- pdf_drop_obj(pdev->images[i].ref);
+ pdf_drop_obj(ctx, pdev->images[i].ref);
}
- pdf_update_stream(doc, pdf_to_num(pdev->contents), pdev->gstates[0].buf);
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, pdev->contents), pdev->gstates[0].buf);
fz_drop_buffer(ctx, pdev->gstates[0].buf);
- pdf_drop_obj(pdev->contents);
- pdf_drop_obj(pdev->resources);
+ pdf_drop_obj(ctx, pdev->contents);
+ pdf_drop_obj(ctx, pdev->resources);
fz_free(ctx, pdev->images);
fz_free(ctx, pdev->alphas);
fz_free(ctx, pdev->gstates);
- fz_free(ctx, pdev);
}
-static void
-pdf_dev_rebind(fz_device *dev)
+fz_device *pdf_new_pdf_device(fz_context *ctx, pdf_document *doc, pdf_obj *contents, pdf_obj *resources, const fz_matrix *ctm)
{
- pdf_device *pdev = dev->user;
+ pdf_device *dev = fz_new_device(ctx, sizeof *dev);
- fz_rebind_document((fz_document *)pdev->doc, dev->ctx);
-}
+ dev->super.drop_imp = pdf_dev_drop_imp;
-fz_device *pdf_new_pdf_device(pdf_document *doc, pdf_obj *contents, pdf_obj *resources, const fz_matrix *ctm)
-{
- fz_context *ctx = doc->ctx;
- pdf_device *pdev = fz_malloc_struct(ctx, pdf_device);
- fz_device *dev;
+ dev->super.fill_path = pdf_dev_fill_path;
+ dev->super.stroke_path = pdf_dev_stroke_path;
+ dev->super.clip_path = pdf_dev_clip_path;
+ dev->super.clip_stroke_path = pdf_dev_clip_stroke_path;
+
+ dev->super.fill_text = pdf_dev_fill_text;
+ dev->super.stroke_text = pdf_dev_stroke_text;
+ dev->super.clip_text = pdf_dev_clip_text;
+ dev->super.clip_stroke_text = pdf_dev_clip_stroke_text;
+ dev->super.ignore_text = pdf_dev_ignore_text;
+
+ dev->super.fill_shade = pdf_dev_fill_shade;
+ dev->super.fill_image = pdf_dev_fill_image;
+ dev->super.fill_image_mask = pdf_dev_fill_image_mask;
+ dev->super.clip_image_mask = pdf_dev_clip_image_mask;
+
+ dev->super.pop_clip = pdf_dev_pop_clip;
+
+ dev->super.begin_mask = pdf_dev_begin_mask;
+ dev->super.end_mask = pdf_dev_end_mask;
+ dev->super.begin_group = pdf_dev_begin_group;
+ dev->super.end_group = pdf_dev_end_group;
+
+ dev->super.begin_tile = pdf_dev_begin_tile;
+ dev->super.end_tile = pdf_dev_end_tile;
fz_try(ctx)
{
- pdev->ctx = ctx;
- pdev->doc = doc;
- pdev->contents = pdf_keep_obj(contents);
- pdev->resources = pdf_keep_obj(resources);
- pdev->gstates = fz_malloc_struct(ctx, gstate);
- pdev->gstates[0].buf = fz_new_buffer(ctx, 256);
- pdev->gstates[0].ctm = *ctm;
- pdev->gstates[0].colorspace[0] = fz_device_gray(ctx);
- pdev->gstates[0].colorspace[1] = fz_device_gray(ctx);
- pdev->gstates[0].color[0][0] = 1;
- pdev->gstates[0].color[1][0] = 1;
- pdev->gstates[0].alpha[0] = 1.0;
- pdev->gstates[0].alpha[1] = 1.0;
- pdev->gstates[0].font = -1;
- pdev->gstates[0].horizontal_scaling = 100;
- pdev->num_gstates = 1;
- pdev->max_gstates = 1;
-
- dev = fz_new_device(ctx, pdev);
+ dev->doc = doc;
+ dev->contents = pdf_keep_obj(ctx, contents);
+ dev->resources = pdf_keep_obj(ctx, resources);
+ dev->gstates = fz_malloc_struct(ctx, gstate);
+ dev->gstates[0].buf = fz_new_buffer(ctx, 256);
+ dev->gstates[0].ctm = *ctm;
+ dev->gstates[0].colorspace[0] = fz_device_gray(ctx);
+ dev->gstates[0].colorspace[1] = fz_device_gray(ctx);
+ dev->gstates[0].color[0][0] = 1;
+ dev->gstates[0].color[1][0] = 1;
+ dev->gstates[0].alpha[0] = 1.0;
+ dev->gstates[0].alpha[1] = 1.0;
+ dev->gstates[0].font = -1;
+ dev->gstates[0].horizontal_scaling = 100;
+ dev->num_gstates = 1;
+ dev->max_gstates = 1;
}
fz_catch(ctx)
{
- if (pdev->gstates)
- fz_drop_buffer(ctx, pdev->gstates[0].buf);
- fz_free(ctx, pdev);
+ if (dev->gstates)
+ fz_drop_buffer(ctx, dev->gstates[0].buf);
+ fz_free(ctx, dev);
fz_rethrow(ctx);
}
- dev->rebind = pdf_dev_rebind;
- dev->free_user = pdf_dev_free_user;
-
- dev->fill_path = pdf_dev_fill_path;
- dev->stroke_path = pdf_dev_stroke_path;
- dev->clip_path = pdf_dev_clip_path;
- dev->clip_stroke_path = pdf_dev_clip_stroke_path;
-
- dev->fill_text = pdf_dev_fill_text;
- dev->stroke_text = pdf_dev_stroke_text;
- dev->clip_text = pdf_dev_clip_text;
- dev->clip_stroke_text = pdf_dev_clip_stroke_text;
- dev->ignore_text = pdf_dev_ignore_text;
-
- dev->fill_shade = pdf_dev_fill_shade;
- dev->fill_image = pdf_dev_fill_image;
- dev->fill_image_mask = pdf_dev_fill_image_mask;
- dev->clip_image_mask = pdf_dev_clip_image_mask;
-
- dev->pop_clip = pdf_dev_pop_clip;
-
- dev->begin_mask = pdf_dev_begin_mask;
- dev->end_mask = pdf_dev_end_mask;
- dev->begin_group = pdf_dev_begin_group;
- dev->end_group = pdf_dev_end_group;
-
- dev->begin_tile = pdf_dev_begin_tile;
- dev->end_tile = pdf_dev_end_tile;
-
- return dev;
+ return (fz_device*)dev;
}
-fz_device *pdf_page_write(pdf_document *doc, pdf_page *page)
+fz_device *pdf_page_write(fz_context *ctx, pdf_document *doc, pdf_page *page)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *resources = pdf_dict_gets(page->me, "Resources");
+ pdf_obj *resources = pdf_dict_gets(ctx, page->me, "Resources");
fz_matrix ctm;
fz_pre_translate(fz_scale(&ctm, 1, -1), 0, page->mediabox.y0-page->mediabox.y1);
if (resources == NULL)
{
- resources = pdf_new_dict(doc, 0);
- pdf_dict_puts_drop(page->me, "Resources", resources);
+ resources = pdf_new_dict(ctx, doc, 0);
+ pdf_dict_puts_drop(ctx, page->me, "Resources", resources);
}
if (page->contents == NULL)
{
- pdf_obj *obj = pdf_new_dict(doc, 0);
+ pdf_obj *obj = pdf_new_dict(ctx, doc, 0);
fz_try(ctx)
{
- page->contents = pdf_new_ref(doc, obj);
- pdf_dict_puts(page->me, "Contents", page->contents);
+ page->contents = pdf_new_ref(ctx, doc, obj);
+ pdf_dict_puts(ctx, page->me, "Contents", page->contents);
}
fz_always(ctx)
{
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
fz_catch(ctx)
{
@@ -1384,5 +1354,5 @@ fz_device *pdf_page_write(pdf_document *doc, pdf_page *page)
}
}
- return pdf_new_pdf_device(doc, page->contents, resources, &ctm);
+ return pdf_new_pdf_device(ctx, doc, page->contents, resources, &ctm);
}
diff --git a/source/pdf/pdf-event.c b/source/pdf/pdf-event.c
index dc908985..b031dd72 100644
--- a/source/pdf/pdf-event.c
+++ b/source/pdf/pdf-event.c
@@ -7,7 +7,7 @@ typedef struct
pdf_alert_event alert;
} pdf_alert_event_internal;
-pdf_alert_event *pdf_access_alert_event(pdf_doc_event *event)
+pdf_alert_event *pdf_access_alert_event(fz_context *ctx, pdf_doc_event *event)
{
pdf_alert_event *alert = NULL;
@@ -17,7 +17,7 @@ pdf_alert_event *pdf_access_alert_event(pdf_doc_event *event)
return alert;
}
-void pdf_event_issue_alert(pdf_document *doc, pdf_alert_event *alert)
+void pdf_event_issue_alert(fz_context *ctx, pdf_document *doc, pdf_alert_event *alert)
{
if (doc->event_cb)
{
@@ -25,20 +25,20 @@ void pdf_event_issue_alert(pdf_document *doc, pdf_alert_event *alert)
ievent.base.type = PDF_DOCUMENT_EVENT_ALERT;
ievent.alert = *alert;
- doc->event_cb((pdf_doc_event *)&ievent, doc->event_cb_data);
+ doc->event_cb(ctx, doc, (pdf_doc_event *)&ievent, doc->event_cb_data);
*alert = ievent.alert;
}
}
-void pdf_event_issue_print(pdf_document *doc)
+void pdf_event_issue_print(fz_context *ctx, pdf_document *doc)
{
pdf_doc_event e;
e.type = PDF_DOCUMENT_EVENT_PRINT;
if (doc->event_cb)
- doc->event_cb(&e, doc->event_cb_data);
+ doc->event_cb(ctx, doc, &e, doc->event_cb_data);
}
typedef struct
@@ -47,7 +47,7 @@ typedef struct
char *item;
} pdf_exec_menu_item_event_internal;
-char *pdf_access_exec_menu_item_event(pdf_doc_event *event)
+char *pdf_access_exec_menu_item_event(fz_context *ctx, pdf_doc_event *event)
{
char *item = NULL;
@@ -57,7 +57,7 @@ char *pdf_access_exec_menu_item_event(pdf_doc_event *event)
return item;
}
-void pdf_event_issue_exec_menu_item(pdf_document *doc, char *item)
+void pdf_event_issue_exec_menu_item(fz_context *ctx, pdf_document *doc, char *item)
{
if (doc->event_cb)
{
@@ -65,18 +65,18 @@ void pdf_event_issue_exec_menu_item(pdf_document *doc, char *item)
ievent.base.type = PDF_DOCUMENT_EVENT_EXEC_MENU_ITEM;
ievent.item = item;
- doc->event_cb((pdf_doc_event *)&ievent, doc->event_cb_data);
+ doc->event_cb(ctx, doc, (pdf_doc_event *)&ievent, doc->event_cb_data);
}
}
-void pdf_event_issue_exec_dialog(pdf_document *doc)
+void pdf_event_issue_exec_dialog(fz_context *ctx, pdf_document *doc)
{
pdf_doc_event e;
e.type = PDF_DOCUMENT_EVENT_EXEC_DIALOG;
if (doc->event_cb)
- doc->event_cb(&e, doc->event_cb_data);
+ doc->event_cb(ctx, doc, &e, doc->event_cb_data);
}
typedef struct
@@ -85,7 +85,7 @@ typedef struct
pdf_launch_url_event launch_url;
} pdf_launch_url_event_internal;
-pdf_launch_url_event *pdf_access_launch_url_event(pdf_doc_event *event)
+pdf_launch_url_event *pdf_access_launch_url_event(fz_context *ctx, pdf_doc_event *event)
{
pdf_launch_url_event *launch_url = NULL;
@@ -95,7 +95,7 @@ pdf_launch_url_event *pdf_access_launch_url_event(pdf_doc_event *event)
return launch_url;
}
-void pdf_event_issue_launch_url(pdf_document *doc, char *url, int new_frame)
+void pdf_event_issue_launch_url(fz_context *ctx, pdf_document *doc, char *url, int new_frame)
{
if (doc->event_cb)
{
@@ -104,7 +104,7 @@ void pdf_event_issue_launch_url(pdf_document *doc, char *url, int new_frame)
e.base.type = PDF_DOCUMENT_EVENT_LAUNCH_URL;
e.launch_url.url = url;
e.launch_url.new_frame = new_frame;
- doc->event_cb((pdf_doc_event *)&e, doc->event_cb_data);
+ doc->event_cb(ctx, doc, (pdf_doc_event *)&e, doc->event_cb_data);
}
}
@@ -114,7 +114,7 @@ typedef struct
pdf_mail_doc_event mail_doc;
} pdf_mail_doc_event_internal;
-pdf_mail_doc_event *pdf_access_mail_doc_event(pdf_doc_event *event)
+pdf_mail_doc_event *pdf_access_mail_doc_event(fz_context *ctx, pdf_doc_event *event)
{
pdf_mail_doc_event *mail_doc = NULL;
@@ -124,7 +124,7 @@ pdf_mail_doc_event *pdf_access_mail_doc_event(pdf_doc_event *event)
return mail_doc;
}
-void pdf_event_issue_mail_doc(pdf_document *doc, pdf_mail_doc_event *event)
+void pdf_event_issue_mail_doc(fz_context *ctx, pdf_document *doc, pdf_mail_doc_event *event)
{
if (doc->event_cb)
{
@@ -133,11 +133,11 @@ void pdf_event_issue_mail_doc(pdf_document *doc, pdf_mail_doc_event *event)
e.base.type = PDF_DOCUMENT_EVENT_MAIL_DOC;
e.mail_doc = *event;
- doc->event_cb((pdf_doc_event *)&e, doc->event_cb_data);
+ doc->event_cb(ctx, doc, (pdf_doc_event *)&e, doc->event_cb_data);
}
}
-void pdf_set_doc_event_callback(pdf_document *doc, pdf_doc_event_cb *fn, void *data)
+void pdf_set_doc_event_callback(fz_context *ctx, pdf_document *doc, pdf_doc_event_cb *fn, void *data)
{
doc->event_cb = fn;
doc->event_cb_data = data;
diff --git a/source/pdf/pdf-field.c b/source/pdf/pdf-field.c
index e8f2508f..5105125a 100644
--- a/source/pdf/pdf-field.c
+++ b/source/pdf/pdf-field.c
@@ -1,23 +1,22 @@
#include "mupdf/pdf.h"
-pdf_obj *pdf_get_inheritable(pdf_document *doc, pdf_obj *obj, char *key)
+pdf_obj *pdf_get_inheritable(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *key)
{
pdf_obj *fobj = NULL;
while (!fobj && obj)
{
- fobj = pdf_dict_gets(obj, key);
+ fobj = pdf_dict_gets(ctx, obj, key);
if (!fobj)
- obj = pdf_dict_gets(obj, "Parent");
+ obj = pdf_dict_gets(ctx, obj, "Parent");
}
- return fobj ? fobj : pdf_dict_gets(pdf_dict_gets(pdf_dict_gets(pdf_trailer(doc), "Root"), "AcroForm"), key);
+ return fobj ? fobj : pdf_dict_gets(ctx, pdf_dict_gets(ctx, pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"), "AcroForm"), key);
}
-char *pdf_get_string_or_stream(pdf_document *doc, pdf_obj *obj)
+char *pdf_get_string_or_stream(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
int len = 0;
char *buf = NULL;
fz_buffer *strmbuf = NULL;
@@ -27,14 +26,14 @@ char *pdf_get_string_or_stream(pdf_document *doc, pdf_obj *obj)
fz_var(text);
fz_try(ctx)
{
- if (pdf_is_string(obj))
+ if (pdf_is_string(ctx, obj))
{
- len = pdf_to_str_len(obj);
- buf = pdf_to_str_buf(obj);
+ len = pdf_to_str_len(ctx, obj);
+ buf = pdf_to_str_buf(ctx, obj);
}
- else if (pdf_is_stream(doc, pdf_to_num(obj), pdf_to_gen(obj)))
+ else if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)))
{
- strmbuf = pdf_load_stream(doc, pdf_to_num(obj), pdf_to_gen(obj));
+ strmbuf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
len = fz_buffer_storage(ctx, strmbuf, (unsigned char **)&buf);
}
@@ -58,25 +57,25 @@ char *pdf_get_string_or_stream(pdf_document *doc, pdf_obj *obj)
return text;
}
-char *pdf_field_value(pdf_document *doc, pdf_obj *field)
+char *pdf_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- return pdf_get_string_or_stream(doc, pdf_get_inheritable(doc, field, "V"));
+ return pdf_get_string_or_stream(ctx, doc, pdf_get_inheritable(ctx, doc, field, "V"));
}
-int pdf_get_field_flags(pdf_document *doc, pdf_obj *obj)
+int pdf_get_field_flags(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- return pdf_to_int(pdf_get_inheritable(doc, obj, "Ff"));
+ return pdf_to_int(ctx, pdf_get_inheritable(ctx, doc, obj, "Ff"));
}
-static char *get_field_type_name(pdf_document *doc, pdf_obj *obj)
+static char *get_field_type_name(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- return pdf_to_name(pdf_get_inheritable(doc, obj, "FT"));
+ return pdf_to_name(ctx, pdf_get_inheritable(ctx, doc, obj, "FT"));
}
-int pdf_field_type(pdf_document *doc, pdf_obj *obj)
+int pdf_field_type(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- char *type = get_field_type_name(doc, obj);
- int flags = pdf_get_field_flags(doc, obj);
+ char *type = get_field_type_name(ctx, doc, obj);
+ int flags = pdf_get_field_flags(ctx, doc, obj);
if (!strcmp(type, "Btn"))
{
@@ -102,7 +101,7 @@ int pdf_field_type(pdf_document *doc, pdf_obj *obj)
return PDF_WIDGET_TYPE_NOT_WIDGET;
}
-void pdf_set_field_type(pdf_document *doc, pdf_obj *obj, int type)
+void pdf_set_field_type(fz_context *ctx, pdf_document *doc, pdf_obj *obj, int type)
{
int setbits = 0;
int clearbits = 0;
@@ -140,13 +139,13 @@ void pdf_set_field_type(pdf_document *doc, pdf_obj *obj, int type)
}
if (typename)
- pdf_dict_puts_drop(obj, "FT", pdf_new_name(doc, typename));
+ pdf_dict_puts_drop(ctx, obj, "FT", pdf_new_name(ctx, doc, typename));
if (setbits != 0 || clearbits != 0)
{
- int bits = pdf_to_int(pdf_dict_gets(obj, "Ff"));
+ int bits = pdf_to_int(ctx, pdf_dict_gets(ctx, obj, "Ff"));
bits &= ~clearbits;
bits |= setbits;
- pdf_dict_puts_drop(obj, "Ff", pdf_new_int(doc, bits));
+ pdf_dict_puts_drop(ctx, obj, "Ff", pdf_new_int(ctx, doc, bits));
}
}
diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c
index 5ac722f0..5e3f1e19 100644
--- a/source/pdf/pdf-font.c
+++ b/source/pdf/pdf-font.c
@@ -4,7 +4,7 @@
#include FT_FREETYPE_H
#include FT_XFREE86_H
-static void pdf_load_font_descriptor(pdf_font_desc *fontdesc, pdf_document *doc, pdf_obj *dict, char *collection, char *basefont, int iscidfont);
+static void pdf_load_font_descriptor(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, pdf_obj *dict, char *collection, char *basefont, int iscidfont);
static const char *base_font_names[][10] =
{
@@ -184,7 +184,7 @@ pdf_load_builtin_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontname,
unsigned char *data;
unsigned int len;
- data = pdf_lookup_builtin_font(clean_name, &len);
+ data = pdf_lookup_builtin_font(ctx, clean_name, &len);
if (!data)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find builtin font: '%s'", fontname);
@@ -208,7 +208,7 @@ pdf_load_substitute_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontnam
unsigned char *data;
unsigned int len;
- data = pdf_lookup_substitute_font(mono, serif, bold, italic, &len);
+ data = pdf_lookup_substitute_font(ctx, mono, serif, bold, italic, &len);
if (!data)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find substitute font");
@@ -230,7 +230,7 @@ pdf_load_substitute_cjk_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fon
unsigned int len;
int index;
- data = pdf_lookup_substitute_cjk_font(ros, serif, fontdesc->wmode, &len, &index);
+ data = pdf_lookup_substitute_cjk_font(ctx, ros, serif, fontdesc->wmode, &len, &index);
if (!data)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find builtin CJK font");
@@ -289,18 +289,17 @@ pdf_load_system_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontname, c
}
static void
-pdf_load_embedded_font(pdf_document *doc, pdf_font_desc *fontdesc, char *fontname, pdf_obj *stmref)
+pdf_load_embedded_font(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, char *fontname, pdf_obj *stmref)
{
fz_buffer *buf;
- fz_context *ctx = doc->ctx;
fz_try(ctx)
{
- buf = pdf_load_stream(doc, pdf_to_num(stmref), pdf_to_gen(stmref));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, stmref), pdf_to_gen(ctx, stmref));
}
fz_catch(ctx)
{
- fz_rethrow_message(ctx, "cannot load font stream (%d %d R)", pdf_to_num(stmref), pdf_to_gen(stmref));
+ fz_rethrow_message(ctx, "cannot load font stream (%d %d R)", pdf_to_num(ctx, stmref), pdf_to_gen(ctx, stmref));
}
fz_try(ctx)
@@ -313,7 +312,7 @@ pdf_load_embedded_font(pdf_document *doc, pdf_font_desc *fontdesc, char *fontnam
}
fz_catch(ctx)
{
- fz_rethrow_message(ctx, "cannot load embedded font (%d %d R)", pdf_to_num(stmref), pdf_to_gen(stmref));
+ fz_rethrow_message(ctx, "cannot load embedded font (%d %d R)", pdf_to_num(ctx, stmref), pdf_to_gen(ctx, stmref));
}
fontdesc->size += buf->len;
@@ -337,7 +336,7 @@ pdf_drop_font(fz_context *ctx, pdf_font_desc *fontdesc)
}
static void
-pdf_free_font_imp(fz_context *ctx, fz_storable *fontdesc_)
+pdf_drop_font_imp(fz_context *ctx, fz_storable *fontdesc_)
{
pdf_font_desc *fontdesc = (pdf_font_desc *)fontdesc_;
@@ -362,7 +361,7 @@ pdf_new_font_desc(fz_context *ctx)
pdf_font_desc *fontdesc;
fontdesc = fz_malloc_struct(ctx, pdf_font_desc);
- FZ_INIT_STORABLE(fontdesc, 1, pdf_free_font_imp);
+ FZ_INIT_STORABLE(fontdesc, 1, pdf_drop_font_imp);
fontdesc->size = sizeof(pdf_font_desc);
fontdesc->font = NULL;
@@ -413,7 +412,7 @@ pdf_new_font_desc(fz_context *ctx)
*/
static pdf_font_desc *
-pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
+pdf_load_simple_font_by_name(fz_context *ctx, pdf_document *doc, pdf_obj *dict, char *basefont)
{
pdf_obj *descriptor;
pdf_obj *encoding;
@@ -431,7 +430,6 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
int i, k, n;
int fterr;
int has_lock = 0;
- fz_context *ctx = doc->ctx;
fz_var(fontdesc);
fz_var(etable);
@@ -442,17 +440,17 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
{
fontdesc = pdf_new_font_desc(ctx);
- descriptor = pdf_dict_gets(dict, "FontDescriptor");
+ descriptor = pdf_dict_gets(ctx, dict, "FontDescriptor");
if (descriptor)
- pdf_load_font_descriptor(fontdesc, doc, descriptor, NULL, basefont, 0);
+ pdf_load_font_descriptor(ctx, doc, fontdesc, descriptor, NULL, basefont, 0);
else
pdf_load_builtin_font(ctx, fontdesc, basefont, 0);
/* Some chinese documents mistakenly consider WinAnsiEncoding to be codepage 936 */
- if (descriptor && pdf_is_string(pdf_dict_gets(descriptor, "FontName")) &&
- !pdf_dict_gets(dict, "ToUnicode") &&
- !strcmp(pdf_to_name(pdf_dict_gets(dict, "Encoding")), "WinAnsiEncoding") &&
- pdf_to_int(pdf_dict_gets(descriptor, "Flags")) == 4)
+ if (descriptor && pdf_is_string(ctx, pdf_dict_gets(ctx, descriptor, "FontName")) &&
+ !pdf_dict_gets(ctx, dict, "ToUnicode") &&
+ !strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "Encoding")), "WinAnsiEncoding") &&
+ pdf_to_int(ctx, pdf_dict_gets(ctx, descriptor, "Flags")) == 4)
{
char *cp936fonts[] = {
"\xCB\xCE\xCC\xE5", "SimSun,Regular",
@@ -471,7 +469,7 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
pdf_drop_font(ctx, fontdesc);
fontdesc = NULL;
fontdesc = pdf_new_font_desc(ctx);
- pdf_load_font_descriptor(fontdesc, doc, descriptor, "Adobe-GB1", cp936fonts[i+1], 0);
+ pdf_load_font_descriptor(ctx, doc, fontdesc, descriptor, "Adobe-GB1", cp936fonts[i+1], 0);
fontdesc->encoding = pdf_load_system_cmap(ctx, "GBK-EUC-H");
fontdesc->to_unicode = pdf_load_system_cmap(ctx, "Adobe-GB1-UCS2");
fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-GB1-UCS2");
@@ -532,34 +530,34 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
etable[i] = 0;
}
- encoding = pdf_dict_gets(dict, "Encoding");
+ encoding = pdf_dict_gets(ctx, dict, "Encoding");
if (encoding)
{
- if (pdf_is_name(encoding))
- pdf_load_encoding(estrings, pdf_to_name(encoding));
+ if (pdf_is_name(ctx, encoding))
+ pdf_load_encoding(estrings, pdf_to_name(ctx, encoding));
- if (pdf_is_dict(encoding))
+ if (pdf_is_dict(ctx, encoding))
{
pdf_obj *base, *diff, *item;
- base = pdf_dict_gets(encoding, "BaseEncoding");
- if (pdf_is_name(base))
- pdf_load_encoding(estrings, pdf_to_name(base));
+ base = pdf_dict_gets(ctx, encoding, "BaseEncoding");
+ if (pdf_is_name(ctx, base))
+ pdf_load_encoding(estrings, pdf_to_name(ctx, base));
else if (!fontdesc->is_embedded && !symbolic)
pdf_load_encoding(estrings, "StandardEncoding");
- diff = pdf_dict_gets(encoding, "Differences");
- if (pdf_is_array(diff))
+ diff = pdf_dict_gets(ctx, encoding, "Differences");
+ if (pdf_is_array(ctx, diff))
{
- n = pdf_array_len(diff);
+ n = pdf_array_len(ctx, diff);
k = 0;
for (i = 0; i < n; i++)
{
- item = pdf_array_get(diff, i);
- if (pdf_is_int(item))
- k = pdf_to_int(item);
- if (pdf_is_name(item) && k >= 0 && k < nelem(estrings))
- estrings[k++] = pdf_to_name(item);
+ item = pdf_array_get(ctx, diff, i);
+ if (pdf_is_int(ctx, item))
+ k = pdf_to_int(ctx, item);
+ if (pdf_is_name(ctx, item) && k >= 0 && k < nelem(estrings))
+ estrings[k++] = pdf_to_name(ctx, item);
}
}
}
@@ -575,7 +573,7 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
has_lock = 1;
/* built-in and substitute fonts may be a different type than what the document expects */
- subtype = pdf_to_name(pdf_dict_gets(dict, "Subtype"));
+ subtype = pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "Subtype"));
if (!strcmp(subtype, "Type1"))
kind = TYPE1;
else if (!strcmp(subtype, "MMType1"))
@@ -705,7 +703,7 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
fz_try(ctx)
{
- pdf_load_to_unicode(doc, fontdesc, estrings, NULL, pdf_dict_gets(dict, "ToUnicode"));
+ pdf_load_to_unicode(ctx, doc, fontdesc, estrings, NULL, pdf_dict_gets(ctx, dict, "ToUnicode"));
}
fz_catch(ctx)
{
@@ -719,20 +717,20 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
pdf_set_default_hmtx(ctx, fontdesc, fontdesc->missing_width);
- widths = pdf_dict_gets(dict, "Widths");
+ widths = pdf_dict_gets(ctx, dict, "Widths");
if (widths)
{
int first, last;
- first = pdf_to_int(pdf_dict_gets(dict, "FirstChar"));
- last = pdf_to_int(pdf_dict_gets(dict, "LastChar"));
+ first = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "FirstChar"));
+ last = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "LastChar"));
if (first < 0 || last > 255 || first > last)
first = last = 0;
for (i = 0; i < last - first + 1; i++)
{
- int wid = pdf_to_int(pdf_array_get(widths, i));
+ int wid = pdf_to_int(ctx, pdf_array_get(ctx, widths, i));
pdf_add_hmtx(ctx, fontdesc, i + first, i + first, wid);
}
}
@@ -760,21 +758,21 @@ pdf_load_simple_font_by_name(pdf_document *doc, pdf_obj *dict, char *basefont)
if (fontdesc && etable != fontdesc->cid_to_gid)
fz_free(ctx, etable);
pdf_drop_font(ctx, fontdesc);
- fz_rethrow_message(ctx, "cannot load simple font (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict));
+ fz_rethrow_message(ctx, "cannot load simple font (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
return fontdesc;
}
static pdf_font_desc *
-pdf_load_simple_font(pdf_document *doc, pdf_obj *dict)
+pdf_load_simple_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
- char *basefont = pdf_to_name(pdf_dict_gets(dict, "BaseFont"));
+ char *basefont = pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "BaseFont"));
- return pdf_load_simple_font_by_name(doc, dict, basefont);
+ return pdf_load_simple_font_by_name(ctx, doc, dict, basefont);
}
static int
-hail_mary_make_hash_key(fz_store_hash *hash, void *key_)
+hail_mary_make_hash_key(fz_context *ctx, fz_store_hash *hash, void *key_)
{
hash->u.i.i0 = 0;
hash->u.i.i1 = 0;
@@ -794,14 +792,14 @@ hail_mary_drop_key(fz_context *ctx, void *key)
}
static int
-hail_mary_cmp_key(void *k0, void *k1)
+hail_mary_cmp_key(fz_context *ctx, void *k0, void *k1)
{
return k0 == k1;
}
#ifndef NDEBUG
static void
-hail_mary_debug_key(FILE *out, void *key_)
+hail_mary_debug_key(fz_context *ctx, FILE *out, void *key_)
{
fprintf(out, "hail mary ");
}
@@ -819,19 +817,18 @@ static fz_store_type hail_mary_store_type =
};
pdf_font_desc *
-pdf_load_hail_mary_font(pdf_document *doc)
+pdf_load_hail_mary_font(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
pdf_font_desc *fontdesc;
pdf_font_desc *existing;
- if ((fontdesc = fz_find_item(ctx, pdf_free_font_imp, &hail_mary_store_type, &hail_mary_store_type)) != NULL)
+ if ((fontdesc = fz_find_item(ctx, pdf_drop_font_imp, &hail_mary_store_type, &hail_mary_store_type)) != NULL)
{
return fontdesc;
}
/* FIXME: Get someone with a clue about fonts to fix this */
- fontdesc = pdf_load_simple_font_by_name(doc, NULL, "Helvetica");
+ fontdesc = pdf_load_simple_font_by_name(ctx, doc, NULL, "Helvetica");
existing = fz_store_item(ctx, &hail_mary_store_type, fontdesc, fontdesc->size, &hail_mary_store_type);
assert(existing == NULL);
@@ -844,7 +841,7 @@ pdf_load_hail_mary_font(pdf_document *doc)
*/
static pdf_font_desc *
-load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_unicode)
+load_cid_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_unicode)
{
pdf_obj *widths;
pdf_obj *descriptor;
@@ -857,7 +854,6 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
pdf_obj *cidtogidmap;
pdf_obj *obj;
int dw;
- fz_context *ctx = doc->ctx;
fz_var(fontdesc);
@@ -865,46 +861,46 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
{
/* Get font name and CID collection */
- basefont = pdf_to_name(pdf_dict_gets(dict, "BaseFont"));
+ basefont = pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "BaseFont"));
{
pdf_obj *cidinfo;
char tmpstr[64];
int tmplen;
- cidinfo = pdf_dict_gets(dict, "CIDSystemInfo");
+ cidinfo = pdf_dict_gets(ctx, dict, "CIDSystemInfo");
if (!cidinfo)
fz_throw(ctx, FZ_ERROR_GENERIC, "cid font is missing info");
- obj = pdf_dict_gets(cidinfo, "Registry");
- tmplen = fz_mini(sizeof tmpstr - 1, pdf_to_str_len(obj));
- memcpy(tmpstr, pdf_to_str_buf(obj), tmplen);
+ obj = pdf_dict_gets(ctx, cidinfo, "Registry");
+ tmplen = fz_mini(sizeof tmpstr - 1, pdf_to_str_len(ctx, obj));
+ memcpy(tmpstr, pdf_to_str_buf(ctx, obj), tmplen);
tmpstr[tmplen] = '\0';
fz_strlcpy(collection, tmpstr, sizeof collection);
fz_strlcat(collection, "-", sizeof collection);
- obj = pdf_dict_gets(cidinfo, "Ordering");
- tmplen = fz_mini(sizeof tmpstr - 1, pdf_to_str_len(obj));
- memcpy(tmpstr, pdf_to_str_buf(obj), tmplen);
+ obj = pdf_dict_gets(ctx, cidinfo, "Ordering");
+ tmplen = fz_mini(sizeof tmpstr - 1, pdf_to_str_len(ctx, obj));
+ memcpy(tmpstr, pdf_to_str_buf(ctx, obj), tmplen);
tmpstr[tmplen] = '\0';
fz_strlcat(collection, tmpstr, sizeof collection);
}
/* Encoding */
- if (pdf_is_name(encoding))
+ if (pdf_is_name(ctx, encoding))
{
- if (!strcmp(pdf_to_name(encoding), "Identity-H"))
+ if (!strcmp(pdf_to_name(ctx, encoding), "Identity-H"))
cmap = pdf_new_identity_cmap(ctx, 0, 2);
- else if (!strcmp(pdf_to_name(encoding), "Identity-V"))
+ else if (!strcmp(pdf_to_name(ctx, encoding), "Identity-V"))
cmap = pdf_new_identity_cmap(ctx, 1, 2);
else
- cmap = pdf_load_system_cmap(ctx, pdf_to_name(encoding));
+ cmap = pdf_load_system_cmap(ctx, pdf_to_name(ctx, encoding));
}
- else if (pdf_is_indirect(encoding))
+ else if (pdf_is_indirect(ctx, encoding))
{
- cmap = pdf_load_embedded_cmap(doc, encoding);
+ cmap = pdf_load_embedded_cmap(ctx, doc, encoding);
}
else
{
@@ -920,21 +916,21 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
pdf_set_font_wmode(ctx, fontdesc, pdf_cmap_wmode(ctx, fontdesc->encoding));
- descriptor = pdf_dict_gets(dict, "FontDescriptor");
+ descriptor = pdf_dict_gets(ctx, dict, "FontDescriptor");
if (!descriptor)
fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: missing font descriptor");
- pdf_load_font_descriptor(fontdesc, doc, descriptor, collection, basefont, 1);
+ pdf_load_font_descriptor(ctx, doc, fontdesc, descriptor, collection, basefont, 1);
face = fontdesc->font->ft_face;
/* Apply encoding */
- cidtogidmap = pdf_dict_gets(dict, "CIDToGIDMap");
- if (pdf_is_indirect(cidtogidmap))
+ cidtogidmap = pdf_dict_gets(ctx, dict, "CIDToGIDMap");
+ if (pdf_is_indirect(ctx, cidtogidmap))
{
fz_buffer *buf;
- buf = pdf_load_stream(doc, pdf_to_num(cidtogidmap), pdf_to_gen(cidtogidmap));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, cidtogidmap), pdf_to_gen(ctx, cidtogidmap));
fontdesc->cid_to_gid_len = (buf->len) / 2;
fontdesc->cid_to_gid = fz_malloc_array(ctx, fontdesc->cid_to_gid_len, sizeof(unsigned short));
@@ -968,7 +964,7 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
fontdesc->to_ttf_cmap = pdf_load_system_cmap(ctx, "Adobe-Korea1-UCS2");
}
- pdf_load_to_unicode(doc, fontdesc, NULL, collection, to_unicode);
+ pdf_load_to_unicode(ctx, doc, fontdesc, NULL, collection, to_unicode);
/* If we have an identity encoding, we're supposed to use the glyph ids directly.
* If we only have a substitute font, that won't work.
@@ -984,35 +980,35 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
/* Horizontal */
dw = 1000;
- obj = pdf_dict_gets(dict, "DW");
+ obj = pdf_dict_gets(ctx, dict, "DW");
if (obj)
- dw = pdf_to_int(obj);
+ dw = pdf_to_int(ctx, obj);
pdf_set_default_hmtx(ctx, fontdesc, dw);
- widths = pdf_dict_gets(dict, "W");
+ widths = pdf_dict_gets(ctx, dict, "W");
if (widths)
{
int c0, c1, w, n, m;
- n = pdf_array_len(widths);
+ n = pdf_array_len(ctx, widths);
for (i = 0; i < n; )
{
- c0 = pdf_to_int(pdf_array_get(widths, i));
- obj = pdf_array_get(widths, i + 1);
- if (pdf_is_array(obj))
+ c0 = pdf_to_int(ctx, pdf_array_get(ctx, widths, i));
+ obj = pdf_array_get(ctx, widths, i + 1);
+ if (pdf_is_array(ctx, obj))
{
- m = pdf_array_len(obj);
+ m = pdf_array_len(ctx, obj);
for (k = 0; k < m; k++)
{
- w = pdf_to_int(pdf_array_get(obj, k));
+ w = pdf_to_int(ctx, pdf_array_get(ctx, obj, k));
pdf_add_hmtx(ctx, fontdesc, c0 + k, c0 + k, w);
}
i += 2;
}
else
{
- c1 = pdf_to_int(obj);
- w = pdf_to_int(pdf_array_get(widths, i + 2));
+ c1 = pdf_to_int(ctx, obj);
+ w = pdf_to_int(ctx, pdf_array_get(ctx, widths, i + 2));
pdf_add_hmtx(ctx, fontdesc, c0, c1, w);
i += 3;
}
@@ -1028,43 +1024,43 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
int dw2y = 880;
int dw2w = -1000;
- obj = pdf_dict_gets(dict, "DW2");
+ obj = pdf_dict_gets(ctx, dict, "DW2");
if (obj)
{
- dw2y = pdf_to_int(pdf_array_get(obj, 0));
- dw2w = pdf_to_int(pdf_array_get(obj, 1));
+ dw2y = pdf_to_int(ctx, pdf_array_get(ctx, obj, 0));
+ dw2w = pdf_to_int(ctx, pdf_array_get(ctx, obj, 1));
}
pdf_set_default_vmtx(ctx, fontdesc, dw2y, dw2w);
- widths = pdf_dict_gets(dict, "W2");
+ widths = pdf_dict_gets(ctx, dict, "W2");
if (widths)
{
int c0, c1, w, x, y, n;
- n = pdf_array_len(widths);
+ n = pdf_array_len(ctx, widths);
for (i = 0; i < n; )
{
- c0 = pdf_to_int(pdf_array_get(widths, i));
- obj = pdf_array_get(widths, i + 1);
- if (pdf_is_array(obj))
+ c0 = pdf_to_int(ctx, pdf_array_get(ctx, widths, i));
+ obj = pdf_array_get(ctx, widths, i + 1);
+ if (pdf_is_array(ctx, obj))
{
- int m = pdf_array_len(obj);
+ int m = pdf_array_len(ctx, obj);
for (k = 0; k * 3 < m; k ++)
{
- w = pdf_to_int(pdf_array_get(obj, k * 3 + 0));
- x = pdf_to_int(pdf_array_get(obj, k * 3 + 1));
- y = pdf_to_int(pdf_array_get(obj, k * 3 + 2));
+ w = pdf_to_int(ctx, pdf_array_get(ctx, obj, k * 3 + 0));
+ x = pdf_to_int(ctx, pdf_array_get(ctx, obj, k * 3 + 1));
+ y = pdf_to_int(ctx, pdf_array_get(ctx, obj, k * 3 + 2));
pdf_add_vmtx(ctx, fontdesc, c0 + k, c0 + k, x, y, w);
}
i += 2;
}
else
{
- c1 = pdf_to_int(obj);
- w = pdf_to_int(pdf_array_get(widths, i + 2));
- x = pdf_to_int(pdf_array_get(widths, i + 3));
- y = pdf_to_int(pdf_array_get(widths, i + 4));
+ c1 = pdf_to_int(ctx, obj);
+ w = pdf_to_int(ctx, pdf_array_get(ctx, widths, i + 2));
+ x = pdf_to_int(ctx, pdf_array_get(ctx, widths, i + 3));
+ y = pdf_to_int(ctx, pdf_array_get(ctx, widths, i + 4));
pdf_add_vmtx(ctx, fontdesc, c0, c1, x, y, w);
i += 5;
}
@@ -1077,14 +1073,14 @@ load_cid_font(pdf_document *doc, pdf_obj *dict, pdf_obj *encoding, pdf_obj *to_u
fz_catch(ctx)
{
pdf_drop_font(ctx, fontdesc);
- fz_rethrow_message(ctx, "cannot load cid font (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict));
+ fz_rethrow_message(ctx, "cannot load cid font (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
return fontdesc;
}
static pdf_font_desc *
-pdf_load_type0_font(pdf_document *doc, pdf_obj *dict)
+pdf_load_type0_font(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
pdf_obj *dfonts;
pdf_obj *dfont;
@@ -1092,21 +1088,21 @@ pdf_load_type0_font(pdf_document *doc, pdf_obj *dict)
pdf_obj *encoding;
pdf_obj *to_unicode;
- dfonts = pdf_dict_gets(dict, "DescendantFonts");
+ dfonts = pdf_dict_gets(ctx, dict, "DescendantFonts");
if (!dfonts)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cid font is missing descendant fonts");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cid font is missing descendant fonts");
- dfont = pdf_array_get(dfonts, 0);
+ dfont = pdf_array_get(ctx, dfonts, 0);
- subtype = pdf_dict_gets(dfont, "Subtype");
- encoding = pdf_dict_gets(dict, "Encoding");
- to_unicode = pdf_dict_gets(dict, "ToUnicode");
+ subtype = pdf_dict_gets(ctx, dfont, "Subtype");
+ encoding = pdf_dict_gets(ctx, dict, "Encoding");
+ to_unicode = pdf_dict_gets(ctx, dict, "ToUnicode");
- if (pdf_is_name(subtype) && !strcmp(pdf_to_name(subtype), "CIDFontType0"))
- return load_cid_font(doc, dfont, encoding, to_unicode);
- if (pdf_is_name(subtype) && !strcmp(pdf_to_name(subtype), "CIDFontType2"))
- return load_cid_font(doc, dfont, encoding, to_unicode);
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "syntaxerror: unknown cid font type");
+ if (pdf_is_name(ctx, subtype) && !strcmp(pdf_to_name(ctx, subtype), "CIDFontType0"))
+ return load_cid_font(ctx, doc, dfont, encoding, to_unicode);
+ if (pdf_is_name(ctx, subtype) && !strcmp(pdf_to_name(ctx, subtype), "CIDFontType2"))
+ return load_cid_font(ctx, doc, dfont, encoding, to_unicode);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: unknown cid font type");
}
/*
@@ -1114,34 +1110,33 @@ pdf_load_type0_font(pdf_document *doc, pdf_obj *dict)
*/
static void
-pdf_load_font_descriptor(pdf_font_desc *fontdesc, pdf_document *doc, pdf_obj *dict, char *collection, char *basefont, int iscidfont)
+pdf_load_font_descriptor(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, pdf_obj *dict, char *collection, char *basefont, int iscidfont)
{
pdf_obj *obj1, *obj2, *obj3, *obj;
char *fontname;
FT_Face face;
- fz_context *ctx = doc->ctx;
/* Prefer BaseFont; don't bother with FontName */
fontname = basefont;
- fontdesc->flags = pdf_to_int(pdf_dict_gets(dict, "Flags"));
- fontdesc->italic_angle = pdf_to_real(pdf_dict_gets(dict, "ItalicAngle"));
- fontdesc->ascent = pdf_to_real(pdf_dict_gets(dict, "Ascent"));
- fontdesc->descent = pdf_to_real(pdf_dict_gets(dict, "Descent"));
- fontdesc->cap_height = pdf_to_real(pdf_dict_gets(dict, "CapHeight"));
- fontdesc->x_height = pdf_to_real(pdf_dict_gets(dict, "XHeight"));
- fontdesc->missing_width = pdf_to_real(pdf_dict_gets(dict, "MissingWidth"));
-
- obj1 = pdf_dict_gets(dict, "FontFile");
- obj2 = pdf_dict_gets(dict, "FontFile2");
- obj3 = pdf_dict_gets(dict, "FontFile3");
+ fontdesc->flags = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "Flags"));
+ fontdesc->italic_angle = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "ItalicAngle"));
+ fontdesc->ascent = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "Ascent"));
+ fontdesc->descent = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "Descent"));
+ fontdesc->cap_height = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "CapHeight"));
+ fontdesc->x_height = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "XHeight"));
+ fontdesc->missing_width = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "MissingWidth"));
+
+ obj1 = pdf_dict_gets(ctx, dict, "FontFile");
+ obj2 = pdf_dict_gets(ctx, dict, "FontFile2");
+ obj3 = pdf_dict_gets(ctx, dict, "FontFile3");
obj = obj1 ? obj1 : obj2 ? obj2 : obj3;
- if (pdf_is_indirect(obj))
+ if (pdf_is_indirect(ctx, obj))
{
fz_try(ctx)
{
- pdf_load_embedded_font(doc, fontdesc, fontname, obj);
+ pdf_load_embedded_font(ctx, doc, fontdesc, fontname, obj);
}
fz_catch(ctx)
{
@@ -1212,52 +1207,51 @@ pdf_make_width_table(fz_context *ctx, pdf_font_desc *fontdesc)
}
pdf_font_desc *
-pdf_load_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, int nested_depth)
+pdf_load_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, int nested_depth)
{
char *subtype;
pdf_obj *dfonts;
pdf_obj *charprocs;
- fz_context *ctx = doc->ctx;
pdf_font_desc *fontdesc;
int type3 = 0;
- if ((fontdesc = pdf_find_item(ctx, pdf_free_font_imp, dict)) != NULL)
+ if ((fontdesc = pdf_find_item(ctx, pdf_drop_font_imp, dict)) != NULL)
{
return fontdesc;
}
- subtype = pdf_to_name(pdf_dict_gets(dict, "Subtype"));
- dfonts = pdf_dict_gets(dict, "DescendantFonts");
- charprocs = pdf_dict_gets(dict, "CharProcs");
+ subtype = pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "Subtype"));
+ dfonts = pdf_dict_gets(ctx, dict, "DescendantFonts");
+ charprocs = pdf_dict_gets(ctx, dict, "CharProcs");
if (subtype && !strcmp(subtype, "Type0"))
- fontdesc = pdf_load_type0_font(doc, dict);
+ fontdesc = pdf_load_type0_font(ctx, doc, dict);
else if (subtype && !strcmp(subtype, "Type1"))
- fontdesc = pdf_load_simple_font(doc, dict);
+ fontdesc = pdf_load_simple_font(ctx, doc, dict);
else if (subtype && !strcmp(subtype, "MMType1"))
- fontdesc = pdf_load_simple_font(doc, dict);
+ fontdesc = pdf_load_simple_font(ctx, doc, dict);
else if (subtype && !strcmp(subtype, "TrueType"))
- fontdesc = pdf_load_simple_font(doc, dict);
+ fontdesc = pdf_load_simple_font(ctx, doc, dict);
else if (subtype && !strcmp(subtype, "Type3"))
{
- fontdesc = pdf_load_type3_font(doc, rdb, dict);
+ fontdesc = pdf_load_type3_font(ctx, doc, rdb, dict);
type3 = 1;
}
else if (charprocs)
{
fz_warn(ctx, "unknown font format, guessing type3.");
- fontdesc = pdf_load_type3_font(doc, rdb, dict);
+ fontdesc = pdf_load_type3_font(ctx, doc, rdb, dict);
type3 = 1;
}
else if (dfonts)
{
fz_warn(ctx, "unknown font format, guessing type0.");
- fontdesc = pdf_load_type0_font(doc, dict);
+ fontdesc = pdf_load_type0_font(ctx, doc, dict);
}
else
{
fz_warn(ctx, "unknown font format, guessing type1 or truetype.");
- fontdesc = pdf_load_simple_font(doc, dict);
+ fontdesc = pdf_load_simple_font(ctx, doc, dict);
}
/* Save the widths to stretch non-CJK substitute fonts */
@@ -1267,7 +1261,7 @@ pdf_load_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, int nested_depth)
pdf_store_item(ctx, dict, fontdesc, fontdesc->size);
if (type3)
- pdf_load_type3_glyphs(doc, fontdesc, nested_depth);
+ pdf_load_type3_glyphs(ctx, doc, fontdesc, nested_depth);
return fontdesc;
}
diff --git a/source/pdf/pdf-fontfile.c b/source/pdf/pdf-fontfile.c
index f0787bc6..86b6682b 100644
--- a/source/pdf/pdf-fontfile.c
+++ b/source/pdf/pdf-fontfile.c
@@ -4,14 +4,11 @@
Which fonts are embedded is based on a few preprocessor definitions.
The base 14 fonts are always embedded.
- For font substitution we embed DroidSans which has good glyph coverage.
For CJK font substitution we embed DroidSansFallback.
Set NOCJK to skip all CJK support (this also omits embedding the CJK CMaps)
Set NOCJKFONT to skip the embedded CJK font.
Set NOCJKFULL to embed a smaller CJK font without CJK Extension A support.
-
- Set NODROIDFONT to use the base 14 fonts as substitute fonts.
*/
#ifdef NOCJK
@@ -20,10 +17,6 @@
#include "gen_font_base14.h"
-#ifndef NODROIDFONT
-#include "gen_font_droid.h"
-#endif
-
#ifndef NOCJKFONT
#ifndef NOCJKFULL
#include "gen_font_cjk_full.h"
@@ -33,55 +26,55 @@
#endif
unsigned char *
-pdf_lookup_builtin_font(const char *name, unsigned int *len)
+pdf_lookup_builtin_font(fz_context *ctx, const char *name, unsigned int *len)
{
if (!strcmp("Courier", name)) {
- *len = sizeof pdf_font_NimbusMon_Reg;
- return (unsigned char*) pdf_font_NimbusMon_Reg;
+ *len = sizeof pdf_font_NimbusMono_Regular;
+ return (unsigned char*) pdf_font_NimbusMono_Regular;
}
if (!strcmp("Courier-Bold", name)) {
- *len = sizeof pdf_font_NimbusMon_Bol;
- return (unsigned char*) pdf_font_NimbusMon_Bol;
+ *len = sizeof pdf_font_NimbusMono_Bold;
+ return (unsigned char*) pdf_font_NimbusMono_Bold;
}
if (!strcmp("Courier-Oblique", name)) {
- *len = sizeof pdf_font_NimbusMon_Obl;
- return (unsigned char*) pdf_font_NimbusMon_Obl;
+ *len = sizeof pdf_font_NimbusMono_Oblique;
+ return (unsigned char*) pdf_font_NimbusMono_Oblique;
}
if (!strcmp("Courier-BoldOblique", name)) {
- *len = sizeof pdf_font_NimbusMon_BolObl;
- return (unsigned char*) pdf_font_NimbusMon_BolObl;
+ *len = sizeof pdf_font_NimbusMono_BoldOblique;
+ return (unsigned char*) pdf_font_NimbusMono_BoldOblique;
}
if (!strcmp("Helvetica", name)) {
- *len = sizeof pdf_font_NimbusSan_Reg;
- return (unsigned char*) pdf_font_NimbusSan_Reg;
+ *len = sizeof pdf_font_NimbusSanL_Reg;
+ return (unsigned char*) pdf_font_NimbusSanL_Reg;
}
if (!strcmp("Helvetica-Bold", name)) {
- *len = sizeof pdf_font_NimbusSan_Bol;
- return (unsigned char*) pdf_font_NimbusSan_Bol;
+ *len = sizeof pdf_font_NimbusSanL_Bol;
+ return (unsigned char*) pdf_font_NimbusSanL_Bol;
}
if (!strcmp("Helvetica-Oblique", name)) {
- *len = sizeof pdf_font_NimbusSan_Ita;
- return (unsigned char*) pdf_font_NimbusSan_Ita;
+ *len = sizeof pdf_font_NimbusSanL_RegIta;
+ return (unsigned char*) pdf_font_NimbusSanL_RegIta;
}
if (!strcmp("Helvetica-BoldOblique", name)) {
- *len = sizeof pdf_font_NimbusSan_BolIta;
- return (unsigned char*) pdf_font_NimbusSan_BolIta;
+ *len = sizeof pdf_font_NimbusSanL_BolIta;
+ return (unsigned char*) pdf_font_NimbusSanL_BolIta;
}
if (!strcmp("Times-Roman", name)) {
- *len = sizeof pdf_font_NimbusRom_Reg;
- return (unsigned char*) pdf_font_NimbusRom_Reg;
+ *len = sizeof pdf_font_NimbusRomNo9L_Reg;
+ return (unsigned char*) pdf_font_NimbusRomNo9L_Reg;
}
if (!strcmp("Times-Bold", name)) {
- *len = sizeof pdf_font_NimbusRom_Med;
- return (unsigned char*) pdf_font_NimbusRom_Med;
+ *len = sizeof pdf_font_NimbusRomNo9L_Med;
+ return (unsigned char*) pdf_font_NimbusRomNo9L_Med;
}
if (!strcmp("Times-Italic", name)) {
- *len = sizeof pdf_font_NimbusRom_Ita;
- return (unsigned char*) pdf_font_NimbusRom_Ita;
+ *len = sizeof pdf_font_NimbusRomNo9L_RegIta;
+ return (unsigned char*) pdf_font_NimbusRomNo9L_RegIta;
}
if (!strcmp("Times-BoldItalic", name)) {
- *len = sizeof pdf_font_NimbusRom_MedIta;
- return (unsigned char*) pdf_font_NimbusRom_MedIta;
+ *len = sizeof pdf_font_NimbusRomNo9L_MedIta;
+ return (unsigned char*) pdf_font_NimbusRomNo9L_MedIta;
}
if (!strcmp("Symbol", name)) {
*len = sizeof pdf_font_StandardSymL;
@@ -96,47 +89,37 @@ pdf_lookup_builtin_font(const char *name, unsigned int *len)
}
unsigned char *
-pdf_lookup_substitute_font(int mono, int serif, int bold, int italic, unsigned int *len)
+pdf_lookup_substitute_font(fz_context *ctx, int mono, int serif, int bold, int italic, unsigned int *len)
{
-#ifdef NODROIDFONT
if (mono) {
if (bold) {
- if (italic) return pdf_lookup_builtin_font("Courier-BoldOblique", len);
- else return pdf_lookup_builtin_font("Courier-Bold", len);
+ if (italic) return pdf_lookup_builtin_font(ctx, "Courier-BoldOblique", len);
+ else return pdf_lookup_builtin_font(ctx, "Courier-Bold", len);
} else {
- if (italic) return pdf_lookup_builtin_font("Courier-Oblique", len);
- else return pdf_lookup_builtin_font("Courier", len);
+ if (italic) return pdf_lookup_builtin_font(ctx, "Courier-Oblique", len);
+ else return pdf_lookup_builtin_font(ctx, "Courier", len);
}
} else if (serif) {
if (bold) {
- if (italic) return pdf_lookup_builtin_font("Times-BoldItalic", len);
- else return pdf_lookup_builtin_font("Times-Bold", len);
+ if (italic) return pdf_lookup_builtin_font(ctx, "Times-BoldItalic", len);
+ else return pdf_lookup_builtin_font(ctx, "Times-Bold", len);
} else {
- if (italic) return pdf_lookup_builtin_font("Times-Italic", len);
- else return pdf_lookup_builtin_font("Times-Roman", len);
+ if (italic) return pdf_lookup_builtin_font(ctx, "Times-Italic", len);
+ else return pdf_lookup_builtin_font(ctx, "Times-Roman", len);
}
} else {
if (bold) {
- if (italic) return pdf_lookup_builtin_font("Helvetica-BoldOblique", len);
- else return pdf_lookup_builtin_font("Helvetica-Bold", len);
+ if (italic) return pdf_lookup_builtin_font(ctx, "Helvetica-BoldOblique", len);
+ else return pdf_lookup_builtin_font(ctx, "Helvetica-Bold", len);
} else {
- if (italic) return pdf_lookup_builtin_font("Helvetica-Oblique", len);
- else return pdf_lookup_builtin_font("Helvetica", len);
+ if (italic) return pdf_lookup_builtin_font(ctx, "Helvetica-Oblique", len);
+ else return pdf_lookup_builtin_font(ctx, "Helvetica", len);
}
}
-#else
- if (mono) {
- *len = sizeof pdf_font_DroidSansMono;
- return (unsigned char*) pdf_font_DroidSansMono;
- } else {
- *len = sizeof pdf_font_DroidSans;
- return (unsigned char*) pdf_font_DroidSans;
- }
-#endif
}
unsigned char *
-pdf_lookup_substitute_cjk_font(int ros, int serif, int wmode, unsigned int *len, int *index)
+pdf_lookup_substitute_cjk_font(fz_context *ctx, int ros, int serif, int wmode, unsigned int *len, int *index)
{
#ifndef NOCJKFONT
#ifndef NOCJKFULL
diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c
index c5e2ef78..4caadd25 100644
--- a/source/pdf/pdf-form.c
+++ b/source/pdf/pdf-form.c
@@ -15,9 +15,9 @@ enum
SigFlag_AppendOnly = 2
};
-static int pdf_field_dirties_document(pdf_document *doc, pdf_obj *field)
+static int pdf_field_dirties_document(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- int ff = pdf_get_field_flags(doc, field);
+ int ff = pdf_get_field_flags(ctx, doc, field);
if (ff & Ff_NoExport) return 0;
if (ff & Ff_ReadOnly) return 0;
return 1;
@@ -25,33 +25,32 @@ static int pdf_field_dirties_document(pdf_document *doc, pdf_obj *field)
/* Find the point in a field hierarchy where all descendents
* share the same name */
-static pdf_obj *find_head_of_field_group(pdf_obj *obj)
+static pdf_obj *find_head_of_field_group(fz_context *ctx, pdf_obj *obj)
{
- if (obj == NULL || pdf_dict_gets(obj, "T"))
+ if (obj == NULL || pdf_dict_gets(ctx, obj, "T"))
return obj;
else
- return find_head_of_field_group(pdf_dict_gets(obj, "Parent"));
+ return find_head_of_field_group(ctx, pdf_dict_gets(ctx, obj, "Parent"));
}
-static void pdf_field_mark_dirty(pdf_document *doc, pdf_obj *field)
+static void pdf_field_mark_dirty(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- pdf_obj *kids = pdf_dict_gets(field, "Kids");
+ pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids");
if (kids)
{
- int i, n = pdf_array_len(kids);
+ int i, n = pdf_array_len(ctx, kids);
for (i = 0; i < n; i++)
- pdf_field_mark_dirty(doc, pdf_array_get(kids, i));
+ pdf_field_mark_dirty(ctx, doc, pdf_array_get(ctx, kids, i));
}
else
{
- pdf_dirty_obj(field);
+ pdf_dirty_obj(ctx, field);
}
}
-static void update_field_value(pdf_document *doc, pdf_obj *obj, char *text)
+static void update_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *text)
{
- fz_context *ctx = doc->ctx;
pdf_obj *sobj = NULL;
pdf_obj *grp;
@@ -60,40 +59,40 @@ static void update_field_value(pdf_document *doc, pdf_obj *obj, char *text)
/* All fields of the same name should be updated, so
* set the value at the head of the group */
- grp = find_head_of_field_group(obj);
+ grp = find_head_of_field_group(ctx, obj);
if (grp)
obj = grp;
fz_var(sobj);
fz_try(ctx)
{
- sobj = pdf_new_string(doc, text, strlen(text));
- pdf_dict_puts(obj, "V", sobj);
+ sobj = pdf_new_string(ctx, doc, text, strlen(text));
+ pdf_dict_puts(ctx, obj, "V", sobj);
}
fz_always(ctx)
{
- pdf_drop_obj(sobj);
+ pdf_drop_obj(ctx, sobj);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
- pdf_field_mark_dirty(doc, obj);
+ pdf_field_mark_dirty(ctx, doc, obj);
}
-static pdf_obj *find_field(pdf_obj *dict, char *name, int len)
+static pdf_obj *find_field(fz_context *ctx, pdf_obj *dict, char *name, int len)
{
pdf_obj *field;
- int i, n = pdf_array_len(dict);
+ int i, n = pdf_array_len(ctx, dict);
for (i = 0; i < n; i++)
{
char *part;
- field = pdf_array_get(dict, i);
- part = pdf_to_str_buf(pdf_dict_gets(field, "T"));
+ field = pdf_array_get(ctx, dict, i);
+ part = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, field, "T"));
if (strlen(part) == (size_t)len && !memcmp(part, name, len))
return field;
}
@@ -101,7 +100,7 @@ static pdf_obj *find_field(pdf_obj *dict, char *name, int len)
return NULL;
}
-pdf_obj *pdf_lookup_field(pdf_obj *form, char *name)
+pdf_obj *pdf_lookup_field(fz_context *ctx, pdf_obj *form, char *name)
{
char *dot;
char *namep;
@@ -118,17 +117,16 @@ pdf_obj *pdf_lookup_field(pdf_obj *form, char *name)
namep = dot + 1;
dot = strchr(namep, '.');
len = dot ? dot - namep : strlen(namep);
- dict = find_field(form, namep, len);
+ dict = find_field(ctx, form, namep, len);
if (dot)
- form = pdf_dict_gets(dict, "Kids");
+ form = pdf_dict_gets(ctx, dict, "Kids");
}
return dict;
}
-static void reset_field(pdf_document *doc, pdf_obj *field)
+static void reset_field(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- fz_context *ctx = doc->ctx;
/* Set V to DV whereever DV is present, and delete V where DV is not.
* FIXME: we assume for now that V has not been set unequal
* to DV higher in the hierarchy than "field".
@@ -136,13 +134,13 @@ static void reset_field(pdf_document *doc, pdf_obj *field)
* At the bottom of the hierarchy we may find widget annotations
* that aren't also fields, but DV and V will not be present in their
* dictionaries, and attempts to remove V will be harmless. */
- pdf_obj *dv = pdf_dict_gets(field, "DV");
- pdf_obj *kids = pdf_dict_gets(field, "Kids");
+ pdf_obj *dv = pdf_dict_gets(ctx, field, "DV");
+ pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids");
if (dv)
- pdf_dict_puts(field, "V", dv);
+ pdf_dict_puts(ctx, field, "V", dv);
else
- pdf_dict_dels(field, "V");
+ pdf_dict_dels(ctx, field, "V");
if (kids == NULL)
{
@@ -150,25 +148,25 @@ static void reset_field(pdf_document *doc, pdf_obj *field)
* In some cases we need to update the appearance state;
* in others we need to mark the field as dirty so that
* the appearance stream will be regenerated. */
- switch (pdf_field_type(doc, field))
+ switch (pdf_field_type(ctx, doc, field))
{
case PDF_WIDGET_TYPE_RADIOBUTTON:
case PDF_WIDGET_TYPE_CHECKBOX:
{
- pdf_obj *leafv = pdf_get_inheritable(doc, field, "V");
+ pdf_obj *leafv = pdf_get_inheritable(ctx, doc, field, "V");
if (leafv)
- pdf_keep_obj(leafv);
+ pdf_keep_obj(ctx, leafv);
else
- leafv = pdf_new_name(doc, "Off");
+ leafv = pdf_new_name(ctx, doc, "Off");
fz_try(ctx)
{
- pdf_dict_puts(field, "AS", leafv);
+ pdf_dict_puts(ctx, field, "AS", leafv);
}
fz_always(ctx)
{
- pdf_drop_obj(leafv);
+ pdf_drop_obj(ctx, leafv);
}
fz_catch(ctx)
{
@@ -181,46 +179,46 @@ static void reset_field(pdf_document *doc, pdf_obj *field)
break;
default:
- pdf_field_mark_dirty(doc, field);
+ pdf_field_mark_dirty(ctx, doc, field);
break;
}
}
- if (pdf_field_dirties_document(doc, field))
+ if (pdf_field_dirties_document(ctx, doc, field))
doc->dirty = 1;
}
-void pdf_field_reset(pdf_document *doc, pdf_obj *field)
+void pdf_field_reset(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- pdf_obj *kids = pdf_dict_gets(field, "Kids");
+ pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids");
- reset_field(doc, field);
+ reset_field(ctx, doc, field);
if (kids)
{
- int i, n = pdf_array_len(kids);
+ int i, n = pdf_array_len(ctx, kids);
for (i = 0; i < n; i++)
- pdf_field_reset(doc, pdf_array_get(kids, i));
+ pdf_field_reset(ctx, doc, pdf_array_get(ctx, kids, i));
}
}
-static void add_field_hierarchy_to_array(pdf_obj *array, pdf_obj *field)
+static void add_field_hierarchy_to_array(fz_context *ctx, pdf_obj *array, pdf_obj *field)
{
- pdf_obj *kids = pdf_dict_gets(field, "Kids");
- pdf_obj *exclude = pdf_dict_gets(field, "Exclude");
+ pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids");
+ pdf_obj *exclude = pdf_dict_gets(ctx, field, "Exclude");
if (exclude)
return;
- pdf_array_push(array, field);
+ pdf_array_push(ctx, array, field);
if (kids)
{
- int i, n = pdf_array_len(kids);
+ int i, n = pdf_array_len(ctx, kids);
for (i = 0; i < n; i++)
- add_field_hierarchy_to_array(array, pdf_array_get(kids, i));
+ add_field_hierarchy_to_array(ctx, array, pdf_array_get(ctx, kids, i));
}
}
@@ -231,12 +229,11 @@ static void add_field_hierarchy_to_array(pdf_obj *array, pdf_obj *field)
the array. specified_fields interprets this information and produces the array
of fields to be acted upon.
*/
-static pdf_obj *specified_fields(pdf_document *doc, pdf_obj *fields, int exclude)
+static pdf_obj *specified_fields(fz_context *ctx, pdf_document *doc, pdf_obj *fields, int exclude)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *form = pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/Fields");
+ pdf_obj *form = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/Fields");
int i, n;
- pdf_obj *result = pdf_new_array(doc, 0);
+ pdf_obj *result = pdf_new_array(ctx, doc, 0);
pdf_obj *nil = NULL;
fz_var(nil);
@@ -247,85 +244,84 @@ static pdf_obj *specified_fields(pdf_document *doc, pdf_obj *fields, int exclude
if (exclude || !fields)
{
/* mark the fields we don't want to act upon */
- nil = pdf_new_null(doc);
+ nil = pdf_new_null(ctx, doc);
- n = pdf_array_len(fields);
+ n = pdf_array_len(ctx, fields);
for (i = 0; i < n; i++)
{
- pdf_obj *field = pdf_array_get(fields, i);
+ pdf_obj *field = pdf_array_get(ctx, fields, i);
- if (pdf_is_string(field))
- field = pdf_lookup_field(form, pdf_to_str_buf(field));
+ if (pdf_is_string(ctx, field))
+ field = pdf_lookup_field(ctx, form, pdf_to_str_buf(ctx, field));
if (field)
- pdf_dict_puts(field, "Exclude", nil);
+ pdf_dict_puts(ctx, field, "Exclude", nil);
}
/* Act upon all unmarked fields */
- n = pdf_array_len(form);
+ n = pdf_array_len(ctx, form);
for (i = 0; i < n; i++)
- add_field_hierarchy_to_array(result, pdf_array_get(form, i));
+ add_field_hierarchy_to_array(ctx, result, pdf_array_get(ctx, form, i));
/* Unmark the marked fields */
- n = pdf_array_len(fields);
+ n = pdf_array_len(ctx, fields);
for (i = 0; i < n; i++)
{
- pdf_obj *field = pdf_array_get(fields, i);
+ pdf_obj *field = pdf_array_get(ctx, fields, i);
- if (pdf_is_string(field))
- field = pdf_lookup_field(form, pdf_to_str_buf(field));
+ if (pdf_is_string(ctx, field))
+ field = pdf_lookup_field(ctx, form, pdf_to_str_buf(ctx, field));
if (field)
- pdf_dict_dels(field, "Exclude");
+ pdf_dict_dels(ctx, field, "Exclude");
}
}
else
{
- n = pdf_array_len(fields);
+ n = pdf_array_len(ctx, fields);
for (i = 0; i < n; i++)
{
- pdf_obj *field = pdf_array_get(fields, i);
+ pdf_obj *field = pdf_array_get(ctx, fields, i);
- if (pdf_is_string(field))
- field = pdf_lookup_field(form, pdf_to_str_buf(field));
+ if (pdf_is_string(ctx, field))
+ field = pdf_lookup_field(ctx, form, pdf_to_str_buf(ctx, field));
if (field)
- add_field_hierarchy_to_array(result, field);
+ add_field_hierarchy_to_array(ctx, result, field);
}
}
}
fz_always(ctx)
{
- pdf_drop_obj(nil);
+ pdf_drop_obj(ctx, nil);
}
fz_catch(ctx)
{
- pdf_drop_obj(result);
+ pdf_drop_obj(ctx, result);
fz_rethrow(ctx);
}
return result;
}
-static void reset_form(pdf_document *doc, pdf_obj *fields, int exclude)
+static void reset_form(fz_context *ctx, pdf_document *doc, pdf_obj *fields, int exclude)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *sfields = specified_fields(doc, fields, exclude);
+ pdf_obj *sfields = specified_fields(ctx, doc, fields, exclude);
fz_try(ctx)
{
- int i, n = pdf_array_len(sfields);
+ int i, n = pdf_array_len(ctx, sfields);
for (i = 0; i < n; i++)
- reset_field(doc, pdf_array_get(sfields, i));
+ reset_field(ctx, doc, pdf_array_get(ctx, sfields, i));
}
fz_always(ctx)
{
- pdf_drop_obj(sfields);
+ pdf_drop_obj(ctx, sfields);
}
fz_catch(ctx)
{
@@ -333,19 +329,18 @@ static void reset_form(pdf_document *doc, pdf_obj *fields, int exclude)
}
}
-static void execute_action(pdf_document *doc, pdf_obj *obj, pdf_obj *a)
+static void execute_action(fz_context *ctx, pdf_document *doc, pdf_obj *obj, pdf_obj *a)
{
- fz_context *ctx = doc->ctx;
if (a)
{
- char *type = pdf_to_name(pdf_dict_gets(a, "S"));
+ char *type = pdf_to_name(ctx, pdf_dict_gets(ctx, a, "S"));
if (!strcmp(type, "JavaScript"))
{
- pdf_obj *js = pdf_dict_gets(a, "JS");
+ pdf_obj *js = pdf_dict_gets(ctx, a, "JS");
if (js)
{
- char *code = pdf_to_utf8(doc, js);
+ char *code = pdf_to_utf8(ctx, doc, js);
fz_try(ctx)
{
pdf_js_execute(doc->js, code);
@@ -362,21 +357,21 @@ static void execute_action(pdf_document *doc, pdf_obj *obj, pdf_obj *a)
}
else if (!strcmp(type, "ResetForm"))
{
- reset_form(doc, pdf_dict_gets(a, "Fields"), pdf_to_int(pdf_dict_gets(a, "Flags")) & 1);
+ reset_form(ctx, doc, pdf_dict_gets(ctx, a, "Fields"), pdf_to_int(ctx, pdf_dict_gets(ctx, a, "Flags")) & 1);
}
else if (!strcmp(type, "Named"))
{
- char *name = pdf_to_name(pdf_dict_gets(a, "N"));
+ char *name = pdf_to_name(ctx, pdf_dict_gets(ctx, a, "N"));
if (!strcmp(name, "Print"))
- pdf_event_issue_print(doc);
+ pdf_event_issue_print(ctx, doc);
}
}
}
-static void execute_action_chain(pdf_document *doc, pdf_obj *obj)
+static void execute_action_chain(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- pdf_obj *a = pdf_dict_gets(obj, "A");
+ pdf_obj *a = pdf_dict_gets(ctx, obj, "A");
pdf_js_event e;
e.target = obj;
@@ -385,14 +380,14 @@ static void execute_action_chain(pdf_document *doc, pdf_obj *obj)
while (a)
{
- execute_action(doc, obj, a);
- a = pdf_dict_gets(a, "Next");
+ execute_action(ctx, doc, obj, a);
+ a = pdf_dict_gets(ctx, a, "Next");
}
}
-static void execute_additional_action(pdf_document *doc, pdf_obj *obj, char *act)
+static void execute_additional_action(fz_context *ctx, pdf_document *doc, pdf_obj *obj, char *act)
{
- pdf_obj *a = pdf_dict_getp(obj, act);
+ pdf_obj *a = pdf_dict_getp(ctx, obj, act);
if (a)
{
@@ -401,24 +396,23 @@ static void execute_additional_action(pdf_document *doc, pdf_obj *obj, char *act
e.target = obj;
e.value = "";
pdf_js_setup_event(doc->js, &e);
- execute_action(doc, obj, a);
+ execute_action(ctx, doc, obj, a);
}
}
-static void check_off(pdf_document *doc, pdf_obj *obj)
+static void check_off(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
pdf_obj *off = NULL;
fz_var(off);
fz_try(ctx);
{
- off = pdf_new_name(doc, "Off");
- pdf_dict_puts(obj, "AS", off);
+ off = pdf_new_name(ctx, doc, "Off");
+ pdf_dict_puts(ctx, obj, "AS", off);
}
fz_always(ctx)
{
- pdf_drop_obj(off);
+ pdf_drop_obj(ctx, off);
}
fz_catch(ctx)
{
@@ -426,27 +420,26 @@ static void check_off(pdf_document *doc, pdf_obj *obj)
}
}
-static void set_check(pdf_document *doc, pdf_obj *chk, char *name)
+static void set_check(fz_context *ctx, pdf_document *doc, pdf_obj *chk, char *name)
{
- pdf_obj *n = pdf_dict_getp(chk, "AP/N");
+ pdf_obj *n = pdf_dict_getp(ctx, chk, "AP/N");
pdf_obj *val = NULL;
- fz_context *ctx = doc->ctx;
fz_var(val);
fz_try(ctx)
{
/* If name is a possible value of this check
* box then use it, otherwise use "Off" */
- if (pdf_dict_gets(n, name))
- val = pdf_new_name(doc, name);
+ if (pdf_dict_gets(ctx, n, name))
+ val = pdf_new_name(ctx, doc, name);
else
- val = pdf_new_name(doc, "Off");
+ val = pdf_new_name(ctx, doc, "Off");
- pdf_dict_puts(chk, "AS", val);
+ pdf_dict_puts(ctx, chk, "AS", val);
}
fz_always(ctx)
{
- pdf_drop_obj(val);
+ pdf_drop_obj(ctx, val);
}
fz_catch(ctx)
{
@@ -456,55 +449,53 @@ static void set_check(pdf_document *doc, pdf_obj *chk, char *name)
/* Set the values of all fields in a group defined by a node
* in the hierarchy */
-static void set_check_grp(pdf_document *doc, pdf_obj *grp, char *val)
+static void set_check_grp(fz_context *ctx, pdf_document *doc, pdf_obj *grp, char *val)
{
- pdf_obj *kids = pdf_dict_gets(grp, "Kids");
+ pdf_obj *kids = pdf_dict_gets(ctx, grp, "Kids");
if (kids == NULL)
{
- set_check(doc, grp, val);
+ set_check(ctx, doc, grp, val);
}
else
{
- int i, n = pdf_array_len(kids);
+ int i, n = pdf_array_len(ctx, kids);
for (i = 0; i < n; i++)
- set_check_grp(doc, pdf_array_get(kids, i), val);
+ set_check_grp(ctx, doc, pdf_array_get(ctx, kids, i), val);
}
}
-static void recalculate(pdf_document *doc)
+static void recalculate(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
-
if (doc->recalculating)
return;
doc->recalculating = 1;
fz_try(ctx)
{
- pdf_obj *co = pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/CO");
+ pdf_obj *co = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/CO");
if (co && doc->js)
{
- int i, n = pdf_array_len(co);
+ int i, n = pdf_array_len(ctx, co);
for (i = 0; i < n; i++)
{
- pdf_obj *field = pdf_array_get(co, i);
- pdf_obj *calc = pdf_dict_getp(field, "AA/C");
+ pdf_obj *field = pdf_array_get(ctx, co, i);
+ pdf_obj *calc = pdf_dict_getp(ctx, field, "AA/C");
if (calc)
{
pdf_js_event e;
e.target = field;
- e.value = pdf_field_value(doc, field);
+ e.value = pdf_field_value(ctx, doc, field);
pdf_js_setup_event(doc->js, &e);
- execute_action(doc, field, calc);
+ execute_action(ctx, doc, field, calc);
/* A calculate action, updates event.value. We need
* to place the value in the field */
- update_field_value(doc, field, pdf_js_get_event(doc->js)->value);
+ update_field_value(ctx, doc, field, pdf_js_get_event(doc->js)->value);
}
}
}
@@ -519,25 +510,24 @@ static void recalculate(pdf_document *doc)
}
}
-static void toggle_check_box(pdf_document *doc, pdf_obj *obj)
+static void toggle_check_box(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *as = pdf_dict_gets(obj, "AS");
- int ff = pdf_get_field_flags(doc, obj);
+ pdf_obj *as = pdf_dict_gets(ctx, obj, "AS");
+ int ff = pdf_get_field_flags(ctx, doc, obj);
int radio = ((ff & (Ff_Pushbutton|Ff_Radio)) == Ff_Radio);
char *val = NULL;
- pdf_obj *grp = radio ? pdf_dict_gets(obj, "Parent") : find_head_of_field_group(obj);
+ pdf_obj *grp = radio ? pdf_dict_gets(ctx, obj, "Parent") : find_head_of_field_group(ctx, obj);
if (!grp)
grp = obj;
- if (as && strcmp(pdf_to_name(as), "Off"))
+ if (as && strcmp(pdf_to_name(ctx, as), "Off"))
{
/* "as" neither missing nor set to Off. Set it to Off, unless
* this is a non-toggle-off radio button. */
if ((ff & (Ff_Pushbutton|Ff_NoToggleToOff|Ff_Radio)) != (Ff_NoToggleToOff|Ff_Radio))
{
- check_off(doc, obj);
+ check_off(ctx, doc, obj);
val = "Off";
}
}
@@ -546,14 +536,14 @@ static void toggle_check_box(pdf_document *doc, pdf_obj *obj)
pdf_obj *n, *key = NULL;
int len, i;
- n = pdf_dict_getp(obj, "AP/N");
+ n = pdf_dict_getp(ctx, obj, "AP/N");
/* Look for a key that isn't "Off" */
- len = pdf_dict_len(n);
+ len = pdf_dict_len(ctx, n);
for (i = 0; i < len; i++)
{
- key = pdf_dict_get_key(n, i);
- if (pdf_is_name(key) && strcmp(pdf_to_name(key), "Off"))
+ key = pdf_dict_get_key(ctx, n, i);
+ if (pdf_is_name(ctx, key) && strcmp(pdf_to_name(ctx, key), "Off"))
break;
}
@@ -561,19 +551,19 @@ static void toggle_check_box(pdf_document *doc, pdf_obj *obj)
if (!key)
return;
- val = pdf_to_name(key);
+ val = pdf_to_name(ctx, key);
if (radio)
{
/* For radio buttons, first turn off all buttons in the group and
* then set the one that was clicked */
- pdf_obj *kids = pdf_dict_gets(grp, "Kids");
+ pdf_obj *kids = pdf_dict_gets(ctx, grp, "Kids");
- len = pdf_array_len(kids);
+ len = pdf_array_len(ctx, kids);
for (i = 0; i < len; i++)
- check_off(doc, pdf_array_get(kids, i));
+ check_off(ctx, doc, pdf_array_get(ctx, kids, i));
- pdf_dict_puts(obj, "AS", key);
+ pdf_dict_puts(ctx, obj, "AS", key);
}
else
{
@@ -582,9 +572,9 @@ static void toggle_check_box(pdf_document *doc, pdf_obj *obj)
* all to the same value. This may cause the group to act like
* radio buttons, if each have distinct "On" values */
if (grp)
- set_check_grp(doc, grp, val);
+ set_check_grp(ctx, doc, grp, val);
else
- set_check(doc, obj, val);
+ set_check(ctx, doc, obj, val);
}
}
@@ -595,28 +585,28 @@ static void toggle_check_box(pdf_document *doc, pdf_obj *obj)
fz_var(v);
fz_try(ctx)
{
- v = pdf_new_string(doc, val, strlen(val));
- pdf_dict_puts(grp, "V", v);
+ v = pdf_new_string(ctx, doc, val, strlen(val));
+ pdf_dict_puts(ctx, grp, "V", v);
}
fz_always(ctx)
{
- pdf_drop_obj(v);
+ pdf_drop_obj(ctx, v);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
- recalculate(doc);
+ recalculate(ctx, doc);
}
}
-int pdf_has_unsaved_changes(pdf_document *doc)
+int pdf_has_unsaved_changes(fz_context *ctx, pdf_document *doc)
{
return doc->dirty;
}
-int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event)
+int pdf_pass_event(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event)
{
pdf_annot *annot;
pdf_hotspot *hp = &doc->hotspot;
@@ -635,7 +625,7 @@ int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event)
if (annot)
{
- int f = pdf_to_int(pdf_dict_gets(annot->obj, "F"));
+ int f = pdf_to_int(ctx, pdf_dict_gets(ctx, annot->obj, "F"));
if (f & (F_Hidden|F_NoView))
annot = NULL;
@@ -651,24 +641,24 @@ int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event)
if (doc->focus_obj)
{
/* Execute the blur action */
- execute_additional_action(doc, doc->focus_obj, "AA/Bl");
+ execute_additional_action(ctx, doc, doc->focus_obj, "AA/Bl");
doc->focus = NULL;
- pdf_drop_obj(doc->focus_obj);
+ pdf_drop_obj(ctx, doc->focus_obj);
doc->focus_obj = NULL;
}
if (annot)
{
doc->focus = annot;
- doc->focus_obj = pdf_keep_obj(annot->obj);
+ doc->focus_obj = pdf_keep_obj(ctx, annot->obj);
- hp->num = pdf_to_num(annot->obj);
- hp->gen = pdf_to_gen(annot->obj);
+ hp->num = pdf_to_num(ctx, annot->obj);
+ hp->gen = pdf_to_gen(ctx, annot->obj);
hp->state = HOTSPOT_POINTER_DOWN;
changed = 1;
/* Exectute the down and focus actions */
- execute_additional_action(doc, annot->obj, "AA/Fo");
- execute_additional_action(doc, annot->obj, "AA/D");
+ execute_additional_action(ctx, doc, annot->obj, "AA/Fo");
+ execute_additional_action(ctx, doc, annot->obj, "AA/D");
}
break;
@@ -687,15 +677,15 @@ int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event)
case PDF_WIDGET_TYPE_RADIOBUTTON:
case PDF_WIDGET_TYPE_CHECKBOX:
/* FIXME: treating radio buttons like check boxes, for now */
- toggle_check_box(doc, annot->obj);
+ toggle_check_box(ctx, doc, annot->obj);
changed = 1;
break;
}
/* Execute the up action */
- execute_additional_action(doc, annot->obj, "AA/U");
+ execute_additional_action(ctx, doc, annot->obj, "AA/U");
/* Execute the main action chain */
- execute_action_chain(doc, annot->obj);
+ execute_action_chain(ctx, doc, annot->obj);
}
break;
}
@@ -706,9 +696,8 @@ int pdf_pass_event(pdf_document *doc, pdf_page *page, pdf_ui_event *ui_event)
return changed;
}
-void pdf_update_page(pdf_document *doc, pdf_page *page)
+void pdf_update_page(fz_context *ctx, pdf_document *doc, pdf_page *page)
{
- fz_context *ctx = doc->ctx;
pdf_annot *annot;
/* Reset changed_annots to empty */
@@ -720,7 +709,7 @@ void pdf_update_page(pdf_document *doc, pdf_page *page)
*/
if (page->tmp_annots)
{
- pdf_free_annot(ctx, page->tmp_annots);
+ pdf_drop_annot(ctx, page->tmp_annots);
page->tmp_annots = NULL;
}
@@ -732,7 +721,7 @@ void pdf_update_page(pdf_document *doc, pdf_page *page)
fz_try(ctx)
{
- pdf_update_annot(doc, annot);
+ pdf_update_annot(ctx, doc, annot);
if ((ap != annot->ap || ap_iteration != annot->ap_iteration))
{
@@ -769,7 +758,7 @@ void pdf_update_page(pdf_document *doc, pdf_page *page)
page->deleted_annots = NULL;
}
-pdf_annot *pdf_poll_changed_annot(pdf_document *idoc, pdf_page *page)
+pdf_annot *pdf_poll_changed_annot(fz_context *ctx, pdf_document *idoc, pdf_page *page)
{
pdf_annot *annot = page->changed_annots;
@@ -779,12 +768,12 @@ pdf_annot *pdf_poll_changed_annot(pdf_document *idoc, pdf_page *page)
return annot;
}
-pdf_widget *pdf_focused_widget(pdf_document *doc)
+pdf_widget *pdf_focused_widget(fz_context *ctx, pdf_document *doc)
{
return (pdf_widget *)doc->focus;
}
-pdf_widget *pdf_first_widget(pdf_document *doc, pdf_page *page)
+pdf_widget *pdf_first_widget(fz_context *ctx, pdf_document *doc, pdf_page *page)
{
pdf_annot *annot = page->annots;
@@ -794,7 +783,7 @@ pdf_widget *pdf_first_widget(pdf_document *doc, pdf_page *page)
return (pdf_widget *)annot;
}
-pdf_widget *pdf_next_widget(pdf_widget *previous)
+pdf_widget *pdf_next_widget(fz_context *ctx, pdf_widget *previous)
{
pdf_annot *annot = (pdf_annot *)previous;
@@ -807,46 +796,45 @@ pdf_widget *pdf_next_widget(pdf_widget *previous)
return (pdf_widget *)annot;
}
-pdf_widget *pdf_create_widget(pdf_document *doc, pdf_page *page, int type, char *fieldname)
+pdf_widget *pdf_create_widget(fz_context *ctx, pdf_document *doc, pdf_page *page, int type, char *fieldname)
{
- fz_context *ctx = doc->ctx;
pdf_obj *form = NULL;
- int old_sigflags = pdf_to_int(pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/SigFlags"));
- pdf_annot *annot = pdf_create_annot(doc, page, FZ_ANNOT_WIDGET);
+ int old_sigflags = pdf_to_int(ctx, pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/SigFlags"));
+ pdf_annot *annot = pdf_create_annot(ctx, doc, page, FZ_ANNOT_WIDGET);
fz_try(ctx)
{
- pdf_set_field_type(doc, annot->obj, type);
- pdf_dict_puts_drop(annot->obj, "T", pdf_new_string(doc, fieldname, strlen(fieldname)));
+ pdf_set_field_type(ctx, doc, annot->obj, type);
+ pdf_dict_puts_drop(ctx, annot->obj, "T", pdf_new_string(ctx, doc, fieldname, strlen(fieldname)));
annot->widget_type = type;
if (type == PDF_WIDGET_TYPE_SIGNATURE)
{
int sigflags = (old_sigflags | (SigFlag_SignaturesExist|SigFlag_AppendOnly));
- pdf_dict_putp_drop(pdf_trailer(doc), "Root/AcroForm/SigFlags", pdf_new_int(doc, sigflags));
+ pdf_dict_putp_drop(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/SigFlags", pdf_new_int(ctx, doc, sigflags));
}
/*
pdf_create_annot will have linked the new widget into the page's
annot array. We also need it linked into the document's form
*/
- form = pdf_dict_getp(pdf_trailer(doc), "Root/AcroForm/Fields");
+ form = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/Fields");
if (!form)
{
- form = pdf_new_array(doc, 1);
- pdf_dict_putp_drop(pdf_trailer(doc), "Root/AcroForm/Fields", form);
+ form = pdf_new_array(ctx, doc, 1);
+ pdf_dict_putp_drop(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/Fields", form);
}
- pdf_array_push(form, annot->obj); /* Cleanup relies on this statement being last */
+ pdf_array_push(ctx, form, annot->obj); /* Cleanup relies on this statement being last */
}
fz_catch(ctx)
{
- pdf_delete_annot(doc, page, annot);
+ pdf_delete_annot(ctx, doc, page, annot);
/* An empty Fields array may have been created, but that is harmless */
if (type == PDF_WIDGET_TYPE_SIGNATURE)
- pdf_dict_putp_drop(pdf_trailer(doc), "Root/AcroForm/SigFlags", pdf_new_int(doc, old_sigflags));
+ pdf_dict_putp_drop(ctx, pdf_trailer(ctx, doc), "Root/AcroForm/SigFlags", pdf_new_int(ctx, doc, old_sigflags));
fz_rethrow(ctx);
}
@@ -854,15 +842,15 @@ pdf_widget *pdf_create_widget(pdf_document *doc, pdf_page *page, int type, char
return (pdf_widget *)annot;
}
-int pdf_widget_get_type(pdf_widget *widget)
+int pdf_widget_get_type(fz_context *ctx, pdf_widget *widget)
{
pdf_annot *annot = (pdf_annot *)widget;
return annot->widget_type;
}
-static int set_text_field_value(pdf_document *doc, pdf_obj *field, char *text)
+static int set_text_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text)
{
- pdf_obj *v = pdf_dict_getp(field, "AA/V");
+ pdf_obj *v = pdf_dict_getp(ctx, field, "AA/V");
if (v && doc->js)
{
@@ -871,7 +859,7 @@ static int set_text_field_value(pdf_document *doc, pdf_obj *field, char *text)
e.target = field;
e.value = text;
pdf_js_setup_event(doc->js, &e);
- execute_action(doc, field, v);
+ execute_action(ctx, doc, field, v);
if (!pdf_js_get_event(doc->js)->rc)
return 0;
@@ -879,43 +867,42 @@ static int set_text_field_value(pdf_document *doc, pdf_obj *field, char *text)
text = pdf_js_get_event(doc->js)->value;
}
- if (pdf_field_dirties_document(doc, field))
+ if (pdf_field_dirties_document(ctx, doc, field))
doc->dirty = 1;
- update_field_value(doc, field, text);
+ update_field_value(ctx, doc, field, text);
return 1;
}
-static void update_checkbox_selector(pdf_document *doc, pdf_obj *field, char *val)
+static void update_checkbox_selector(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *val)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *kids = pdf_dict_gets(field, "Kids");
+ pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids");
if (kids)
{
- int i, n = pdf_array_len(kids);
+ int i, n = pdf_array_len(ctx, kids);
for (i = 0; i < n; i++)
- update_checkbox_selector(doc, pdf_array_get(kids, i), val);
+ update_checkbox_selector(ctx, doc, pdf_array_get(ctx, kids, i), val);
}
else
{
- pdf_obj *n = pdf_dict_getp(field, "AP/N");
+ pdf_obj *n = pdf_dict_getp(ctx, field, "AP/N");
pdf_obj *oval = NULL;
fz_var(oval);
fz_try(ctx)
{
- if (pdf_dict_gets(n, val))
- oval = pdf_new_name(doc, val);
+ if (pdf_dict_gets(ctx, n, val))
+ oval = pdf_new_name(ctx, doc, val);
else
- oval = pdf_new_name(doc, "Off");
+ oval = pdf_new_name(ctx, doc, "Off");
- pdf_dict_puts(field, "AS", oval);
+ pdf_dict_puts(ctx, field, "AS", oval);
}
fz_always(ctx)
{
- pdf_drop_obj(oval);
+ pdf_drop_obj(ctx, oval);
}
fz_catch(ctx)
{
@@ -924,43 +911,43 @@ static void update_checkbox_selector(pdf_document *doc, pdf_obj *field, char *va
}
}
-static int set_checkbox_value(pdf_document *doc, pdf_obj *field, char *val)
+static int set_checkbox_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *val)
{
- update_checkbox_selector(doc, field, val);
- update_field_value(doc, field, val);
+ update_checkbox_selector(ctx, doc, field, val);
+ update_field_value(ctx, doc, field, val);
return 1;
}
-int pdf_field_set_value(pdf_document *doc, pdf_obj *field, char *text)
+int pdf_field_set_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text)
{
int res = 0;
- switch (pdf_field_type(doc, field))
+ switch (pdf_field_type(ctx, doc, field))
{
case PDF_WIDGET_TYPE_TEXT:
- res = set_text_field_value(doc, field, text);
+ res = set_text_field_value(ctx, doc, field, text);
break;
case PDF_WIDGET_TYPE_CHECKBOX:
case PDF_WIDGET_TYPE_RADIOBUTTON:
- res = set_checkbox_value(doc, field, text);
+ res = set_checkbox_value(ctx, doc, field, text);
break;
default:
/* text updater will do in most cases */
- update_field_value(doc, field, text);
+ update_field_value(ctx, doc, field, text);
res = 1;
break;
}
- recalculate(doc);
+ recalculate(ctx, doc);
return res;
}
-char *pdf_field_border_style(pdf_document *doc, pdf_obj *field)
+char *pdf_field_border_style(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- char *bs = pdf_to_name(pdf_dict_getp(field, "BS/S"));
+ char *bs = pdf_to_name(ctx, pdf_dict_getp(ctx, field, "BS/S"));
switch (*bs)
{
@@ -974,32 +961,31 @@ char *pdf_field_border_style(pdf_document *doc, pdf_obj *field)
return "Solid";
}
-void pdf_field_set_border_style(pdf_document *doc, pdf_obj *field, char *text)
+void pdf_field_set_border_style(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text)
{
- fz_context *ctx = doc->ctx;
pdf_obj *val = NULL;
if (!strcmp(text, "Solid"))
- val = pdf_new_name(doc, "S");
+ val = pdf_new_name(ctx, doc, "S");
else if (!strcmp(text, "Dashed"))
- val = pdf_new_name(doc, "D");
+ val = pdf_new_name(ctx, doc, "D");
else if (!strcmp(text, "Beveled"))
- val = pdf_new_name(doc, "B");
+ val = pdf_new_name(ctx, doc, "B");
else if (!strcmp(text, "Inset"))
- val = pdf_new_name(doc, "I");
+ val = pdf_new_name(ctx, doc, "I");
else if (!strcmp(text, "Underline"))
- val = pdf_new_name(doc, "U");
+ val = pdf_new_name(ctx, doc, "U");
else
return;
fz_try(ctx);
{
- pdf_dict_putp(field, "BS/S", val);
- pdf_field_mark_dirty(doc, field);
+ pdf_dict_putp(ctx, field, "BS/S", val);
+ pdf_field_mark_dirty(ctx, doc, field);
}
fz_always(ctx)
{
- pdf_drop_obj(val);
+ pdf_drop_obj(ctx, val);
}
fz_catch(ctx)
{
@@ -1007,22 +993,21 @@ 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_button_caption(fz_context *ctx, pdf_document *doc, pdf_obj *field, char *text)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *val = pdf_new_string(doc, text, strlen(text));
+ pdf_obj *val = pdf_new_string(ctx, doc, text, strlen(text));
fz_try(ctx);
{
- if (pdf_field_type(doc, field) == PDF_WIDGET_TYPE_PUSHBUTTON)
+ if (pdf_field_type(ctx, doc, field) == PDF_WIDGET_TYPE_PUSHBUTTON)
{
- pdf_dict_putp(field, "MK/CA", val);
- pdf_field_mark_dirty(doc, field);
+ pdf_dict_putp(ctx, field, "MK/CA", val);
+ pdf_field_mark_dirty(ctx, doc, field);
}
}
fz_always(ctx)
{
- pdf_drop_obj(val);
+ pdf_drop_obj(ctx, val);
}
fz_catch(ctx)
{
@@ -1030,7 +1015,7 @@ void pdf_field_set_button_caption(pdf_document *doc, pdf_obj *field, char *text)
}
}
-int pdf_field_display(pdf_document *doc, pdf_obj *field)
+int pdf_field_display(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
pdf_obj *kids;
int f, res = Display_Visible;
@@ -1038,10 +1023,10 @@ int pdf_field_display(pdf_document *doc, pdf_obj *field)
/* Base response on first of children. Not ideal,
* but not clear how to handle children with
* differing values */
- while ((kids = pdf_dict_gets(field, "Kids")) != NULL)
- field = pdf_array_get(kids, 0);
+ while ((kids = pdf_dict_gets(ctx, field, "Kids")) != NULL)
+ field = pdf_array_get(ctx, kids, 0);
- f = pdf_to_int(pdf_dict_gets(field, "F"));
+ f = pdf_to_int(ctx, pdf_dict_gets(ctx, field, "F"));
if (f & F_Hidden)
{
@@ -1067,12 +1052,11 @@ int pdf_field_display(pdf_document *doc, pdf_obj *field)
* get the field name in a char buffer that has spare room to
* add more characters at the end.
*/
-static char *get_field_name(pdf_document *doc, pdf_obj *field, int spare)
+static char *get_field_name(fz_context *ctx, pdf_document *doc, pdf_obj *field, int spare)
{
- fz_context *ctx = doc->ctx;
char *res = NULL;
- pdf_obj *parent = pdf_dict_gets(field, "Parent");
- char *lname = pdf_to_str_buf(pdf_dict_gets(field, "T"));
+ pdf_obj *parent = pdf_dict_gets(ctx, field, "Parent");
+ char *lname = pdf_to_str_buf(ctx, pdf_dict_gets(ctx, field, "T"));
int llen = strlen(lname);
/*
@@ -1084,7 +1068,7 @@ static char *get_field_name(pdf_document *doc, pdf_obj *field, int spare)
if (parent)
{
- res = get_field_name(doc, parent, spare);
+ res = get_field_name(ctx, doc, parent, spare);
}
else
{
@@ -1103,20 +1087,19 @@ static char *get_field_name(pdf_document *doc, pdf_obj *field, int spare)
return res;
}
-char *pdf_field_name(pdf_document *doc, pdf_obj *field)
+char *pdf_field_name(fz_context *ctx, pdf_document *doc, pdf_obj *field)
{
- return get_field_name(doc, field, 0);
+ return get_field_name(ctx, doc, field, 0);
}
-void pdf_field_set_display(pdf_document *doc, pdf_obj *field, int d)
+void pdf_field_set_display(fz_context *ctx, pdf_document *doc, pdf_obj *field, int d)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *kids = pdf_dict_gets(field, "Kids");
+ pdf_obj *kids = pdf_dict_gets(ctx, field, "Kids");
if (!kids)
{
int mask = (F_Hidden|F_Print|F_NoView);
- int f = pdf_to_int(pdf_dict_gets(field, "F")) & ~mask;
+ int f = pdf_to_int(ctx, pdf_dict_gets(ctx, field, "F")) & ~mask;
pdf_obj *fo = NULL;
switch (d)
@@ -1137,12 +1120,12 @@ void pdf_field_set_display(pdf_document *doc, pdf_obj *field, int d)
fz_var(fo);
fz_try(ctx)
{
- fo = pdf_new_int(doc, f);
- pdf_dict_puts(field, "F", fo);
+ fo = pdf_new_int(ctx, doc, f);
+ pdf_dict_puts(ctx, field, "F", fo);
}
fz_always(ctx)
{
- pdf_drop_obj(fo);
+ pdf_drop_obj(ctx, fo);
}
fz_catch(ctx)
{
@@ -1151,28 +1134,27 @@ void pdf_field_set_display(pdf_document *doc, pdf_obj *field, int d)
}
else
{
- int i, n = pdf_array_len(kids);
+ int i, n = pdf_array_len(ctx, kids);
for (i = 0; i < n; i++)
- pdf_field_set_display(doc, pdf_array_get(kids, i), d);
+ pdf_field_set_display(ctx, doc, pdf_array_get(ctx, kids, i), d);
}
}
-void pdf_field_set_fill_color(pdf_document *doc, pdf_obj *field, pdf_obj *col)
+void pdf_field_set_fill_color(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_obj *col)
{
/* col == NULL mean transparent, but we can simply pass it on as with
* non-NULL values because pdf_dict_putp interprets a NULL value as
* delete */
- pdf_dict_putp(field, "MK/BG", col);
- pdf_field_mark_dirty(doc, field);
+ pdf_dict_putp(ctx, field, "MK/BG", col);
+ pdf_field_mark_dirty(ctx, doc, field);
}
-void pdf_field_set_text_color(pdf_document *doc, pdf_obj *field, pdf_obj *col)
+void pdf_field_set_text_color(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_obj *col)
{
- fz_context *ctx = doc->ctx;
pdf_da_info di;
fz_buffer *fzbuf = NULL;
- char *da = pdf_to_str_buf(pdf_get_inheritable(doc, field, "DA"));
+ char *da = pdf_to_str_buf(ctx, pdf_get_inheritable(ctx, doc, field, "DA"));
unsigned char *buf;
int len;
pdf_obj *daobj = NULL;
@@ -1187,24 +1169,24 @@ void pdf_field_set_text_color(pdf_document *doc, pdf_obj *field, pdf_obj *col)
int i;
pdf_parse_da(ctx, da, &di);
- di.col_size = pdf_array_len(col);
+ di.col_size = pdf_array_len(ctx, col);
len = fz_mini(di.col_size, nelem(di.col));
for (i = 0; i < len; i++)
- di.col[i] = pdf_to_real(pdf_array_get(col, i));
+ di.col[i] = pdf_to_real(ctx, pdf_array_get(ctx, col, i));
fzbuf = fz_new_buffer(ctx, 0);
pdf_fzbuf_print_da(ctx, fzbuf, &di);
len = fz_buffer_storage(ctx, fzbuf, &buf);
- daobj = pdf_new_string(doc, (char *)buf, len);
- pdf_dict_puts(field, "DA", daobj);
- pdf_field_mark_dirty(doc, field);
+ daobj = pdf_new_string(ctx, doc, (char *)buf, len);
+ pdf_dict_puts(ctx, field, "DA", daobj);
+ pdf_field_mark_dirty(ctx, doc, field);
}
fz_always(ctx)
{
pdf_da_info_fin(ctx, &di);
fz_drop_buffer(ctx, fzbuf);
- pdf_drop_obj(daobj);
+ pdf_drop_obj(ctx, daobj);
}
fz_catch(ctx)
{
@@ -1212,7 +1194,7 @@ void pdf_field_set_text_color(pdf_document *doc, pdf_obj *field, pdf_obj *col)
}
}
-fz_rect *pdf_bound_widget(pdf_widget *widget, fz_rect *rect)
+fz_rect *pdf_bound_widget(fz_context *ctx, pdf_widget *widget, fz_rect *rect)
{
pdf_annot *annot = (pdf_annot *)widget;
@@ -1223,16 +1205,15 @@ fz_rect *pdf_bound_widget(pdf_widget *widget, fz_rect *rect)
return rect;
}
-char *pdf_text_widget_text(pdf_document *doc, pdf_widget *tw)
+char *pdf_text_widget_text(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
{
pdf_annot *annot = (pdf_annot *)tw;
- fz_context *ctx = doc->ctx;
char *text = NULL;
fz_var(text);
fz_try(ctx)
{
- text = pdf_field_value(doc, annot->obj);
+ text = pdf_field_value(ctx, doc, annot->obj);
}
fz_catch(ctx)
{
@@ -1242,24 +1223,23 @@ char *pdf_text_widget_text(pdf_document *doc, pdf_widget *tw)
return text;
}
-int pdf_text_widget_max_len(pdf_document *doc, pdf_widget *tw)
+int pdf_text_widget_max_len(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
{
pdf_annot *annot = (pdf_annot *)tw;
- return pdf_to_int(pdf_get_inheritable(doc, annot->obj, "MaxLen"));
+ return pdf_to_int(ctx, pdf_get_inheritable(ctx, doc, annot->obj, "MaxLen"));
}
-int pdf_text_widget_content_type(pdf_document *doc, pdf_widget *tw)
+int pdf_text_widget_content_type(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
{
pdf_annot *annot = (pdf_annot *)tw;
- fz_context *ctx = doc->ctx;
char *code = NULL;
int type = PDF_WIDGET_CONTENT_UNRESTRAINED;
fz_var(code);
fz_try(ctx)
{
- code = pdf_get_string_or_stream(doc, pdf_dict_getp(annot->obj, "AA/F/JS"));
+ code = pdf_get_string_or_stream(ctx, doc, pdf_dict_getp(ctx, annot->obj, "AA/F/JS"));
if (code)
{
if (strstr(code, "AFNumber_Format"))
@@ -1284,9 +1264,9 @@ int pdf_text_widget_content_type(pdf_document *doc, pdf_widget *tw)
return type;
}
-static int run_keystroke(pdf_document *doc, pdf_obj *field, char **text)
+static int run_keystroke(fz_context *ctx, pdf_document *doc, pdf_obj *field, char **text)
{
- pdf_obj *k = pdf_dict_getp(field, "AA/K");
+ pdf_obj *k = pdf_dict_getp(ctx, field, "AA/K");
if (k && doc->js)
{
@@ -1295,7 +1275,7 @@ static int run_keystroke(pdf_document *doc, pdf_obj *field, char **text)
e.target = field;
e.value = *text;
pdf_js_setup_event(doc->js, &e);
- execute_action(doc, field, k);
+ execute_action(ctx, doc, field, k);
if (!pdf_js_get_event(doc->js)->rc)
return 0;
@@ -1306,17 +1286,16 @@ static int run_keystroke(pdf_document *doc, pdf_obj *field, char **text)
return 1;
}
-int pdf_text_widget_set_text(pdf_document *doc, pdf_widget *tw, char *text)
+int pdf_text_widget_set_text(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *text)
{
pdf_annot *annot = (pdf_annot *)tw;
- fz_context *ctx = doc->ctx;
int accepted = 0;
fz_try(ctx)
{
- accepted = run_keystroke(doc, annot->obj, &text);
+ accepted = run_keystroke(ctx, doc, annot->obj, &text);
if (accepted)
- accepted = pdf_field_set_value(doc, annot->obj, text);
+ accepted = pdf_field_set_value(ctx, doc, annot->obj, text);
}
fz_catch(ctx)
{
@@ -1326,7 +1305,7 @@ int pdf_text_widget_set_text(pdf_document *doc, pdf_widget *tw, char *text)
return accepted;
}
-int pdf_choice_widget_options(pdf_document *doc, pdf_widget *tw, char *opts[])
+int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *opts[])
{
pdf_annot *annot = (pdf_annot *)tw;
pdf_obj *optarr;
@@ -1335,37 +1314,37 @@ int pdf_choice_widget_options(pdf_document *doc, pdf_widget *tw, char *opts[])
if (!annot)
return 0;
- optarr = pdf_dict_gets(annot->obj, "Opt");
- n = pdf_array_len(optarr);
+ optarr = pdf_dict_gets(ctx, annot->obj, "Opt");
+ n = pdf_array_len(ctx, optarr);
if (opts)
{
for (i = 0; i < n; i++)
{
- opts[i] = pdf_to_str_buf(pdf_array_get(optarr, i));
+ opts[i] = pdf_to_str_buf(ctx, pdf_array_get(ctx, optarr, i));
}
}
return n;
}
-int pdf_choice_widget_is_multiselect(pdf_document *doc, pdf_widget *tw)
+int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
{
pdf_annot *annot = (pdf_annot *)tw;
if (!annot) return 0;
- switch (pdf_field_type(doc, annot->obj))
+ switch (pdf_field_type(ctx, doc, annot->obj))
{
case PDF_WIDGET_TYPE_LISTBOX:
case PDF_WIDGET_TYPE_COMBOBOX:
- return (pdf_get_field_flags(doc, annot->obj) & Ff_MultiSelect) != 0;
+ return (pdf_get_field_flags(ctx, doc, annot->obj) & Ff_MultiSelect) != 0;
default:
return 0;
}
}
-int pdf_choice_widget_value(pdf_document *doc, pdf_widget *tw, char *opts[])
+int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *opts[])
{
pdf_annot *annot = (pdf_annot *)tw;
pdf_obj *optarr;
@@ -1374,29 +1353,29 @@ int pdf_choice_widget_value(pdf_document *doc, pdf_widget *tw, char *opts[])
if (!annot)
return 0;
- optarr = pdf_dict_gets(annot->obj, "V");
+ optarr = pdf_dict_gets(ctx, annot->obj, "V");
- if (pdf_is_string(optarr))
+ if (pdf_is_string(ctx, optarr))
{
if (opts)
- opts[0] = pdf_to_str_buf(optarr);
+ opts[0] = pdf_to_str_buf(ctx, optarr);
return 1;
}
else
{
- n = pdf_array_len(optarr);
+ n = pdf_array_len(ctx, optarr);
if (opts)
{
for (i = 0; i < n; i++)
{
- pdf_obj *elem = pdf_array_get(optarr, i);
+ pdf_obj *elem = pdf_array_get(ctx, optarr, i);
- if (pdf_is_array(elem))
- elem = pdf_array_get(elem, 1);
+ if (pdf_is_array(ctx, elem))
+ elem = pdf_array_get(ctx, elem, 1);
- opts[i] = pdf_to_str_buf(elem);
+ opts[i] = pdf_to_str_buf(ctx, elem);
}
}
@@ -1404,9 +1383,8 @@ int pdf_choice_widget_value(pdf_document *doc, pdf_widget *tw, char *opts[])
}
}
-void pdf_choice_widget_set_value(pdf_document *doc, pdf_widget *tw, int n, char *opts[])
+void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, char *opts[])
{
- fz_context *ctx = doc->ctx;
pdf_annot *annot = (pdf_annot *)tw;
pdf_obj *optarr = NULL, *opt = NULL;
int i;
@@ -1420,71 +1398,70 @@ void pdf_choice_widget_set_value(pdf_document *doc, pdf_widget *tw, int n, char
{
if (n != 1)
{
- optarr = pdf_new_array(doc, n);
+ optarr = pdf_new_array(ctx, doc, n);
for (i = 0; i < n; i++)
{
- opt = pdf_new_string(doc, opts[i], strlen(opts[i]));
- pdf_array_push(optarr, opt);
- pdf_drop_obj(opt);
+ opt = pdf_new_string(ctx, doc, opts[i], strlen(opts[i]));
+ pdf_array_push(ctx, optarr, opt);
+ pdf_drop_obj(ctx, opt);
opt = NULL;
}
- pdf_dict_puts(annot->obj, "V", optarr);
- pdf_drop_obj(optarr);
+ pdf_dict_puts(ctx, annot->obj, "V", optarr);
+ pdf_drop_obj(ctx, optarr);
}
else
{
- opt = pdf_new_string(doc, opts[0], strlen(opts[0]));
- pdf_dict_puts(annot->obj, "V", opt);
- pdf_drop_obj(opt);
+ opt = pdf_new_string(ctx, doc, opts[0], strlen(opts[0]));
+ pdf_dict_puts(ctx, annot->obj, "V", opt);
+ pdf_drop_obj(ctx, opt);
}
/* FIXME: when n > 1, we should be regenerating the indexes */
- pdf_dict_dels(annot->obj, "I");
+ pdf_dict_dels(ctx, annot->obj, "I");
- pdf_field_mark_dirty(doc, annot->obj);
- if (pdf_field_dirties_document(doc, annot->obj))
+ pdf_field_mark_dirty(ctx, doc, annot->obj);
+ if (pdf_field_dirties_document(ctx, doc, annot->obj))
doc->dirty = 1;
}
fz_catch(ctx)
{
- pdf_drop_obj(optarr);
- pdf_drop_obj(opt);
+ pdf_drop_obj(ctx, optarr);
+ pdf_drop_obj(ctx, opt);
fz_rethrow(ctx);
}
}
-int pdf_signature_widget_byte_range(pdf_document *doc, pdf_widget *widget, int (*byte_range)[2])
+int pdf_signature_widget_byte_range(fz_context *ctx, pdf_document *doc, pdf_widget *widget, int (*byte_range)[2])
{
pdf_annot *annot = (pdf_annot *)widget;
- pdf_obj *br = pdf_dict_getp(annot->obj, "V/ByteRange");
- int i, n = pdf_array_len(br)/2;
+ pdf_obj *br = pdf_dict_getp(ctx, annot->obj, "V/ByteRange");
+ int i, n = pdf_array_len(ctx, br)/2;
if (byte_range)
{
for (i = 0; i < n; i++)
{
- byte_range[i][0] = pdf_to_int(pdf_array_get(br, 2*i));
- byte_range[i][1] = pdf_to_int(pdf_array_get(br, 2*i+1));
+ byte_range[i][0] = pdf_to_int(ctx, pdf_array_get(ctx, br, 2*i));
+ byte_range[i][1] = pdf_to_int(ctx, pdf_array_get(ctx, br, 2*i+1));
}
}
return n;
}
-int pdf_signature_widget_contents(pdf_document *doc, pdf_widget *widget, char **contents)
+int pdf_signature_widget_contents(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char **contents)
{
pdf_annot *annot = (pdf_annot *)widget;
- pdf_obj *c = pdf_dict_getp(annot->obj, "V/Contents");
+ pdf_obj *c = pdf_dict_getp(ctx, annot->obj, "V/Contents");
if (contents)
- *contents = pdf_to_str_buf(c);
- return pdf_to_str_len(c);
+ *contents = pdf_to_str_buf(ctx, c);
+ return pdf_to_str_len(ctx, c);
}
-void pdf_signature_set_value(pdf_document *doc, pdf_obj *field, pdf_signer *signer)
+void pdf_signature_set_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_signer *signer)
{
- fz_context *ctx = doc->ctx;
pdf_obj *v;
pdf_obj *indv;
int vnum;
@@ -1495,40 +1472,40 @@ void pdf_signature_set_value(pdf_document *doc, pdf_obj *field, pdf_signer *sign
memset(buf, 0, sizeof(buf));
- vnum = pdf_create_object(doc);
- indv = pdf_new_indirect(doc, vnum, 0);
- pdf_dict_puts_drop(field, "V", indv);
+ vnum = pdf_create_object(ctx, doc);
+ indv = pdf_new_indirect(ctx, doc, vnum, 0);
+ pdf_dict_puts_drop(ctx, field, "V", indv);
fz_var(v);
fz_try(ctx)
{
- v = pdf_new_dict(doc, 4);
- pdf_update_object(doc, vnum, v);
+ v = pdf_new_dict(ctx, doc, 4);
+ pdf_update_object(ctx, doc, vnum, v);
}
fz_always(ctx)
{
- pdf_drop_obj(v);
+ pdf_drop_obj(ctx, v);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
- byte_range = pdf_new_array(doc, 4);
- pdf_dict_puts_drop(v, "ByteRange", byte_range);
+ byte_range = pdf_new_array(ctx, doc, 4);
+ pdf_dict_puts_drop(ctx, v, "ByteRange", byte_range);
- contents = pdf_new_string(doc, buf, sizeof(buf));
- pdf_dict_puts_drop(v, "Contents", contents);
+ contents = pdf_new_string(ctx, doc, buf, sizeof(buf));
+ pdf_dict_puts_drop(ctx, v, "Contents", contents);
- pdf_dict_puts_drop(v, "Filter", pdf_new_name(doc, "Adobe.PPKLite"));
- pdf_dict_puts_drop(v, "SubFilter", pdf_new_name(doc, "adbe.pkcs7.detached"));
+ pdf_dict_puts_drop(ctx, v, "Filter", pdf_new_name(ctx, doc, "Adobe.PPKLite"));
+ pdf_dict_puts_drop(ctx, v, "SubFilter", pdf_new_name(ctx, doc, "adbe.pkcs7.detached"));
/* Record details within the document structure so that contents
* and byte_range can be updated with their correct values at
* saving time */
- unsaved_sig = fz_malloc_struct(doc->ctx, pdf_unsaved_sig);
- unsaved_sig->field = pdf_keep_obj(field);
- unsaved_sig->signer = pdf_keep_signer(signer);
+ unsaved_sig = fz_malloc_struct(ctx, pdf_unsaved_sig);
+ unsaved_sig->field = pdf_keep_obj(ctx, field);
+ unsaved_sig->signer = pdf_keep_signer(ctx, signer);
unsaved_sig->next = doc->unsaved_sigs;
doc->unsaved_sigs = unsaved_sig;
}
diff --git a/source/pdf/pdf-function.c b/source/pdf/pdf-function.c
index b94e508a..7ead09ca 100644
--- a/source/pdf/pdf-function.c
+++ b/source/pdf/pdf-function.c
@@ -111,7 +111,7 @@ struct ps_stack_s
#ifndef NDEBUG
void
-pdf_debug_ps_stack(ps_stack *st)
+pdf_debug_ps_stack(fz_context *ctx, ps_stack *st)
{
int i;
@@ -693,16 +693,15 @@ resize_code(fz_context *ctx, pdf_function *func, int newsize)
}
static void
-parse_code(pdf_function *func, fz_stream *stream, int *codeptr, pdf_lexbuf *buf)
+parse_code(fz_context *ctx, pdf_function *func, fz_stream *stream, int *codeptr, pdf_lexbuf *buf)
{
pdf_token tok;
int opptr, elseptr, ifptr;
int a, b, mid, cmp;
- fz_context *ctx = stream->ctx;
while (1)
{
- tok = pdf_lex(stream, buf);
+ tok = pdf_lex(ctx, stream, buf);
switch (tok)
{
@@ -744,16 +743,16 @@ parse_code(pdf_function *func, fz_stream *stream, int *codeptr, pdf_lexbuf *buf)
resize_code(ctx, func, *codeptr);
ifptr = *codeptr;
- parse_code(func, stream, codeptr, buf);
+ parse_code(ctx, func, stream, codeptr, buf);
- tok = pdf_lex(stream, buf);
+ tok = pdf_lex(ctx, stream, buf);
if (tok == PDF_TOK_OPEN_BRACE)
{
elseptr = *codeptr;
- parse_code(func, stream, codeptr, buf);
+ parse_code(ctx, func, stream, codeptr, buf);
- tok = pdf_lex(stream, buf);
+ tok = pdf_lex(ctx, stream, buf);
}
else
{
@@ -835,13 +834,12 @@ parse_code(pdf_function *func, fz_stream *stream, int *codeptr, pdf_lexbuf *buf)
}
static void
-load_postscript_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num, int gen)
+load_postscript_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict, int num, int gen)
{
fz_stream *stream = NULL;
int codeptr;
pdf_lexbuf buf;
pdf_token tok;
- fz_context *ctx = doc->ctx;
int locked = 0;
pdf_lexbuf_init(ctx, &buf, PDF_LEXBUF_SMALL);
@@ -851,9 +849,9 @@ load_postscript_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int n
fz_try(ctx)
{
- stream = pdf_open_stream(doc, num, gen);
+ stream = pdf_open_stream(ctx, doc, num, gen);
- tok = pdf_lex(stream, &buf);
+ tok = pdf_lex(ctx, stream, &buf);
if (tok != PDF_TOK_OPEN_BRACE)
{
fz_throw(ctx, FZ_ERROR_GENERIC, "stream is not a calculator function");
@@ -863,12 +861,12 @@ load_postscript_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int n
func->u.p.cap = 0;
codeptr = 0;
- parse_code(func, stream, &codeptr, &buf);
+ parse_code(ctx, func, stream, &codeptr, &buf);
}
fz_always(ctx)
{
- fz_close(stream);
- pdf_lexbuf_fin(&buf);
+ fz_drop_stream(ctx, stream);
+ pdf_lexbuf_fin(ctx, &buf);
}
fz_catch(ctx)
{
@@ -909,9 +907,8 @@ eval_postscript_func(fz_context *ctx, pdf_function *func, const float *in, float
#define MAX_SAMPLE_FUNCTION_SIZE (100 << 20)
static void
-load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num, int gen)
+load_sample_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict, int num, int gen)
{
- fz_context *ctx = doc->ctx;
fz_stream *stream;
pdf_obj *obj;
int samplecount;
@@ -922,14 +919,14 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num,
func->u.sa.samples = NULL;
- obj = pdf_dict_gets(dict, "Size");
- if (pdf_array_len(obj) < func->base.m)
+ obj = pdf_dict_gets(ctx, dict, "Size");
+ if (pdf_array_len(ctx, obj) < func->base.m)
fz_throw(ctx, FZ_ERROR_GENERIC, "too few sample function dimension sizes");
- if (pdf_array_len(obj) > func->base.m)
+ if (pdf_array_len(ctx, obj) > func->base.m)
fz_warn(ctx, "too many sample function dimension sizes");
for (i = 0; i < func->base.m; i++)
{
- func->u.sa.size[i] = pdf_to_int(pdf_array_get(obj, i));
+ func->u.sa.size[i] = pdf_to_int(ctx, pdf_array_get(ctx, obj, i));
if (func->u.sa.size[i] <= 0)
{
fz_warn(ctx, "non-positive sample function dimension size");
@@ -937,25 +934,25 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num,
}
}
- obj = pdf_dict_gets(dict, "BitsPerSample");
- func->u.sa.bps = bps = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "BitsPerSample");
+ func->u.sa.bps = bps = pdf_to_int(ctx, obj);
for (i = 0; i < func->base.m; i++)
{
func->u.sa.encode[i][0] = 0;
func->u.sa.encode[i][1] = func->u.sa.size[i] - 1;
}
- obj = pdf_dict_gets(dict, "Encode");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "Encode");
+ if (pdf_is_array(ctx, obj))
{
- int ranges = fz_mini(func->base.m, pdf_array_len(obj) / 2);
+ int ranges = fz_mini(func->base.m, pdf_array_len(ctx, obj) / 2);
if (ranges != func->base.m)
fz_warn(ctx, "wrong number of sample function input mappings");
for (i = 0; i < ranges; i++)
{
- func->u.sa.encode[i][0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0));
- func->u.sa.encode[i][1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1));
+ func->u.sa.encode[i][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0));
+ func->u.sa.encode[i][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1));
}
}
@@ -965,17 +962,17 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num,
func->u.sa.decode[i][1] = func->range[i][1];
}
- obj = pdf_dict_gets(dict, "Decode");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "Decode");
+ if (pdf_is_array(ctx, obj))
{
- int ranges = fz_mini(func->base.n, pdf_array_len(obj) / 2);
+ int ranges = fz_mini(func->base.n, pdf_array_len(ctx, obj) / 2);
if (ranges != func->base.n)
fz_warn(ctx, "wrong number of sample function output mappings");
for (i = 0; i < ranges; i++)
{
- func->u.sa.decode[i][0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0));
- func->u.sa.decode[i][1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1));
+ func->u.sa.decode[i][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0));
+ func->u.sa.decode[i][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1));
}
}
@@ -988,7 +985,7 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num,
func->u.sa.samples = fz_malloc_array(ctx, samplecount, sizeof(float));
func->base.size += samplecount * sizeof(float);
- stream = pdf_open_stream(doc, num, gen);
+ stream = pdf_open_stream(ctx, doc, num, gen);
fz_try(ctx)
{
@@ -997,45 +994,45 @@ load_sample_func(pdf_function *func, pdf_document *doc, pdf_obj *dict, int num,
{
unsigned int x;
float s;
-
- if (fz_is_eof_bits(stream))
+
+ if (fz_is_eof_bits(ctx, stream))
fz_throw(ctx, FZ_ERROR_GENERIC, "truncated sample function stream");
-
+
switch (bps)
{
- case 1: s = fz_read_bits(stream, 1); break;
- case 2: s = fz_read_bits(stream, 2) / 3.0f; break;
- case 4: s = fz_read_bits(stream, 4) / 15.0f; break;
- case 8: s = fz_read_byte(stream) / 255.0f; break;
- case 12: s = fz_read_bits(stream, 12) / 4095.0f; break;
+ case 1: s = fz_read_bits(ctx, stream, 1); break;
+ case 2: s = fz_read_bits(ctx, stream, 2) / 3.0f; break;
+ case 4: s = fz_read_bits(ctx, stream, 4) / 15.0f; break;
+ case 8: s = fz_read_byte(ctx, stream) / 255.0f; break;
+ case 12: s = fz_read_bits(ctx, stream, 12) / 4095.0f; break;
case 16:
- x = fz_read_byte(stream) << 8;
- x |= fz_read_byte(stream);
+ x = fz_read_byte(ctx, stream) << 8;
+ x |= fz_read_byte(ctx, stream);
s = x / 65535.0f;
break;
case 24:
- x = fz_read_byte(stream) << 16;
- x |= fz_read_byte(stream) << 8;
- x |= fz_read_byte(stream);
+ x = fz_read_byte(ctx, stream) << 16;
+ x |= fz_read_byte(ctx, stream) << 8;
+ x |= fz_read_byte(ctx, stream);
s = x / 16777215.0f;
break;
case 32:
- x = fz_read_byte(stream) << 24;
- x |= fz_read_byte(stream) << 16;
- x |= fz_read_byte(stream) << 8;
- x |= fz_read_byte(stream);
+ x = fz_read_byte(ctx, stream) << 24;
+ x |= fz_read_byte(ctx, stream) << 16;
+ x |= fz_read_byte(ctx, stream) << 8;
+ x |= fz_read_byte(ctx, stream);
s = x / 4294967295.0f;
break;
default:
fz_throw(ctx, FZ_ERROR_GENERIC, "sample stream bit depth %d unsupported", bps);
}
-
+
func->u.sa.samples[i] = s;
}
}
fz_always(ctx)
{
- fz_close(stream);
+ fz_drop_stream(ctx, stream);
}
fz_catch(ctx)
{
@@ -1135,7 +1132,7 @@ eval_sample_func(fz_context *ctx, pdf_function *func, const float *in, float *ou
*/
static void
-load_exponential_func(fz_context *ctx, pdf_function *func, pdf_obj *dict)
+load_exponential_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict)
{
pdf_obj *obj;
int i;
@@ -1144,8 +1141,8 @@ load_exponential_func(fz_context *ctx, pdf_function *func, pdf_obj *dict)
fz_warn(ctx, "exponential functions have at most one input");
func->base.m = 1;
- obj = pdf_dict_gets(dict, "N");
- func->u.e.n = pdf_to_real(obj);
+ obj = pdf_dict_gets(ctx, dict, "N");
+ func->u.e.n = pdf_to_real(ctx, obj);
/* See exponential functions (PDF 1.7 section 3.9.2) */
if (func->u.e.n != (int) func->u.e.n)
@@ -1170,26 +1167,26 @@ load_exponential_func(fz_context *ctx, pdf_function *func, pdf_obj *dict)
func->u.e.c1[i] = 1;
}
- obj = pdf_dict_gets(dict, "C0");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "C0");
+ if (pdf_is_array(ctx, obj))
{
- int ranges = fz_mini(func->base.n, pdf_array_len(obj));
+ int ranges = fz_mini(func->base.n, pdf_array_len(ctx, obj));
if (ranges != func->base.n)
fz_warn(ctx, "wrong number of C0 constants for exponential function");
for (i = 0; i < ranges; i++)
- func->u.e.c0[i] = pdf_to_real(pdf_array_get(obj, i));
+ func->u.e.c0[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i));
}
- obj = pdf_dict_gets(dict, "C1");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "C1");
+ if (pdf_is_array(ctx, obj))
{
- int ranges = fz_mini(func->base.n, pdf_array_len(obj));
+ int ranges = fz_mini(func->base.n, pdf_array_len(ctx, obj));
if (ranges != func->base.n)
fz_warn(ctx, "wrong number of C1 constants for exponential function");
for (i = 0; i < ranges; i++)
- func->u.e.c1[i] = pdf_to_real(pdf_array_get(obj, i));
+ func->u.e.c1[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i));
}
}
@@ -1220,9 +1217,8 @@ eval_exponential_func(fz_context *ctx, pdf_function *func, float in, float *out)
*/
static void
-load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict)
+load_stitching_func(fz_context *ctx, pdf_document *doc, pdf_function *func, pdf_obj *dict)
{
- fz_context *ctx = doc->ctx;
fz_function **funcs;
pdf_obj *obj;
pdf_obj *sub;
@@ -1236,14 +1232,14 @@ load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict)
fz_warn(ctx, "stitching functions have at most one input");
func->base.m = 1;
- obj = pdf_dict_gets(dict, "Functions");
- if (!pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "Functions");
+ if (!pdf_is_array(ctx, obj))
fz_throw(ctx, FZ_ERROR_GENERIC, "stitching function has no input functions");
fz_try(ctx)
{
- pdf_mark_obj(obj);
- k = pdf_array_len(obj);
+ pdf_mark_obj(ctx, obj);
+ k = pdf_array_len(ctx, obj);
func->u.st.funcs = fz_malloc_array(ctx, k, sizeof(fz_function*));
func->u.st.bounds = fz_malloc_array(ctx, k - 1, sizeof(float));
@@ -1252,10 +1248,10 @@ load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict)
for (i = 0; i < k; i++)
{
- sub = pdf_array_get(obj, i);
- funcs[i] = pdf_load_function(doc, sub, 1, func->base.n);
+ sub = pdf_array_get(ctx, obj, i);
+ funcs[i] = pdf_load_function(ctx, doc, sub, 1, func->base.n);
- func->base.size += fz_function_size(funcs[i]);
+ func->base.size += fz_function_size(ctx, funcs[i]);
func->u.st.k ++;
if (funcs[i]->m != func->base.m)
@@ -1266,26 +1262,26 @@ load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict)
}
fz_always(ctx)
{
- pdf_unmark_obj(obj);
+ pdf_unmark_obj(ctx, obj);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
- obj = pdf_dict_gets(dict, "Bounds");
- if (!pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "Bounds");
+ if (!pdf_is_array(ctx, obj))
fz_throw(ctx, FZ_ERROR_GENERIC, "stitching function has no bounds");
{
- if (pdf_array_len(obj) < k - 1)
+ if (pdf_array_len(ctx, obj) < k - 1)
fz_throw(ctx, FZ_ERROR_GENERIC, "too few subfunction boundaries");
- if (pdf_array_len(obj) > k)
+ if (pdf_array_len(ctx, obj) > k)
fz_warn(ctx, "too many subfunction boundaries");
for (i = 0; i < k - 1; i++)
{
- num = pdf_array_get(obj, i);
- func->u.st.bounds[i] = pdf_to_real(num);
+ num = pdf_array_get(ctx, obj, i);
+ func->u.st.bounds[i] = pdf_to_real(ctx, num);
if (i && func->u.st.bounds[i - 1] > func->u.st.bounds[i])
fz_throw(ctx, FZ_ERROR_GENERIC, "subfunction %d boundary out of range", i);
}
@@ -1301,17 +1297,17 @@ load_stitching_func(pdf_function *func, pdf_document *doc, pdf_obj *dict)
func->u.st.encode[i * 2 + 1] = 0;
}
- obj = pdf_dict_gets(dict, "Encode");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "Encode");
+ if (pdf_is_array(ctx, obj))
{
- int ranges = fz_mini(k, pdf_array_len(obj) / 2);
+ int ranges = fz_mini(k, pdf_array_len(ctx, obj) / 2);
if (ranges != k)
fz_warn(ctx, "wrong number of stitching function input mappings");
for (i = 0; i < ranges; i++)
{
- func->u.st.encode[i * 2 + 0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0));
- func->u.st.encode[i * 2 + 1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1));
+ func->u.st.encode[i * 2 + 0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0));
+ func->u.st.encode[i * 2 + 1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1));
}
}
}
@@ -1363,7 +1359,7 @@ eval_stitching_func(fz_context *ctx, pdf_function *func, float in, float *out)
*/
static void
-pdf_free_function_imp(fz_context *ctx, fz_storable *func_)
+pdf_drop_function_imp(fz_context *ctx, fz_storable *func_)
{
pdf_function *func = (pdf_function *)func_;
int i;
@@ -1620,58 +1616,57 @@ pdf_debug_function_imp(fz_function *func_, int level)
}
void
-pdf_debug_function(fz_function *func)
+pdf_debug_function(fz_context *ctx, fz_function *func)
{
pdf_debug_function_imp(func, 0);
}
#endif
fz_function *
-pdf_load_function(pdf_document *doc, pdf_obj *dict, int in, int out)
+pdf_load_function(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int in, int out)
{
- fz_context *ctx = doc->ctx;
pdf_function *func;
pdf_obj *obj;
int i;
- if (pdf_obj_marked(dict))
+ if (pdf_obj_marked(ctx, dict))
fz_throw(ctx, FZ_ERROR_GENERIC, "Recursion in function definition");
- if ((func = pdf_find_item(ctx, pdf_free_function_imp, dict)) != NULL)
+ if ((func = pdf_find_item(ctx, pdf_drop_function_imp, dict)) != NULL)
{
return (fz_function *)func;
}
func = fz_malloc_struct(ctx, pdf_function);
- FZ_INIT_STORABLE(&func->base, 1, pdf_free_function_imp);
+ FZ_INIT_STORABLE(&func->base, 1, pdf_drop_function_imp);
func->base.size = sizeof(*func);
func->base.evaluate = pdf_eval_function;
#ifndef NDEBUG
func->base.debug = pdf_debug_function;
#endif
- obj = pdf_dict_gets(dict, "FunctionType");
- func->type = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "FunctionType");
+ func->type = pdf_to_int(ctx, obj);
/* required for all */
- obj = pdf_dict_gets(dict, "Domain");
- func->base.m = fz_clampi(pdf_array_len(obj) / 2, 1, FZ_FN_MAXM);
+ obj = pdf_dict_gets(ctx, dict, "Domain");
+ func->base.m = fz_clampi(pdf_array_len(ctx, obj) / 2, 1, FZ_FN_MAXM);
for (i = 0; i < func->base.m; i++)
{
- func->domain[i][0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0));
- func->domain[i][1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1));
+ func->domain[i][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0));
+ func->domain[i][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1));
}
/* required for type0 and type4, optional otherwise */
- obj = pdf_dict_gets(dict, "Range");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "Range");
+ if (pdf_is_array(ctx, obj))
{
func->has_range = 1;
- func->base.n = fz_clampi(pdf_array_len(obj) / 2, 1, FZ_FN_MAXN);
+ func->base.n = fz_clampi(pdf_array_len(ctx, obj) / 2, 1, FZ_FN_MAXN);
for (i = 0; i < func->base.n; i++)
{
- func->range[i][0] = pdf_to_real(pdf_array_get(obj, i * 2 + 0));
- func->range[i][1] = pdf_to_real(pdf_array_get(obj, i * 2 + 1));
+ func->range[i][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 0));
+ func->range[i][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i * 2 + 1));
}
}
else
@@ -1690,23 +1685,23 @@ pdf_load_function(pdf_document *doc, pdf_obj *dict, int in, int out)
switch (func->type)
{
case SAMPLE:
- load_sample_func(func, doc, dict, pdf_to_num(dict), pdf_to_gen(dict));
+ load_sample_func(ctx, doc, func, dict, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
break;
case EXPONENTIAL:
- load_exponential_func(ctx, func, dict);
+ load_exponential_func(ctx, doc, func, dict);
break;
case STITCHING:
- load_stitching_func(func, doc, dict);
+ load_stitching_func(ctx, doc, func, dict);
break;
case POSTSCRIPT:
- load_postscript_func(func, doc, dict, pdf_to_num(dict), pdf_to_gen(dict));
+ load_postscript_func(ctx, doc, func, dict, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
break;
default:
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown function type (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown function type (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
pdf_store_item(ctx, dict, func, func->base.size);
@@ -1721,7 +1716,7 @@ pdf_load_function(pdf_document *doc, pdf_obj *dict, int in, int out)
type == STITCHING ? "stitching" :
type == POSTSCRIPT ? "calculator" :
"unknown",
- pdf_to_num(dict), pdf_to_gen(dict));
+ pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
return (fz_function *)func;
diff --git a/source/pdf/pdf-image.c b/source/pdf/pdf-image.c
index ffd21dd6..30f96dc8 100644
--- a/source/pdf/pdf-image.c
+++ b/source/pdf/pdf-image.c
@@ -1,9 +1,9 @@
#include "mupdf/pdf.h"
-static fz_image *pdf_load_jpx(pdf_document *doc, pdf_obj *dict, int forcemask);
+static fz_image *pdf_load_jpx(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int forcemask);
static fz_image *
-pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cstm, int forcemask)
+pdf_load_image_imp(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cstm, int forcemask)
{
fz_stream *stm = NULL;
fz_image *image = NULL;
@@ -21,7 +21,6 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
int stride;
int i;
- fz_context *ctx = doc->ctx;
fz_compressed_buffer *buffer;
fz_var(stm);
@@ -34,7 +33,7 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
/* special case for JPEG2000 images */
if (pdf_is_jpx_image(ctx, dict))
{
- image = pdf_load_jpx(doc, dict, forcemask);
+ image = pdf_load_jpx(ctx, doc, dict, forcemask);
if (forcemask)
{
@@ -56,13 +55,13 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
break; /* Out of fz_try */
}
- w = pdf_to_int(pdf_dict_getsa(dict, "Width", "W"));
- h = pdf_to_int(pdf_dict_getsa(dict, "Height", "H"));
- bpc = pdf_to_int(pdf_dict_getsa(dict, "BitsPerComponent", "BPC"));
+ w = pdf_to_int(ctx, pdf_dict_getsa(ctx, dict, "Width", "W"));
+ h = pdf_to_int(ctx, pdf_dict_getsa(ctx, dict, "Height", "H"));
+ bpc = pdf_to_int(ctx, pdf_dict_getsa(ctx, dict, "BitsPerComponent", "BPC"));
if (bpc == 0)
bpc = 8;
- imagemask = pdf_to_bool(pdf_dict_getsa(dict, "ImageMask", "IM"));
- interpolate = pdf_to_bool(pdf_dict_getsa(dict, "Interpolate", "I"));
+ imagemask = pdf_to_bool(ctx, pdf_dict_getsa(ctx, dict, "ImageMask", "IM"));
+ interpolate = pdf_to_bool(ctx, pdf_dict_getsa(ctx, dict, "Interpolate", "I"));
indexed = 0;
usecolorkey = 0;
@@ -83,19 +82,19 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
if (h > (1 << 16))
fz_throw(ctx, FZ_ERROR_GENERIC, "image is too high");
- obj = pdf_dict_getsa(dict, "ColorSpace", "CS");
+ obj = pdf_dict_getsa(ctx, dict, "ColorSpace", "CS");
if (obj && !imagemask && !forcemask)
{
/* colorspace resource lookup is only done for inline images */
- if (pdf_is_name(obj))
+ if (pdf_is_name(ctx, obj))
{
- res = pdf_dict_get(pdf_dict_gets(rdb, "ColorSpace"), obj);
+ res = pdf_dict_get(ctx, pdf_dict_gets(ctx, rdb, "ColorSpace"), obj);
if (res)
obj = res;
}
- colorspace = pdf_load_colorspace(doc, obj);
- indexed = fz_colorspace_is_indexed(colorspace);
+ colorspace = pdf_load_colorspace(ctx, doc, obj);
+ indexed = fz_colorspace_is_indexed(ctx, colorspace);
n = colorspace->n;
}
@@ -104,11 +103,11 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
n = 1;
}
- obj = pdf_dict_getsa(dict, "Decode", "D");
+ obj = pdf_dict_getsa(ctx, dict, "Decode", "D");
if (obj)
{
for (i = 0; i < n * 2; i++)
- decode[i] = pdf_to_real(pdf_array_get(obj, i));
+ decode[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i));
}
else
{
@@ -117,8 +116,8 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
decode[i] = i & 1 ? maxval : 0;
}
- obj = pdf_dict_getsa(dict, "SMask", "Mask");
- if (pdf_is_dict(obj))
+ obj = pdf_dict_getsa(ctx, dict, "SMask", "Mask");
+ if (pdf_is_dict(ctx, obj))
{
/* Not allowed for inline images or soft masks */
if (cstm)
@@ -127,27 +126,27 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
fz_warn(ctx, "Ignoring recursive image soft mask");
else
{
- mask = pdf_load_image_imp(doc, rdb, obj, NULL, 1);
- obj = pdf_dict_gets(obj, "Matte");
- if (pdf_is_array(obj))
+ mask = pdf_load_image_imp(ctx, doc, rdb, obj, NULL, 1);
+ obj = pdf_dict_gets(ctx, obj, "Matte");
+ if (pdf_is_array(ctx, obj))
{
usecolorkey = 1;
for (i = 0; i < n; i++)
- colorkey[i] = pdf_to_real(pdf_array_get(obj, i)) * 255;
+ colorkey[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i)) * 255;
}
}
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
usecolorkey = 1;
for (i = 0; i < n * 2; i++)
{
- if (!pdf_is_int(pdf_array_get(obj, i)))
+ if (!pdf_is_int(ctx, pdf_array_get(ctx, obj, i)))
{
fz_warn(ctx, "invalid value in color key mask");
usecolorkey = 0;
}
- colorkey[i] = pdf_to_int(pdf_array_get(obj, i));
+ colorkey[i] = pdf_to_int(ctx, pdf_array_get(ctx, obj, i));
}
}
@@ -156,9 +155,9 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
{
/* Just load the compressed image data now and we can
* decode it on demand. */
- int num = pdf_to_num(dict);
- int gen = pdf_to_gen(dict);
- buffer = pdf_load_compressed_stream(doc, num, gen);
+ int num = pdf_to_num(ctx, dict);
+ int gen = pdf_to_gen(ctx, dict);
+ buffer = pdf_load_compressed_stream(ctx, doc, num, gen);
image = fz_new_image(ctx, w, h, bpc, colorspace, 96, 96, interpolate, imagemask, decode, usecolorkey ? colorkey : NULL, buffer, mask);
}
else
@@ -166,7 +165,7 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
/* Inline stream */
stride = (w * n * bpc + 7) / 8;
image = fz_new_image(ctx, w, h, bpc, colorspace, 96, 96, interpolate, imagemask, decode, usecolorkey ? colorkey : NULL, NULL, mask);
- pdf_load_compressed_inline_image(doc, dict, stride * h, cstm, indexed, image);
+ pdf_load_compressed_inline_image(ctx, doc, dict, stride * h, cstm, indexed, image);
}
}
@@ -181,9 +180,9 @@ pdf_load_image_imp(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *cs
}
fz_image *
-pdf_load_inline_image(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file)
+pdf_load_inline_image(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict, fz_stream *file)
{
- return pdf_load_image_imp(doc, rdb, dict, file, 0);
+ return pdf_load_image_imp(ctx, doc, rdb, dict, file, 0);
}
int
@@ -192,79 +191,81 @@ pdf_is_jpx_image(fz_context *ctx, pdf_obj *dict)
pdf_obj *filter;
int i, n;
- filter = pdf_dict_gets(dict, "Filter");
- if (!strcmp(pdf_to_name(filter), "JPXDecode"))
+ filter = pdf_dict_gets(ctx, dict, "Filter");
+ if (!strcmp(pdf_to_name(ctx, filter), "JPXDecode"))
return 1;
- n = pdf_array_len(filter);
+ n = pdf_array_len(ctx, filter);
for (i = 0; i < n; i++)
- if (!strcmp(pdf_to_name(pdf_array_get(filter, i)), "JPXDecode"))
+ if (!strcmp(pdf_to_name(ctx, pdf_array_get(ctx, filter, i)), "JPXDecode"))
return 1;
return 0;
}
static fz_image *
-pdf_load_jpx(pdf_document *doc, pdf_obj *dict, int forcemask)
+pdf_load_jpx(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int forcemask)
{
fz_buffer *buf = NULL;
fz_colorspace *colorspace = NULL;
- fz_pixmap *img = NULL;
+ fz_pixmap *pix = NULL;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
int indexed = 0;
fz_image *mask = NULL;
+ fz_image *img = NULL;
- fz_var(img);
+ fz_var(pix);
fz_var(buf);
fz_var(colorspace);
fz_var(mask);
- buf = pdf_load_stream(doc, pdf_to_num(dict), pdf_to_gen(dict));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
/* FIXME: We can't handle decode arrays for indexed images currently */
fz_try(ctx)
{
- obj = pdf_dict_gets(dict, "ColorSpace");
+ obj = pdf_dict_gets(ctx, dict, "ColorSpace");
if (obj)
{
- colorspace = pdf_load_colorspace(doc, obj);
- indexed = fz_colorspace_is_indexed(colorspace);
+ colorspace = pdf_load_colorspace(ctx, doc, obj);
+ indexed = fz_colorspace_is_indexed(ctx, colorspace);
}
- img = fz_load_jpx(ctx, buf->data, buf->len, colorspace, indexed);
+ pix = fz_load_jpx(ctx, buf->data, buf->len, colorspace, indexed);
- obj = pdf_dict_getsa(dict, "SMask", "Mask");
- if (pdf_is_dict(obj))
+ obj = pdf_dict_getsa(ctx, dict, "SMask", "Mask");
+ if (pdf_is_dict(ctx, obj))
{
if (forcemask)
fz_warn(ctx, "Ignoring recursive JPX soft mask");
else
- mask = pdf_load_image_imp(doc, NULL, obj, NULL, 1);
+ mask = pdf_load_image_imp(ctx, doc, NULL, obj, NULL, 1);
}
- obj = pdf_dict_getsa(dict, "Decode", "D");
+ obj = pdf_dict_getsa(ctx, dict, "Decode", "D");
if (obj && !indexed)
{
float decode[FZ_MAX_COLORS * 2];
int i;
- for (i = 0; i < img->n * 2; i++)
- decode[i] = pdf_to_real(pdf_array_get(obj, i));
+ for (i = 0; i < pix->n * 2; i++)
+ decode[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i));
- fz_decode_tile(img, decode);
+ fz_decode_tile(ctx, pix, decode);
}
+
+ img = fz_new_image_from_pixmap(ctx, pix, mask);
}
fz_always(ctx)
{
fz_drop_colorspace(ctx, colorspace);
fz_drop_buffer(ctx, buf);
+ fz_drop_pixmap(ctx, pix);
}
fz_catch(ctx)
{
- fz_drop_pixmap(ctx, img);
fz_rethrow(ctx);
}
- return fz_new_image_from_pixmap(ctx, img, mask);
+ return img;
}
static int
@@ -276,17 +277,16 @@ fz_image_size(fz_context *ctx, fz_image *im)
}
fz_image *
-pdf_load_image(pdf_document *doc, pdf_obj *dict)
+pdf_load_image(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
- fz_context *ctx = doc->ctx;
fz_image *image;
- if ((image = pdf_find_item(ctx, fz_free_image, dict)) != NULL)
+ if ((image = pdf_find_item(ctx, fz_drop_image_imp, dict)) != NULL)
{
return (fz_image *)image;
}
- image = pdf_load_image_imp(doc, NULL, dict, NULL, 0);
+ image = pdf_load_image_imp(ctx, doc, NULL, dict, NULL, 0);
pdf_store_item(ctx, dict, image, fz_image_size(ctx, image));
diff --git a/source/pdf/pdf-interpret-imp.h b/source/pdf/pdf-interpret-imp.h
index 314e6d2b..817a7d2c 100644
--- a/source/pdf/pdf-interpret-imp.h
+++ b/source/pdf/pdf-interpret-imp.h
@@ -106,6 +106,7 @@ typedef struct pdf_process_s
struct pdf_csi_s
{
+ fz_context *ctx;
pdf_document *doc;
/* Current resource dict and file. These are in here to reduce param
@@ -142,14 +143,14 @@ void pdf_process_contents_object(pdf_csi *csi, pdf_obj *rdb, pdf_obj *contents);
void pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf);
/* Functions to set up pdf_process structures */
-pdf_process *pdf_process_run(pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested);
-pdf_process *pdf_process_buffer(pdf_process *process, fz_context *ctx, fz_buffer *buffer);
-pdf_process *pdf_process_filter(pdf_process *process, fz_context *ctx, pdf_process *underlying, pdf_obj *resources);
+pdf_process *pdf_init_process_run(fz_context *ctx, pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested);
+pdf_process *pdf_init_process_buffer(fz_context *ctx, pdf_process *process, fz_buffer *buffer);
+pdf_process *pdf_init_process_filter(fz_context *ctx, pdf_process *process, pdf_process *underlying, pdf_obj *resources);
/* Functions to actually use the pdf_process structures to process
* annotations, glyphs and general stream objects */
-void pdf_process_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie);
-void pdf_process_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process);
-void pdf_process_stream_object(pdf_document *doc, pdf_obj *obj, const pdf_process *process, pdf_obj *res, fz_cookie *cookie);
+void pdf_process_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie);
+void pdf_process_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process);
+void pdf_process_stream_object(fz_context *ctx, pdf_document *doc, pdf_obj *obj, const pdf_process *process, pdf_obj *res, fz_cookie *cookie);
#endif
diff --git a/source/pdf/pdf-interpret.c b/source/pdf/pdf-interpret.c
index 359f6eda..a3df4c77 100644
--- a/source/pdf/pdf-interpret.c
+++ b/source/pdf/pdf-interpret.c
@@ -1,17 +1,18 @@
#include "pdf-interpret-imp.h"
static pdf_csi *
-pdf_new_csi(pdf_document *doc, fz_cookie *cookie, const pdf_process *process)
+pdf_new_csi(fz_context *ctx, pdf_document *doc, fz_cookie *cookie, const pdf_process *process)
{
pdf_csi *csi = NULL;
- fz_context *ctx = doc->ctx;
fz_var(csi);
fz_try(ctx)
{
csi = fz_malloc_struct(ctx, pdf_csi);
- csi->doc = doc;
+ csi->ctx = ctx; /* FIXME */
+ csi->doc = doc; /* FIXME */
+
csi->in_text = 0;
csi->top = 0;
@@ -38,12 +39,14 @@ pdf_new_csi(pdf_document *doc, fz_cookie *cookie, const pdf_process *process)
static void
pdf_clear_stack(pdf_csi *csi)
{
+ fz_context *ctx = csi->ctx;
+
int i;
- fz_drop_image(csi->doc->ctx, csi->img);
+ fz_drop_image(ctx, csi->img);
csi->img = NULL;
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = NULL;
csi->name[0] = 0;
@@ -55,9 +58,9 @@ pdf_clear_stack(pdf_csi *csi)
}
static void
-pdf_free_csi(pdf_csi *csi)
+pdf_drop_csi(pdf_csi *csi)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_process_op(csi, PDF_OP_END, &csi->process);
fz_free(ctx, csi);
@@ -70,27 +73,29 @@ pdf_free_csi(pdf_csi *csi)
static void
parse_inline_image(pdf_csi *csi)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
+ pdf_document *doc = csi->doc;
+
pdf_obj *rdb = csi->rdb;
fz_stream *file = csi->file;
int ch, found;
fz_drop_image(ctx, csi->img);
csi->img = NULL;
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = NULL;
- csi->obj = pdf_parse_dict(csi->doc, file, &csi->doc->lexbuf.base);
+ csi->obj = pdf_parse_dict(ctx, doc, file, &doc->lexbuf.base);
/* read whitespace after ID keyword */
- ch = fz_read_byte(file);
+ ch = fz_read_byte(ctx, file);
if (ch == '\r')
- if (fz_peek_byte(file) == '\n')
- fz_read_byte(file);
+ if (fz_peek_byte(ctx, file) == '\n')
+ fz_read_byte(ctx, file);
fz_try(ctx)
{
- csi->img = pdf_load_inline_image(csi->doc, rdb, csi->obj, file);
+ csi->img = pdf_load_inline_image(ctx, doc, rdb, csi->obj, file);
}
fz_catch(ctx)
{
@@ -99,17 +104,17 @@ parse_inline_image(pdf_csi *csi)
/* find EI */
found = 0;
- ch = fz_read_byte(file);
+ ch = fz_read_byte(ctx, file);
do
{
while (ch != 'E' && ch != EOF)
- ch = fz_read_byte(file);
+ ch = fz_read_byte(ctx, file);
if (ch == 'E')
{
- ch = fz_read_byte(file);
+ ch = fz_read_byte(ctx, file);
if (ch == 'I')
{
- ch = fz_peek_byte(file);
+ ch = fz_peek_byte(ctx, file);
if (ch == ' ' || ch <= 32 || ch == EOF || ch == '<' || ch == '/')
{
found = 1;
@@ -125,7 +130,8 @@ parse_inline_image(pdf_csi *csi)
static int
pdf_run_keyword(pdf_csi *csi, char *buf)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
+
int key;
PDF_OP op;
@@ -278,7 +284,9 @@ pdf_run_keyword(pdf_csi *csi, char *buf)
void
pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
+ pdf_document *doc = csi->doc;
+
fz_stream *file = csi->file;
pdf_token tok = PDF_TOK_ERROR;
int in_text_array = 0;
@@ -313,7 +321,7 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf)
csi->cookie->progress++;
}
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (in_text_array)
{
@@ -323,27 +331,27 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf)
in_text_array = 0;
break;
case PDF_TOK_REAL:
- pdf_array_push_drop(csi->obj, pdf_new_real(csi->doc, buf->f));
+ pdf_array_push_drop(ctx, csi->obj, pdf_new_real(ctx, doc, buf->f));
break;
case PDF_TOK_INT:
- pdf_array_push_drop(csi->obj, pdf_new_int(csi->doc, buf->i));
+ pdf_array_push_drop(ctx, csi->obj, pdf_new_int(ctx, doc, buf->i));
break;
case PDF_TOK_STRING:
- pdf_array_push_drop(csi->obj, pdf_new_string(csi->doc, buf->scratch, buf->len));
+ pdf_array_push_drop(ctx, csi->obj, pdf_new_string(ctx, doc, buf->scratch, buf->len));
break;
case PDF_TOK_EOF:
break;
case PDF_TOK_KEYWORD:
if (!strcmp(buf->scratch, "Tw") || !strcmp(buf->scratch, "Tc"))
{
- int l = pdf_array_len(csi->obj);
+ int l = pdf_array_len(ctx, csi->obj);
if (l > 0)
{
- pdf_obj *o = pdf_array_get(csi->obj, l-1);
- if (pdf_is_number(o))
+ pdf_obj *o = pdf_array_get(ctx, csi->obj, l-1);
+ if (pdf_is_number(ctx, o))
{
- csi->stack[0] = pdf_to_real(o);
- pdf_array_delete(csi->obj, l-1);
+ csi->stack[0] = pdf_to_real(ctx, o);
+ pdf_array_delete(ctx, csi->obj, l-1);
if (pdf_run_keyword(csi, buf->scratch) == 0)
break;
}
@@ -364,35 +372,35 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf)
case PDF_TOK_OPEN_ARRAY:
if (csi->obj)
{
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = NULL;
}
if (csi->in_text)
{
in_text_array = 1;
- csi->obj = pdf_new_array(csi->doc, 4);
+ csi->obj = pdf_new_array(ctx, doc, 4);
}
else
{
- csi->obj = pdf_parse_array(csi->doc, file, buf);
+ csi->obj = pdf_parse_array(ctx, doc, file, buf);
}
break;
case PDF_TOK_OPEN_DICT:
if (csi->obj)
{
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = NULL;
}
- csi->obj = pdf_parse_dict(csi->doc, file, buf);
+ csi->obj = pdf_parse_dict(ctx, doc, file, buf);
break;
case PDF_TOK_NAME:
if (csi->name[0])
{
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = NULL;
- csi->obj = pdf_new_name(csi->doc, buf->scratch);
+ csi->obj = pdf_new_name(ctx, doc, buf->scratch);
}
else
fz_strlcpy(csi->name, buf->scratch, sizeof(csi->name));
@@ -426,10 +434,10 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf)
{
if (csi->obj)
{
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = NULL;
}
- csi->obj = pdf_new_string(csi->doc, buf->scratch, buf->len);
+ csi->obj = pdf_new_string(ctx, doc, buf->scratch, buf->len);
}
break;
@@ -494,7 +502,8 @@ pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf)
static void
pdf_process_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
+
pdf_lexbuf *buf;
int save_in_text;
pdf_obj *save_obj;
@@ -521,11 +530,11 @@ pdf_process_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file)
fz_always(ctx)
{
csi->in_text = save_in_text;
- pdf_drop_obj(csi->obj);
+ pdf_drop_obj(ctx, csi->obj);
csi->obj = save_obj;
csi->rdb = save_rdb;
csi->file = save_file;
- pdf_lexbuf_fin(buf);
+ pdf_lexbuf_fin(ctx, buf);
fz_free(ctx, buf);
}
fz_catch(ctx)
@@ -537,16 +546,15 @@ pdf_process_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file)
}
void
-pdf_process_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie)
+pdf_process_annot(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
pdf_csi *csi;
int flags;
- csi = pdf_new_csi(doc, cookie, process);
+ csi = pdf_new_csi(ctx, doc, cookie, process);
fz_try(ctx)
{
- flags = pdf_to_int(pdf_dict_gets(annot->obj, "F"));
+ flags = pdf_to_int(ctx, pdf_dict_gets(ctx, annot->obj, "F"));
/* Check not invisible (bit 0) and hidden (bit 1) */
/* TODO: NoZoom and NoRotate */
@@ -557,7 +565,7 @@ pdf_process_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf
}
fz_always(ctx)
{
- pdf_free_csi(csi);
+ pdf_drop_csi(csi);
}
fz_catch(ctx)
{
@@ -568,20 +576,22 @@ pdf_process_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf
void
pdf_process_contents_object(pdf_csi *csi, pdf_obj *rdb, pdf_obj *contents)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
+ pdf_document *doc = csi->doc;
+
fz_stream *file = NULL;
if (contents == NULL)
return;
- file = pdf_open_contents_stream(csi->doc, contents);
+ file = pdf_open_contents_stream(ctx, doc, contents);
fz_try(ctx)
{
pdf_process_contents_stream(csi, rdb, file);
}
fz_always(ctx)
{
- fz_close(file);
+ fz_drop_stream(ctx, file);
}
fz_catch(ctx)
{
@@ -592,7 +602,8 @@ pdf_process_contents_object(pdf_csi *csi, pdf_obj *rdb, pdf_obj *contents)
static void
pdf_process_contents_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
+
fz_stream *file = NULL;
if (contents == NULL)
@@ -605,7 +616,7 @@ pdf_process_contents_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents)
}
fz_always(ctx)
{
- fz_close(file);
+ fz_drop_stream(ctx, file);
}
fz_catch(ctx)
{
@@ -614,19 +625,18 @@ pdf_process_contents_buffer(pdf_csi *csi, pdf_obj *rdb, fz_buffer *contents)
}
void
-pdf_process_stream_object(pdf_document *doc, pdf_obj *obj, const pdf_process *process, pdf_obj *res, fz_cookie *cookie)
+pdf_process_stream_object(fz_context *ctx, pdf_document *doc, pdf_obj *obj, const pdf_process *process, pdf_obj *res, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
pdf_csi *csi;
- csi = pdf_new_csi(doc, cookie, process);
+ csi = pdf_new_csi(ctx, doc, cookie, process);
fz_try(ctx)
{
csi->process.processor->process_contents(csi, csi->process.state, res, obj);
}
fz_always(ctx)
{
- pdf_free_csi(csi);
+ pdf_drop_csi(csi);
}
fz_catch(ctx)
{
@@ -636,19 +646,18 @@ pdf_process_stream_object(pdf_document *doc, pdf_obj *obj, const pdf_process *pr
}
void
-pdf_process_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process)
+pdf_process_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process)
{
pdf_csi *csi;
- fz_context *ctx = doc->ctx;
- csi = pdf_new_csi(doc, NULL, process);
+ csi = pdf_new_csi(ctx, doc, NULL, process);
fz_try(ctx)
{
pdf_process_contents_buffer(csi, resources, contents);
}
fz_always(ctx)
{
- pdf_free_csi(csi);
+ pdf_drop_csi(csi);
}
fz_catch(ctx)
{
diff --git a/source/pdf/pdf-lex.c b/source/pdf/pdf-lex.c
index 6a4033f9..a8dfd916 100644
--- a/source/pdf/pdf-lex.c
+++ b/source/pdf/pdf-lex.c
@@ -21,6 +21,8 @@
'a':case'b':case'c':case'd':case'e':case'f'
#define RANGE_A_F \
'A':case'B':case'C':case'D':case'E':case'F'
+#define RANGE_0_7 \
+ '0':case'1':case'2':case'3':case'4':case'5':case'6':case'7'
static inline int iswhite(int ch)
{
@@ -42,27 +44,27 @@ static inline int unhex(int ch)
}
static void
-lex_white(fz_stream *f)
+lex_white(fz_context *ctx, fz_stream *f)
{
int c;
do {
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
} while ((c <= 32) && (iswhite(c)));
if (c != EOF)
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
}
static void
-lex_comment(fz_stream *f)
+lex_comment(fz_context *ctx, fz_stream *f)
{
int c;
do {
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
} while ((c != '\012') && (c != '\015') && (c != EOF));
}
static int
-lex_number(fz_stream *f, pdf_lexbuf *buf, int c)
+lex_number(fz_context *ctx, fz_stream *f, pdf_lexbuf *buf, int c)
{
int neg = 0;
int i = 0;
@@ -87,7 +89,7 @@ lex_number(fz_stream *f, pdf_lexbuf *buf, int c)
while (1)
{
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case '.':
@@ -97,7 +99,7 @@ lex_number(fz_stream *f, pdf_lexbuf *buf, int c)
/* FIXME: Need overflow check here; do we care? */
break;
default:
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
/* Fallthrough */
case EOF:
if (neg)
@@ -113,7 +115,7 @@ loop_after_dot:
d = 1;
while (1)
{
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case RANGE_0_9:
@@ -123,7 +125,7 @@ loop_after_dot:
d *= 10;
break;
default:
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
/* Fallthrough */
case EOF:
v = (float)i + ((float)n / (float)d);
@@ -138,13 +140,13 @@ underflow:
/* Ignore any digits after here, because they are too small */
while (1)
{
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case RANGE_0_9:
break;
default:
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
/* Fallthrough */
case EOF:
v = (float)i + ((float)n / (float)d);
@@ -157,26 +159,26 @@ underflow:
}
static void
-lex_name(fz_stream *f, pdf_lexbuf *buf)
+lex_name(fz_context *ctx, fz_stream *f, pdf_lexbuf *buf)
{
char *s = buf->scratch;
int n = buf->size;
while (n > 1)
{
- int c = fz_read_byte(f);
+ int c = fz_read_byte(ctx, f);
switch (c)
{
case IS_WHITE:
case IS_DELIM:
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
goto end;
case EOF:
goto end;
case '#':
{
int d;
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case RANGE_0_9:
@@ -189,12 +191,12 @@ lex_name(fz_stream *f, pdf_lexbuf *buf)
d = (c - 'A' + 10) << 4;
break;
default:
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
/* fallthrough */
case EOF:
goto end;
}
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case RANGE_0_9:
@@ -207,7 +209,7 @@ lex_name(fz_stream *f, pdf_lexbuf *buf)
c -= 'A' - 10;
break;
default:
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
/* fallthrough */
case EOF:
*s++ = d;
@@ -230,7 +232,7 @@ end:
}
static int
-lex_string(fz_stream *f, pdf_lexbuf *lb)
+lex_string(fz_context *ctx, fz_stream *f, pdf_lexbuf *lb)
{
char *s = lb->scratch;
char *e = s + lb->size;
@@ -242,10 +244,10 @@ lex_string(fz_stream *f, pdf_lexbuf *lb)
{
if (s == e)
{
- s += pdf_lexbuf_grow(lb);
+ s += pdf_lexbuf_grow(ctx, lb);
e = lb->scratch + lb->size;
}
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case EOF:
@@ -261,7 +263,7 @@ lex_string(fz_stream *f, pdf_lexbuf *lb)
*s++ = c;
break;
case '\\':
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case EOF:
@@ -290,28 +292,28 @@ lex_string(fz_stream *f, pdf_lexbuf *lb)
case '\\':
*s++ = '\\';
break;
- case RANGE_0_9:
+ case RANGE_0_7:
oct = c - '0';
- c = fz_read_byte(f);
- if (c >= '0' && c <= '9')
+ c = fz_read_byte(ctx, f);
+ if (c >= '0' && c <= '7')
{
oct = oct * 8 + (c - '0');
- c = fz_read_byte(f);
- if (c >= '0' && c <= '9')
+ c = fz_read_byte(ctx, f);
+ if (c >= '0' && c <= '7')
oct = oct * 8 + (c - '0');
else if (c != EOF)
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
}
else if (c != EOF)
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
*s++ = oct;
break;
case '\n':
break;
case '\r':
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
if ((c != '\n') && (c != EOF))
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
break;
default:
*s++ = c;
@@ -328,7 +330,7 @@ end:
}
static int
-lex_hex_string(fz_stream *f, pdf_lexbuf *lb)
+lex_hex_string(fz_context *ctx, fz_stream *f, pdf_lexbuf *lb)
{
char *s = lb->scratch;
char *e = s + lb->size;
@@ -339,10 +341,10 @@ lex_hex_string(fz_stream *f, pdf_lexbuf *lb)
{
if (s == e)
{
- s += pdf_lexbuf_grow(lb);
+ s += pdf_lexbuf_grow(ctx, lb);
e = lb->scratch + lb->size;
}
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
switch (c)
{
case IS_WHITE:
@@ -363,7 +365,7 @@ lex_hex_string(fz_stream *f, pdf_lexbuf *lb)
case EOF:
goto end;
default:
- fz_warn(f->ctx, "ignoring invalid character in hex string");
+ fz_warn(ctx, "ignoring invalid character in hex string");
}
}
end:
@@ -414,80 +416,79 @@ void pdf_lexbuf_init(fz_context *ctx, pdf_lexbuf *lb, int size)
{
lb->size = lb->base_size = size;
lb->len = 0;
- lb->ctx = ctx;
lb->scratch = &lb->buffer[0];
}
-void pdf_lexbuf_fin(pdf_lexbuf *lb)
+void pdf_lexbuf_fin(fz_context *ctx, pdf_lexbuf *lb)
{
if (lb && lb->size != lb->base_size)
- fz_free(lb->ctx, lb->scratch);
+ fz_free(ctx, lb->scratch);
}
-ptrdiff_t pdf_lexbuf_grow(pdf_lexbuf *lb)
+ptrdiff_t pdf_lexbuf_grow(fz_context *ctx, pdf_lexbuf *lb)
{
char *old = lb->scratch;
int newsize = lb->size * 2;
if (lb->size == lb->base_size)
{
- lb->scratch = fz_malloc(lb->ctx, newsize);
+ lb->scratch = fz_malloc(ctx, newsize);
memcpy(lb->scratch, lb->buffer, lb->size);
}
else
{
- lb->scratch = fz_resize_array(lb->ctx, lb->scratch, newsize, 1);
+ lb->scratch = fz_resize_array(ctx, lb->scratch, newsize, 1);
}
lb->size = newsize;
return lb->scratch - old;
}
pdf_token
-pdf_lex(fz_stream *f, pdf_lexbuf *buf)
+pdf_lex(fz_context *ctx, fz_stream *f, pdf_lexbuf *buf)
{
while (1)
{
- int c = fz_read_byte(f);
+ int c = fz_read_byte(ctx, f);
switch (c)
{
case EOF:
return PDF_TOK_EOF;
case IS_WHITE:
- lex_white(f);
+ lex_white(ctx, f);
break;
case '%':
- lex_comment(f);
+ lex_comment(ctx, f);
break;
case '/':
- lex_name(f, buf);
+ lex_name(ctx, f, buf);
return PDF_TOK_NAME;
case '(':
- return lex_string(f, buf);
+ return lex_string(ctx, f, buf);
case ')':
- fz_warn(f->ctx, "lexical error (unexpected ')')");
+ fz_warn(ctx, "lexical error (unexpected ')')");
continue;
case '<':
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
if (c == '<')
{
return PDF_TOK_OPEN_DICT;
}
else
{
- fz_unread_byte(f);
- return lex_hex_string(f, buf);
+ fz_unread_byte(ctx, f);
+ return lex_hex_string(ctx, f, buf);
}
case '>':
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
if (c == '>')
{
return PDF_TOK_CLOSE_DICT;
}
- fz_warn(f->ctx, "lexical error (unexpected '>')");
+ fz_warn(ctx, "lexical error (unexpected '>')");
if (c == EOF)
{
return PDF_TOK_EOF;
}
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
continue;
case '[':
return PDF_TOK_OPEN_ARRAY;
@@ -498,40 +499,40 @@ pdf_lex(fz_stream *f, pdf_lexbuf *buf)
case '}':
return PDF_TOK_CLOSE_BRACE;
case IS_NUMBER:
- return lex_number(f, buf, c);
+ return lex_number(ctx, f, buf, c);
default: /* isregular: !isdelim && !iswhite && c != EOF */
- fz_unread_byte(f);
- lex_name(f, buf);
+ fz_unread_byte(ctx, f);
+ lex_name(ctx, f, buf);
return pdf_token_from_keyword(buf->scratch);
}
}
}
pdf_token
-pdf_lex_no_string(fz_stream *f, pdf_lexbuf *buf)
+pdf_lex_no_string(fz_context *ctx, fz_stream *f, pdf_lexbuf *buf)
{
while (1)
{
- int c = fz_read_byte(f);
+ int c = fz_read_byte(ctx, f);
switch (c)
{
case EOF:
return PDF_TOK_EOF;
case IS_WHITE:
- lex_white(f);
+ lex_white(ctx, f);
break;
case '%':
- lex_comment(f);
+ lex_comment(ctx, f);
break;
case '/':
- lex_name(f, buf);
+ lex_name(ctx, f, buf);
return PDF_TOK_NAME;
case '(':
continue;
case ')':
continue;
case '<':
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
if (c == '<')
{
return PDF_TOK_OPEN_DICT;
@@ -541,7 +542,7 @@ pdf_lex_no_string(fz_stream *f, pdf_lexbuf *buf)
continue;
}
case '>':
- c = fz_read_byte(f);
+ c = fz_read_byte(ctx, f);
if (c == '>')
{
return PDF_TOK_CLOSE_DICT;
@@ -550,7 +551,7 @@ pdf_lex_no_string(fz_stream *f, pdf_lexbuf *buf)
{
return PDF_TOK_EOF;
}
- fz_unread_byte(f);
+ fz_unread_byte(ctx, f);
continue;
case '[':
return PDF_TOK_OPEN_ARRAY;
@@ -561,10 +562,10 @@ pdf_lex_no_string(fz_stream *f, pdf_lexbuf *buf)
case '}':
return PDF_TOK_CLOSE_BRACE;
case IS_NUMBER:
- return lex_number(f, buf, c);
+ return lex_number(ctx, f, buf, c);
default: /* isregular: !isdelim && !iswhite && c != EOF */
- fz_unread_byte(f);
- lex_name(f, buf);
+ fz_unread_byte(ctx, f);
+ lex_name(ctx, f, buf);
return pdf_token_from_keyword(buf->scratch);
}
}
@@ -579,7 +580,7 @@ void pdf_print_token(fz_context *ctx, fz_buffer *fzbuf, int tok, pdf_lexbuf *buf
break;
case PDF_TOK_STRING:
if (buf->len >= buf->size)
- pdf_lexbuf_grow(buf);
+ pdf_lexbuf_grow(ctx, buf);
buf->scratch[buf->len] = 0;
fz_buffer_cat_pdf_string(ctx, fzbuf, buf->scratch);
break;
diff --git a/source/pdf/pdf-nametree.c b/source/pdf/pdf-nametree.c
index bcbe8002..eecbb320 100644
--- a/source/pdf/pdf-nametree.c
+++ b/source/pdf/pdf-nametree.c
@@ -3,52 +3,52 @@
static pdf_obj *
pdf_lookup_name_imp(fz_context *ctx, pdf_obj *node, pdf_obj *needle)
{
- pdf_obj *kids = pdf_dict_gets(node, "Kids");
- pdf_obj *names = pdf_dict_gets(node, "Names");
+ pdf_obj *kids = pdf_dict_gets(ctx, node, "Kids");
+ pdf_obj *names = pdf_dict_gets(ctx, node, "Names");
- if (pdf_is_array(kids))
+ if (pdf_is_array(ctx, kids))
{
int l = 0;
- int r = pdf_array_len(kids) - 1;
+ int r = pdf_array_len(ctx, kids) - 1;
while (l <= r)
{
int m = (l + r) >> 1;
- pdf_obj *kid = pdf_array_get(kids, m);
- pdf_obj *limits = pdf_dict_gets(kid, "Limits");
- pdf_obj *first = pdf_array_get(limits, 0);
- pdf_obj *last = pdf_array_get(limits, 1);
+ pdf_obj *kid = pdf_array_get(ctx, kids, m);
+ pdf_obj *limits = pdf_dict_gets(ctx, kid, "Limits");
+ pdf_obj *first = pdf_array_get(ctx, limits, 0);
+ pdf_obj *last = pdf_array_get(ctx, limits, 1);
- if (pdf_objcmp(needle, first) < 0)
+ if (pdf_objcmp(ctx, needle, first) < 0)
r = m - 1;
- else if (pdf_objcmp(needle, last) > 0)
+ else if (pdf_objcmp(ctx, needle, last) > 0)
l = m + 1;
else
{
pdf_obj *obj;
- if (pdf_mark_obj(node))
+ if (pdf_mark_obj(ctx, node))
break;
obj = pdf_lookup_name_imp(ctx, kid, needle);
- pdf_unmark_obj(node);
+ pdf_unmark_obj(ctx, node);
return obj;
}
}
}
- if (pdf_is_array(names))
+ if (pdf_is_array(ctx, names))
{
int l = 0;
- int r = (pdf_array_len(names) / 2) - 1;
+ int r = (pdf_array_len(ctx, names) / 2) - 1;
while (l <= r)
{
int m = (l + r) >> 1;
int c;
- pdf_obj *key = pdf_array_get(names, m * 2);
- pdf_obj *val = pdf_array_get(names, m * 2 + 1);
+ pdf_obj *key = pdf_array_get(ctx, names, m * 2);
+ pdf_obj *val = pdf_array_get(ctx, names, m * 2 + 1);
- c = pdf_objcmp(needle, key);
+ c = pdf_objcmp(ctx, needle, key);
if (c < 0)
r = m - 1;
else if (c > 0)
@@ -60,49 +60,45 @@ pdf_lookup_name_imp(fz_context *ctx, pdf_obj *node, pdf_obj *needle)
/* Spec says names should be sorted (hence the binary search,
* above), but Acrobat copes with non-sorted. Drop back to a
* simple search if the binary search fails. */
- r = pdf_array_len(names)/2;
+ r = pdf_array_len(ctx, names)/2;
for (l = 0; l < r; l++)
- if (!pdf_objcmp(needle, pdf_array_get(names, l * 2)))
- return pdf_array_get(names, l * 2 + 1);
+ if (!pdf_objcmp(ctx, needle, pdf_array_get(ctx, names, l * 2)))
+ return pdf_array_get(ctx, names, l * 2 + 1);
}
return NULL;
}
pdf_obj *
-pdf_lookup_name(pdf_document *doc, char *which, pdf_obj *needle)
+pdf_lookup_name(fz_context *ctx, pdf_document *doc, char *which, pdf_obj *needle)
{
- fz_context *ctx = doc->ctx;
-
- pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root");
- pdf_obj *names = pdf_dict_gets(root, "Names");
- pdf_obj *tree = pdf_dict_gets(names, which);
+ pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pdf_obj *names = pdf_dict_gets(ctx, root, "Names");
+ pdf_obj *tree = pdf_dict_gets(ctx, names, which);
return pdf_lookup_name_imp(ctx, tree, needle);
}
pdf_obj *
-pdf_lookup_dest(pdf_document *doc, pdf_obj *needle)
+pdf_lookup_dest(fz_context *ctx, pdf_document *doc, pdf_obj *needle)
{
- fz_context *ctx = doc->ctx;
-
- pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root");
- pdf_obj *dests = pdf_dict_gets(root, "Dests");
- pdf_obj *names = pdf_dict_gets(root, "Names");
+ pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pdf_obj *dests = pdf_dict_gets(ctx, root, "Dests");
+ pdf_obj *names = pdf_dict_gets(ctx, root, "Names");
pdf_obj *dest = NULL;
/* PDF 1.1 has destinations in a dictionary */
if (dests)
{
- if (pdf_is_name(needle))
- return pdf_dict_get(dests, needle);
+ if (pdf_is_name(ctx, needle))
+ return pdf_dict_get(ctx, dests, needle);
else
- return pdf_dict_gets(dests, pdf_to_str_buf(needle));
+ return pdf_dict_gets(ctx, dests, pdf_to_str_buf(ctx, needle));
}
/* PDF 1.2 has destinations in a name tree */
if (names && !dest)
{
- pdf_obj *tree = pdf_dict_gets(names, "Dests");
+ pdf_obj *tree = pdf_dict_gets(ctx, names, "Dests");
return pdf_lookup_name_imp(ctx, tree, needle);
}
@@ -110,54 +106,53 @@ pdf_lookup_dest(pdf_document *doc, pdf_obj *needle)
}
static void
-pdf_load_name_tree_imp(pdf_obj *dict, pdf_document *doc, pdf_obj *node)
+pdf_load_name_tree_imp(fz_context *ctx, pdf_obj *dict, pdf_document *doc, pdf_obj *node)
{
- fz_context *ctx = doc->ctx;
- pdf_obj *kids = pdf_dict_gets(node, "Kids");
- pdf_obj *names = pdf_dict_gets(node, "Names");
+ pdf_obj *kids = pdf_dict_gets(ctx, node, "Kids");
+ pdf_obj *names = pdf_dict_gets(ctx, node, "Names");
int i;
UNUSED(ctx);
- if (kids && !pdf_mark_obj(node))
+ if (kids && !pdf_mark_obj(ctx, node))
{
- int len = pdf_array_len(kids);
+ int len = pdf_array_len(ctx, kids);
for (i = 0; i < len; i++)
- pdf_load_name_tree_imp(dict, doc, pdf_array_get(kids, i));
- pdf_unmark_obj(node);
+ pdf_load_name_tree_imp(ctx, dict, doc, pdf_array_get(ctx, kids, i));
+ pdf_unmark_obj(ctx, node);
}
if (names)
{
- int len = pdf_array_len(names);
+ int len = pdf_array_len(ctx, names);
for (i = 0; i + 1 < len; i += 2)
{
- pdf_obj *key = pdf_array_get(names, i);
- pdf_obj *val = pdf_array_get(names, i + 1);
- if (pdf_is_string(key))
+ pdf_obj *key = pdf_array_get(ctx, names, i);
+ pdf_obj *val = pdf_array_get(ctx, names, i + 1);
+ if (pdf_is_string(ctx, key))
{
- key = pdf_to_utf8_name(doc, key);
- pdf_dict_put(dict, key, val);
- pdf_drop_obj(key);
+ key = pdf_to_utf8_name(ctx, doc, key);
+ pdf_dict_put(ctx, dict, key, val);
+ pdf_drop_obj(ctx, key);
}
- else if (pdf_is_name(key))
+ else if (pdf_is_name(ctx, key))
{
- pdf_dict_put(dict, key, val);
+ pdf_dict_put(ctx, dict, key, val);
}
}
}
}
pdf_obj *
-pdf_load_name_tree(pdf_document *doc, char *which)
+pdf_load_name_tree(fz_context *ctx, pdf_document *doc, char *which)
{
- pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root");
- pdf_obj *names = pdf_dict_gets(root, "Names");
- pdf_obj *tree = pdf_dict_gets(names, which);
- if (pdf_is_dict(tree))
+ pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pdf_obj *names = pdf_dict_gets(ctx, root, "Names");
+ pdf_obj *tree = pdf_dict_gets(ctx, names, which);
+ if (pdf_is_dict(ctx, tree))
{
- pdf_obj *dict = pdf_new_dict(doc, 100);
- pdf_load_name_tree_imp(dict, doc, tree);
+ pdf_obj *dict = pdf_new_dict(ctx, doc, 100);
+ pdf_load_name_tree_imp(ctx, dict, doc, tree);
return dict;
}
return NULL;
diff --git a/source/pdf/pdf-object.c b/source/pdf/pdf-object.c
index a3c44fe2..d4b008fb 100644
--- a/source/pdf/pdf-object.c
+++ b/source/pdf/pdf-object.c
@@ -33,7 +33,7 @@ struct pdf_obj_s
int refs;
unsigned char kind;
unsigned char flags;
- pdf_document *doc;
+ pdf_document *doc; /* KEEP */
int parent_num;
union
{
@@ -63,10 +63,9 @@ struct pdf_obj_s
};
pdf_obj *
-pdf_new_null(pdf_document *doc)
+pdf_new_null(fz_context *ctx, pdf_document *doc)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(null)");
obj->doc = doc;
obj->refs = 1;
@@ -77,10 +76,9 @@ pdf_new_null(pdf_document *doc)
}
pdf_obj *
-pdf_new_bool(pdf_document *doc, int b)
+pdf_new_bool(fz_context *ctx, pdf_document *doc, int b)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(bool)");
obj->doc = doc;
obj->refs = 1;
@@ -92,10 +90,9 @@ pdf_new_bool(pdf_document *doc, int b)
}
pdf_obj *
-pdf_new_int(pdf_document *doc, int i)
+pdf_new_int(fz_context *ctx, pdf_document *doc, int i)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(int)");
obj->doc = doc;
obj->refs = 1;
@@ -107,10 +104,9 @@ pdf_new_int(pdf_document *doc, int i)
}
pdf_obj *
-pdf_new_real(pdf_document *doc, float f)
+pdf_new_real(fz_context *ctx, pdf_document *doc, float f)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(real)");
obj->doc = doc;
obj->refs = 1;
@@ -122,10 +118,9 @@ pdf_new_real(pdf_document *doc, float f)
}
pdf_obj *
-pdf_new_string(pdf_document *doc, const char *str, int len)
+pdf_new_string(fz_context *ctx, pdf_document *doc, const char *str, int len)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, offsetof(pdf_obj, u.s.buf) + len + 1), "pdf_obj(string)");
obj->doc = doc;
obj->refs = 1;
@@ -139,10 +134,9 @@ pdf_new_string(pdf_document *doc, const char *str, int len)
}
pdf_obj *
-pdf_new_name(pdf_document *doc, const char *str)
+pdf_new_name(fz_context *ctx, pdf_document *doc, const char *str)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, offsetof(pdf_obj, u.n) + strlen(str) + 1), "pdf_obj(name)");
obj->doc = doc;
obj->refs = 1;
@@ -154,10 +148,9 @@ pdf_new_name(pdf_document *doc, const char *str)
}
pdf_obj *
-pdf_new_indirect(pdf_document *doc, int num, int gen)
+pdf_new_indirect(fz_context *ctx, pdf_document *doc, int num, int gen)
{
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(indirect)");
obj->doc = doc;
obj->refs = 1;
@@ -170,81 +163,77 @@ pdf_new_indirect(pdf_document *doc, int num, int gen)
}
pdf_obj *
-pdf_keep_obj(pdf_obj *obj)
+pdf_keep_obj(fz_context *ctx, pdf_obj *obj)
{
if (obj)
obj->refs ++;
return obj;
}
-int pdf_is_indirect(pdf_obj *obj)
+int pdf_is_indirect(fz_context *ctx, pdf_obj *obj)
{
return obj ? obj->kind == PDF_INDIRECT : 0;
}
#define RESOLVE(obj) \
- do { \
- if (obj && obj->kind == PDF_INDIRECT) \
- {\
- obj = pdf_resolve_indirect(obj); \
- } \
- } while (0)
+ if (obj && obj->kind == PDF_INDIRECT) \
+ obj = pdf_resolve_indirect(ctx, obj); \
-int pdf_is_null(pdf_obj *obj)
+int pdf_is_null(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_NULL : 0;
}
-int pdf_is_bool(pdf_obj *obj)
+int pdf_is_bool(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_BOOL : 0;
}
-int pdf_is_int(pdf_obj *obj)
+int pdf_is_int(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_INT : 0;
}
-int pdf_is_real(pdf_obj *obj)
+int pdf_is_real(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_REAL : 0;
}
-int pdf_is_number(pdf_obj *obj)
+int pdf_is_number(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? (obj->kind == PDF_REAL || obj->kind == PDF_INT) : 0;
}
-int pdf_is_string(pdf_obj *obj)
+int pdf_is_string(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_STRING : 0;
}
-int pdf_is_name(pdf_obj *obj)
+int pdf_is_name(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_NAME : 0;
}
-int pdf_is_array(pdf_obj *obj)
+int pdf_is_array(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_ARRAY : 0;
}
-int pdf_is_dict(pdf_obj *obj)
+int pdf_is_dict(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return obj ? obj->kind == PDF_DICT : 0;
}
-int pdf_to_bool(pdf_obj *obj)
+int pdf_to_bool(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -252,7 +241,7 @@ int pdf_to_bool(pdf_obj *obj)
return obj->kind == PDF_BOOL ? obj->u.b : 0;
}
-int pdf_to_int(pdf_obj *obj)
+int pdf_to_int(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -264,7 +253,7 @@ int pdf_to_int(pdf_obj *obj)
return 0;
}
-float pdf_to_real(pdf_obj *obj)
+float pdf_to_real(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -276,7 +265,7 @@ float pdf_to_real(pdf_obj *obj)
return 0;
}
-char *pdf_to_name(pdf_obj *obj)
+char *pdf_to_name(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_NAME)
@@ -284,7 +273,7 @@ char *pdf_to_name(pdf_obj *obj)
return obj->u.n;
}
-char *pdf_to_str_buf(pdf_obj *obj)
+char *pdf_to_str_buf(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_STRING)
@@ -292,7 +281,7 @@ char *pdf_to_str_buf(pdf_obj *obj)
return obj->u.s.buf;
}
-int pdf_to_str_len(pdf_obj *obj)
+int pdf_to_str_len(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_STRING)
@@ -300,7 +289,7 @@ int pdf_to_str_len(pdf_obj *obj)
return obj->u.s.len;
}
-void pdf_set_int(pdf_obj *obj, int i)
+void pdf_set_int(fz_context *ctx, pdf_obj *obj, int i)
{
if (!obj || obj->kind != PDF_INT)
return;
@@ -308,7 +297,7 @@ void pdf_set_int(pdf_obj *obj, int i)
}
/* for use by pdf_crypt_obj_imp to decrypt AES string in place */
-void pdf_set_str_len(pdf_obj *obj, int newlen)
+void pdf_set_str_len(fz_context *ctx, pdf_obj *obj, int newlen)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_STRING)
@@ -318,27 +307,27 @@ void pdf_set_str_len(pdf_obj *obj, int newlen)
obj->u.s.len = newlen;
}
-pdf_obj *pdf_to_dict(pdf_obj *obj)
+pdf_obj *pdf_to_dict(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
return (obj && obj->kind == PDF_DICT ? obj : NULL);
}
-int pdf_to_num(pdf_obj *obj)
+int pdf_to_num(fz_context *ctx, pdf_obj *obj)
{
if (!obj || obj->kind != PDF_INDIRECT)
return 0;
return obj->u.r.num;
}
-int pdf_to_gen(pdf_obj *obj)
+int pdf_to_gen(fz_context *ctx, pdf_obj *obj)
{
if (!obj || obj->kind != PDF_INDIRECT)
return 0;
return obj->u.r.gen;
}
-pdf_document *pdf_get_indirect_document(pdf_obj *obj)
+pdf_document *pdf_get_indirect_document(fz_context *ctx, pdf_obj *obj)
{
if (!obj || obj->kind != PDF_INDIRECT)
return NULL;
@@ -346,7 +335,7 @@ pdf_document *pdf_get_indirect_document(pdf_obj *obj)
}
int
-pdf_objcmp(pdf_obj *a, pdf_obj *b)
+pdf_objcmp(fz_context *ctx, pdf_obj *a, pdf_obj *b)
{
int i;
@@ -404,7 +393,7 @@ pdf_objcmp(pdf_obj *a, pdf_obj *b)
if (a->u.a.len != b->u.a.len)
return a->u.a.len - b->u.a.len;
for (i = 0; i < a->u.a.len; i++)
- if (pdf_objcmp(a->u.a.items[i], b->u.a.items[i]))
+ if (pdf_objcmp(ctx, a->u.a.items[i], b->u.a.items[i]))
return 1;
return 0;
@@ -413,9 +402,9 @@ pdf_objcmp(pdf_obj *a, pdf_obj *b)
return a->u.d.len - b->u.d.len;
for (i = 0; i < a->u.d.len; i++)
{
- if (pdf_objcmp(a->u.d.items[i].k, b->u.d.items[i].k))
+ if (pdf_objcmp(ctx, a->u.d.items[i].k, b->u.d.items[i].k))
return 1;
- if (pdf_objcmp(a->u.d.items[i].v, b->u.d.items[i].v))
+ if (pdf_objcmp(ctx, a->u.d.items[i].v, b->u.d.items[i].v))
return 1;
}
return 0;
@@ -445,11 +434,10 @@ pdf_objkindstr(pdf_obj *obj)
}
pdf_obj *
-pdf_new_array(pdf_document *doc, int initialcap)
+pdf_new_array(fz_context *ctx, pdf_document *doc, int initialcap)
{
pdf_obj *obj;
int i;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(array)");
obj->doc = doc;
@@ -477,12 +465,12 @@ pdf_new_array(pdf_document *doc, int initialcap)
}
static void
-pdf_array_grow(pdf_obj *obj)
+pdf_array_grow(fz_context *ctx, pdf_obj *obj)
{
int i;
int new_cap = (obj->u.a.cap * 3) / 2;
- obj->u.a.items = fz_resize_array(obj->doc->ctx, obj->u.a.items, new_cap, sizeof(pdf_obj*));
+ obj->u.a.items = fz_resize_array(ctx, obj->u.a.items, new_cap, sizeof(pdf_obj*));
obj->u.a.cap = new_cap;
for (i = obj->u.a.len ; i < obj->u.a.cap; i++)
@@ -490,29 +478,32 @@ pdf_array_grow(pdf_obj *obj)
}
pdf_obj *
-pdf_copy_array(pdf_obj *obj)
+pdf_copy_array(fz_context *ctx, pdf_obj *obj)
{
- pdf_obj *arr;
- int i;
- int n;
- fz_context *ctx = obj->doc->ctx;
-
RESOLVE(obj);
- if (!obj)
- return NULL; /* Can't warn :( */
- if (obj->kind != PDF_ARRAY)
- fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
+ if (obj)
+ {
+ pdf_document *doc = obj->doc;
- arr = pdf_new_array(obj->doc, pdf_array_len(obj));
- n = pdf_array_len(obj);
- for (i = 0; i < n; i++)
- pdf_array_push(arr, pdf_array_get(obj, i));
+ pdf_obj *arr;
+ int i;
+ int n;
- return arr;
+ if (obj->kind != PDF_ARRAY)
+ fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
+
+ arr = pdf_new_array(ctx, doc, pdf_array_len(ctx, obj));
+ n = pdf_array_len(ctx, obj);
+ for (i = 0; i < n; i++)
+ pdf_array_push(ctx, arr, pdf_array_get(ctx, obj, i));
+
+ return arr;
+ }
+ return NULL; /* Can't warn :( */
}
int
-pdf_array_len(pdf_obj *obj)
+pdf_array_len(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_ARRAY)
@@ -521,258 +512,252 @@ pdf_array_len(pdf_obj *obj)
}
pdf_obj *
-pdf_array_get(pdf_obj *obj, int i)
+pdf_array_get(fz_context *ctx, pdf_obj *obj, int i)
{
RESOLVE(obj);
-
if (!obj || obj->kind != PDF_ARRAY)
return NULL;
-
if (i < 0 || i >= obj->u.a.len)
return NULL;
-
return obj->u.a.items[i];
}
-static void object_altered(pdf_obj *obj, pdf_obj *val)
+static void object_altered(fz_context *ctx, pdf_obj *obj, pdf_obj *val)
{
+ pdf_document *doc = obj->doc;
+
/*
- parent_num = 0 while an object is being parsed from the file.
- No further action is necessary.
+ parent_num = 0 while an object is being parsed from the file.
+ No further action is necessary.
*/
- if (obj->parent_num == 0 || obj->doc->freeze_updates)
+ if (obj->parent_num == 0 || doc->freeze_updates)
return;
/*
- Otherwise we need to ensure that the containing hierarchy of objects
- has been moved to the incremental xref section and the newly linked
- object needs to record the parent_num
+ Otherwise we need to ensure that the containing hierarchy of objects
+ has been moved to the incremental xref section and the newly linked
+ object needs to record the parent_num
*/
- pdf_xref_ensure_incremental_object(obj->doc, obj->parent_num);
- pdf_set_obj_parent(val, obj->parent_num);
+ pdf_xref_ensure_incremental_object(ctx, doc, obj->parent_num);
+ pdf_set_obj_parent(ctx, val, obj->parent_num);
}
void
-pdf_array_put(pdf_obj *obj, int i, pdf_obj *item)
+pdf_array_put(fz_context *ctx, pdf_obj *obj, int i, pdf_obj *item)
{
RESOLVE(obj);
-
- if (!obj)
- return; /* Can't warn :( */
- if (obj->kind != PDF_ARRAY)
- fz_warn(obj->doc->ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
- else if (i < 0)
- fz_warn(obj->doc->ctx, "assert: index %d < 0", i);
- else if (i >= obj->u.a.len)
- fz_warn(obj->doc->ctx, "assert: index %d > length %d", i, obj->u.a.len);
- else
+ if (obj)
{
- pdf_drop_obj(obj->u.a.items[i]);
- obj->u.a.items[i] = pdf_keep_obj(item);
- }
+ if (obj->kind != PDF_ARRAY)
+ fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
+ else if (i < 0)
+ fz_warn(ctx, "assert: index %d < 0", i);
+ else if (i >= obj->u.a.len)
+ fz_warn(ctx, "assert: index %d > length %d", i, obj->u.a.len);
+ else
+ {
+ pdf_drop_obj(ctx, obj->u.a.items[i]);
+ obj->u.a.items[i] = pdf_keep_obj(ctx, item);
+ }
- object_altered(obj, item);
+ object_altered(ctx, obj, item);
+ }
+ return; /* Can't warn :( */
}
void
-pdf_array_push(pdf_obj *obj, pdf_obj *item)
+pdf_array_push(fz_context *ctx, pdf_obj *obj, pdf_obj *item)
{
RESOLVE(obj);
-
- if (!obj)
- return; /* Can't warn :( */
- if (obj->kind != PDF_ARRAY)
- fz_warn(obj->doc->ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
- else
+ if (obj)
{
- if (obj->u.a.len + 1 > obj->u.a.cap)
- pdf_array_grow(obj);
- obj->u.a.items[obj->u.a.len] = pdf_keep_obj(item);
- obj->u.a.len++;
- }
+ if (obj->kind != PDF_ARRAY)
+ fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
+ else
+ {
+ if (obj->u.a.len + 1 > obj->u.a.cap)
+ pdf_array_grow(ctx, obj);
+ obj->u.a.items[obj->u.a.len] = pdf_keep_obj(ctx, item);
+ obj->u.a.len++;
+ }
- object_altered(obj, item);
+ object_altered(ctx, obj, item);
+ }
+ return; /* Can't warn :( */
}
void
-pdf_array_push_drop(pdf_obj *obj, pdf_obj *item)
+pdf_array_push_drop(fz_context *ctx, pdf_obj *obj, pdf_obj *item)
{
- fz_context *ctx = obj->doc->ctx;
-
- fz_try(ctx)
- {
- pdf_array_push(obj, item);
- }
- fz_always(ctx)
- {
- pdf_drop_obj(item);
- }
- fz_catch(ctx)
+ RESOLVE(obj);
+ if (obj)
{
- fz_rethrow(ctx);
+ fz_try(ctx)
+ pdf_array_push(ctx, obj, item);
+ fz_always(ctx)
+ pdf_drop_obj(ctx, item);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
}
}
void
-pdf_array_insert(pdf_obj *obj, pdf_obj *item, int i)
+pdf_array_insert(fz_context *ctx, pdf_obj *obj, pdf_obj *item, int i)
{
RESOLVE(obj);
-
- if (!obj)
- return; /* Can't warn :( */
- if (obj->kind != PDF_ARRAY)
- fz_warn(obj->doc->ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
- else
+ if (obj)
{
- if (i < 0 || i > obj->u.a.len)
- fz_throw(obj->doc->ctx, FZ_ERROR_GENERIC, "attempt to insert object %d in array of length %d", i, obj->u.a.len);
- if (obj->u.a.len + 1 > obj->u.a.cap)
- pdf_array_grow(obj);
- memmove(obj->u.a.items + i + 1, obj->u.a.items + i, (obj->u.a.len - i) * sizeof(pdf_obj*));
- obj->u.a.items[i] = pdf_keep_obj(item);
- obj->u.a.len++;
- }
+ if (obj->kind != PDF_ARRAY)
+ fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
+ else
+ {
+ if (i < 0 || i > obj->u.a.len)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "attempt to insert object %d in array of length %d", i, obj->u.a.len);
+ if (obj->u.a.len + 1 > obj->u.a.cap)
+ pdf_array_grow(ctx, obj);
+ memmove(obj->u.a.items + i + 1, obj->u.a.items + i, (obj->u.a.len - i) * sizeof(pdf_obj*));
+ obj->u.a.items[i] = pdf_keep_obj(ctx, item);
+ obj->u.a.len++;
+ }
- object_altered(obj, item);
+ object_altered(ctx, obj, item);
+ }
+ return; /* Can't warn :( */
}
void
-pdf_array_insert_drop(pdf_obj *obj, pdf_obj *item, int i)
+pdf_array_insert_drop(fz_context *ctx, pdf_obj *obj, pdf_obj *item, int i)
{
- fz_context *ctx = obj->doc->ctx;
- fz_try(ctx)
- {
- pdf_array_insert(obj, item, i);
- }
- fz_always(ctx)
+ RESOLVE(obj);
+ if (obj)
{
- pdf_drop_obj(item);
- }
- fz_catch(ctx)
- {
- fz_rethrow(ctx);
+ fz_try(ctx)
+ pdf_array_insert(ctx, obj, item, i);
+ fz_always(ctx)
+ pdf_drop_obj(ctx, item);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
}
}
void
-pdf_array_delete(pdf_obj *obj, int i)
+pdf_array_delete(fz_context *ctx, pdf_obj *obj, int i)
{
RESOLVE(obj);
-
- if (!obj)
- return; /* Can't warn :( */
- if (obj->kind != PDF_ARRAY)
- fz_warn(obj->doc->ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
- else
+ if (obj)
{
- pdf_drop_obj(obj->u.a.items[i]);
- obj->u.a.items[i] = 0;
- obj->u.a.len--;
- memmove(obj->u.a.items + i, obj->u.a.items + i + 1, (obj->u.a.len - i) * sizeof(pdf_obj*));
+ if (obj->kind != PDF_ARRAY)
+ fz_warn(ctx, "assert: not an array (%s)", pdf_objkindstr(obj));
+ else
+ {
+ pdf_drop_obj(ctx, obj->u.a.items[i]);
+ obj->u.a.items[i] = 0;
+ obj->u.a.len--;
+ memmove(obj->u.a.items + i, obj->u.a.items + i + 1, (obj->u.a.len - i) * sizeof(pdf_obj*));
+ }
}
+ return; /* Can't warn :( */
}
int
-pdf_array_contains(pdf_obj *arr, pdf_obj *obj)
+pdf_array_contains(fz_context *ctx, pdf_obj *arr, pdf_obj *obj)
{
int i, len;
- len = pdf_array_len(arr);
+ len = pdf_array_len(ctx, arr);
for (i = 0; i < len; i++)
- if (!pdf_objcmp(pdf_array_get(arr, i), obj))
+ if (!pdf_objcmp(ctx, pdf_array_get(ctx, arr, i), obj))
return 1;
return 0;
}
-pdf_obj *pdf_new_rect(pdf_document *doc, const fz_rect *rect)
+pdf_obj *pdf_new_rect(fz_context *ctx, pdf_document *doc, const fz_rect *rect)
{
pdf_obj *arr = NULL;
pdf_obj *item = NULL;
- fz_context *ctx = doc->ctx;
fz_var(arr);
fz_var(item);
fz_try(ctx)
{
- arr = pdf_new_array(doc, 4);
+ arr = pdf_new_array(ctx, doc, 4);
- item = pdf_new_real(doc, rect->x0);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, rect->x0);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, rect->y0);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, rect->y0);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, rect->x1);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, rect->x1);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, rect->y1);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, rect->y1);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
}
fz_catch(ctx)
{
- pdf_drop_obj(item);
- pdf_drop_obj(arr);
+ pdf_drop_obj(ctx, item);
+ pdf_drop_obj(ctx, arr);
fz_rethrow(ctx);
}
return arr;
}
-pdf_obj *pdf_new_matrix(pdf_document *doc, const fz_matrix *mtx)
+pdf_obj *pdf_new_matrix(fz_context *ctx, pdf_document *doc, const fz_matrix *mtx)
{
pdf_obj *arr = NULL;
pdf_obj *item = NULL;
- fz_context *ctx = doc->ctx;
fz_var(arr);
fz_var(item);
fz_try(ctx)
{
- arr = pdf_new_array(doc, 6);
+ arr = pdf_new_array(ctx, doc, 6);
- item = pdf_new_real(doc, mtx->a);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, mtx->a);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, mtx->b);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, mtx->b);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, mtx->c);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, mtx->c);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, mtx->d);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, mtx->d);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, mtx->e);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, mtx->e);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
- item = pdf_new_real(doc, mtx->f);
- pdf_array_push(arr, item);
- pdf_drop_obj(item);
+ item = pdf_new_real(ctx, doc, mtx->f);
+ pdf_array_push(ctx, arr, item);
+ pdf_drop_obj(ctx, item);
item = NULL;
}
fz_catch(ctx)
{
- pdf_drop_obj(item);
- pdf_drop_obj(arr);
+ pdf_drop_obj(ctx, item);
+ pdf_drop_obj(ctx, arr);
fz_rethrow(ctx);
}
@@ -785,15 +770,16 @@ static int keyvalcmp(const void *ap, const void *bp)
{
const struct keyval *a = ap;
const struct keyval *b = bp;
- return strcmp(pdf_to_name(a->k), pdf_to_name(b->k));
+ if (a->k->kind == PDF_NAME && b->k->kind == PDF_NAME)
+ return strcmp(a->k->u.n, b->k->u.n);
+ return 0;
}
pdf_obj *
-pdf_new_dict(pdf_document *doc, int initialcap)
+pdf_new_dict(fz_context *ctx, pdf_document *doc, int initialcap)
{
pdf_obj *obj;
int i;
- fz_context *ctx = doc->ctx;
obj = Memento_label(fz_malloc(ctx, sizeof(pdf_obj)), "pdf_obj(dict)");
obj->doc = doc;
@@ -824,12 +810,12 @@ pdf_new_dict(pdf_document *doc, int initialcap)
}
static void
-pdf_dict_grow(pdf_obj *obj)
+pdf_dict_grow(fz_context *ctx, pdf_obj *obj)
{
int i;
int new_cap = (obj->u.d.cap * 3) / 2;
- obj->u.d.items = fz_resize_array(obj->doc->ctx, obj->u.d.items, new_cap, sizeof(struct keyval));
+ obj->u.d.items = fz_resize_array(ctx, obj->u.d.items, new_cap, sizeof(struct keyval));
obj->u.d.cap = new_cap;
for (i = obj->u.d.len; i < obj->u.d.cap; i++)
@@ -840,29 +826,31 @@ pdf_dict_grow(pdf_obj *obj)
}
pdf_obj *
-pdf_copy_dict(pdf_obj *obj)
+pdf_copy_dict(fz_context *ctx, pdf_obj *obj)
{
pdf_obj *dict;
int i, n;
- pdf_document *doc;
RESOLVE(obj);
- if (!obj)
- return NULL; /* Can't warn :( */
- doc = obj->doc;
- if (obj->kind != PDF_DICT)
- fz_warn(doc->ctx, "assert: not a dict (%s)", pdf_objkindstr(obj));
+ if (obj)
+ {
+ pdf_document *doc = obj->doc;
- n = pdf_dict_len(obj);
- dict = pdf_new_dict(doc, n);
- for (i = 0; i < n; i++)
- pdf_dict_put(dict, pdf_dict_get_key(obj, i), pdf_dict_get_val(obj, i));
+ if (obj->kind != PDF_DICT)
+ fz_warn(ctx, "assert: not a dict (%s)", pdf_objkindstr(obj));
+
+ n = pdf_dict_len(ctx, obj);
+ dict = pdf_new_dict(ctx, doc, n);
+ for (i = 0; i < n; i++)
+ pdf_dict_put(ctx, dict, pdf_dict_get_key(ctx, obj, i), pdf_dict_get_val(ctx, obj, i));
- return dict;
+ return dict;
+ }
+ return NULL; /* Can't warn :( */
}
int
-pdf_dict_len(pdf_obj *obj)
+pdf_dict_len(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_DICT)
@@ -871,40 +859,36 @@ pdf_dict_len(pdf_obj *obj)
}
pdf_obj *
-pdf_dict_get_key(pdf_obj *obj, int i)
+pdf_dict_get_key(fz_context *ctx, pdf_obj *obj, int i)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_DICT)
return NULL;
-
if (i < 0 || i >= obj->u.d.len)
return NULL;
-
return obj->u.d.items[i].k;
}
pdf_obj *
-pdf_dict_get_val(pdf_obj *obj, int i)
+pdf_dict_get_val(fz_context *ctx, pdf_obj *obj, int i)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_DICT)
return NULL;
-
if (i < 0 || i >= obj->u.d.len)
return NULL;
-
return obj->u.d.items[i].v;
}
static int
-pdf_dict_finds(pdf_obj *obj, const char *key, int *location)
+pdf_dict_finds(fz_context *ctx, pdf_obj *obj, const char *key, int *location)
{
if ((obj->flags & PDF_FLAGS_SORTED) && obj->u.d.len > 0)
{
int l = 0;
int r = obj->u.d.len - 1;
- if (strcmp(pdf_to_name(obj->u.d.items[r].k), key) < 0)
+ if (strcmp(pdf_to_name(ctx, obj->u.d.items[r].k), key) < 0)
{
if (location)
*location = r + 1;
@@ -914,7 +898,7 @@ pdf_dict_finds(pdf_obj *obj, const char *key, int *location)
while (l <= r)
{
int m = (l + r) >> 1;
- int c = -strcmp(pdf_to_name(obj->u.d.items[m].k), key);
+ int c = -strcmp(pdf_to_name(ctx, obj->u.d.items[m].k), key);
if (c < 0)
r = m - 1;
else if (c > 0)
@@ -931,7 +915,7 @@ pdf_dict_finds(pdf_obj *obj, const char *key, int *location)
{
int i;
for (i = 0; i < obj->u.d.len; i++)
- if (strcmp(pdf_to_name(obj->u.d.items[i].k), key) == 0)
+ if (strcmp(pdf_to_name(ctx, obj->u.d.items[i].k), key) == 0)
return i;
if (location)
@@ -942,7 +926,7 @@ pdf_dict_finds(pdf_obj *obj, const char *key, int *location)
}
pdf_obj *
-pdf_dict_gets(pdf_obj *obj, const char *key)
+pdf_dict_gets(fz_context *ctx, pdf_obj *obj, const char *key)
{
int i;
@@ -950,7 +934,7 @@ pdf_dict_gets(pdf_obj *obj, const char *key)
if (!obj || obj->kind != PDF_DICT)
return NULL;
- i = pdf_dict_finds(obj, key, NULL);
+ i = pdf_dict_finds(ctx, obj, key, NULL);
if (i >= 0)
return obj->u.d.items[i].v;
@@ -958,155 +942,154 @@ pdf_dict_gets(pdf_obj *obj, const char *key)
}
pdf_obj *
-pdf_dict_getp(pdf_obj *obj, const char *keys)
+pdf_dict_getp(fz_context *ctx, pdf_obj *obj, const char *keys)
{
- char buf[256];
- char *k, *e;
-
- if (strlen(keys)+1 > 256)
- fz_throw(obj->doc->ctx, FZ_ERROR_GENERIC, "buffer overflow in pdf_dict_getp");
+ RESOLVE(obj);
+ if (obj)
+ {
+ char buf[256];
+ char *k, *e;
- strcpy(buf, keys);
+ if (strlen(keys)+1 > 256)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "buffer overflow in pdf_dict_getp");
- e = buf;
- while (*e && obj)
- {
- k = e;
- while (*e != '/' && *e != '\0')
- e++;
+ strcpy(buf, keys);
- if (*e == '/')
+ e = buf;
+ while (*e && obj)
{
- *e = '\0';
- e++;
+ k = e;
+ while (*e != '/' && *e != '\0')
+ e++;
+
+ if (*e == '/')
+ {
+ *e = '\0';
+ e++;
+ }
+
+ obj = pdf_dict_gets(ctx, obj, k);
}
- obj = pdf_dict_gets(obj, k);
+ return obj;
}
-
- return obj;
+ return NULL; /* Can't warn */
}
pdf_obj *
-pdf_dict_get(pdf_obj *obj, pdf_obj *key)
+pdf_dict_get(fz_context *ctx, pdf_obj *obj, pdf_obj *key)
{
if (!key || key->kind != PDF_NAME)
return NULL;
- return pdf_dict_gets(obj, pdf_to_name(key));
+ return pdf_dict_gets(ctx, obj, pdf_to_name(ctx, key));
}
pdf_obj *
-pdf_dict_getsa(pdf_obj *obj, const char *key, const char *abbrev)
+pdf_dict_getsa(fz_context *ctx, pdf_obj *obj, const char *key, const char *abbrev)
{
pdf_obj *v;
- v = pdf_dict_gets(obj, key);
+ v = pdf_dict_gets(ctx, obj, key);
if (v)
return v;
- return pdf_dict_gets(obj, abbrev);
+ return pdf_dict_gets(ctx, obj, abbrev);
}
void
-pdf_dict_put(pdf_obj *obj, pdf_obj *key, pdf_obj *val)
+pdf_dict_put(fz_context *ctx, pdf_obj *obj, pdf_obj *key, pdf_obj *val)
{
- int location;
- char *s;
- int i;
-
RESOLVE(obj);
- if (!obj)
- return; /* Can't warn :( */
- if (obj->kind != PDF_DICT)
+ if (obj)
{
- fz_warn(obj->doc->ctx, "assert: not a dict (%s)", pdf_objkindstr(obj));
- return;
- }
+ int location;
+ char *s;
+ int i;
- RESOLVE(key);
- if (!key || key->kind != PDF_NAME)
- {
- fz_warn(obj->doc->ctx, "assert: key is not a name (%s)", pdf_objkindstr(obj));
- return;
- }
- else
- s = pdf_to_name(key);
+ if (obj->kind != PDF_DICT)
+ {
+ fz_warn(ctx, "assert: not a dict (%s)", pdf_objkindstr(obj));
+ return;
+ }
- if (!val)
- {
- fz_warn(obj->doc->ctx, "assert: val does not exist for key (%s)", s);
- return;
- }
+ RESOLVE(key);
+ if (!key || key->kind != PDF_NAME)
+ {
+ fz_warn(ctx, "assert: key is not a name (%s)", pdf_objkindstr(obj));
+ return;
+ }
+ else
+ s = pdf_to_name(ctx, key);
+
+ if (!val)
+ {
+ fz_warn(ctx, "assert: val does not exist for key (%s)", s);
+ return;
+ }
- if (obj->u.d.len > 100 && !(obj->flags & PDF_FLAGS_SORTED))
- pdf_sort_dict(obj);
+ if (obj->u.d.len > 100 && !(obj->flags & PDF_FLAGS_SORTED))
+ pdf_sort_dict(ctx, obj);
- i = pdf_dict_finds(obj, s, &location);
- if (i >= 0 && i < obj->u.d.len)
- {
- if (obj->u.d.items[i].v != val)
+ i = pdf_dict_finds(ctx, obj, s, &location);
+ if (i >= 0 && i < obj->u.d.len)
{
- pdf_obj *d = obj->u.d.items[i].v;
- obj->u.d.items[i].v = pdf_keep_obj(val);
- pdf_drop_obj(d);
+ if (obj->u.d.items[i].v != val)
+ {
+ pdf_obj *d = obj->u.d.items[i].v;
+ obj->u.d.items[i].v = pdf_keep_obj(ctx, val);
+ pdf_drop_obj(ctx, d);
+ }
+ }
+ else
+ {
+ if (obj->u.d.len + 1 > obj->u.d.cap)
+ pdf_dict_grow(ctx, obj);
+
+ i = location;
+ if ((obj->flags & PDF_FLAGS_SORTED) && obj->u.d.len > 0)
+ memmove(&obj->u.d.items[i + 1],
+ &obj->u.d.items[i],
+ (obj->u.d.len - i) * sizeof(struct keyval));
+
+ obj->u.d.items[i].k = pdf_keep_obj(ctx, key);
+ obj->u.d.items[i].v = pdf_keep_obj(ctx, val);
+ obj->u.d.len ++;
}
- }
- else
- {
- if (obj->u.d.len + 1 > obj->u.d.cap)
- pdf_dict_grow(obj);
-
- i = location;
- if ((obj->flags & PDF_FLAGS_SORTED) && obj->u.d.len > 0)
- memmove(&obj->u.d.items[i + 1],
- &obj->u.d.items[i],
- (obj->u.d.len - i) * sizeof(struct keyval));
-
- obj->u.d.items[i].k = pdf_keep_obj(key);
- obj->u.d.items[i].v = pdf_keep_obj(val);
- obj->u.d.len ++;
- }
- object_altered(obj, val);
+ object_altered(ctx, obj, val);
+ }
+ return; /* Can't warn :( */
}
void
-pdf_dict_puts(pdf_obj *obj, const char *key, pdf_obj *val)
+pdf_dict_puts(fz_context *ctx, pdf_obj *obj, const char *key, pdf_obj *val)
{
pdf_document *doc = obj->doc;
- fz_context *ctx = doc->ctx;
- pdf_obj *keyobj = pdf_new_name(doc, key);
+ pdf_obj *keyobj = pdf_new_name(ctx, doc, key);
fz_try(ctx)
- {
- pdf_dict_put(obj, keyobj, val);
- }
+ pdf_dict_put(ctx, obj, keyobj, val);
fz_always(ctx)
- {
- pdf_drop_obj(keyobj);
- }
+ pdf_drop_obj(ctx, keyobj);
fz_catch(ctx)
- {
fz_rethrow(ctx);
- }
}
void
-pdf_dict_puts_drop(pdf_obj *obj, const char *key, pdf_obj *val)
+pdf_dict_puts_drop(fz_context *ctx, pdf_obj *obj, const char *key, pdf_obj *val)
{
pdf_document *doc = obj->doc;
- fz_context *ctx = doc->ctx;
pdf_obj *keyobj = NULL;
fz_var(keyobj);
fz_try(ctx)
{
- keyobj = pdf_new_name(doc, key);
- pdf_dict_put(obj, keyobj, val);
+ keyobj = pdf_new_name(ctx, doc, key);
+ pdf_dict_put(ctx, obj, keyobj, val);
}
fz_always(ctx)
{
- pdf_drop_obj(keyobj);
- pdf_drop_obj(val);
+ pdf_drop_obj(ctx, keyobj);
+ pdf_drop_obj(ctx, val);
}
fz_catch(ctx)
{
@@ -1115,122 +1098,113 @@ pdf_dict_puts_drop(pdf_obj *obj, const char *key, pdf_obj *val)
}
void
-pdf_dict_putp(pdf_obj *obj, const char *keys, pdf_obj *val)
+pdf_dict_putp(fz_context *ctx, pdf_obj *obj, const char *keys, pdf_obj *val)
{
- fz_context *ctx = obj->doc->ctx;
- char buf[256];
- char *k, *e;
- pdf_obj *cobj = NULL;
+ RESOLVE(obj);
+ if (obj)
+ {
+ pdf_document *doc = obj->doc;
- if (strlen(keys)+1 > 256)
- fz_throw(ctx, FZ_ERROR_GENERIC, "buffer overflow in pdf_dict_putp");
+ char buf[256];
+ char *k, *e;
+ pdf_obj *cobj = NULL;
- strcpy(buf, keys);
+ if (strlen(keys)+1 > 256)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "buffer overflow in pdf_dict_putp");
- e = buf;
- while (*e)
- {
- k = e;
- while (*e != '/' && *e != '\0')
- e++;
+ strcpy(buf, keys);
- if (*e == '/')
+ e = buf;
+ while (*e)
{
- *e = '\0';
- e++;
- }
+ k = e;
+ while (*e != '/' && *e != '\0')
+ e++;
- if (*e)
- {
- /* Not the last key in the key path. Create subdict if not already there. */
- cobj = pdf_dict_gets(obj, k);
- if (cobj == NULL)
+ if (*e == '/')
{
- cobj = pdf_new_dict(obj->doc, 1);
- fz_try(ctx)
- {
- pdf_dict_puts(obj, k, cobj);
- }
- fz_always(ctx)
- {
- pdf_drop_obj(cobj);
- }
- fz_catch(ctx)
+ *e = '\0';
+ e++;
+ }
+
+ if (*e)
+ {
+ /* Not the last key in the key path. Create subdict if not already there. */
+ cobj = pdf_dict_gets(ctx, obj, k);
+ if (cobj == NULL)
{
- fz_rethrow(ctx);
+ cobj = pdf_new_dict(ctx, doc, 1);
+ fz_try(ctx)
+ pdf_dict_puts(ctx, obj, k, cobj);
+ fz_always(ctx)
+ pdf_drop_obj(ctx, cobj);
+ fz_catch(ctx)
+ fz_rethrow(ctx);
}
+ /* Move to subdict */
+ obj = cobj;
}
- /* Move to subdict */
- obj = cobj;
- }
- else
- {
- /* Last key. Use it to store the value */
- /* Use val = NULL to request delete */
- if (val)
- pdf_dict_puts(obj, k, val);
else
- pdf_dict_dels(obj, k);
+ {
+ /* Last key. Use it to store the value */
+ /* Use val = NULL to request delete */
+ if (val)
+ pdf_dict_puts(ctx, obj, k, val);
+ else
+ pdf_dict_dels(ctx, obj, k);
+ }
}
}
}
void
-pdf_dict_putp_drop(pdf_obj *obj, const char *keys, pdf_obj *val)
+pdf_dict_putp_drop(fz_context *ctx, pdf_obj *obj, const char *keys, pdf_obj *val)
{
- fz_context *ctx = obj->doc->ctx;
-
fz_try(ctx)
- {
- pdf_dict_putp(obj, keys, val);
- }
+ pdf_dict_putp(ctx, obj, keys, val);
fz_always(ctx)
- {
- pdf_drop_obj(val);
- }
+ pdf_drop_obj(ctx, val);
fz_catch(ctx)
- {
fz_rethrow(ctx);
- }
}
void
-pdf_dict_dels(pdf_obj *obj, const char *key)
+pdf_dict_dels(fz_context *ctx, pdf_obj *obj, const char *key)
{
RESOLVE(obj);
-
- if (!obj)
- return; /* Can't warn :( */
- if (obj->kind != PDF_DICT)
- fz_warn(obj->doc->ctx, "assert: not a dict (%s)", pdf_objkindstr(obj));
- else
+ if (obj)
{
- int i = pdf_dict_finds(obj, key, NULL);
- if (i >= 0)
+ if (obj->kind != PDF_DICT)
+ fz_warn(ctx, "assert: not a dict (%s)", pdf_objkindstr(obj));
+ else
{
- pdf_drop_obj(obj->u.d.items[i].k);
- pdf_drop_obj(obj->u.d.items[i].v);
- obj->flags &= ~PDF_FLAGS_SORTED;
- obj->u.d.items[i] = obj->u.d.items[obj->u.d.len-1];
- obj->u.d.len --;
+ int i = pdf_dict_finds(ctx, obj, key, NULL);
+ if (i >= 0)
+ {
+ pdf_drop_obj(ctx, obj->u.d.items[i].k);
+ pdf_drop_obj(ctx, obj->u.d.items[i].v);
+ obj->flags &= ~PDF_FLAGS_SORTED;
+ obj->u.d.items[i] = obj->u.d.items[obj->u.d.len-1];
+ obj->u.d.len --;
+ }
}
- }
- object_altered(obj, NULL);
+ object_altered(ctx, obj, NULL);
+ }
+ return; /* Can't warn :( */
}
void
-pdf_dict_del(pdf_obj *obj, pdf_obj *key)
+pdf_dict_del(fz_context *ctx, pdf_obj *obj, pdf_obj *key)
{
RESOLVE(key);
- if (!key || key->kind != PDF_NAME)
- fz_warn(obj->doc->ctx, "assert: key is not a name (%s)", pdf_objkindstr(obj));
- else
- pdf_dict_dels(obj, key->u.n);
+ if (key && key->kind == PDF_NAME)
+ pdf_dict_dels(ctx, obj, key->u.n);
+ /* else Can't warn */
}
void
-pdf_sort_dict(pdf_obj *obj)
+pdf_sort_dict(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj || obj->kind != PDF_DICT)
@@ -1243,7 +1217,7 @@ pdf_sort_dict(pdf_obj *obj)
}
int
-pdf_obj_marked(pdf_obj *obj)
+pdf_obj_marked(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -1252,7 +1226,7 @@ pdf_obj_marked(pdf_obj *obj)
}
int
-pdf_mark_obj(pdf_obj *obj)
+pdf_mark_obj(fz_context *ctx, pdf_obj *obj)
{
int marked;
RESOLVE(obj);
@@ -1264,7 +1238,7 @@ pdf_mark_obj(pdf_obj *obj)
}
void
-pdf_unmark_obj(pdf_obj *obj)
+pdf_unmark_obj(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -1273,7 +1247,7 @@ pdf_unmark_obj(pdf_obj *obj)
}
void
-pdf_set_obj_memo(pdf_obj *obj, int memo)
+pdf_set_obj_memo(fz_context *ctx, pdf_obj *obj, int memo)
{
obj->flags |= PDF_FLAGS_MEMO;
if (memo)
@@ -1283,7 +1257,7 @@ pdf_set_obj_memo(pdf_obj *obj, int memo)
}
int
-pdf_obj_memo(pdf_obj *obj, int *memo)
+pdf_obj_memo(fz_context *ctx, pdf_obj *obj, int *memo)
{
if (!(obj->flags & PDF_FLAGS_MEMO))
return 0;
@@ -1291,7 +1265,7 @@ pdf_obj_memo(pdf_obj *obj, int *memo)
return 1;
}
-int pdf_obj_is_dirty(pdf_obj *obj)
+int pdf_obj_is_dirty(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -1299,7 +1273,7 @@ int pdf_obj_is_dirty(pdf_obj *obj)
return !!(obj->flags & PDF_FLAGS_DIRTY);
}
-void pdf_dirty_obj(pdf_obj *obj)
+void pdf_dirty_obj(fz_context *ctx, pdf_obj *obj)
{
RESOLVE(obj);
if (!obj)
@@ -1307,7 +1281,7 @@ void pdf_dirty_obj(pdf_obj *obj)
obj->flags |= PDF_FLAGS_DIRTY;
}
-void pdf_clean_obj(pdf_obj *obj)
+void pdf_clean_obj(fz_context *ctx, pdf_obj *obj)
{
if (!obj)
return;
@@ -1315,27 +1289,25 @@ void pdf_clean_obj(pdf_obj *obj)
}
static void
-pdf_free_array(pdf_obj *obj)
+pdf_drop_array(fz_context *ctx, pdf_obj *obj)
{
- fz_context *ctx = obj->doc->ctx;
int i;
for (i = 0; i < obj->u.a.len; i++)
- pdf_drop_obj(obj->u.a.items[i]);
+ pdf_drop_obj(ctx, obj->u.a.items[i]);
fz_free(ctx, obj->u.a.items);
fz_free(ctx, obj);
}
static void
-pdf_free_dict(pdf_obj *obj)
+pdf_drop_dict(fz_context *ctx, pdf_obj *obj)
{
int i;
- fz_context *ctx = obj->doc->ctx;
for (i = 0; i < obj->u.d.len; i++) {
- pdf_drop_obj(obj->u.d.items[i].k);
- pdf_drop_obj(obj->u.d.items[i].v);
+ pdf_drop_obj(ctx, obj->u.d.items[i].k);
+ pdf_drop_obj(ctx, obj->u.d.items[i].v);
}
fz_free(ctx, obj->u.d.items);
@@ -1343,22 +1315,23 @@ pdf_free_dict(pdf_obj *obj)
}
void
-pdf_drop_obj(pdf_obj *obj)
+pdf_drop_obj(fz_context *ctx, pdf_obj *obj)
{
- if (!obj)
- return;
- if (--obj->refs)
- return;
- if (obj->kind == PDF_ARRAY)
- pdf_free_array(obj);
- else if (obj->kind == PDF_DICT)
- pdf_free_dict(obj);
- else
- fz_free(obj->doc->ctx, obj);
+ if (obj)
+ {
+ if (--obj->refs)
+ return;
+ if (obj->kind == PDF_ARRAY)
+ pdf_drop_array(ctx, obj);
+ else if (obj->kind == PDF_DICT)
+ pdf_drop_dict(ctx, obj);
+ else
+ fz_free(ctx, obj);
+ }
}
void
-pdf_set_obj_parent(pdf_obj *obj, int num)
+pdf_set_obj_parent(fz_context *ctx, pdf_obj *obj, int num)
{
int n, i;
@@ -1370,39 +1343,38 @@ pdf_set_obj_parent(pdf_obj *obj, int num)
switch(obj->kind)
{
case PDF_ARRAY:
- n = pdf_array_len(obj);
+ n = pdf_array_len(ctx, obj);
for (i = 0; i < n; i++)
- pdf_set_obj_parent(pdf_array_get(obj, i), num);
+ pdf_set_obj_parent(ctx, pdf_array_get(ctx, obj, i), num);
break;
case PDF_DICT:
- n = pdf_dict_len(obj);
+ n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
- pdf_set_obj_parent(pdf_dict_get_val(obj, i), num);
+ pdf_set_obj_parent(ctx, pdf_dict_get_val(ctx, obj, i), num);
break;
}
}
-int pdf_obj_parent_num(pdf_obj *obj)
+int pdf_obj_parent_num(fz_context *ctx, pdf_obj *obj)
{
return obj->parent_num;
}
-pdf_obj *pdf_new_obj_from_str(pdf_document *doc, const char *src)
+pdf_obj *pdf_new_obj_from_str(fz_context *ctx, pdf_document *doc, const char *src)
{
pdf_obj *result;
pdf_lexbuf lexbuf;
- fz_context *ctx = doc->ctx;
fz_stream *stream = fz_open_memory(ctx, (unsigned char *)src, strlen(src));
pdf_lexbuf_init(ctx, &lexbuf, PDF_LEXBUF_SMALL);
fz_try(ctx)
{
- result = pdf_parse_stm_obj(doc, stream, &lexbuf);
+ result = pdf_parse_stm_obj(ctx, doc, stream, &lexbuf);
}
fz_always(ctx)
{
- pdf_lexbuf_fin(&lexbuf);
- fz_close(stream);
+ pdf_lexbuf_fin(ctx, &lexbuf);
+ fz_drop_stream(ctx, stream);
}
fz_catch(ctx)
{
@@ -1426,7 +1398,7 @@ struct fmt
int last;
};
-static void fmt_obj(struct fmt *fmt, pdf_obj *obj);
+static void fmt_obj(fz_context *ctx, struct fmt *fmt, pdf_obj *obj);
static inline int iswhite(int ch)
{
@@ -1450,11 +1422,11 @@ static inline int isdelim(int ch)
ch == '%';
}
-static inline void fmt_putc(struct fmt *fmt, int c)
+static inline void fmt_putc(fz_context *ctx, struct fmt *fmt, int c)
{
if (fmt->sep && !isdelim(fmt->last) && !isdelim(c)) {
fmt->sep = 0;
- fmt_putc(fmt, ' ');
+ fmt_putc(ctx, fmt, ' ');
}
fmt->sep = 0;
@@ -1471,201 +1443,201 @@ static inline void fmt_putc(struct fmt *fmt, int c)
fmt->last = c;
}
-static inline void fmt_indent(struct fmt *fmt)
+static inline void fmt_indent(fz_context *ctx, struct fmt *fmt)
{
int i = fmt->indent;
while (i--) {
- fmt_putc(fmt, ' ');
- fmt_putc(fmt, ' ');
+ fmt_putc(ctx, fmt, ' ');
+ fmt_putc(ctx, fmt, ' ');
}
}
-static inline void fmt_puts(struct fmt *fmt, char *s)
+static inline void fmt_puts(fz_context *ctx, struct fmt *fmt, char *s)
{
while (*s)
- fmt_putc(fmt, *s++);
+ fmt_putc(ctx, fmt, *s++);
}
-static inline void fmt_sep(struct fmt *fmt)
+static inline void fmt_sep(fz_context *ctx, struct fmt *fmt)
{
fmt->sep = 1;
}
-static void fmt_str(struct fmt *fmt, pdf_obj *obj)
+static void fmt_str(fz_context *ctx, struct fmt *fmt, pdf_obj *obj)
{
- char *s = pdf_to_str_buf(obj);
- int n = pdf_to_str_len(obj);
+ char *s = pdf_to_str_buf(ctx, obj);
+ int n = pdf_to_str_len(ctx, obj);
int i, c;
- fmt_putc(fmt, '(');
+ fmt_putc(ctx, fmt, '(');
for (i = 0; i < n; i++)
{
c = (unsigned char)s[i];
if (c == '\n')
- fmt_puts(fmt, "\\n");
+ fmt_puts(ctx, fmt, "\\n");
else if (c == '\r')
- fmt_puts(fmt, "\\r");
+ fmt_puts(ctx, fmt, "\\r");
else if (c == '\t')
- fmt_puts(fmt, "\\t");
+ fmt_puts(ctx, fmt, "\\t");
else if (c == '\b')
- fmt_puts(fmt, "\\b");
+ fmt_puts(ctx, fmt, "\\b");
else if (c == '\f')
- fmt_puts(fmt, "\\f");
+ fmt_puts(ctx, fmt, "\\f");
else if (c == '(')
- fmt_puts(fmt, "\\(");
+ fmt_puts(ctx, fmt, "\\(");
else if (c == ')')
- fmt_puts(fmt, "\\)");
+ fmt_puts(ctx, fmt, "\\)");
else if (c == '\\')
- fmt_puts(fmt, "\\\\");
+ fmt_puts(ctx, fmt, "\\\\");
else if (c < 32 || c >= 127) {
- fmt_putc(fmt, '\\');
- fmt_putc(fmt, '0' + ((c / 64) & 7));
- fmt_putc(fmt, '0' + ((c / 8) & 7));
- fmt_putc(fmt, '0' + ((c) & 7));
+ fmt_putc(ctx, fmt, '\\');
+ fmt_putc(ctx, fmt, '0' + ((c / 64) & 7));
+ fmt_putc(ctx, fmt, '0' + ((c / 8) & 7));
+ fmt_putc(ctx, fmt, '0' + ((c) & 7));
}
else
- fmt_putc(fmt, c);
+ fmt_putc(ctx, fmt, c);
}
- fmt_putc(fmt, ')');
+ fmt_putc(ctx, fmt, ')');
}
-static void fmt_hex(struct fmt *fmt, pdf_obj *obj)
+static void fmt_hex(fz_context *ctx, struct fmt *fmt, pdf_obj *obj)
{
- char *s = pdf_to_str_buf(obj);
- int n = pdf_to_str_len(obj);
+ char *s = pdf_to_str_buf(ctx, obj);
+ int n = pdf_to_str_len(ctx, obj);
int i, b, c;
- fmt_putc(fmt, '<');
+ fmt_putc(ctx, fmt, '<');
for (i = 0; i < n; i++) {
b = (unsigned char) s[i];
c = (b >> 4) & 0x0f;
- fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
+ fmt_putc(ctx, fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
c = (b) & 0x0f;
- fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
+ fmt_putc(ctx, fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
}
- fmt_putc(fmt, '>');
+ fmt_putc(ctx, fmt, '>');
}
-static void fmt_name(struct fmt *fmt, pdf_obj *obj)
+static void fmt_name(fz_context *ctx, struct fmt *fmt, pdf_obj *obj)
{
- unsigned char *s = (unsigned char *) pdf_to_name(obj);
+ unsigned char *s = (unsigned char *) pdf_to_name(ctx, obj);
int i, c;
- fmt_putc(fmt, '/');
+ fmt_putc(ctx, fmt, '/');
for (i = 0; s[i]; i++)
{
if (isdelim(s[i]) || iswhite(s[i]) ||
s[i] == '#' || s[i] < 32 || s[i] >= 127)
{
- fmt_putc(fmt, '#');
+ fmt_putc(ctx, fmt, '#');
c = (s[i] >> 4) & 0xf;
- fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
+ fmt_putc(ctx, fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
c = s[i] & 0xf;
- fmt_putc(fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
+ fmt_putc(ctx, fmt, c < 0xA ? c + '0' : c + 'A' - 0xA);
}
else
{
- fmt_putc(fmt, s[i]);
+ fmt_putc(ctx, fmt, s[i]);
}
}
}
-static void fmt_array(struct fmt *fmt, pdf_obj *obj)
+static void fmt_array(fz_context *ctx, struct fmt *fmt, pdf_obj *obj)
{
int i, n;
- n = pdf_array_len(obj);
+ n = pdf_array_len(ctx, obj);
if (fmt->tight) {
- fmt_putc(fmt, '[');
+ fmt_putc(ctx, fmt, '[');
for (i = 0; i < n; i++) {
- fmt_obj(fmt, pdf_array_get(obj, i));
- fmt_sep(fmt);
+ fmt_obj(ctx, fmt, pdf_array_get(ctx, obj, i));
+ fmt_sep(ctx, fmt);
}
- fmt_putc(fmt, ']');
+ fmt_putc(ctx, fmt, ']');
}
else {
- fmt_puts(fmt, "[ ");
+ fmt_puts(ctx, fmt, "[ ");
for (i = 0; i < n; i++) {
if (fmt->col > 60) {
- fmt_putc(fmt, '\n');
- fmt_indent(fmt);
+ fmt_putc(ctx, fmt, '\n');
+ fmt_indent(ctx, fmt);
}
- fmt_obj(fmt, pdf_array_get(obj, i));
- fmt_putc(fmt, ' ');
+ fmt_obj(ctx, fmt, pdf_array_get(ctx, obj, i));
+ fmt_putc(ctx, fmt, ' ');
}
- fmt_putc(fmt, ']');
- fmt_sep(fmt);
+ fmt_putc(ctx, fmt, ']');
+ fmt_sep(ctx, fmt);
}
}
-static void fmt_dict(struct fmt *fmt, pdf_obj *obj)
+static void fmt_dict(fz_context *ctx, struct fmt *fmt, pdf_obj *obj)
{
int i, n;
pdf_obj *key, *val;
- n = pdf_dict_len(obj);
+ n = pdf_dict_len(ctx, obj);
if (fmt->tight) {
- fmt_puts(fmt, "<<");
+ fmt_puts(ctx, fmt, "<<");
for (i = 0; i < n; i++) {
- fmt_obj(fmt, pdf_dict_get_key(obj, i));
- fmt_sep(fmt);
- fmt_obj(fmt, pdf_dict_get_val(obj, i));
- fmt_sep(fmt);
+ fmt_obj(ctx, fmt, pdf_dict_get_key(ctx, obj, i));
+ fmt_sep(ctx, fmt);
+ fmt_obj(ctx, fmt, pdf_dict_get_val(ctx, obj, i));
+ fmt_sep(ctx, fmt);
}
- fmt_puts(fmt, ">>");
+ fmt_puts(ctx, fmt, ">>");
}
else {
- fmt_puts(fmt, "<<\n");
+ fmt_puts(ctx, fmt, "<<\n");
fmt->indent ++;
for (i = 0; i < n; i++) {
- key = pdf_dict_get_key(obj, i);
- val = pdf_dict_get_val(obj, i);
- fmt_indent(fmt);
- fmt_obj(fmt, key);
- fmt_putc(fmt, ' ');
- if (!pdf_is_indirect(val) && pdf_is_array(val))
+ key = pdf_dict_get_key(ctx, obj, i);
+ val = pdf_dict_get_val(ctx, obj, i);
+ fmt_indent(ctx, fmt);
+ fmt_obj(ctx, fmt, key);
+ fmt_putc(ctx, fmt, ' ');
+ if (!pdf_is_indirect(ctx, val) && pdf_is_array(ctx, val))
fmt->indent ++;
- fmt_obj(fmt, val);
- fmt_putc(fmt, '\n');
- if (!pdf_is_indirect(val) && pdf_is_array(val))
+ fmt_obj(ctx, fmt, val);
+ fmt_putc(ctx, fmt, '\n');
+ if (!pdf_is_indirect(ctx, val) && pdf_is_array(ctx, val))
fmt->indent --;
}
fmt->indent --;
- fmt_indent(fmt);
- fmt_puts(fmt, ">>");
+ fmt_indent(ctx, fmt);
+ fmt_puts(ctx, fmt, ">>");
}
}
-static void fmt_obj(struct fmt *fmt, pdf_obj *obj)
+static void fmt_obj(fz_context *ctx, struct fmt *fmt, pdf_obj *obj)
{
char buf[256];
if (!obj)
- fmt_puts(fmt, "<NULL>");
- else if (pdf_is_indirect(obj))
+ fmt_puts(ctx, fmt, "<NULL>");
+ else if (pdf_is_indirect(ctx, obj))
{
- fz_snprintf(buf, sizeof buf, "%d %d R", pdf_to_num(obj), pdf_to_gen(obj));
- fmt_puts(fmt, buf);
- }
- else if (pdf_is_null(obj))
- fmt_puts(fmt, "null");
- else if (pdf_is_bool(obj))
- fmt_puts(fmt, pdf_to_bool(obj) ? "true" : "false");
- else if (pdf_is_int(obj))
+ fz_snprintf(buf, sizeof buf, "%d %d R", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
+ fmt_puts(ctx, fmt, buf);
+ }
+ else if (pdf_is_null(ctx, obj))
+ fmt_puts(ctx, fmt, "null");
+ else if (pdf_is_bool(ctx, obj))
+ fmt_puts(ctx, fmt, pdf_to_bool(ctx, obj) ? "true" : "false");
+ else if (pdf_is_int(ctx, obj))
{
- fz_snprintf(buf, sizeof buf, "%d", pdf_to_int(obj));
- fmt_puts(fmt, buf);
+ fz_snprintf(buf, sizeof buf, "%d", pdf_to_int(ctx, obj));
+ fmt_puts(ctx, fmt, buf);
}
- else if (pdf_is_real(obj))
+ else if (pdf_is_real(ctx, obj))
{
- fz_snprintf(buf, sizeof buf, "%g", pdf_to_real(obj));
- fmt_puts(fmt, buf);
+ fz_snprintf(buf, sizeof buf, "%g", pdf_to_real(ctx, obj));
+ fmt_puts(ctx, fmt, buf);
}
- else if (pdf_is_string(obj))
+ else if (pdf_is_string(ctx, obj))
{
- char *str = pdf_to_str_buf(obj);
- int len = pdf_to_str_len(obj);
+ char *str = pdf_to_str_buf(ctx, obj);
+ int len = pdf_to_str_len(ctx, obj);
int added = 0;
int i, c;
for (i = 0; i < len; i++) {
@@ -1676,22 +1648,22 @@ static void fmt_obj(struct fmt *fmt, pdf_obj *obj)
added += 3;
}
if (added < len)
- fmt_str(fmt, obj);
+ fmt_str(ctx, fmt, obj);
else
- fmt_hex(fmt, obj);
- }
- else if (pdf_is_name(obj))
- fmt_name(fmt, obj);
- else if (pdf_is_array(obj))
- fmt_array(fmt, obj);
- else if (pdf_is_dict(obj))
- fmt_dict(fmt, obj);
+ fmt_hex(ctx, fmt, obj);
+ }
+ else if (pdf_is_name(ctx, obj))
+ fmt_name(ctx, fmt, obj);
+ else if (pdf_is_array(ctx, obj))
+ fmt_array(ctx, fmt, obj);
+ else if (pdf_is_dict(ctx, obj))
+ fmt_dict(ctx, fmt, obj);
else
- fmt_puts(fmt, "<unknown object>");
+ fmt_puts(ctx, fmt, "<unknown object>");
}
int
-pdf_sprint_obj(char *s, int n, pdf_obj *obj, int tight)
+pdf_sprint_obj(fz_context *ctx, char *s, int n, pdf_obj *obj, int tight)
{
struct fmt fmt;
@@ -1704,7 +1676,7 @@ pdf_sprint_obj(char *s, int n, pdf_obj *obj, int tight)
fmt.buf = s;
fmt.cap = n;
fmt.len = 0;
- fmt_obj(&fmt, obj);
+ fmt_obj(ctx, &fmt, obj);
if (fmt.buf && fmt.len < fmt.cap)
fmt.buf[fmt.len] = '\0';
@@ -1713,67 +1685,67 @@ pdf_sprint_obj(char *s, int n, pdf_obj *obj, int tight)
}
int
-pdf_fprint_obj(FILE *fp, pdf_obj *obj, int tight)
+pdf_fprint_obj(fz_context *ctx, FILE *fp, pdf_obj *obj, int tight)
{
char buf[1024];
char *ptr;
int n;
- n = pdf_sprint_obj(NULL, 0, obj, tight);
+ n = pdf_sprint_obj(ctx, NULL, 0, obj, tight);
if ((n + 1) < sizeof buf)
{
- pdf_sprint_obj(buf, sizeof buf, obj, tight);
+ pdf_sprint_obj(ctx, buf, sizeof buf, obj, tight);
fputs(buf, fp);
fputc('\n', fp);
}
else
{
- ptr = fz_malloc(obj->doc->ctx, n + 1);
- pdf_sprint_obj(ptr, n + 1, obj, tight);
+ ptr = fz_malloc(ctx, n + 1);
+ pdf_sprint_obj(ctx, ptr, n + 1, obj, tight);
fputs(ptr, fp);
fputc('\n', fp);
- fz_free(obj->doc->ctx, ptr);
+ fz_free(ctx, ptr);
}
return n;
}
-int pdf_output_obj(fz_output *out, pdf_obj *obj, int tight)
+int pdf_output_obj(fz_context *ctx, fz_output *out, pdf_obj *obj, int tight)
{
char buf[1024];
char *ptr;
int n;
- n = pdf_sprint_obj(NULL, 0, obj, tight);
+ n = pdf_sprint_obj(ctx, NULL, 0, obj, tight);
if ((n + 1) < sizeof buf)
{
- pdf_sprint_obj(buf, sizeof buf, obj, tight);
- fz_printf(out, "%s\n", buf);
+ pdf_sprint_obj(ctx, buf, sizeof buf, obj, tight);
+ fz_printf(ctx, out, "%s\n", buf);
}
else
{
- ptr = fz_malloc(obj->doc->ctx, n + 1);
- pdf_sprint_obj(ptr, n + 1, obj, tight);
- fz_printf(out, "%s\n", ptr);
- fz_free(obj->doc->ctx, ptr);
+ ptr = fz_malloc(ctx, n + 1);
+ pdf_sprint_obj(ctx, ptr, n + 1, obj, tight);
+ fz_printf(ctx, out, "%s\n", ptr);
+ fz_free(ctx, ptr);
}
return n;
}
#ifndef NDEBUG
void
-pdf_print_obj(pdf_obj *obj)
+pdf_print_obj(fz_context *ctx, pdf_obj *obj)
{
- pdf_fprint_obj(stdout, obj, 0);
+ pdf_fprint_obj(ctx, stdout, obj, 0);
}
void
-pdf_print_ref(pdf_obj *ref)
+pdf_print_ref(fz_context *ctx, pdf_obj *ref)
{
- pdf_print_obj(pdf_resolve_indirect(ref));
+ pdf_print_obj(ctx, pdf_resolve_indirect(ctx, ref));
}
#endif
-int pdf_obj_refs(pdf_obj *ref)
+int pdf_obj_refs(fz_context *ctx, pdf_obj *ref)
{
return (ref ? ref->refs : 0);
}
diff --git a/source/pdf/pdf-op-buffer.c b/source/pdf/pdf-op-buffer.c
index 22436ce5..e2bbd343 100644
--- a/source/pdf/pdf-op-buffer.c
+++ b/source/pdf/pdf-op-buffer.c
@@ -9,18 +9,18 @@ typedef struct pdf_buffer_state_s
pdf_buffer_state;
static void
-put_hexstring(pdf_csi *csi, fz_output *out)
+put_hexstring(fz_context *ctx, fz_output *out, pdf_csi *csi)
{
int i;
- fz_printf(out, "<");
+ fz_printf(ctx, out, "<");
for (i = 0; i < csi->string_len; i++)
- fz_printf(out, "%02x", csi->string[i]);
- fz_printf(out, ">");
+ fz_printf(ctx, out, "%02x", csi->string[i]);
+ fz_printf(ctx, out, ">");
}
static void
-put_string(pdf_csi *csi, fz_output *out)
+put_string(fz_context *ctx, fz_output *out, pdf_csi *csi)
{
int i;
@@ -28,40 +28,40 @@ put_string(pdf_csi *csi, fz_output *out)
if (csi->string[i] < 32 || csi->string[i] >= 127)
break;
if (i < csi->string_len)
- put_hexstring(csi, out);
+ put_hexstring(ctx, out, csi);
else
{
- fz_printf(out, "(");
+ fz_printf(ctx, out, "(");
for (i = 0; i < csi->string_len; i++)
{
char c = csi->string[i];
switch (c)
{
case '(':
- fz_printf(out, "\\(");
+ fz_printf(ctx, out, "\\(");
break;
case ')':
- fz_printf(out, "\\)");
+ fz_printf(ctx, out, "\\)");
break;
case '\\':
- fz_printf(out, "\\\\");
+ fz_printf(ctx, out, "\\\\");
break;
default:
- fz_printf(out, "%c", csi->string[i]);
+ fz_printf(ctx, out, "%c", csi->string[i]);
break;
}
}
- fz_printf(out, ")");
+ fz_printf(ctx, out, ")");
}
}
static void
-put_string_or_obj(pdf_csi *csi, fz_output *out)
+put_string_or_obj(fz_context *ctx, fz_output *out, pdf_csi *csi)
{
if (csi->string_len)
- put_string(csi, out);
+ put_string(ctx, out, csi);
else
- pdf_output_obj(out, csi->obj, 1);
+ pdf_output_obj(ctx, out, csi->obj, 1);
}
static void
@@ -69,9 +69,9 @@ pdf_buffer_dquote(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f ", csi->stack[0], csi->stack[1]);
- put_string_or_obj(csi, state->out);
- fz_printf(state->out, " \"\n");
+ fz_printf(state->ctx, state->out, "%f %f ", csi->stack[0], csi->stack[1]);
+ put_string_or_obj(state->ctx, state->out, csi);
+ fz_printf(state->ctx, state->out, " \"\n");
}
static void
@@ -79,8 +79,8 @@ pdf_buffer_squote(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- put_string_or_obj(csi, state->out);
- fz_printf(state->out, " \'\n");
+ put_string_or_obj(state->ctx, state->out, csi);
+ fz_printf(state->ctx, state->out, " \'\n");
}
static void
@@ -88,7 +88,7 @@ pdf_buffer_B(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "B\n");
+ fz_printf(state->ctx, state->out, "B\n");
}
static void
@@ -96,7 +96,7 @@ pdf_buffer_Bstar(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "B*\n");
+ fz_printf(state->ctx, state->out, "B*\n");
}
static void
@@ -104,9 +104,9 @@ pdf_buffer_BDC(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s ", csi->name);
- pdf_output_obj(state->out, csi->obj, 1);
- fz_printf(state->out, " BDC\n");
+ fz_printf(state->ctx, state->out, "/%s ", csi->name);
+ pdf_output_obj(state->ctx, state->out, csi->obj, 1);
+ fz_printf(state->ctx, state->out, " BDC\n");
}
static void
@@ -120,7 +120,7 @@ pdf_buffer_BI(pdf_csi *csi, void *state_)
const char *match;
const char *match2;
pdf_obj *filter;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
if (csi->img == NULL)
return;
@@ -163,44 +163,44 @@ pdf_buffer_BI(pdf_csi *csi, void *state_)
return;
}
- filter = pdf_dict_gets(csi->obj, "Filter");
+ filter = pdf_dict_gets(ctx, csi->obj, "Filter");
if (filter == NULL)
- filter = pdf_dict_gets(csi->obj, "F");
+ filter = pdf_dict_gets(ctx, csi->obj, "F");
if (match == NULL)
{
/* Remove any filter entry (e.g. Ascii85Decode) */
if (filter)
{
- pdf_dict_dels(csi->obj, "Filter");
- pdf_dict_dels(csi->obj, "F");
+ pdf_dict_dels(ctx, csi->obj, "Filter");
+ pdf_dict_dels(ctx, csi->obj, "F");
}
- pdf_dict_dels(csi->obj, "DecodeParms");
- pdf_dict_dels(csi->obj, "DP");
+ pdf_dict_dels(ctx, csi->obj, "DecodeParms");
+ pdf_dict_dels(ctx, csi->obj, "DP");
}
- else if (pdf_is_array(filter))
+ else if (pdf_is_array(ctx, filter))
{
- int l = pdf_array_len(filter);
- pdf_obj *o = (l == 0 ? NULL : pdf_array_get(filter, l-1));
- const char *fil = pdf_to_name(o);
+ int l = pdf_array_len(ctx, filter);
+ pdf_obj *o = (l == 0 ? NULL : pdf_array_get(ctx, filter, l-1));
+ const char *fil = pdf_to_name(ctx, o);
if (l == 0 || (strcmp(fil, match) && strcmp(fil, match2)))
{
fz_warn(ctx, "Unexpected Filter configuration in inline image");
return;
}
- pdf_dict_puts(csi->obj, "F", o);
+ pdf_dict_puts(ctx, csi->obj, "F", o);
- o = pdf_dict_gets(csi->obj, "DecodeParms");
+ o = pdf_dict_gets(ctx, csi->obj, "DecodeParms");
if (o == NULL)
- o = pdf_dict_gets(csi->obj, "DP");
+ o = pdf_dict_gets(ctx, csi->obj, "DP");
if (o)
{
- o = pdf_array_get(o, l-1);
+ o = pdf_array_get(ctx, o, l-1);
if (o)
- pdf_dict_puts(csi->obj, "DP", o);
+ pdf_dict_puts(ctx, csi->obj, "DP", o);
else
- pdf_dict_dels(csi->obj, "DP");
- pdf_dict_dels(csi->obj, "DecodeParms");
+ pdf_dict_dels(ctx, csi->obj, "DP");
+ pdf_dict_dels(ctx, csi->obj, "DecodeParms");
}
}
else
@@ -208,25 +208,25 @@ pdf_buffer_BI(pdf_csi *csi, void *state_)
/* It's a singleton. It must be correct */
}
- fz_printf(state->out, "BI\n");
+ fz_printf(state->ctx, state->out, "BI\n");
- len = pdf_dict_len(csi->obj);
+ len = pdf_dict_len(ctx, csi->obj);
for (i = 0; i < len; i++)
{
- pdf_output_obj(state->out, pdf_dict_get_key(csi->obj, i), 1);
- pdf_output_obj(state->out, pdf_dict_get_val(csi->obj, i), 1);
+ pdf_output_obj(state->ctx, state->out, pdf_dict_get_key(ctx, csi->obj, i), 1);
+ pdf_output_obj(state->ctx, state->out, pdf_dict_get_val(ctx, csi->obj, i), 1);
}
- fz_printf(state->out, "ID\n");
+ fz_printf(state->ctx, state->out, "ID\n");
buffer = csi->img->buffer->buffer;
len = buffer->len;
data = buffer->data;
for (i = 0; i < len; i++)
{
- fz_printf(state->out, "%c", data[i]);
+ fz_printf(state->ctx, state->out, "%c", data[i]);
}
- fz_printf(state->out, "\nEI\n");
+ fz_printf(state->ctx, state->out, "\nEI\n");
}
static void
@@ -234,7 +234,7 @@ pdf_buffer_BMC(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s BMC\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s BMC\n", csi->name);
}
static void
@@ -242,7 +242,7 @@ pdf_buffer_BT(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "BT\n");
+ fz_printf(state->ctx, state->out, "BT\n");
}
static void
@@ -250,7 +250,7 @@ pdf_buffer_BX(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "BX\n");
+ fz_printf(state->ctx, state->out, "BX\n");
}
static void
@@ -258,7 +258,7 @@ pdf_buffer_CS(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s CS\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s CS\n", csi->name);
}
static void
@@ -266,9 +266,9 @@ pdf_buffer_DP(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s ", csi->name);
- pdf_output_obj(state->out, csi->obj, 1);
- fz_printf(state->out, " DP\n");
+ fz_printf(state->ctx, state->out, "/%s ", csi->name);
+ pdf_output_obj(state->ctx, state->out, csi->obj, 1);
+ fz_printf(state->ctx, state->out, " DP\n");
}
static void
@@ -276,7 +276,7 @@ pdf_buffer_EMC(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "EMC\n");
+ fz_printf(state->ctx, state->out, "EMC\n");
}
static void
@@ -284,7 +284,7 @@ pdf_buffer_ET(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "ET\n");
+ fz_printf(state->ctx, state->out, "ET\n");
}
static void
@@ -292,7 +292,7 @@ pdf_buffer_EX(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "EX\n");
+ fz_printf(state->ctx, state->out, "EX\n");
}
static void
@@ -300,7 +300,7 @@ pdf_buffer_F(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "F\n");
+ fz_printf(state->ctx, state->out, "F\n");
}
static void
@@ -308,7 +308,7 @@ pdf_buffer_G(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f G\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f G\n", csi->stack[0]);
}
static void
@@ -316,7 +316,7 @@ pdf_buffer_J(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%d J\n", (int)csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%d J\n", (int)csi->stack[0]);
}
static void
@@ -324,7 +324,7 @@ pdf_buffer_K(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f K\n", csi->stack[0],
+ fz_printf(state->ctx, state->out, "%f %f %f %f K\n", csi->stack[0],
csi->stack[1], csi->stack[2], csi->stack[3]);
}
@@ -333,7 +333,7 @@ pdf_buffer_M(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f M\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f M\n", csi->stack[0]);
}
static void
@@ -341,7 +341,7 @@ pdf_buffer_MP(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s MP\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s MP\n", csi->name);
}
static void
@@ -349,7 +349,7 @@ pdf_buffer_Q(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "Q\n");
+ fz_printf(state->ctx, state->out, "Q\n");
}
static void
@@ -357,7 +357,7 @@ pdf_buffer_RG(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f RG\n", csi->stack[0], csi->stack[1], csi->stack[2]);
+ fz_printf(state->ctx, state->out, "%f %f %f RG\n", csi->stack[0], csi->stack[1], csi->stack[2]);
}
static void
@@ -365,7 +365,7 @@ pdf_buffer_S(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "S\n");
+ fz_printf(state->ctx, state->out, "S\n");
}
static void
@@ -375,8 +375,8 @@ pdf_buffer_SC(pdf_csi *csi, void *state_)
int i;
for (i = 0; i < csi->top; i++)
- fz_printf(state->out, "%f ", csi->stack[i]);
- fz_printf(state->out, "SC\n");
+ fz_printf(state->ctx, state->out, "%f ", csi->stack[i]);
+ fz_printf(state->ctx, state->out, "SC\n");
}
static void
@@ -386,10 +386,10 @@ pdf_buffer_SCN(pdf_csi *csi, void *state_)
int i;
for (i = 0; i < csi->top; i++)
- fz_printf(state->out, "%f ", csi->stack[i]);
+ fz_printf(state->ctx, state->out, "%f ", csi->stack[i]);
if (csi->name[0])
- fz_printf(state->out, "/%s ", csi->name);
- fz_printf(state->out, "SCN\n");
+ fz_printf(state->ctx, state->out, "/%s ", csi->name);
+ fz_printf(state->ctx, state->out, "SCN\n");
}
static void
@@ -397,7 +397,7 @@ pdf_buffer_Tstar(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "T*\n");
+ fz_printf(state->ctx, state->out, "T*\n");
}
static void
@@ -405,7 +405,7 @@ pdf_buffer_TD(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f TD\n", csi->stack[0], csi->stack[1]);
+ fz_printf(state->ctx, state->out, "%f %f TD\n", csi->stack[0], csi->stack[1]);
}
static void
@@ -413,8 +413,8 @@ pdf_buffer_TJ(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- pdf_output_obj(state->out, csi->obj, 1);
- fz_printf(state->out, " TJ\n");
+ pdf_output_obj(state->ctx, state->out, csi->obj, 1);
+ fz_printf(state->ctx, state->out, " TJ\n");
}
static void
@@ -422,7 +422,7 @@ pdf_buffer_TL(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f TL\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f TL\n", csi->stack[0]);
}
static void
@@ -430,7 +430,7 @@ pdf_buffer_Tc(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f Tc\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f Tc\n", csi->stack[0]);
}
static void
@@ -438,7 +438,7 @@ pdf_buffer_Td(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f Td\n", csi->stack[0], csi->stack[1]);
+ fz_printf(state->ctx, state->out, "%f %f Td\n", csi->stack[0], csi->stack[1]);
}
static void
@@ -446,8 +446,8 @@ pdf_buffer_Tj(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- put_string_or_obj(csi, state->out);
- fz_printf(state->out, " Tj\n");
+ put_string_or_obj(state->ctx, state->out, csi);
+ fz_printf(state->ctx, state->out, " Tj\n");
}
static void
@@ -455,7 +455,7 @@ pdf_buffer_Tm(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f %f %f Tm\n",
+ fz_printf(state->ctx, state->out, "%f %f %f %f %f %f Tm\n",
csi->stack[0], csi->stack[1], csi->stack[2],
csi->stack[3], csi->stack[4], csi->stack[5]);
}
@@ -465,7 +465,7 @@ pdf_buffer_Tr(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f Tr\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f Tr\n", csi->stack[0]);
}
static void
@@ -473,7 +473,7 @@ pdf_buffer_Ts(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f Ts\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f Ts\n", csi->stack[0]);
}
static void
@@ -481,7 +481,7 @@ pdf_buffer_Tw(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f Tw\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f Tw\n", csi->stack[0]);
}
static void
@@ -489,7 +489,7 @@ pdf_buffer_Tz(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f Tz\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f Tz\n", csi->stack[0]);
}
static void
@@ -497,7 +497,7 @@ pdf_buffer_W(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "W\n");
+ fz_printf(state->ctx, state->out, "W\n");
}
static void
@@ -505,7 +505,7 @@ pdf_buffer_Wstar(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "W*\n");
+ fz_printf(state->ctx, state->out, "W*\n");
}
static void
@@ -513,7 +513,7 @@ pdf_buffer_b(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "b\n");
+ fz_printf(state->ctx, state->out, "b\n");
}
static void
@@ -521,7 +521,7 @@ pdf_buffer_bstar(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "b*\n");
+ fz_printf(state->ctx, state->out, "b*\n");
}
static void
@@ -529,7 +529,7 @@ pdf_buffer_c(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f %f %f c\n",
+ fz_printf(state->ctx, state->out, "%f %f %f %f %f %f c\n",
csi->stack[0], csi->stack[1], csi->stack[2],
csi->stack[3], csi->stack[4], csi->stack[5]);
}
@@ -539,7 +539,7 @@ pdf_buffer_cm(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f %f %f cm\n",
+ fz_printf(state->ctx, state->out, "%f %f %f %f %f %f cm\n",
csi->stack[0], csi->stack[1], csi->stack[2],
csi->stack[3], csi->stack[4], csi->stack[5]);
}
@@ -549,7 +549,7 @@ pdf_buffer_cs(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s cs\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s cs\n", csi->name);
}
static void
@@ -557,8 +557,8 @@ pdf_buffer_d(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- pdf_output_obj(state->out, csi->obj, 1);
- fz_printf(state->out, " %f d\n", csi->stack[0]);
+ pdf_output_obj(state->ctx, state->out, csi->obj, 1);
+ fz_printf(state->ctx, state->out, " %f d\n", csi->stack[0]);
}
static void
@@ -566,7 +566,7 @@ pdf_buffer_d0(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f d0\n", csi->stack[0], csi->stack[1]);
+ fz_printf(state->ctx, state->out, "%f %f d0\n", csi->stack[0], csi->stack[1]);
}
static void
@@ -574,7 +574,7 @@ pdf_buffer_d1(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f %f %f d1\n",
+ fz_printf(state->ctx, state->out, "%f %f %f %f %f %f d1\n",
csi->stack[0], csi->stack[1], csi->stack[2],
csi->stack[3], csi->stack[4], csi->stack[5]);
}
@@ -584,7 +584,7 @@ pdf_buffer_f(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "f\n");
+ fz_printf(state->ctx, state->out, "f\n");
}
static void
@@ -592,7 +592,7 @@ pdf_buffer_fstar(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "f*\n");
+ fz_printf(state->ctx, state->out, "f*\n");
}
static void
@@ -600,7 +600,7 @@ pdf_buffer_g(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f g\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f g\n", csi->stack[0]);
}
static void
@@ -608,7 +608,7 @@ pdf_buffer_h(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "h\n");
+ fz_printf(state->ctx, state->out, "h\n");
}
static void
@@ -616,7 +616,7 @@ pdf_buffer_i(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f i\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f i\n", csi->stack[0]);
}
static void
@@ -624,7 +624,7 @@ pdf_buffer_j(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%d j\n", (int)csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%d j\n", (int)csi->stack[0]);
}
static void
@@ -632,7 +632,7 @@ pdf_buffer_k(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f k\n", csi->stack[0],
+ fz_printf(state->ctx, state->out, "%f %f %f %f k\n", csi->stack[0],
csi->stack[1], csi->stack[2], csi->stack[3]);
}
@@ -641,7 +641,7 @@ pdf_buffer_l(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f l\n", csi->stack[0], csi->stack[1]);
+ fz_printf(state->ctx, state->out, "%f %f l\n", csi->stack[0], csi->stack[1]);
}
static void
@@ -649,7 +649,7 @@ pdf_buffer_m(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f m\n", csi->stack[0], csi->stack[1]);
+ fz_printf(state->ctx, state->out, "%f %f m\n", csi->stack[0], csi->stack[1]);
}
static void
@@ -657,7 +657,7 @@ pdf_buffer_n(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "n\n");
+ fz_printf(state->ctx, state->out, "n\n");
}
static void
@@ -665,7 +665,7 @@ pdf_buffer_q(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "q\n");
+ fz_printf(state->ctx, state->out, "q\n");
}
static void
@@ -673,7 +673,7 @@ pdf_buffer_re(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f re\n", csi->stack[0],
+ fz_printf(state->ctx, state->out, "%f %f %f %f re\n", csi->stack[0],
csi->stack[1], csi->stack[2], csi->stack[3]);
}
@@ -682,7 +682,7 @@ pdf_buffer_rg(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f rg\n",
+ fz_printf(state->ctx, state->out, "%f %f %f rg\n",
csi->stack[0], csi->stack[1], csi->stack[2]);
}
@@ -691,7 +691,7 @@ pdf_buffer_ri(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s ri\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s ri\n", csi->name);
}
static void
@@ -699,7 +699,7 @@ pdf_buffer_s(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "s\n");
+ fz_printf(state->ctx, state->out, "s\n");
}
static void
@@ -709,8 +709,8 @@ pdf_buffer_sc(pdf_csi *csi, void *state_)
int i;
for (i = 0; i < csi->top; i++)
- fz_printf(state->out, "%f ", csi->stack[i]);
- fz_printf(state->out, "sc\n");
+ fz_printf(state->ctx, state->out, "%f ", csi->stack[i]);
+ fz_printf(state->ctx, state->out, "sc\n");
}
static void
@@ -720,10 +720,10 @@ pdf_buffer_scn(pdf_csi *csi, void *state_)
int i;
for (i = 0; i < csi->top; i++)
- fz_printf(state->out, "%f ", csi->stack[i]);
+ fz_printf(state->ctx, state->out, "%f ", csi->stack[i]);
if (csi->name[0])
- fz_printf(state->out, "/%s ", csi->name);
- fz_printf(state->out, "scn\n");
+ fz_printf(state->ctx, state->out, "/%s ", csi->name);
+ fz_printf(state->ctx, state->out, "scn\n");
}
static void
@@ -731,7 +731,7 @@ pdf_buffer_v(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f v\n", csi->stack[0],
+ fz_printf(state->ctx, state->out, "%f %f %f %f v\n", csi->stack[0],
csi->stack[1], csi->stack[2], csi->stack[3]);
}
@@ -740,7 +740,7 @@ pdf_buffer_w(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f w\n", csi->stack[0]);
+ fz_printf(state->ctx, state->out, "%f w\n", csi->stack[0]);
}
static void
@@ -748,7 +748,7 @@ pdf_buffer_y(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "%f %f %f %f y\n", csi->stack[0],
+ fz_printf(state->ctx, state->out, "%f %f %f %f y\n", csi->stack[0],
csi->stack[1], csi->stack[2], csi->stack[3]);
}
@@ -757,7 +757,7 @@ pdf_buffer_Do(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s Do\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s Do\n", csi->name);
}
static void
@@ -765,7 +765,7 @@ pdf_buffer_Tf(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s %f Tf\n", csi->name, csi->stack[0]);
+ fz_printf(state->ctx, state->out, "/%s %f Tf\n", csi->name, csi->stack[0]);
}
static void
@@ -773,7 +773,7 @@ pdf_buffer_gs(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s gs\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s gs\n", csi->name);
}
static void
@@ -781,27 +781,26 @@ pdf_buffer_sh(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_printf(state->out, "/%s sh\n", csi->name);
+ fz_printf(state->ctx, state->out, "/%s sh\n", csi->name);
}
static void
free_processor_buffer(pdf_csi *csi, void *state_)
{
pdf_buffer_state *state = (pdf_buffer_state *)state_;
- fz_context *ctx = state->ctx;
- fz_close_output(state->out);
- fz_free(ctx, state);
+ fz_drop_output(state->ctx, state->out);
+ fz_free(state->ctx, state);
}
static void
process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_xobject *xobj = annot->ap;
/* Avoid infinite recursion */
- if (xobj == NULL || pdf_mark_obj(xobj->me))
+ if (xobj == NULL || pdf_mark_obj(ctx, xobj->me))
return;
fz_try(ctx)
@@ -813,7 +812,7 @@ process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot)
}
fz_always(ctx)
{
- pdf_unmark_obj(xobj->me);
+ pdf_unmark_obj(ctx, xobj->me);
}
fz_catch(ctx)
{
@@ -914,7 +913,7 @@ static const pdf_processor pdf_processor_buffer =
process_contents
};
-pdf_process *pdf_process_buffer(pdf_process *process, fz_context *ctx, fz_buffer *buffer)
+pdf_process *pdf_init_process_buffer(fz_context *ctx, pdf_process *process, fz_buffer *buffer)
{
fz_output *out = fz_new_output_with_buffer(ctx, buffer);
pdf_buffer_state *p = NULL;
@@ -930,7 +929,7 @@ pdf_process *pdf_process_buffer(pdf_process *process, fz_context *ctx, fz_buffer
}
fz_catch(ctx)
{
- fz_close_output(out);
+ fz_drop_output(ctx, out);
fz_rethrow(ctx);
}
diff --git a/source/pdf/pdf-op-filter.c b/source/pdf/pdf-op-filter.c
index 17bd3af0..ec08b305 100644
--- a/source/pdf/pdf-op-filter.c
+++ b/source/pdf/pdf-op-filter.c
@@ -47,21 +47,22 @@ typedef struct pdf_filter_state_s
static void insert_resource_name(pdf_csi *csi, pdf_filter_state *state, const char *key, const char *name)
{
+ fz_context *ctx = csi->ctx;
pdf_obj *xobj;
pdf_obj *obj;
if (!state->resources || !name || name[0] == 0)
return;
- xobj = pdf_dict_gets(csi->rdb, key);
- obj = pdf_dict_gets(xobj, name);
+ xobj = pdf_dict_gets(ctx, csi->rdb, key);
+ obj = pdf_dict_gets(ctx, xobj, name);
- xobj = pdf_dict_gets(state->resources, key);
+ xobj = pdf_dict_gets(ctx, state->resources, key);
if (xobj == NULL) {
- xobj = pdf_new_dict(csi->doc, 1);
- pdf_dict_puts_drop(state->resources, key, xobj);
+ xobj = pdf_new_dict(csi->ctx, csi->doc, 1);
+ pdf_dict_puts_drop(ctx, state->resources, key, xobj);
}
- pdf_dict_putp(xobj, name, obj);
+ pdf_dict_putp(ctx, xobj, name, obj);
}
static void insert_resource(pdf_csi *csi, pdf_filter_state *state, const char *key)
@@ -408,7 +409,7 @@ pdf_filter_BDC(pdf_csi *csi, void *state_)
{
pdf_filter_state *state = (pdf_filter_state *)state_;
- insert_resource_name(csi, state, "Properties", pdf_to_name(csi->obj));
+ insert_resource_name(csi, state, "Properties", pdf_to_name(csi->ctx, csi->obj));
filter_flush(csi, state, 0);
call_op(csi, state, PDF_OP_BDC);
@@ -467,7 +468,7 @@ pdf_filter_DP(pdf_csi *csi, void *state_)
{
pdf_filter_state *state = (pdf_filter_state *)state_;
- insert_resource_name(csi, state, "Properties", pdf_to_name(csi->obj));
+ insert_resource_name(csi, state, "Properties", pdf_to_name(csi->ctx, csi->obj));
filter_flush(csi, state, 0);
call_op(csi, state, PDF_OP_DP);
@@ -1085,11 +1086,11 @@ free_processor_filter(pdf_csi *csi, void *state_)
static void
process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_xobject *xobj = annot->ap;
/* Avoid infinite recursion */
- if (xobj == NULL || pdf_mark_obj(xobj->me))
+ if (xobj == NULL || pdf_mark_obj(ctx, xobj->me))
return;
fz_try(ctx)
@@ -1101,7 +1102,7 @@ process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot)
}
fz_always(ctx)
{
- pdf_unmark_obj(xobj->me);
+ pdf_unmark_obj(ctx, xobj->me);
}
fz_catch(ctx)
{
@@ -1203,7 +1204,7 @@ static const pdf_processor pdf_processor_filter =
};
pdf_process *
-pdf_process_filter(pdf_process *process, fz_context *ctx, pdf_process *underlying, pdf_obj *resources)
+pdf_init_process_filter(fz_context *ctx, pdf_process *process, pdf_process *underlying, pdf_obj *resources)
{
pdf_filter_state *p = NULL;
diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c
index 22e6a4be..139f7e50 100644
--- a/source/pdf/pdf-op-run.c
+++ b/source/pdf/pdf-op-run.c
@@ -107,7 +107,7 @@ static void
run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, const fz_matrix *transform);
static int
-ocg_intents_include(pdf_ocg_descriptor *desc, char *name)
+ocg_intents_include(fz_context *ctx, pdf_ocg_descriptor *desc, char *name)
{
int i, len;
@@ -118,20 +118,20 @@ ocg_intents_include(pdf_ocg_descriptor *desc, char *name)
if (!desc->intent)
return (strcmp(name, "View") == 0);
- if (pdf_is_name(desc->intent))
+ if (pdf_is_name(ctx, desc->intent))
{
- char *intent = pdf_to_name(desc->intent);
+ char *intent = pdf_to_name(ctx, desc->intent);
if (strcmp(intent, "All") == 0)
return 1;
return (strcmp(intent, name) == 0);
}
- if (!pdf_is_array(desc->intent))
+ if (!pdf_is_array(ctx, desc->intent))
return 0;
- len = pdf_array_len(desc->intent);
+ len = pdf_array_len(ctx, desc->intent);
for (i=0; i < len; i++)
{
- char *intent = pdf_to_name(pdf_array_get(desc->intent, i));
+ char *intent = pdf_to_name(ctx, pdf_array_get(ctx, desc->intent, i));
if (strcmp(intent, "All") == 0)
return 1;
if (strcmp(intent, name) == 0)
@@ -147,10 +147,10 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
pdf_obj *obj, *obj2;
char *type;
pdf_ocg_descriptor *desc = csi->doc->ocg;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
/* Avoid infinite recursions */
- if (pdf_obj_marked(ocg))
+ if (pdf_obj_marked(ctx, ocg))
return 0;
/* If no ocg descriptor, everything is visible */
@@ -158,9 +158,9 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
return 0;
/* If we've been handed a name, look it up in the properties. */
- if (pdf_is_name(ocg))
+ if (pdf_is_name(ctx, ocg))
{
- ocg = pdf_dict_gets(pdf_dict_gets(rdb, "Properties"), pdf_to_name(ocg));
+ ocg = pdf_dict_gets(ctx, pdf_dict_gets(ctx, rdb, "Properties"), pdf_to_name(ctx, ocg));
}
/* If we haven't been given an ocg at all, then we're visible */
if (!ocg)
@@ -169,14 +169,14 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
fz_strlcpy(event_state, pr->event, sizeof event_state);
fz_strlcat(event_state, "State", sizeof event_state);
- type = pdf_to_name(pdf_dict_gets(ocg, "Type"));
+ type = pdf_to_name(ctx, pdf_dict_gets(ctx, ocg, "Type"));
if (strcmp(type, "OCG") == 0)
{
/* An Optional Content Group */
int default_value = 0;
- int num = pdf_to_num(ocg);
- int gen = pdf_to_gen(ocg);
+ int num = pdf_to_num(ctx, ocg);
+ int gen = pdf_to_gen(ctx, ocg);
int len = desc->len;
int i;
@@ -192,19 +192,19 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
/* Check Intents; if our intent is not part of the set given
* by the current config, we should ignore it. */
- obj = pdf_dict_gets(ocg, "Intent");
- if (pdf_is_name(obj))
+ obj = pdf_dict_gets(ctx, ocg, "Intent");
+ if (pdf_is_name(ctx, obj))
{
/* If it doesn't match, it's hidden */
- if (ocg_intents_include(desc, pdf_to_name(obj)) == 0)
+ if (ocg_intents_include(ctx, desc, pdf_to_name(ctx, obj)) == 0)
return 1;
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
int match = 0;
- len = pdf_array_len(obj);
+ len = pdf_array_len(ctx, obj);
for (i=0; i<len; i++) {
- match |= ocg_intents_include(desc, pdf_to_name(pdf_array_get(obj, i)));
+ match |= ocg_intents_include(ctx, desc, pdf_to_name(ctx, pdf_array_get(ctx, obj, i)));
if (match)
break;
}
@@ -215,7 +215,7 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
else
{
/* If it doesn't match, it's hidden */
- if (ocg_intents_include(desc, "View") == 0)
+ if (ocg_intents_include(ctx, desc, "View") == 0)
return 1;
}
@@ -228,19 +228,19 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
* correspond to entries in the AS list in the OCG config.
* Given that we don't handle Zoom or User, or Language
* dicts, this is not really a problem. */
- obj = pdf_dict_gets(ocg, "Usage");
- if (!pdf_is_dict(obj))
+ obj = pdf_dict_gets(ctx, ocg, "Usage");
+ if (!pdf_is_dict(ctx, obj))
return default_value;
/* FIXME: Should look at Zoom (and return hidden if out of
* max/min range) */
/* FIXME: Could provide hooks to the caller to check if
* User is appropriate - if not return hidden. */
- obj2 = pdf_dict_gets(obj, pr->event);
- if (strcmp(pdf_to_name(pdf_dict_gets(obj2, event_state)), "OFF") == 0)
+ obj2 = pdf_dict_gets(ctx, obj, pr->event);
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, obj2, event_state)), "OFF") == 0)
{
return 1;
}
- if (strcmp(pdf_to_name(pdf_dict_gets(obj2, event_state)), "ON") == 0)
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, obj2, event_state)), "ON") == 0)
{
return 0;
}
@@ -252,12 +252,12 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
char *name;
int combine, on;
- obj = pdf_dict_gets(ocg, "VE");
- if (pdf_is_array(obj)) {
+ obj = pdf_dict_gets(ctx, ocg, "VE");
+ if (pdf_is_array(ctx, obj)) {
/* FIXME: Calculate visibility from array */
return 0;
}
- name = pdf_to_name(pdf_dict_gets(ocg, "P"));
+ name = pdf_to_name(ctx, pdf_dict_gets(ctx, ocg, "P"));
/* Set combine; Bit 0 set => AND, Bit 1 set => true means
* Off, otherwise true means On */
if (strcmp(name, "AllOn") == 0)
@@ -277,19 +277,19 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
combine = 0;
}
- if (pdf_mark_obj(ocg))
+ if (pdf_mark_obj(ctx, ocg))
return 0; /* Should never happen */
fz_try(ctx)
{
- obj = pdf_dict_gets(ocg, "OCGs");
+ obj = pdf_dict_gets(ctx, ocg, "OCGs");
on = combine & 1;
- if (pdf_is_array(obj)) {
+ if (pdf_is_array(ctx, obj)) {
int i, len;
- len = pdf_array_len(obj);
+ len = pdf_array_len(ctx, obj);
for (i = 0; i < len; i++)
{
int hidden;
- hidden = pdf_is_hidden_ocg(pdf_array_get(obj, i), csi, pr, rdb);
+ hidden = pdf_is_hidden_ocg(pdf_array_get(ctx, obj, i), csi, pr, rdb);
if ((combine & 1) == 0)
hidden = !hidden;
if (combine & 2)
@@ -307,7 +307,7 @@ pdf_is_hidden_ocg(pdf_obj *ocg, pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb)
}
fz_always(ctx)
{
- pdf_unmark_obj(ocg);
+ pdf_unmark_obj(ctx, ocg);
}
fz_catch(ctx)
{
@@ -349,7 +349,7 @@ begin_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save)
gstate->softmask = NULL;
gstate->ctm = gstate->softmask_ctm;
- fz_begin_mask(pr->dev, &mask_bbox, gstate->luminosity,
+ fz_begin_mask(ctx, pr->dev, &mask_bbox, gstate->luminosity,
softmask->colorspace, gstate->softmask_bc);
fz_try(ctx)
{
@@ -364,7 +364,7 @@ begin_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save)
csi->cookie->errors++;
}
- fz_end_mask(pr->dev);
+ fz_end_mask(ctx, pr->dev);
pr->tm = save_tm;
pr->tlm = save_tlm;
@@ -378,6 +378,7 @@ begin_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save)
static void
end_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save)
{
+ fz_context *ctx = pr->ctx;
pdf_gstate *gstate = pr->gstate + pr->gtop;
if (save->softmask == NULL)
@@ -385,7 +386,7 @@ end_softmask(pdf_csi *csi, pdf_run_state *pr, softmask_save *save)
gstate->softmask = save->softmask;
gstate->softmask_ctm = save->ctm;
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
static pdf_gstate *
@@ -394,7 +395,7 @@ pdf_begin_group(pdf_csi *csi, pdf_run_state *pr, const fz_rect *bbox, softmask_s
pdf_gstate *gstate = begin_softmask(csi, pr, softmask);
if (gstate->blendmode)
- fz_begin_group(pr->dev, bbox, 1, 0, gstate->blendmode, 1);
+ fz_begin_group(pr->ctx, pr->dev, bbox, 1, 0, gstate->blendmode, 1);
return pr->gstate + pr->gtop;
}
@@ -405,7 +406,7 @@ pdf_end_group(pdf_csi *csi, pdf_run_state *pr, softmask_save *softmask)
pdf_gstate *gstate = pr->gstate + pr->gtop;
if (gstate->blendmode)
- fz_end_group(pr->dev);
+ fz_end_group(pr->ctx, pr->dev);
end_softmask(csi, pr, softmask);
}
@@ -427,7 +428,7 @@ pdf_show_shade(pdf_csi *csi, pdf_run_state *pr, fz_shade *shd)
/* FIXME: The gstate->ctm in the next line may be wrong; maybe
* it should be the parent gstates ctm? */
- fz_fill_shade(pr->dev, shd, &gstate->ctm, gstate->fill.alpha);
+ fz_fill_shade(ctx, pr->dev, shd, &gstate->ctm, gstate->fill.alpha);
pdf_end_group(csi, pr, &softmask);
}
@@ -549,7 +550,7 @@ pdf_grestore(pdf_run_state *pr)
{
fz_try(ctx)
{
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
fz_catch(ctx)
{
@@ -649,14 +650,14 @@ pdf_show_pattern(pdf_csi *csi, pdf_run_state *pr, pdf_pattern *pat, pdf_gstate *
if (0)
#endif
{
- fz_begin_tile(pr->dev, &local_area, &pat->bbox, pat->xstep, pat->ystep, &ptm);
+ fz_begin_tile(ctx, pr->dev, &local_area, &pat->bbox, pat->xstep, pat->ystep, &ptm);
gstate->ctm = ptm;
pdf_gsave(pr);
pdf_process_contents_object(csi, pat->resources, pat->contents);
pdf_grestore(pr);
while (oldtop < pr->gtop)
pdf_grestore(pr);
- fz_end_tile(pr->dev);
+ fz_end_tile(ctx, pr->dev);
}
else
{
@@ -671,6 +672,13 @@ pdf_show_pattern(pdf_csi *csi, pdf_run_state *pr, pdf_pattern *pat, pdf_gstate *
y0 = floorf(fy0 + 0.001);
x1 = ceilf(fx1 - 0.001);
y1 = ceilf(fy1 - 0.001);
+ /* The above adjustments cause problems for sufficiently
+ * large values for xstep/ystep which may be used if the
+ * pattern is expected to be rendered exactly once. */
+ if (fx1 > fx0 && x1 == x0)
+ x1 = x0 + 1;
+ if (fy1 > fy0 && y1 == y0)
+ y1 = y0 + 1;
for (y = y0; y < y1; y++)
{
@@ -713,6 +721,7 @@ pdf_show_pattern(pdf_csi *csi, pdf_run_state *pr, pdf_pattern *pat, pdf_gstate *
static void
pdf_show_image(pdf_csi *csi, pdf_run_state *pr, fz_image *image)
{
+ fz_context *ctx = pr->ctx;
pdf_gstate *gstate = pr->gstate + pr->gtop;
fz_matrix image_ctm;
fz_rect bbox;
@@ -732,8 +741,8 @@ pdf_show_image(pdf_csi *csi, pdf_run_state *pr, fz_image *image)
{
/* apply blend group even though we skip the soft mask */
if (gstate->blendmode)
- fz_begin_group(pr->dev, &bbox, 0, 0, gstate->blendmode, 1);
- fz_clip_image_mask(pr->dev, image->mask, &bbox, &image_ctm);
+ fz_begin_group(ctx, pr->dev, &bbox, 0, 0, gstate->blendmode, 1);
+ fz_clip_image_mask(ctx, pr->dev, image->mask, &bbox, &image_ctm);
}
else
gstate = pdf_begin_group(csi, pr, &bbox, &softmask);
@@ -746,37 +755,37 @@ pdf_show_image(pdf_csi *csi, pdf_run_state *pr, fz_image *image)
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
- fz_fill_image_mask(pr->dev, image, &image_ctm,
+ fz_fill_image_mask(ctx, pr->dev, image, &image_ctm,
gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->fill.pattern)
{
- fz_clip_image_mask(pr->dev, image, &bbox, &image_ctm);
+ fz_clip_image_mask(ctx, pr->dev, image, &bbox, &image_ctm);
pdf_show_pattern(csi, pr, gstate->fill.pattern, &pr->gstate[gstate->fill.gstate_num], &bbox, PDF_FILL);
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->fill.shade)
{
- fz_clip_image_mask(pr->dev, image, &bbox, &image_ctm);
- fz_fill_shade(pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha);
- fz_pop_clip(pr->dev);
+ fz_clip_image_mask(ctx, pr->dev, image, &bbox, &image_ctm);
+ fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha);
+ fz_pop_clip(ctx, pr->dev);
}
break;
}
}
else
{
- fz_fill_image(pr->dev, image, &image_ctm, gstate->fill.alpha);
+ fz_fill_image(ctx, pr->dev, image, &image_ctm, gstate->fill.alpha);
}
if (image->mask)
{
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
if (gstate->blendmode)
- fz_end_group(pr->dev);
+ fz_end_group(ctx, pr->dev);
}
else
pdf_end_group(csi, pr, &softmask);
@@ -818,7 +827,7 @@ pdf_show_path(pdf_csi *csi, pdf_run_state *pr, int doclose, int dofill, int dost
if (pr->clip)
{
gstate->clip_depth++;
- fz_clip_path(pr->dev, path, &bbox, pr->clip_even_odd, &gstate->ctm);
+ fz_clip_path(ctx, pr->dev, path, &bbox, pr->clip_even_odd, &gstate->ctm);
pr->clip = 0;
}
@@ -842,7 +851,7 @@ pdf_show_path(pdf_csi *csi, pdf_run_state *pr, int doclose, int dofill, int dost
else
{
knockout_group = 1;
- fz_begin_group(pr->dev, &bbox, 0, 1, FZ_BLEND_NORMAL, 1);
+ fz_begin_group(ctx, pr->dev, &bbox, 0, 1, FZ_BLEND_NORMAL, 1);
}
}
@@ -853,24 +862,24 @@ pdf_show_path(pdf_csi *csi, pdf_run_state *pr, int doclose, int dofill, int dost
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
- fz_fill_path(pr->dev, path, even_odd, &gstate->ctm,
+ fz_fill_path(ctx, pr->dev, path, even_odd, &gstate->ctm,
gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->fill.pattern)
{
- fz_clip_path(pr->dev, path, &bbox, even_odd, &gstate->ctm);
+ fz_clip_path(ctx, pr->dev, path, &bbox, even_odd, &gstate->ctm);
pdf_show_pattern(csi, pr, gstate->fill.pattern, &pr->gstate[gstate->fill.gstate_num], &bbox, PDF_FILL);
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->fill.shade)
{
- fz_clip_path(pr->dev, path, &bbox, even_odd, &gstate->ctm);
+ fz_clip_path(ctx, pr->dev, path, &bbox, even_odd, &gstate->ctm);
/* The cluster and page 2 of patterns.pdf shows that fz_fill_shade should NOT be called with gstate->ctm. */
- fz_fill_shade(pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha);
- fz_pop_clip(pr->dev);
+ fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha);
+ fz_pop_clip(ctx, pr->dev);
}
break;
}
@@ -883,37 +892,37 @@ pdf_show_path(pdf_csi *csi, pdf_run_state *pr, int doclose, int dofill, int dost
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
- fz_stroke_path(pr->dev, path, gstate->stroke_state, &gstate->ctm,
+ fz_stroke_path(ctx, pr->dev, path, gstate->stroke_state, &gstate->ctm,
gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->stroke.pattern)
{
- fz_clip_stroke_path(pr->dev, path, &bbox, gstate->stroke_state, &gstate->ctm);
+ fz_clip_stroke_path(ctx, pr->dev, path, &bbox, gstate->stroke_state, &gstate->ctm);
pdf_show_pattern(csi, pr, gstate->stroke.pattern, &pr->gstate[gstate->stroke.gstate_num], &bbox, PDF_STROKE);
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->stroke.shade)
{
- fz_clip_stroke_path(pr->dev, path, &bbox, gstate->stroke_state, &gstate->ctm);
- fz_fill_shade(pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha);
- fz_pop_clip(pr->dev);
+ fz_clip_stroke_path(ctx, pr->dev, path, &bbox, gstate->stroke_state, &gstate->ctm);
+ fz_fill_shade(ctx, pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha);
+ fz_pop_clip(ctx, pr->dev);
}
break;
}
}
if (knockout_group)
- fz_end_group(pr->dev);
+ fz_end_group(ctx, pr->dev);
if (dofill || dostroke)
pdf_end_group(csi, pr, &softmask);
}
fz_always(ctx)
{
- fz_free_path(ctx, path);
+ fz_drop_path(ctx, path);
}
fz_catch(ctx)
{
@@ -971,7 +980,7 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr)
gstate = pdf_begin_group(csi, pr, &tb, &softmask);
if (doinvisible)
- fz_ignore_text(pr->dev, text, &gstate->ctm);
+ fz_ignore_text(ctx, pr->dev, text, &gstate->ctm);
if (dofill)
{
@@ -980,24 +989,24 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr)
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
- fz_fill_text(pr->dev, text, &gstate->ctm,
+ fz_fill_text(ctx, pr->dev, text, &gstate->ctm,
gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->fill.pattern)
{
- fz_clip_text(pr->dev, text, &gstate->ctm, 0);
+ fz_clip_text(ctx, pr->dev, text, &gstate->ctm, 0);
pdf_show_pattern(csi, pr, gstate->fill.pattern, &pr->gstate[gstate->fill.gstate_num], &tb, PDF_FILL);
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->fill.shade)
{
- fz_clip_text(pr->dev, text, &gstate->ctm, 0);
+ fz_clip_text(ctx, pr->dev, text, &gstate->ctm, 0);
/* Page 2 of patterns.pdf shows that fz_fill_shade should NOT be called with gstate->ctm */
- fz_fill_shade(pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha);
- fz_pop_clip(pr->dev);
+ fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha);
+ fz_pop_clip(ctx, pr->dev);
}
break;
}
@@ -1010,23 +1019,23 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr)
case PDF_MAT_NONE:
break;
case PDF_MAT_COLOR:
- fz_stroke_text(pr->dev, text, gstate->stroke_state, &gstate->ctm,
+ fz_stroke_text(ctx, pr->dev, text, gstate->stroke_state, &gstate->ctm,
gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha);
break;
case PDF_MAT_PATTERN:
if (gstate->stroke.pattern)
{
- fz_clip_stroke_text(pr->dev, text, gstate->stroke_state, &gstate->ctm);
+ fz_clip_stroke_text(ctx, pr->dev, text, gstate->stroke_state, &gstate->ctm);
pdf_show_pattern(csi, pr, gstate->stroke.pattern, &pr->gstate[gstate->stroke.gstate_num], &tb, PDF_STROKE);
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
}
break;
case PDF_MAT_SHADE:
if (gstate->stroke.shade)
{
- fz_clip_stroke_text(pr->dev, text, gstate->stroke_state, &gstate->ctm);
- fz_fill_shade(pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha);
- fz_pop_clip(pr->dev);
+ fz_clip_stroke_text(ctx, pr->dev, text, gstate->stroke_state, &gstate->ctm);
+ fz_fill_shade(ctx, pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha);
+ fz_pop_clip(ctx, pr->dev);
}
break;
}
@@ -1036,7 +1045,7 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr)
{
if (pr->accumulate < 2)
gstate->clip_depth++;
- fz_clip_text(pr->dev, text, &gstate->ctm, pr->accumulate);
+ fz_clip_text(ctx, pr->dev, text, &gstate->ctm, pr->accumulate);
pr->accumulate = 2;
}
@@ -1044,7 +1053,7 @@ pdf_flush_text(pdf_csi *csi, pdf_run_state *pr)
}
fz_always(ctx)
{
- fz_free_text(ctx, text);
+ fz_drop_text(ctx, text);
}
fz_catch(ctx)
{
@@ -1224,24 +1233,25 @@ pdf_show_string(pdf_csi *csi, pdf_run_state *pr, unsigned char *buf, int len)
static void
pdf_show_text(pdf_csi *csi, pdf_run_state *pr, pdf_obj *text)
{
+ fz_context *ctx = csi->ctx;
pdf_gstate *gstate = pr->gstate + pr->gtop;
int i;
- if (pdf_is_array(text))
+ if (pdf_is_array(ctx, text))
{
- int n = pdf_array_len(text);
+ int n = pdf_array_len(ctx, text);
for (i = 0; i < n; i++)
{
- pdf_obj *item = pdf_array_get(text, i);
- if (pdf_is_string(item))
- pdf_show_string(csi, pr, (unsigned char *)pdf_to_str_buf(item), pdf_to_str_len(item));
+ pdf_obj *item = pdf_array_get(ctx, text, i);
+ if (pdf_is_string(ctx, item))
+ pdf_show_string(csi, pr, (unsigned char *)pdf_to_str_buf(ctx, item), pdf_to_str_len(ctx, item));
else
- pdf_show_space(pr, - pdf_to_real(item) * gstate->size * 0.001f);
+ pdf_show_space(pr, - pdf_to_real(ctx, item) * gstate->size * 0.001f);
}
}
- else if (pdf_is_string(text))
+ else if (pdf_is_string(ctx, text))
{
- pdf_show_string(csi, pr, (unsigned char *)pdf_to_str_buf(text), pdf_to_str_len(text));
+ pdf_show_string(csi, pr, (unsigned char *)pdf_to_str_buf(ctx, text), pdf_to_str_len(ctx, text));
}
}
@@ -1321,7 +1331,7 @@ pdf_set_colorspace(pdf_csi *csi, pdf_run_state *pr, int what, fz_colorspace *col
mat->v[2] = 0;
mat->v[3] = 1;
- if (pdf_is_tint_colorspace(colorspace))
+ if (pdf_is_tint_colorspace(ctx, colorspace))
{
int i;
for (i = 0; i < colorspace->n; i++)
@@ -1345,7 +1355,7 @@ pdf_set_color(pdf_csi *csi, pdf_run_state *pr, int what, float *v)
{
case PDF_MAT_PATTERN:
case PDF_MAT_COLOR:
- if (fz_colorspace_is_indexed(mat->colorspace))
+ if (fz_colorspace_is_indexed(ctx, mat->colorspace))
{
mat->v[0] = v[0] / 255;
break;
@@ -1404,13 +1414,13 @@ pdf_set_pattern(pdf_csi *csi, pdf_run_state *pr, int what, pdf_pattern *pat, flo
static pdf_font_desc *
load_font_or_hail_mary(pdf_csi *csi, pdf_obj *rdb, pdf_obj *font, int depth)
{
+ fz_context *ctx = csi->ctx;
pdf_document *doc = csi->doc;
- fz_context *ctx = doc->ctx;
pdf_font_desc *desc;
fz_try(ctx)
{
- desc = pdf_load_font(doc, rdb, font, depth);
+ desc = pdf_load_font(ctx, doc, rdb, font, depth);
}
fz_catch(ctx)
{
@@ -1422,7 +1432,7 @@ load_font_or_hail_mary(pdf_csi *csi, pdf_obj *rdb, pdf_obj *font, int depth)
csi->cookie->incomplete++;
}
if (desc == NULL)
- desc = pdf_load_hail_mary_font(doc);
+ desc = pdf_load_hail_mary_font(ctx, doc);
return desc;
}
@@ -1436,18 +1446,18 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
gstate = pdf_flush_text(csi, pr);
- n = pdf_dict_len(extgstate);
+ n = pdf_dict_len(ctx, extgstate);
for (i = 0; i < n; i++)
{
- pdf_obj *key = pdf_dict_get_key(extgstate, i);
- pdf_obj *val = pdf_dict_get_val(extgstate, i);
- char *s = pdf_to_name(key);
+ pdf_obj *key = pdf_dict_get_key(ctx, extgstate, i);
+ pdf_obj *val = pdf_dict_get_val(ctx, extgstate, i);
+ char *s = pdf_to_name(ctx, key);
if (!strcmp(s, "Font"))
{
- if (pdf_is_array(val) && pdf_array_len(val) == 2)
+ if (pdf_is_array(ctx, val) && pdf_array_len(ctx, val) == 2)
{
- pdf_obj *font = pdf_array_get(val, 0);
+ pdf_obj *font = pdf_array_get(ctx, val, 0);
if (gstate->font)
{
@@ -1458,7 +1468,7 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
gstate->font = load_font_or_hail_mary(csi, rdb, font, pr->nested_depth);
if (!gstate->font)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find font in store");
- gstate->size = pdf_to_real(pdf_array_get(val, 1));
+ gstate->size = pdf_to_real(ctx, pdf_array_get(ctx, val, 1));
}
else
fz_throw(ctx, FZ_ERROR_GENERIC, "malformed /Font dictionary");
@@ -1468,61 +1478,61 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
{
pr->dev->flags &= ~(FZ_DEVFLAG_STARTCAP_UNDEFINED | FZ_DEVFLAG_DASHCAP_UNDEFINED | FZ_DEVFLAG_ENDCAP_UNDEFINED);
gstate->stroke_state = fz_unshare_stroke_state(ctx, gstate->stroke_state);
- gstate->stroke_state->start_cap = pdf_to_int(val);
- gstate->stroke_state->dash_cap = pdf_to_int(val);
- gstate->stroke_state->end_cap = pdf_to_int(val);
+ gstate->stroke_state->start_cap = pdf_to_int(ctx, val);
+ gstate->stroke_state->dash_cap = pdf_to_int(ctx, val);
+ gstate->stroke_state->end_cap = pdf_to_int(ctx, val);
}
else if (!strcmp(s, "LW"))
{
pr->dev->flags &= ~FZ_DEVFLAG_LINEWIDTH_UNDEFINED;
gstate->stroke_state = fz_unshare_stroke_state(ctx, gstate->stroke_state);
- gstate->stroke_state->linewidth = pdf_to_real(val);
+ gstate->stroke_state->linewidth = pdf_to_real(ctx, val);
}
else if (!strcmp(s, "LJ"))
{
pr->dev->flags &= ~FZ_DEVFLAG_LINEJOIN_UNDEFINED;
gstate->stroke_state = fz_unshare_stroke_state(ctx, gstate->stroke_state);
- gstate->stroke_state->linejoin = pdf_to_int(val);
+ gstate->stroke_state->linejoin = pdf_to_int(ctx, val);
}
else if (!strcmp(s, "ML"))
{
pr->dev->flags &= ~FZ_DEVFLAG_MITERLIMIT_UNDEFINED;
gstate->stroke_state = fz_unshare_stroke_state(ctx, gstate->stroke_state);
- gstate->stroke_state->miterlimit = pdf_to_real(val);
+ gstate->stroke_state->miterlimit = pdf_to_real(ctx, val);
}
else if (!strcmp(s, "D"))
{
- if (pdf_is_array(val) && pdf_array_len(val) == 2)
+ if (pdf_is_array(ctx, val) && pdf_array_len(ctx, val) == 2)
{
- pdf_obj *dashes = pdf_array_get(val, 0);
- int len = pdf_array_len(dashes);
+ pdf_obj *dashes = pdf_array_get(ctx, val, 0);
+ int len = pdf_array_len(ctx, dashes);
gstate->stroke_state = fz_unshare_stroke_state_with_dash_len(ctx, gstate->stroke_state, len);
gstate->stroke_state->dash_len = len;
for (k = 0; k < len; k++)
- gstate->stroke_state->dash_list[k] = pdf_to_real(pdf_array_get(dashes, k));
- gstate->stroke_state->dash_phase = pdf_to_real(pdf_array_get(val, 1));
+ gstate->stroke_state->dash_list[k] = pdf_to_real(ctx, pdf_array_get(ctx, dashes, k));
+ gstate->stroke_state->dash_phase = pdf_to_real(ctx, pdf_array_get(ctx, val, 1));
}
else
fz_throw(ctx, FZ_ERROR_GENERIC, "malformed /D");
}
else if (!strcmp(s, "CA"))
- gstate->stroke.alpha = fz_clamp(pdf_to_real(val), 0, 1);
+ gstate->stroke.alpha = fz_clamp(pdf_to_real(ctx, val), 0, 1);
else if (!strcmp(s, "ca"))
- gstate->fill.alpha = fz_clamp(pdf_to_real(val), 0, 1);
+ gstate->fill.alpha = fz_clamp(pdf_to_real(ctx, val), 0, 1);
else if (!strcmp(s, "BM"))
{
- if (pdf_is_array(val))
- val = pdf_array_get(val, 0);
- gstate->blendmode = fz_lookup_blendmode(pdf_to_name(val));
+ if (pdf_is_array(ctx, val))
+ val = pdf_array_get(ctx, val, 0);
+ gstate->blendmode = fz_lookup_blendmode(pdf_to_name(ctx, val));
}
else if (!strcmp(s, "SMask"))
{
- if (pdf_is_dict(val))
+ if (pdf_is_dict(ctx, val))
{
pdf_xobject *xobj;
pdf_obj *group, *luminosity, *bc, *tr;
@@ -1533,10 +1543,10 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
gstate->softmask = NULL;
}
- group = pdf_dict_gets(val, "G");
+ group = pdf_dict_gets(ctx, val, "G");
if (!group)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load softmask xobject (%d %d R)", pdf_to_num(val), pdf_to_gen(val));
- xobj = pdf_load_xobject(csi->doc, group);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load softmask xobject (%d %d R)", pdf_to_num(ctx, val), pdf_to_gen(ctx, val));
+ xobj = pdf_load_xobject(ctx, csi->doc, group);
colorspace = xobj->colorspace;
if (!colorspace)
@@ -1549,24 +1559,24 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
for (k = 0; k < colorspace->n; k++)
gstate->softmask_bc[k] = 0;
- bc = pdf_dict_gets(val, "BC");
- if (pdf_is_array(bc))
+ bc = pdf_dict_gets(ctx, val, "BC");
+ if (pdf_is_array(ctx, bc))
{
for (k = 0; k < colorspace->n; k++)
- gstate->softmask_bc[k] = pdf_to_real(pdf_array_get(bc, k));
+ gstate->softmask_bc[k] = pdf_to_real(ctx, pdf_array_get(ctx, bc, k));
}
- luminosity = pdf_dict_gets(val, "S");
- if (pdf_is_name(luminosity) && !strcmp(pdf_to_name(luminosity), "Luminosity"))
+ luminosity = pdf_dict_gets(ctx, val, "S");
+ if (pdf_is_name(ctx, luminosity) && !strcmp(pdf_to_name(ctx, luminosity), "Luminosity"))
gstate->luminosity = 1;
else
gstate->luminosity = 0;
- tr = pdf_dict_gets(val, "TR");
- if (tr && strcmp(pdf_to_name(tr), "Identity"))
+ tr = pdf_dict_gets(ctx, val, "TR");
+ if (tr && strcmp(pdf_to_name(ctx, tr), "Identity"))
fz_warn(ctx, "ignoring transfer function");
}
- else if (pdf_is_name(val) && !strcmp(pdf_to_name(val), "None"))
+ else if (pdf_is_name(ctx, val) && !strcmp(pdf_to_name(ctx, val), "None"))
{
if (gstate->softmask)
{
@@ -1578,15 +1588,15 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
else if (!strcmp(s, "TR2"))
{
- if (strcmp(pdf_to_name(val), "Identity") && strcmp(pdf_to_name(val), "Default"))
+ if (strcmp(pdf_to_name(ctx, val), "Identity") && strcmp(pdf_to_name(ctx, val), "Default"))
fz_warn(ctx, "ignoring transfer function");
}
else if (!strcmp(s, "TR"))
{
/* TR is ignored in the presence of TR2 */
- pdf_obj *tr2 = pdf_dict_gets(extgstate, "TR2");
- if (tr2 && strcmp(pdf_to_name(val), "Identity"))
+ pdf_obj *tr2 = pdf_dict_gets(ctx, extgstate, "TR2");
+ if (tr2 && strcmp(pdf_to_name(ctx, val), "Identity"))
fz_warn(ctx, "ignoring transfer function");
}
}
@@ -1595,7 +1605,7 @@ pdf_run_extgstate(pdf_csi *csi, pdf_run_state *pr, pdf_obj *rdb, pdf_obj *extgst
static void
run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, const fz_matrix *transform)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_gstate *gstate = NULL;
int oldtop = 0;
fz_matrix local_transform = *transform;
@@ -1607,7 +1617,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co
char errmess[256] = "";
/* Avoid infinite recursion */
- if (xobj == NULL || pdf_mark_obj(xobj->me))
+ if (xobj == NULL || pdf_mark_obj(ctx, xobj->me))
return;
fz_var(cleanup_state);
@@ -1646,7 +1656,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co
/* Remember that we tried to call fz_begin_group. Even
* if it throws an error, we must call fz_end_group. */
cleanup_state = 2;
- fz_begin_group(pr->dev, &bbox,
+ fz_begin_group(ctx, pr->dev, &bbox,
xobj->isolated, xobj->knockout, gstate->blendmode, gstate->fill.alpha);
gstate->blendmode = 0;
@@ -1687,7 +1697,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co
{
fz_try(ctx)
{
- fz_end_group(pr->dev);
+ fz_end_group(ctx, pr->dev);
}
fz_catch(ctx)
{
@@ -1720,7 +1730,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co
pdf_grestore(pr);
}
- pdf_unmark_obj(xobj->me);
+ pdf_unmark_obj(ctx, xobj->me);
}
fz_catch(ctx)
{
@@ -1734,6 +1744,7 @@ run_xobject(pdf_csi *csi, void *state, pdf_obj *resources, pdf_xobject *xobj, co
static void pdf_run_BDC(pdf_csi *csi, void *state)
{
+ fz_context *ctx = csi->ctx;
pdf_run_state *pr = (pdf_run_state *)state;
pdf_obj *ocg;
pdf_obj *rdb = csi->rdb;
@@ -1751,9 +1762,9 @@ static void pdf_run_BDC(pdf_csi *csi, void *state)
return;
}
- if (pdf_is_name(csi->obj))
+ if (pdf_is_name(ctx, csi->obj))
{
- ocg = pdf_dict_gets(pdf_dict_gets(rdb, "Properties"), pdf_to_name(csi->obj));
+ ocg = pdf_dict_gets(ctx, pdf_dict_gets(ctx, rdb, "Properties"), pdf_to_name(ctx, csi->obj));
}
else
ocg = csi->obj;
@@ -1764,7 +1775,7 @@ static void pdf_run_BDC(pdf_csi *csi, void *state)
* means visible. */
return;
}
- if (strcmp(pdf_to_name(pdf_dict_gets(ocg, "Type")), "OCG") != 0)
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, ocg, "Type")), "OCG") != 0)
{
/* Wrong type of property */
return;
@@ -1840,13 +1851,13 @@ static void pdf_run_cs_imp(pdf_csi *csi, pdf_run_state *pr, int what)
colorspace = fz_device_cmyk(ctx); /* No fz_keep_colorspace as static */
else
{
- dict = pdf_dict_gets(rdb, "ColorSpace");
+ dict = pdf_dict_gets(ctx, rdb, "ColorSpace");
if (!dict)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find ColorSpace dictionary");
- obj = pdf_dict_gets(dict, csi->name);
+ obj = pdf_dict_gets(ctx, dict, csi->name);
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find colorspace resource '%s'", csi->name);
- colorspace = pdf_load_colorspace(csi->doc, obj);
+ colorspace = pdf_load_colorspace(ctx, csi->doc, obj);
}
pdf_set_colorspace(csi, pr, what, colorspace);
@@ -1880,39 +1891,39 @@ static void pdf_run_DP(pdf_csi *csi, void *state)
static void pdf_run_Do(pdf_csi *csi, void *state)
{
pdf_run_state *pr = (pdf_run_state *)state;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_obj *dict;
pdf_obj *obj;
pdf_obj *subtype;
pdf_obj *rdb = csi->rdb;
- dict = pdf_dict_gets(rdb, "XObject");
+ dict = pdf_dict_gets(ctx, rdb, "XObject");
if (!dict)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find XObject dictionary when looking for: '%s'", csi->name);
- obj = pdf_dict_gets(dict, csi->name);
+ obj = pdf_dict_gets(ctx, dict, csi->name);
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find xobject resource: '%s'", csi->name);
- subtype = pdf_dict_gets(obj, "Subtype");
- if (!pdf_is_name(subtype))
+ subtype = pdf_dict_gets(ctx, obj, "Subtype");
+ if (!pdf_is_name(ctx, subtype))
fz_throw(ctx, FZ_ERROR_GENERIC, "no XObject subtype specified");
- if (pdf_is_hidden_ocg(pdf_dict_gets(obj, "OC"), csi, pr, rdb))
+ if (pdf_is_hidden_ocg(pdf_dict_gets(ctx, obj, "OC"), csi, pr, rdb))
return;
- if (!strcmp(pdf_to_name(subtype), "Form") && pdf_dict_gets(obj, "Subtype2"))
- subtype = pdf_dict_gets(obj, "Subtype2");
+ if (!strcmp(pdf_to_name(ctx, subtype), "Form") && pdf_dict_gets(ctx, obj, "Subtype2"))
+ subtype = pdf_dict_gets(ctx, obj, "Subtype2");
- if (!strcmp(pdf_to_name(subtype), "Form"))
+ if (!strcmp(pdf_to_name(ctx, subtype), "Form"))
{
pdf_xobject *xobj;
- xobj = pdf_load_xobject(csi->doc, obj);
+ xobj = pdf_load_xobject(ctx, csi->doc, obj);
/* Inherit parent resources, in case this one was empty XXX check where it's loaded */
if (!xobj->resources)
- xobj->resources = pdf_keep_obj(rdb);
+ xobj->resources = pdf_keep_obj(ctx, rdb);
fz_try(ctx)
{
@@ -1924,15 +1935,15 @@ static void pdf_run_Do(pdf_csi *csi, void *state)
}
fz_catch(ctx)
{
- fz_rethrow_message(ctx, "cannot draw xobject (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ fz_rethrow_message(ctx, "cannot draw xobject (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
}
- else if (!strcmp(pdf_to_name(subtype), "Image"))
+ else if (!strcmp(pdf_to_name(ctx, subtype), "Image"))
{
if ((pr->dev->hints & FZ_IGNORE_IMAGE) == 0)
{
- fz_image *img = pdf_load_image(csi->doc, obj);
+ fz_image *img = pdf_load_image(ctx, csi->doc, obj);
fz_try(ctx)
{
@@ -1949,14 +1960,14 @@ static void pdf_run_Do(pdf_csi *csi, void *state)
}
}
- else if (!strcmp(pdf_to_name(subtype), "PS"))
+ else if (!strcmp(pdf_to_name(ctx, subtype), "PS"))
{
fz_warn(ctx, "ignoring XObject with subtype PS");
}
else
{
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown XObject subtype: '%s'", pdf_to_name(subtype));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown XObject subtype: '%s'", pdf_to_name(ctx, subtype));
}
}
@@ -1992,7 +2003,7 @@ static void pdf_run_G(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pr->dev->flags &= ~FZ_DEVFLAG_STROKECOLOR_UNDEFINED;
- pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_gray(csi->doc->ctx));
+ pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_gray(csi->ctx));
pdf_set_color(csi, pr, PDF_STROKE, csi->stack);
}
@@ -2002,7 +2013,7 @@ static void pdf_run_J(pdf_csi *csi, void *state)
pdf_gstate *gstate = pr->gstate + pr->gtop;
pr->dev->flags &= ~(FZ_DEVFLAG_STARTCAP_UNDEFINED | FZ_DEVFLAG_DASHCAP_UNDEFINED | FZ_DEVFLAG_ENDCAP_UNDEFINED);
- gstate->stroke_state = fz_unshare_stroke_state(csi->doc->ctx, gstate->stroke_state);
+ gstate->stroke_state = fz_unshare_stroke_state(csi->ctx, gstate->stroke_state);
gstate->stroke_state->start_cap = csi->stack[0];
gstate->stroke_state->dash_cap = csi->stack[0];
gstate->stroke_state->end_cap = csi->stack[0];
@@ -2013,7 +2024,7 @@ static void pdf_run_K(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pr->dev->flags &= ~FZ_DEVFLAG_STROKECOLOR_UNDEFINED;
- pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_cmyk(csi->doc->ctx));
+ pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_cmyk(csi->ctx));
pdf_set_color(csi, pr, PDF_STROKE, csi->stack);
}
@@ -2023,7 +2034,7 @@ static void pdf_run_M(pdf_csi *csi, void *state)
pdf_gstate *gstate = pr->gstate + pr->gtop;
pr->dev->flags &= ~FZ_DEVFLAG_MITERLIMIT_UNDEFINED;
- gstate->stroke_state = fz_unshare_stroke_state(csi->doc->ctx, gstate->stroke_state);
+ gstate->stroke_state = fz_unshare_stroke_state(csi->ctx, gstate->stroke_state);
gstate->stroke_state->miterlimit = csi->stack[0];
}
@@ -2043,7 +2054,7 @@ static void pdf_run_RG(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pr->dev->flags &= ~FZ_DEVFLAG_STROKECOLOR_UNDEFINED;
- pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_rgb(csi->doc->ctx));
+ pdf_set_colorspace(csi, pr, PDF_STROKE, fz_device_rgb(csi->ctx));
pdf_set_color(csi, pr, PDF_STROKE, csi->stack);
}
@@ -2077,33 +2088,33 @@ static void pdf_run_SC_imp(pdf_csi *csi, pdf_run_state *pr, int what, pdf_materi
break;
case PDF_MAT_PATTERN:
- dict = pdf_dict_gets(rdb, "Pattern");
+ dict = pdf_dict_gets(ctx, rdb, "Pattern");
if (!dict)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find Pattern dictionary");
- obj = pdf_dict_gets(dict, csi->name);
+ obj = pdf_dict_gets(ctx, dict, csi->name);
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find pattern resource '%s'", csi->name);
- patterntype = pdf_dict_gets(obj, "PatternType");
+ patterntype = pdf_dict_gets(ctx, obj, "PatternType");
- if (pdf_to_int(patterntype) == 1)
+ if (pdf_to_int(ctx, patterntype) == 1)
{
pdf_pattern *pat;
- pat = pdf_load_pattern(csi->doc, obj);
+ pat = pdf_load_pattern(ctx, csi->doc, obj);
pdf_set_pattern(csi, pr, what, pat, csi->top > 0 ? csi->stack : NULL);
pdf_drop_pattern(ctx, pat);
}
- else if (pdf_to_int(patterntype) == 2)
+ else if (pdf_to_int(ctx, patterntype) == 2)
{
fz_shade *shd;
- shd = pdf_load_shading(csi->doc, obj);
+ shd = pdf_load_shading(ctx, csi->doc, obj);
pdf_set_shade(csi, pr, what, shd);
fz_drop_shade(ctx, shd);
}
else
{
- fz_throw(ctx, FZ_ERROR_GENERIC, "unknown pattern type: %d", pdf_to_int(patterntype));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unknown pattern type: %d", pdf_to_int(ctx, patterntype));
}
break;
@@ -2168,7 +2179,7 @@ static void pdf_run_TL(pdf_csi *csi, void *state)
static void pdf_run_Tf(pdf_csi *csi, void *state)
{
pdf_run_state *pr = (pdf_run_state *)state;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_obj *rdb = csi->rdb;
pdf_gstate *gstate = pr->gstate + pr->gtop;
pdf_obj *dict;
@@ -2179,11 +2190,11 @@ static void pdf_run_Tf(pdf_csi *csi, void *state)
pdf_drop_font(ctx, gstate->font);
gstate->font = NULL;
- dict = pdf_dict_gets(rdb, "Font");
+ dict = pdf_dict_gets(ctx, rdb, "Font");
if (!dict)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find Font dictionary");
- obj = pdf_dict_gets(dict, csi->name);
+ obj = pdf_dict_gets(ctx, dict, csi->name);
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find font resource: '%s'", csi->name);
@@ -2307,7 +2318,7 @@ static void pdf_run_c(pdf_csi *csi, void *state)
d = csi->stack[3];
e = csi->stack[4];
f = csi->stack[5];
- fz_curveto(csi->doc->ctx, pr->path, a, b, c, d, e, f);
+ fz_curveto(csi->ctx, pr->path, a, b, c, d, e, f);
}
static void pdf_run_cm(pdf_csi *csi, void *state)
@@ -2329,6 +2340,7 @@ static void pdf_run_cm(pdf_csi *csi, void *state)
static void pdf_run_d(pdf_csi *csi, void *state)
{
+ fz_context *ctx = csi->ctx;
pdf_run_state *pr = (pdf_run_state *)state;
pdf_gstate *gstate = pr->gstate + pr->gtop;
pdf_obj *array;
@@ -2336,11 +2348,11 @@ static void pdf_run_d(pdf_csi *csi, void *state)
int len;
array = csi->obj;
- len = pdf_array_len(array);
- gstate->stroke_state = fz_unshare_stroke_state_with_dash_len(csi->doc->ctx, gstate->stroke_state, len);
+ len = pdf_array_len(ctx, array);
+ gstate->stroke_state = fz_unshare_stroke_state_with_dash_len(csi->ctx, gstate->stroke_state, len);
gstate->stroke_state->dash_len = len;
for (i = 0; i < len; i++)
- gstate->stroke_state->dash_list[i] = pdf_to_real(pdf_array_get(array, i));
+ gstate->stroke_state->dash_list[i] = pdf_to_real(ctx, pdf_array_get(ctx, array, i));
gstate->stroke_state->dash_phase = csi->stack[0];
}
@@ -2389,7 +2401,7 @@ static void pdf_run_g(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pr->dev->flags &= ~FZ_DEVFLAG_FILLCOLOR_UNDEFINED;
- pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_gray(csi->doc->ctx));
+ pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_gray(csi->ctx));
pdf_set_color(csi, pr, PDF_FILL, csi->stack);
}
@@ -2398,14 +2410,14 @@ static void pdf_run_gs(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pdf_obj *dict;
pdf_obj *obj;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_obj *rdb = csi->rdb;
- dict = pdf_dict_gets(rdb, "ExtGState");
+ dict = pdf_dict_gets(ctx, rdb, "ExtGState");
if (!dict)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find ExtGState dictionary");
- obj = pdf_dict_gets(dict, csi->name);
+ obj = pdf_dict_gets(ctx, dict, csi->name);
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find extgstate resource '%s'", csi->name);
@@ -2416,7 +2428,7 @@ static void pdf_run_h(pdf_csi *csi, void *state)
{
pdf_run_state *pr = (pdf_run_state *)state;
- fz_closepath(csi->doc->ctx, pr->path);
+ fz_closepath(csi->ctx, pr->path);
}
static void pdf_run_i(pdf_csi *csi, void *state)
@@ -2429,7 +2441,7 @@ static void pdf_run_j(pdf_csi *csi, void *state)
pdf_gstate *gstate = pr->gstate + pr->gtop;
pr->dev->flags &= ~FZ_DEVFLAG_LINEJOIN_UNDEFINED;
- gstate->stroke_state = fz_unshare_stroke_state(csi->doc->ctx, gstate->stroke_state);
+ gstate->stroke_state = fz_unshare_stroke_state(csi->ctx, gstate->stroke_state);
gstate->stroke_state->linejoin = csi->stack[0];
}
@@ -2438,7 +2450,7 @@ static void pdf_run_k(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pr->dev->flags &= ~FZ_DEVFLAG_FILLCOLOR_UNDEFINED;
- pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_cmyk(csi->doc->ctx));
+ pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_cmyk(csi->ctx));
pdf_set_color(csi, pr, PDF_FILL, csi->stack);
}
@@ -2449,7 +2461,7 @@ static void pdf_run_l(pdf_csi *csi, void *state)
a = csi->stack[0];
b = csi->stack[1];
- fz_lineto(csi->doc->ctx, pr->path, a, b);
+ fz_lineto(csi->ctx, pr->path, a, b);
}
static void pdf_run_m(pdf_csi *csi, void *state)
@@ -2459,7 +2471,7 @@ static void pdf_run_m(pdf_csi *csi, void *state)
a = csi->stack[0];
b = csi->stack[1];
- fz_moveto(csi->doc->ctx, pr->path, a, b);
+ fz_moveto(csi->ctx, pr->path, a, b);
}
static void pdf_run_n(pdf_csi *csi, void *state)
@@ -2479,7 +2491,7 @@ static void pdf_run_q(pdf_csi *csi, void *state)
static void pdf_run_re(pdf_csi *csi, void *state)
{
pdf_run_state *pr = (pdf_run_state *)state;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
float x, y, w, h;
x = csi->stack[0];
@@ -2499,7 +2511,7 @@ static void pdf_run_rg(pdf_csi *csi, void *state)
pdf_run_state *pr = (pdf_run_state *)state;
pr->dev->flags &= ~FZ_DEVFLAG_FILLCOLOR_UNDEFINED;
- pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_rgb(csi->doc->ctx));
+ pdf_set_colorspace(csi, pr, PDF_FILL, fz_device_rgb(csi->ctx));
pdf_set_color(csi, pr, PDF_FILL, csi->stack);
}
@@ -2517,23 +2529,23 @@ static void pdf_run_s(pdf_csi *csi, void *state)
static void pdf_run_sh(pdf_csi *csi, void *state)
{
pdf_run_state *pr = (pdf_run_state *)state;
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_obj *rdb = csi->rdb;
pdf_obj *dict;
pdf_obj *obj;
fz_shade *shd;
- dict = pdf_dict_gets(rdb, "Shading");
+ dict = pdf_dict_gets(ctx, rdb, "Shading");
if (!dict)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find shading dictionary");
- obj = pdf_dict_gets(dict, csi->name);
+ obj = pdf_dict_gets(ctx, dict, csi->name);
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find shading resource: '%s'", csi->name);
if ((pr->dev->hints & FZ_IGNORE_SHADE) == 0)
{
- shd = pdf_load_shading(csi->doc, obj);
+ shd = pdf_load_shading(ctx, csi->doc, obj);
fz_try(ctx)
{
@@ -2559,7 +2571,7 @@ static void pdf_run_v(pdf_csi *csi, void *state)
b = csi->stack[1];
c = csi->stack[2];
d = csi->stack[3];
- fz_curvetov(csi->doc->ctx, pr->path, a, b, c, d);
+ fz_curvetov(csi->ctx, pr->path, a, b, c, d);
}
static void pdf_run_w(pdf_csi *csi, void *state)
@@ -2569,7 +2581,7 @@ static void pdf_run_w(pdf_csi *csi, void *state)
gstate = pdf_flush_text(csi, pr); /* linewidth affects stroked text rendering mode */
pr->dev->flags &= ~FZ_DEVFLAG_LINEWIDTH_UNDEFINED;
- gstate->stroke_state = fz_unshare_stroke_state(csi->doc->ctx, gstate->stroke_state);
+ gstate->stroke_state = fz_unshare_stroke_state(csi->ctx, gstate->stroke_state);
gstate->stroke_state->linewidth = csi->stack[0];
}
@@ -2582,7 +2594,7 @@ static void pdf_run_y(pdf_csi *csi, void *state)
b = csi->stack[1];
c = csi->stack[2];
d = csi->stack[3];
- fz_curvetoy(csi->doc->ctx, pr->path, a, b, c, d);
+ fz_curvetoy(csi->ctx, pr->path, a, b, c, d);
}
static void pdf_run_squote(pdf_csi *csi, void *state)
@@ -2618,7 +2630,7 @@ static void pdf_run_dquote(pdf_csi *csi, void *state)
static void free_processor_normal(pdf_csi *csi, void *state)
{
- fz_context *ctx = csi->doc->ctx;
+ fz_context *ctx = csi->ctx;
pdf_run_state *pr = (pdf_run_state *)state;
while (pr->gtop)
@@ -2633,10 +2645,10 @@ static void free_processor_normal(pdf_csi *csi, void *state)
fz_drop_stroke_state(ctx, pr->gstate[0].stroke_state);
while (pr->gstate[0].clip_depth--)
- fz_pop_clip(pr->dev);
+ fz_pop_clip(ctx, pr->dev);
- if (pr->path) fz_free_path(ctx, pr->path);
- if (pr->text) fz_free_text(ctx, pr->text);
+ if (pr->path) fz_drop_path(ctx, pr->path);
+ if (pr->text) fz_drop_text(ctx, pr->text);
fz_free(ctx, pr->gstate);
fz_free(ctx, pr);
@@ -2649,10 +2661,10 @@ process_annot(pdf_csi *csi, void *state, pdf_obj *resources, pdf_annot *annot)
fz_context *ctx = pr->ctx;
int flags;
- if (pdf_is_hidden_ocg(pdf_dict_gets(annot->obj, "OC"), csi, pr, resources))
+ if (pdf_is_hidden_ocg(pdf_dict_gets(ctx, annot->obj, "OC"), csi, pr, resources))
return;
- flags = pdf_to_int(pdf_dict_gets(annot->obj, "F"));
+ flags = pdf_to_int(ctx, pdf_dict_gets(ctx, annot->obj, "F"));
if (!strcmp(pr->event, "Print") && !(flags & (1 << 2))) /* Print */
return;
if (!strcmp(pr->event, "View") && (flags & (1 << 5))) /* NoView */
@@ -2803,9 +2815,8 @@ const pdf_processor pdf_processor_normal =
process_contents
};
-pdf_process *pdf_process_run(pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested)
+pdf_process *pdf_init_process_run(fz_context *ctx, pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested)
{
- fz_context *ctx = dev->ctx;
pdf_run_state *pr;
pr = fz_malloc_struct(ctx, pdf_run_state);
@@ -2842,7 +2853,7 @@ pdf_process *pdf_process_run(pdf_process *process, fz_device *dev, const fz_matr
}
fz_catch(ctx)
{
- fz_free_path(ctx, pr->path);
+ fz_drop_path(ctx, pr->path);
fz_free(ctx, pr);
fz_rethrow(ctx);
}
diff --git a/source/pdf/pdf-outline.c b/source/pdf/pdf-outline.c
index 44273dda..34bb79ed 100644
--- a/source/pdf/pdf-outline.c
+++ b/source/pdf/pdf-outline.c
@@ -1,9 +1,8 @@
#include "mupdf/pdf.h"
static fz_outline *
-pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict)
+pdf_load_outline_imp(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
- fz_context *ctx = doc->ctx;
fz_outline *node, **prev, *first;
pdf_obj *obj;
pdf_obj *odict = dict;
@@ -15,9 +14,9 @@ pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict)
{
first = NULL;
prev = &first;
- while (dict && pdf_is_dict(dict))
+ while (dict && pdf_is_dict(ctx, dict))
{
- if (pdf_mark_obj(dict))
+ if (pdf_mark_obj(ctx, dict))
break;
node = fz_malloc_struct(ctx, fz_outline);
node->title = NULL;
@@ -27,30 +26,30 @@ pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict)
*prev = node;
prev = &node->next;
- obj = pdf_dict_gets(dict, "Title");
+ obj = pdf_dict_gets(ctx, dict, "Title");
if (obj)
- node->title = pdf_to_utf8(doc, obj);
+ node->title = pdf_to_utf8(ctx, doc, obj);
- if ((obj = pdf_dict_gets(dict, "Dest")) != NULL)
- node->dest = pdf_parse_link_dest(doc, FZ_LINK_GOTO, obj);
- else if ((obj = pdf_dict_gets(dict, "A")) != NULL)
- node->dest = pdf_parse_action(doc, obj);
+ if ((obj = pdf_dict_gets(ctx, dict, "Dest")) != NULL)
+ node->dest = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTO, obj);
+ else if ((obj = pdf_dict_gets(ctx, dict, "A")) != NULL)
+ node->dest = pdf_parse_action(ctx, doc, obj);
- obj = pdf_dict_gets(dict, "First");
+ obj = pdf_dict_gets(ctx, dict, "First");
if (obj)
- node->down = pdf_load_outline_imp(doc, obj);
+ node->down = pdf_load_outline_imp(ctx, doc, obj);
- dict = pdf_dict_gets(dict, "Next");
+ dict = pdf_dict_gets(ctx, dict, "Next");
}
}
fz_always(ctx)
{
- for (dict = odict; dict && pdf_obj_marked(dict); dict = pdf_dict_gets(dict, "Next"))
- pdf_unmark_obj(dict);
+ for (dict = odict; dict && pdf_obj_marked(ctx, dict); dict = pdf_dict_gets(ctx, dict, "Next"))
+ pdf_unmark_obj(ctx, dict);
}
fz_catch(ctx)
{
- fz_free_outline(ctx, first);
+ fz_drop_outline(ctx, first);
fz_rethrow(ctx);
}
@@ -58,15 +57,15 @@ pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict)
}
fz_outline *
-pdf_load_outline(pdf_document *doc)
+pdf_load_outline(fz_context *ctx, pdf_document *doc)
{
pdf_obj *root, *obj, *first;
- root = pdf_dict_gets(pdf_trailer(doc), "Root");
- obj = pdf_dict_gets(root, "Outlines");
- first = pdf_dict_gets(obj, "First");
+ root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ obj = pdf_dict_gets(ctx, root, "Outlines");
+ first = pdf_dict_gets(ctx, obj, "First");
if (first)
- return pdf_load_outline_imp(doc, first);
+ return pdf_load_outline_imp(ctx, doc, first);
return NULL;
}
diff --git a/source/pdf/pdf-page.c b/source/pdf/pdf-page.c
index 6543b7dc..7917afbf 100644
--- a/source/pdf/pdf-page.c
+++ b/source/pdf/pdf-page.c
@@ -1,12 +1,12 @@
#include "mupdf/pdf.h"
int
-pdf_count_pages(pdf_document *doc)
+pdf_count_pages(fz_context *ctx, pdf_document *doc)
{
if (doc->page_count == 0)
{
- pdf_obj *count = pdf_dict_getp(pdf_trailer(doc), "Root/Pages/Count");
- doc->page_count = pdf_to_int(count);
+ pdf_obj *count = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/Pages/Count");
+ doc->page_count = pdf_to_int(ctx, count);
}
return doc->page_count;
}
@@ -17,9 +17,8 @@ enum
};
static pdf_obj *
-pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **parentp, int *indexp)
+pdf_lookup_page_loc_imp(fz_context *ctx, pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **parentp, int *indexp)
{
- fz_context *ctx = doc->ctx;
pdf_obj *kids;
pdf_obj *hit = NULL;
int i, len;
@@ -37,8 +36,8 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p
{
do
{
- kids = pdf_dict_gets(node, "Kids");
- len = pdf_array_len(kids);
+ kids = pdf_dict_gets(ctx, node, "Kids");
+ len = pdf_array_len(ctx, kids);
if (len == 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "Malformed pages tree");
@@ -57,16 +56,16 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p
}
stack[stack_len++] = node;
- if (pdf_mark_obj(node))
+ if (pdf_mark_obj(ctx, node))
fz_throw(ctx, FZ_ERROR_GENERIC, "cycle in page tree");
for (i = 0; i < len; i++)
{
- pdf_obj *kid = pdf_array_get(kids, i);
- char *type = pdf_to_name(pdf_dict_gets(kid, "Type"));
- if (*type ? !strcmp(type, "Pages") : pdf_dict_gets(kid, "Kids") && !pdf_dict_gets(kid, "MediaBox"))
+ pdf_obj *kid = pdf_array_get(ctx, kids, i);
+ char *type = pdf_to_name(ctx, pdf_dict_gets(ctx, kid, "Type"));
+ if (*type ? !strcmp(type, "Pages") : pdf_dict_gets(ctx, kid, "Kids") && !pdf_dict_gets(ctx, kid, "MediaBox"))
{
- int count = pdf_to_int(pdf_dict_gets(kid, "Count"));
+ int count = pdf_to_int(ctx, pdf_dict_gets(ctx, kid, "Count"));
if (*skip < count)
{
node = kid;
@@ -79,7 +78,7 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p
}
else
{
- if (*type ? strcmp(type, "Page") != 0 : !pdf_dict_gets(kid, "MediaBox"))
+ if (*type ? strcmp(type, "Page") != 0 : !pdf_dict_gets(ctx, kid, "MediaBox"))
fz_warn(ctx, "non-page object in page tree (%s)", type);
if (*skip == 0)
{
@@ -100,7 +99,7 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p
fz_always(ctx)
{
for (i = stack_len; i > 0; i--)
- pdf_unmark_obj(stack[i-1]);
+ pdf_unmark_obj(ctx, stack[i-1]);
if (stack != &local_stack[0])
fz_free(ctx, stack);
}
@@ -113,74 +112,73 @@ pdf_lookup_page_loc_imp(pdf_document *doc, pdf_obj *node, int *skip, pdf_obj **p
}
pdf_obj *
-pdf_lookup_page_loc(pdf_document *doc, int needle, pdf_obj **parentp, int *indexp)
+pdf_lookup_page_loc(fz_context *ctx, pdf_document *doc, int needle, pdf_obj **parentp, int *indexp)
{
- pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root");
- pdf_obj *node = pdf_dict_gets(root, "Pages");
+ pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pdf_obj *node = pdf_dict_gets(ctx, root, "Pages");
int skip = needle;
pdf_obj *hit;
if (!node)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find page tree");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page tree");
- hit = pdf_lookup_page_loc_imp(doc, node, &skip, parentp, indexp);
+ hit = pdf_lookup_page_loc_imp(ctx, doc, node, &skip, parentp, indexp);
if (!hit)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find page %d in page tree", needle);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page %d in page tree", needle);
return hit;
}
pdf_obj *
-pdf_lookup_page_obj(pdf_document *doc, int needle)
+pdf_lookup_page_obj(fz_context *ctx, pdf_document *doc, int needle)
{
- return pdf_lookup_page_loc(doc, needle, NULL, NULL);
+ return pdf_lookup_page_loc(ctx, doc, needle, NULL, NULL);
}
static int
-pdf_count_pages_before_kid(pdf_document *doc, pdf_obj *parent, int kid_num)
+pdf_count_pages_before_kid(fz_context *ctx, pdf_document *doc, pdf_obj *parent, int kid_num)
{
- pdf_obj *kids = pdf_dict_gets(parent, "Kids");
- int i, total = 0, len = pdf_array_len(kids);
+ pdf_obj *kids = pdf_dict_gets(ctx, parent, "Kids");
+ int i, total = 0, len = pdf_array_len(ctx, kids);
for (i = 0; i < len; i++)
{
- pdf_obj *kid = pdf_array_get(kids, i);
- if (pdf_to_num(kid) == kid_num)
+ pdf_obj *kid = pdf_array_get(ctx, kids, i);
+ if (pdf_to_num(ctx, kid) == kid_num)
return total;
- if (!strcmp(pdf_to_name(pdf_dict_gets(kid, "Type")), "Pages"))
+ if (!strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, kid, "Type")), "Pages"))
{
- pdf_obj *count = pdf_dict_gets(kid, "Count");
- int n = pdf_to_int(count);
- if (!pdf_is_int(count) || n < 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "illegal or missing count in pages tree");
+ pdf_obj *count = pdf_dict_gets(ctx, kid, "Count");
+ int n = pdf_to_int(ctx, count);
+ if (!pdf_is_int(ctx, count) || n < 0)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "illegal or missing count in pages tree");
total += n;
}
else
total++;
}
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "kid not found in parent's kids array");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "kid not found in parent's kids array");
}
int
-pdf_lookup_page_number(pdf_document *doc, pdf_obj *node)
+pdf_lookup_page_number(fz_context *ctx, pdf_document *doc, pdf_obj *node)
{
- fz_context *ctx = doc->ctx;
- int needle = pdf_to_num(node);
+ int needle = pdf_to_num(ctx, node);
int total = 0;
pdf_obj *parent, *parent2;
- if (strcmp(pdf_to_name(pdf_dict_gets(node, "Type")), "Page") != 0)
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, node, "Type")), "Page") != 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "invalid page object");
- parent2 = parent = pdf_dict_gets(node, "Parent");
+ parent2 = parent = pdf_dict_gets(ctx, node, "Parent");
fz_var(parent);
fz_try(ctx)
{
- while (pdf_is_dict(parent))
+ while (pdf_is_dict(ctx, parent))
{
- if (pdf_mark_obj(parent))
+ if (pdf_mark_obj(ctx, parent))
fz_throw(ctx, FZ_ERROR_GENERIC, "cycle in page tree (parents)");
- total += pdf_count_pages_before_kid(doc, parent, needle);
- needle = pdf_to_num(parent);
- parent = pdf_dict_gets(parent, "Parent");
+ total += pdf_count_pages_before_kid(ctx, doc, parent, needle);
+ needle = pdf_to_num(ctx, parent);
+ parent = pdf_dict_gets(ctx, parent, "Parent");
}
}
fz_always(ctx)
@@ -188,10 +186,10 @@ pdf_lookup_page_number(pdf_document *doc, pdf_obj *node)
/* Run back and unmark */
while (parent2)
{
- pdf_unmark_obj(parent2);
+ pdf_unmark_obj(ctx, parent2);
if (parent2 == parent)
break;
- parent2 = pdf_dict_gets(parent2, "Parent");
+ parent2 = pdf_dict_gets(ctx, parent2, "Parent");
}
}
fz_catch(ctx)
@@ -203,9 +201,8 @@ pdf_lookup_page_number(pdf_document *doc, pdf_obj *node)
}
static pdf_obj *
-pdf_lookup_inherited_page_item(pdf_document *doc, pdf_obj *node, const char *key)
+pdf_lookup_inherited_page_item(fz_context *ctx, pdf_document *doc, pdf_obj *node, const char *key)
{
- fz_context *ctx = doc->ctx;
pdf_obj *node2 = node;
pdf_obj *val;
@@ -215,12 +212,12 @@ pdf_lookup_inherited_page_item(pdf_document *doc, pdf_obj *node, const char *key
{
do
{
- val = pdf_dict_gets(node, key);
+ val = pdf_dict_gets(ctx, node, key);
if (val)
break;
- if (pdf_mark_obj(node))
+ if (pdf_mark_obj(ctx, node))
fz_throw(ctx, FZ_ERROR_GENERIC, "cycle in page tree (parents)");
- node = pdf_dict_gets(node, "Parent");
+ node = pdf_dict_gets(ctx, node, "Parent");
}
while (node);
}
@@ -228,10 +225,10 @@ pdf_lookup_inherited_page_item(pdf_document *doc, pdf_obj *node, const char *key
{
do
{
- pdf_unmark_obj(node2);
+ pdf_unmark_obj(ctx, node2);
if (node2 == node)
break;
- node2 = pdf_dict_gets(node2, "Parent");
+ node2 = pdf_dict_gets(ctx, node2, "Parent");
}
while (node2);
}
@@ -245,41 +242,40 @@ pdf_lookup_inherited_page_item(pdf_document *doc, pdf_obj *node, const char *key
/* We need to know whether to install a page-level transparency group */
-static int pdf_resources_use_blending(pdf_document *doc, pdf_obj *rdb);
+static int pdf_resources_use_blending(fz_context *ctx, pdf_document *doc, pdf_obj *rdb);
static int
-pdf_extgstate_uses_blending(pdf_document *doc, pdf_obj *dict)
+pdf_extgstate_uses_blending(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
- pdf_obj *obj = pdf_dict_gets(dict, "BM");
- if (pdf_is_name(obj) && strcmp(pdf_to_name(obj), "Normal"))
+ pdf_obj *obj = pdf_dict_gets(ctx, dict, "BM");
+ if (pdf_is_name(ctx, obj) && strcmp(pdf_to_name(ctx, obj), "Normal"))
return 1;
return 0;
}
static int
-pdf_pattern_uses_blending(pdf_document *doc, pdf_obj *dict)
+pdf_pattern_uses_blending(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
pdf_obj *obj;
- obj = pdf_dict_gets(dict, "Resources");
- if (pdf_resources_use_blending(doc, obj))
+ obj = pdf_dict_gets(ctx, dict, "Resources");
+ if (pdf_resources_use_blending(ctx, doc, obj))
return 1;
- obj = pdf_dict_gets(dict, "ExtGState");
- return pdf_extgstate_uses_blending(doc, obj);
+ obj = pdf_dict_gets(ctx, dict, "ExtGState");
+ return pdf_extgstate_uses_blending(ctx, doc, obj);
}
static int
-pdf_xobject_uses_blending(pdf_document *doc, pdf_obj *dict)
+pdf_xobject_uses_blending(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
- pdf_obj *obj = pdf_dict_gets(dict, "Resources");
- if (!strcmp(pdf_to_name(pdf_dict_getp(dict, "Group/S")), "Transparency"))
+ pdf_obj *obj = pdf_dict_gets(ctx, dict, "Resources");
+ if (!strcmp(pdf_to_name(ctx, pdf_dict_getp(ctx, dict, "Group/S")), "Transparency"))
return 1;
- return pdf_resources_use_blending(doc, obj);
+ return pdf_resources_use_blending(ctx, doc, obj);
}
static int
-pdf_resources_use_blending(pdf_document *doc, pdf_obj *rdb)
+pdf_resources_use_blending(fz_context *ctx, pdf_document *doc, pdf_obj *rdb)
{
- fz_context *ctx = doc->ctx;
pdf_obj *obj;
int i, n, useBM = 0;
@@ -287,31 +283,31 @@ pdf_resources_use_blending(pdf_document *doc, pdf_obj *rdb)
return 0;
/* Have we been here before and remembered an answer? */
- if (pdf_obj_memo(rdb, &useBM))
+ if (pdf_obj_memo(ctx, rdb, &useBM))
return useBM;
/* stop on cyclic resource dependencies */
- if (pdf_mark_obj(rdb))
+ if (pdf_mark_obj(ctx, rdb))
return 0;
fz_try(ctx)
{
- obj = pdf_dict_gets(rdb, "ExtGState");
- n = pdf_dict_len(obj);
+ obj = pdf_dict_gets(ctx, rdb, "ExtGState");
+ n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
- if (pdf_extgstate_uses_blending(doc, pdf_dict_get_val(obj, i)))
+ if (pdf_extgstate_uses_blending(ctx, doc, pdf_dict_get_val(ctx, obj, i)))
goto found;
- obj = pdf_dict_gets(rdb, "Pattern");
- n = pdf_dict_len(obj);
+ obj = pdf_dict_gets(ctx, rdb, "Pattern");
+ n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
- if (pdf_pattern_uses_blending(doc, pdf_dict_get_val(obj, i)))
+ if (pdf_pattern_uses_blending(ctx, doc, pdf_dict_get_val(ctx, obj, i)))
goto found;
- obj = pdf_dict_gets(rdb, "XObject");
- n = pdf_dict_len(obj);
+ obj = pdf_dict_gets(ctx, rdb, "XObject");
+ n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
- if (pdf_xobject_uses_blending(doc, pdf_dict_get_val(obj, i)))
+ if (pdf_xobject_uses_blending(ctx, doc, pdf_dict_get_val(ctx, obj, i)))
goto found;
if (0)
{
@@ -321,36 +317,36 @@ found:
}
fz_always(ctx)
{
- pdf_unmark_obj(rdb);
+ pdf_unmark_obj(ctx, rdb);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
- pdf_set_obj_memo(rdb, useBM);
+ pdf_set_obj_memo(ctx, rdb, useBM);
return useBM;
}
static void
-pdf_load_transition(pdf_document *doc, pdf_page *page, pdf_obj *transdict)
+pdf_load_transition(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_obj *transdict)
{
char *name;
pdf_obj *obj;
int type;
- obj = pdf_dict_gets(transdict, "D");
- page->transition.duration = (obj ? pdf_to_real(obj) : 1);
+ obj = pdf_dict_gets(ctx, transdict, "D");
+ page->transition.duration = (obj ? pdf_to_real(ctx, obj) : 1);
- page->transition.vertical = (pdf_to_name(pdf_dict_gets(transdict, "Dm"))[0] != 'H');
- page->transition.outwards = (pdf_to_name(pdf_dict_gets(transdict, "M"))[0] != 'I');
+ page->transition.vertical = (pdf_to_name(ctx, pdf_dict_gets(ctx, transdict, "Dm"))[0] != 'H');
+ page->transition.outwards = (pdf_to_name(ctx, pdf_dict_gets(ctx, transdict, "M"))[0] != 'I');
/* FIXME: If 'Di' is None, it should be handled differently, but
* this only affects Fly, and we don't implement that currently. */
- page->transition.direction = (pdf_to_int(pdf_dict_gets(transdict, "Di")));
+ page->transition.direction = (pdf_to_int(ctx, pdf_dict_gets(ctx, transdict, "Di")));
/* FIXME: Read SS for Fly when we implement it */
/* FIXME: Read B for Fly when we implement it */
- name = pdf_to_name(pdf_dict_gets(transdict, "S"));
+ name = pdf_to_name(ctx, pdf_dict_gets(ctx, transdict, "S"));
if (!strcmp(name, "Split"))
type = FZ_TRANSITION_SPLIT;
else if (!strcmp(name, "Blinds"))
@@ -378,10 +374,55 @@ pdf_load_transition(pdf_document *doc, pdf_page *page, pdf_obj *transdict)
page->transition.type = type;
}
+fz_rect *
+pdf_bound_page(fz_context *ctx, pdf_page *page, fz_rect *bounds)
+{
+ fz_matrix mtx;
+ fz_rect mediabox = page->mediabox;
+ fz_transform_rect(&mediabox, fz_rotate(&mtx, page->rotate));
+ bounds->x0 = bounds->y0 = 0;
+ bounds->x1 = mediabox.x1 - mediabox.x0;
+ bounds->y1 = mediabox.y1 - mediabox.y0;
+ return bounds;
+}
+
+fz_link *
+pdf_load_links(fz_context *ctx, pdf_page *page)
+{
+ return fz_keep_link(ctx, page->links);
+}
+
+static void
+pdf_drop_page_imp(fz_context *ctx, pdf_page *page)
+{
+ pdf_document *doc = page->doc;
+
+ if (page == NULL)
+ return;
+
+ pdf_drop_obj(ctx, page->resources);
+ pdf_drop_obj(ctx, page->contents);
+ if (page->links)
+ fz_drop_link(ctx, page->links);
+ if (page->annots)
+ pdf_drop_annot(ctx, page->annots);
+ if (page->deleted_annots)
+ pdf_drop_annot(ctx, page->deleted_annots);
+ if (page->tmp_annots)
+ pdf_drop_annot(ctx, page->tmp_annots);
+ /* doc->focus, when not NULL, refers to one of
+ * the annotations and must be NULLed when the
+ * annotations are destroyed. doc->focus_obj
+ * keeps track of the actual annotation object. */
+ doc->focus = NULL;
+ pdf_drop_obj(ctx, page->me);
+
+ fz_drop_document(ctx, &page->doc->super);
+}
+
pdf_page *
-pdf_load_page(pdf_document *doc, int number)
+pdf_load_page(fz_context *ctx, pdf_document *doc, int number)
{
- fz_context *ctx = doc->ctx;
pdf_page *page;
pdf_annot *annot;
pdf_obj *pageobj, *pageref, *obj;
@@ -391,15 +432,27 @@ pdf_load_page(pdf_document *doc, int number)
if (doc->file_reading_linearly)
{
- pageref = pdf_progressive_advance(doc, number);
+ pageref = pdf_progressive_advance(ctx, doc, number);
if (pageref == NULL)
- fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "page %d not available yet", number);
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "page %d not available yet", number);
}
else
- pageref = pdf_lookup_page_obj(doc, number);
- pageobj = pdf_resolve_indirect(pageref);
+ pageref = pdf_lookup_page_obj(ctx, doc, number);
+ pageobj = pdf_resolve_indirect(ctx, pageref);
+
+ page = fz_new_page(ctx, sizeof *page);
+ page->doc = (pdf_document*) fz_keep_document(ctx, &doc->super);
+
+ page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)pdf_drop_page_imp;
+ page->super.load_links = (fz_page_load_links_fn *)pdf_load_links;
+ page->super.bound_page = (fz_page_bound_page_fn *)pdf_bound_page;
+ page->super.first_annot = (fz_page_first_annot_fn *)pdf_first_annot;
+ page->super.next_annot = (fz_page_next_annot_fn *)pdf_next_annot;
+ page->super.bound_annot = (fz_page_bound_annot_fn *)pdf_bound_annot;
+ page->super.run_page_contents = (fz_page_run_page_contents_fn *)pdf_run_page_contents;
+ page->super.run_annot = (fz_page_run_annot_fn *)pdf_run_annot;
+ page->super.page_presentation = (fz_page_page_presentation_fn *)pdf_page_presentation;
- page = fz_malloc_struct(ctx, pdf_page);
page->resources = NULL;
page->contents = NULL;
page->transparency = 0;
@@ -408,16 +461,16 @@ pdf_load_page(pdf_document *doc, int number)
page->annot_tailp = &page->annots;
page->deleted_annots = NULL;
page->tmp_annots = NULL;
- page->me = pdf_keep_obj(pageobj);
+ page->me = pdf_keep_obj(ctx, pageobj);
page->incomplete = 0;
- obj = pdf_dict_gets(pageobj, "UserUnit");
- if (pdf_is_real(obj))
- userunit = pdf_to_real(obj);
+ obj = pdf_dict_gets(ctx, pageobj, "UserUnit");
+ if (pdf_is_real(ctx, obj))
+ userunit = pdf_to_real(ctx, obj);
else
userunit = 1;
- pdf_to_rect(ctx, pdf_lookup_inherited_page_item(doc, pageobj, "MediaBox"), &mediabox);
+ pdf_to_rect(ctx, pdf_lookup_inherited_page_item(ctx, doc, pageobj, "MediaBox"), &mediabox);
if (fz_is_empty_rect(&mediabox))
{
fz_warn(ctx, "cannot find page size for page %d", number + 1);
@@ -427,7 +480,7 @@ pdf_load_page(pdf_document *doc, int number)
mediabox.y1 = 792;
}
- pdf_to_rect(ctx, pdf_lookup_inherited_page_item(doc, pageobj, "CropBox"), &cropbox);
+ pdf_to_rect(ctx, pdf_lookup_inherited_page_item(ctx, doc, pageobj, "CropBox"), &cropbox);
if (!fz_is_empty_rect(&cropbox))
fz_intersect_rect(&mediabox, &cropbox);
@@ -442,7 +495,7 @@ pdf_load_page(pdf_document *doc, int number)
page->mediabox = fz_unit_rect;
}
- page->rotate = pdf_to_int(pdf_lookup_inherited_page_item(doc, pageobj, "Rotate"));
+ page->rotate = pdf_to_int(ctx, pdf_lookup_inherited_page_item(ctx, doc, pageobj, "Rotate"));
/* Snap page->rotate to 0, 90, 180 or 270 */
if (page->rotate < 0)
page->rotate = 360 - ((-page->rotate) % 360);
@@ -460,11 +513,11 @@ pdf_load_page(pdf_document *doc, int number)
fz_try(ctx)
{
- obj = pdf_dict_gets(pageobj, "Annots");
+ obj = pdf_dict_gets(ctx, pageobj, "Annots");
if (obj)
{
- page->links = pdf_load_link_annots(doc, obj, &page->ctm);
- pdf_load_annots(doc, page, obj);
+ page->links = pdf_load_link_annots(ctx, doc, obj, &page->ctm);
+ pdf_load_annots(ctx, doc, page, obj);
}
}
fz_catch(ctx)
@@ -476,40 +529,40 @@ pdf_load_page(pdf_document *doc, int number)
page->links = NULL;
}
- page->duration = pdf_to_real(pdf_dict_gets(pageobj, "Dur"));
+ page->duration = pdf_to_real(ctx, pdf_dict_gets(ctx, pageobj, "Dur"));
- obj = pdf_dict_gets(pageobj, "Trans");
+ obj = pdf_dict_gets(ctx, pageobj, "Trans");
page->transition_present = (obj != NULL);
if (obj)
{
- pdf_load_transition(doc, page, obj);
+ pdf_load_transition(ctx, doc, page, obj);
}
// TODO: inherit
- page->resources = pdf_lookup_inherited_page_item(doc, pageobj, "Resources");
+ page->resources = pdf_lookup_inherited_page_item(ctx, doc, pageobj, "Resources");
if (page->resources)
- pdf_keep_obj(page->resources);
+ pdf_keep_obj(ctx, page->resources);
- obj = pdf_dict_gets(pageobj, "Contents");
+ obj = pdf_dict_gets(ctx, pageobj, "Contents");
fz_try(ctx)
{
- page->contents = pdf_keep_obj(obj);
+ page->contents = pdf_keep_obj(ctx, obj);
- if (pdf_resources_use_blending(doc, page->resources))
+ if (pdf_resources_use_blending(ctx, doc, page->resources))
page->transparency = 1;
- else if (!strcmp(pdf_to_name(pdf_dict_getp(pageobj, "Group/S")), "Transparency"))
+ else if (!strcmp(pdf_to_name(ctx, pdf_dict_getp(ctx, pageobj, "Group/S")), "Transparency"))
page->transparency = 1;
for (annot = page->annots; annot && !page->transparency; annot = annot->next)
- if (annot->ap && pdf_resources_use_blending(doc, annot->ap->resources))
+ if (annot->ap && pdf_resources_use_blending(ctx, doc, annot->ap->resources))
page->transparency = 1;
}
fz_catch(ctx)
{
if (fz_caught(ctx) != FZ_ERROR_TRYLATER)
{
- pdf_free_page(doc, page);
- fz_rethrow_message(ctx, "cannot load page %d contents (%d 0 R)", number + 1, pdf_to_num(pageref));
+ fz_drop_page(ctx, &page->super);
+ fz_rethrow_message(ctx, "cannot load page %d contents (%d 0 R)", number + 1, pdf_to_num(ctx, pageref));
}
page->incomplete |= PDF_PAGE_INCOMPLETE_CONTENTS;
}
@@ -517,93 +570,50 @@ pdf_load_page(pdf_document *doc, int number)
return page;
}
-fz_rect *
-pdf_bound_page(pdf_document *doc, pdf_page *page, fz_rect *bounds)
-{
- fz_matrix mtx;
- fz_rect mediabox = page->mediabox;
- fz_transform_rect(&mediabox, fz_rotate(&mtx, page->rotate));
- bounds->x0 = bounds->y0 = 0;
- bounds->x1 = mediabox.x1 - mediabox.x0;
- bounds->y1 = mediabox.y1 - mediabox.y0;
- return bounds;
-}
-
-fz_link *
-pdf_load_links(pdf_document *doc, pdf_page *page)
-{
- return fz_keep_link(doc->ctx, page->links);
-}
-
-void
-pdf_free_page(pdf_document *doc, pdf_page *page)
-{
- if (page == NULL)
- return;
- pdf_drop_obj(page->resources);
- pdf_drop_obj(page->contents);
- if (page->links)
- fz_drop_link(doc->ctx, page->links);
- if (page->annots)
- pdf_free_annot(doc->ctx, page->annots);
- if (page->deleted_annots)
- pdf_free_annot(doc->ctx, page->deleted_annots);
- if (page->tmp_annots)
- pdf_free_annot(doc->ctx, page->tmp_annots);
- /* doc->focus, when not NULL, refers to one of
- * the annotations and must be NULLed when the
- * annotations are destroyed. doc->focus_obj
- * keeps track of the actual annotation object. */
- doc->focus = NULL;
- pdf_drop_obj(page->me);
- fz_free(doc->ctx, page);
-}
-
void
-pdf_delete_page(pdf_document *doc, int at)
+pdf_delete_page(fz_context *ctx, pdf_document *doc, int at)
{
pdf_obj *parent, *kids;
int i;
- pdf_lookup_page_loc(doc, at, &parent, &i);
- kids = pdf_dict_gets(parent, "Kids");
- pdf_array_delete(kids, i);
+ pdf_lookup_page_loc(ctx, doc, at, &parent, &i);
+ kids = pdf_dict_gets(ctx, parent, "Kids");
+ pdf_array_delete(ctx, kids, i);
while (parent)
{
- int count = pdf_to_int(pdf_dict_gets(parent, "Count"));
- pdf_dict_puts_drop(parent, "Count", pdf_new_int(doc, count - 1));
- parent = pdf_dict_gets(parent, "Parent");
+ int count = pdf_to_int(ctx, pdf_dict_gets(ctx, parent, "Count"));
+ pdf_dict_puts_drop(ctx, parent, "Count", pdf_new_int(ctx, doc, count - 1));
+ parent = pdf_dict_gets(ctx, parent, "Parent");
}
doc->page_count = 0; /* invalidate cached value */
}
void
-pdf_insert_page(pdf_document *doc, pdf_page *page, int at)
+pdf_insert_page(fz_context *ctx, pdf_document *doc, pdf_page *page, int at)
{
- fz_context *ctx = doc->ctx;
- int count = pdf_count_pages(doc);
+ int count = pdf_count_pages(ctx, doc);
pdf_obj *parent, *kids;
pdf_obj *page_ref;
int i;
- page_ref = pdf_new_ref(doc, page->me);
+ page_ref = pdf_new_ref(ctx, doc, page->me);
fz_try(ctx)
{
if (count == 0)
{
- pdf_obj *root = pdf_dict_gets(pdf_trailer(doc), "Root");
- parent = pdf_dict_gets(root, "Pages");
+ pdf_obj *root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ parent = pdf_dict_gets(ctx, root, "Pages");
if (!parent)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find page tree");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page tree");
- kids = pdf_dict_gets(parent, "Kids");
+ kids = pdf_dict_gets(ctx, parent, "Kids");
if (!kids)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "malformed page tree");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "malformed page tree");
- pdf_array_insert(kids, page_ref, 0);
+ pdf_array_insert(ctx, kids, page_ref, 0);
}
else if (at >= count)
{
@@ -614,32 +624,32 @@ pdf_insert_page(pdf_document *doc, pdf_page *page, int at)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot insert page beyond end of page tree");
/* append after last page */
- pdf_lookup_page_loc(doc, count - 1, &parent, &i);
- kids = pdf_dict_gets(parent, "Kids");
- pdf_array_insert(kids, page_ref, i + 1);
+ pdf_lookup_page_loc(ctx, doc, count - 1, &parent, &i);
+ kids = pdf_dict_gets(ctx, parent, "Kids");
+ pdf_array_insert(ctx, kids, page_ref, i + 1);
}
else
{
/* insert before found page */
- pdf_lookup_page_loc(doc, at, &parent, &i);
- kids = pdf_dict_gets(parent, "Kids");
- pdf_array_insert(kids, page_ref, i);
+ pdf_lookup_page_loc(ctx, doc, at, &parent, &i);
+ kids = pdf_dict_gets(ctx, parent, "Kids");
+ pdf_array_insert(ctx, kids, page_ref, i);
}
- pdf_dict_puts(page->me, "Parent", parent);
+ pdf_dict_puts(ctx, page->me, "Parent", parent);
/* Adjust page counts */
while (parent)
{
- int count = pdf_to_int(pdf_dict_gets(parent, "Count"));
- pdf_dict_puts_drop(parent, "Count", pdf_new_int(doc, count + 1));
- parent = pdf_dict_gets(parent, "Parent");
+ int count = pdf_to_int(ctx, pdf_dict_gets(ctx, parent, "Count"));
+ pdf_dict_puts_drop(ctx, parent, "Count", pdf_new_int(ctx, doc, count + 1));
+ parent = pdf_dict_gets(ctx, parent, "Parent");
}
}
fz_always(ctx)
{
- pdf_drop_obj(page_ref);
+ pdf_drop_obj(ctx, page_ref);
}
fz_catch(ctx)
{
@@ -650,19 +660,18 @@ pdf_insert_page(pdf_document *doc, pdf_page *page, int at)
}
void
-pdf_delete_page_range(pdf_document *doc, int start, int end)
+pdf_delete_page_range(fz_context *ctx, pdf_document *doc, int start, int end)
{
while (start < end)
- pdf_delete_page(doc, start++);
+ pdf_delete_page(ctx, doc, start++);
}
pdf_page *
-pdf_create_page(pdf_document *doc, fz_rect mediabox, int res, int rotate)
+pdf_create_page(fz_context *ctx, pdf_document *doc, fz_rect mediabox, int res, int rotate)
{
pdf_page *page = NULL;
pdf_obj *pageobj;
float userunit = 1;
- fz_context *ctx = doc->ctx;
fz_matrix ctm, tmp;
fz_rect realbox;
@@ -675,15 +684,15 @@ pdf_create_page(pdf_document *doc, fz_rect mediabox, int res, int rotate)
page->transparency = 0;
page->links = NULL;
page->annots = NULL;
- page->me = pageobj = pdf_new_dict(doc, 4);
+ page->me = pageobj = pdf_new_dict(ctx, doc, 4);
- pdf_dict_puts_drop(pageobj, "Type", pdf_new_name(doc, "Page"));
+ pdf_dict_puts_drop(ctx, pageobj, "Type", pdf_new_name(ctx, doc, "Page"));
page->mediabox.x0 = fz_min(mediabox.x0, mediabox.x1) * userunit;
page->mediabox.y0 = fz_min(mediabox.y0, mediabox.y1) * userunit;
page->mediabox.x1 = fz_max(mediabox.x0, mediabox.x1) * userunit;
page->mediabox.y1 = fz_max(mediabox.y0, mediabox.y1) * userunit;
- pdf_dict_puts_drop(pageobj, "MediaBox", pdf_new_rect(doc, &page->mediabox));
+ pdf_dict_puts_drop(ctx, pageobj, "MediaBox", pdf_new_rect(ctx, doc, &page->mediabox));
/* Snap page->rotate to 0, 90, 180 or 270 */
if (page->rotate < 0)
@@ -693,7 +702,7 @@ pdf_create_page(pdf_document *doc, fz_rect mediabox, int res, int rotate)
page->rotate = 90*((page->rotate + 45)/90);
if (page->rotate > 360)
page->rotate = 0;
- pdf_dict_puts_drop(pageobj, "Rotate", pdf_new_int(doc, page->rotate));
+ pdf_dict_puts_drop(ctx, pageobj, "Rotate", pdf_new_int(ctx, doc, page->rotate));
fz_pre_rotate(fz_scale(&ctm, 1, -1), -page->rotate);
realbox = page->mediabox;
@@ -706,7 +715,7 @@ pdf_create_page(pdf_document *doc, fz_rect mediabox, int res, int rotate)
}
fz_catch(ctx)
{
- pdf_drop_obj(page->me);
+ pdf_drop_obj(ctx, page->me);
fz_free(ctx, page);
fz_rethrow_message(ctx, "Failed to create page");
}
diff --git a/source/pdf/pdf-parse.c b/source/pdf/pdf-parse.c
index a2fd09db..48761374 100644
--- a/source/pdf/pdf-parse.c
+++ b/source/pdf/pdf-parse.c
@@ -3,10 +3,10 @@
fz_rect *
pdf_to_rect(fz_context *ctx, pdf_obj *array, fz_rect *r)
{
- float a = pdf_to_real(pdf_array_get(array, 0));
- float b = pdf_to_real(pdf_array_get(array, 1));
- float c = pdf_to_real(pdf_array_get(array, 2));
- float d = pdf_to_real(pdf_array_get(array, 3));
+ float a = pdf_to_real(ctx, pdf_array_get(ctx, array, 0));
+ float b = pdf_to_real(ctx, pdf_array_get(ctx, array, 1));
+ float c = pdf_to_real(ctx, pdf_array_get(ctx, array, 2));
+ float d = pdf_to_real(ctx, pdf_array_get(ctx, array, 3));
r->x0 = fz_min(a, c);
r->y0 = fz_min(b, d);
r->x1 = fz_max(a, c);
@@ -17,20 +17,19 @@ pdf_to_rect(fz_context *ctx, pdf_obj *array, fz_rect *r)
fz_matrix *
pdf_to_matrix(fz_context *ctx, pdf_obj *array, fz_matrix *m)
{
- m->a = pdf_to_real(pdf_array_get(array, 0));
- m->b = pdf_to_real(pdf_array_get(array, 1));
- m->c = pdf_to_real(pdf_array_get(array, 2));
- m->d = pdf_to_real(pdf_array_get(array, 3));
- m->e = pdf_to_real(pdf_array_get(array, 4));
- m->f = pdf_to_real(pdf_array_get(array, 5));
+ m->a = pdf_to_real(ctx, pdf_array_get(ctx, array, 0));
+ m->b = pdf_to_real(ctx, pdf_array_get(ctx, array, 1));
+ m->c = pdf_to_real(ctx, pdf_array_get(ctx, array, 2));
+ m->d = pdf_to_real(ctx, pdf_array_get(ctx, array, 3));
+ m->e = pdf_to_real(ctx, pdf_array_get(ctx, array, 4));
+ m->f = pdf_to_real(ctx, pdf_array_get(ctx, array, 5));
return m;
}
/* Convert Unicode/PdfDocEncoding string into utf-8 */
char *
-pdf_to_utf8(pdf_document *doc, pdf_obj *src)
+pdf_to_utf8(fz_context *ctx, pdf_document *doc, pdf_obj *src)
{
- fz_context *ctx = doc->ctx;
fz_buffer *strmbuf = NULL;
unsigned char *srcptr;
char *dstptr, *dst;
@@ -42,14 +41,14 @@ pdf_to_utf8(pdf_document *doc, pdf_obj *src)
fz_var(strmbuf);
fz_try(ctx)
{
- if (pdf_is_string(src))
+ if (pdf_is_string(ctx, src))
{
- srcptr = (unsigned char *) pdf_to_str_buf(src);
- srclen = pdf_to_str_len(src);
+ srcptr = (unsigned char *) pdf_to_str_buf(ctx, src);
+ srclen = pdf_to_str_len(ctx, src);
}
- else if (pdf_is_stream(doc, pdf_to_num(src), pdf_to_gen(src)))
+ else if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, src), pdf_to_gen(ctx, src)))
{
- strmbuf = pdf_load_stream(doc, pdf_to_num(src), pdf_to_gen(src));
+ strmbuf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, src), pdf_to_gen(ctx, src));
srclen = fz_buffer_storage(ctx, strmbuf, (unsigned char **)&srcptr);
}
else
@@ -118,12 +117,11 @@ pdf_to_utf8(pdf_document *doc, pdf_obj *src)
/* Convert Unicode/PdfDocEncoding string into ucs-2 */
unsigned short *
-pdf_to_ucs2(pdf_document *doc, pdf_obj *src)
+pdf_to_ucs2(fz_context *ctx, pdf_document *doc, pdf_obj *src)
{
- fz_context *ctx = doc->ctx;
- unsigned char *srcptr = (unsigned char *) pdf_to_str_buf(src);
+ unsigned char *srcptr = (unsigned char *) pdf_to_str_buf(ctx, src);
unsigned short *dstptr, *dst;
- int srclen = pdf_to_str_len(src);
+ int srclen = pdf_to_str_len(ctx, src);
int i;
if (srclen >= 2 && srcptr[0] == 254 && srcptr[1] == 255)
@@ -152,11 +150,11 @@ pdf_to_ucs2(pdf_document *doc, pdf_obj *src)
/* allow to convert to UCS-2 without the need for an fz_context */
/* (buffer must be at least (fz_to_str_len(src) + 1) * 2 bytes in size) */
void
-pdf_to_ucs2_buf(unsigned short *buffer, pdf_obj *src)
+pdf_to_ucs2_buf(fz_context *ctx, unsigned short *buffer, pdf_obj *src)
{
- unsigned char *srcptr = (unsigned char *) pdf_to_str_buf(src);
+ unsigned char *srcptr = (unsigned char *) pdf_to_str_buf(ctx, src);
unsigned short *dstptr = buffer;
- int srclen = pdf_to_str_len(src);
+ int srclen = pdf_to_str_len(ctx, src);
int i;
if (srclen >= 2 && srcptr[0] == 254 && srcptr[1] == 255)
@@ -180,9 +178,8 @@ pdf_to_ucs2_buf(unsigned short *buffer, pdf_obj *src)
/* Convert UCS-2 string into PdfDocEncoding for authentication */
char *
-pdf_from_ucs2(pdf_document *doc, unsigned short *src)
+pdf_from_ucs2(fz_context *ctx, pdf_document *doc, unsigned short *src)
{
- fz_context *ctx = doc->ctx;
int i, j, len;
char *docstr;
@@ -219,48 +216,47 @@ pdf_from_ucs2(pdf_document *doc, unsigned short *src)
}
pdf_obj *
-pdf_to_utf8_name(pdf_document *doc, pdf_obj *src)
+pdf_to_utf8_name(fz_context *ctx, pdf_document *doc, pdf_obj *src)
{
- char *buf = pdf_to_utf8(doc, src);
- pdf_obj *dst = pdf_new_name(doc, buf);
- fz_free(doc->ctx, buf);
+ char *buf = pdf_to_utf8(ctx, doc, src);
+ pdf_obj *dst = pdf_new_name(ctx, doc, buf);
+ fz_free(ctx, buf);
return dst;
}
pdf_obj *
-pdf_parse_array(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
+pdf_parse_array(fz_context *ctx, pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
{
pdf_obj *ary = NULL;
pdf_obj *obj = NULL;
int a = 0, b = 0, n = 0;
pdf_token tok;
- fz_context *ctx = file->ctx;
pdf_obj *op = NULL;
fz_var(obj);
- ary = pdf_new_array(doc, 4);
+ ary = pdf_new_array(ctx, doc, 4);
fz_try(ctx)
{
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_INT && tok != PDF_TOK_R)
{
if (n > 0)
{
- obj = pdf_new_int(doc, a);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_int(ctx, doc, a);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
}
if (n > 1)
{
- obj = pdf_new_int(doc, b);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_int(ctx, doc, b);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
}
n = 0;
@@ -268,9 +264,9 @@ pdf_parse_array(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
if (tok == PDF_TOK_INT && n == 2)
{
- obj = pdf_new_int(doc, a);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_int(ctx, doc, a);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
a = b;
n --;
@@ -293,61 +289,61 @@ pdf_parse_array(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
case PDF_TOK_R:
if (n != 2)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot parse indirect reference in array");
- obj = pdf_new_indirect(doc, a, b);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_indirect(ctx, doc, a, b);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
n = 0;
break;
case PDF_TOK_OPEN_ARRAY:
- obj = pdf_parse_array(doc, file, buf);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_parse_array(ctx, doc, file, buf);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_OPEN_DICT:
- obj = pdf_parse_dict(doc, file, buf);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_parse_dict(ctx, doc, file, buf);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_NAME:
- obj = pdf_new_name(doc, buf->scratch);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_name(ctx, doc, buf->scratch);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_REAL:
- obj = pdf_new_real(doc, buf->f);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_real(ctx, doc, buf->f);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_STRING:
- obj = pdf_new_string(doc, buf->scratch, buf->len);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_string(ctx, doc, buf->scratch, buf->len);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_TRUE:
- obj = pdf_new_bool(doc, 1);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_bool(ctx, doc, 1);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_FALSE:
- obj = pdf_new_bool(doc, 0);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_bool(ctx, doc, 0);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
case PDF_TOK_NULL:
- obj = pdf_new_null(doc);
- pdf_array_push(ary, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_null(ctx, doc);
+ pdf_array_push(ctx, ary, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
break;
@@ -360,24 +356,23 @@ end:
}
fz_catch(ctx)
{
- pdf_drop_obj(obj);
- pdf_drop_obj(ary);
+ pdf_drop_obj(ctx, obj);
+ pdf_drop_obj(ctx, ary);
fz_rethrow_message(ctx, "cannot parse array");
}
return op;
}
pdf_obj *
-pdf_parse_dict(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
+pdf_parse_dict(fz_context *ctx, pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
{
pdf_obj *dict;
pdf_obj *key = NULL;
pdf_obj *val = NULL;
pdf_token tok;
int a, b;
- fz_context *ctx = file->ctx;
- dict = pdf_new_dict(doc, 8);
+ dict = pdf_new_dict(ctx, doc, 8);
fz_var(key);
fz_var(val);
@@ -386,7 +381,7 @@ pdf_parse_dict(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
{
while (1)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
skip:
if (tok == PDF_TOK_CLOSE_DICT)
break;
@@ -398,49 +393,49 @@ pdf_parse_dict(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
if (tok != PDF_TOK_NAME)
fz_throw(ctx, FZ_ERROR_GENERIC, "invalid key in dict");
- key = pdf_new_name(doc, buf->scratch);
+ key = pdf_new_name(ctx, doc, buf->scratch);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
switch (tok)
{
case PDF_TOK_OPEN_ARRAY:
- val = pdf_parse_array(doc, file, buf);
+ val = pdf_parse_array(ctx, doc, file, buf);
break;
case PDF_TOK_OPEN_DICT:
- val = pdf_parse_dict(doc, file, buf);
+ val = pdf_parse_dict(ctx, doc, file, buf);
break;
- case PDF_TOK_NAME: val = pdf_new_name(doc, buf->scratch); break;
- case PDF_TOK_REAL: val = pdf_new_real(doc, buf->f); break;
- case PDF_TOK_STRING: val = pdf_new_string(doc, buf->scratch, buf->len); break;
- case PDF_TOK_TRUE: val = pdf_new_bool(doc, 1); break;
- case PDF_TOK_FALSE: val = pdf_new_bool(doc, 0); break;
- case PDF_TOK_NULL: val = pdf_new_null(doc); break;
+ case PDF_TOK_NAME: val = pdf_new_name(ctx, doc, buf->scratch); break;
+ case PDF_TOK_REAL: val = pdf_new_real(ctx, doc, buf->f); break;
+ case PDF_TOK_STRING: val = pdf_new_string(ctx, doc, buf->scratch, buf->len); break;
+ case PDF_TOK_TRUE: val = pdf_new_bool(ctx, doc, 1); break;
+ case PDF_TOK_FALSE: val = pdf_new_bool(ctx, doc, 0); break;
+ case PDF_TOK_NULL: val = pdf_new_null(ctx, doc); break;
case PDF_TOK_INT:
/* 64-bit to allow for numbers > INT_MAX and overflow */
a = buf->i;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_CLOSE_DICT || tok == PDF_TOK_NAME ||
(tok == PDF_TOK_KEYWORD && !strcmp(buf->scratch, "ID")))
{
- val = pdf_new_int(doc, a);
- pdf_dict_put(dict, key, val);
- pdf_drop_obj(val);
+ val = pdf_new_int(ctx, doc, a);
+ pdf_dict_put(ctx, dict, key, val);
+ pdf_drop_obj(ctx, val);
val = NULL;
- pdf_drop_obj(key);
+ pdf_drop_obj(ctx, key);
key = NULL;
goto skip;
}
if (tok == PDF_TOK_INT)
{
b = buf->i;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_R)
{
- val = pdf_new_indirect(doc, a, b);
+ val = pdf_new_indirect(ctx, doc, a, b);
break;
}
}
@@ -450,50 +445,49 @@ pdf_parse_dict(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
fz_throw(ctx, FZ_ERROR_GENERIC, "unknown token in dict");
}
- pdf_dict_put(dict, key, val);
- pdf_drop_obj(val);
+ pdf_dict_put(ctx, dict, key, val);
+ pdf_drop_obj(ctx, val);
val = NULL;
- pdf_drop_obj(key);
+ pdf_drop_obj(ctx, key);
key = NULL;
}
}
fz_catch(ctx)
{
- pdf_drop_obj(dict);
- pdf_drop_obj(key);
- pdf_drop_obj(val);
+ pdf_drop_obj(ctx, dict);
+ pdf_drop_obj(ctx, key);
+ pdf_drop_obj(ctx, val);
fz_rethrow_message(ctx, "cannot parse dict");
}
return dict;
}
pdf_obj *
-pdf_parse_stm_obj(pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
+pdf_parse_stm_obj(fz_context *ctx, pdf_document *doc, fz_stream *file, pdf_lexbuf *buf)
{
pdf_token tok;
- fz_context *ctx = file->ctx;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
switch (tok)
{
case PDF_TOK_OPEN_ARRAY:
- return pdf_parse_array(doc, file, buf);
+ return pdf_parse_array(ctx, doc, file, buf);
case PDF_TOK_OPEN_DICT:
- return pdf_parse_dict(doc, file, buf);
- case PDF_TOK_NAME: return pdf_new_name(doc, buf->scratch); break;
- case PDF_TOK_REAL: return pdf_new_real(doc, buf->f); break;
- case PDF_TOK_STRING: return pdf_new_string(doc, buf->scratch, buf->len); break;
- case PDF_TOK_TRUE: return pdf_new_bool(doc, 1); break;
- case PDF_TOK_FALSE: return pdf_new_bool(doc, 0); break;
- case PDF_TOK_NULL: return pdf_new_null(doc); break;
- case PDF_TOK_INT: return pdf_new_int(doc, buf->i); break;
+ return pdf_parse_dict(ctx, doc, file, buf);
+ case PDF_TOK_NAME: return pdf_new_name(ctx, doc, buf->scratch); break;
+ case PDF_TOK_REAL: return pdf_new_real(ctx, doc, buf->f); break;
+ case PDF_TOK_STRING: return pdf_new_string(ctx, doc, buf->scratch, buf->len); break;
+ case PDF_TOK_TRUE: return pdf_new_bool(ctx, doc, 1); break;
+ case PDF_TOK_FALSE: return pdf_new_bool(ctx, doc, 0); break;
+ case PDF_TOK_NULL: return pdf_new_null(ctx, doc); break;
+ case PDF_TOK_INT: return pdf_new_int(ctx, doc, buf->i); break;
default: fz_throw(ctx, FZ_ERROR_GENERIC, "unknown token in object stream");
}
}
pdf_obj *
-pdf_parse_ind_obj(pdf_document *doc,
+pdf_parse_ind_obj(fz_context *ctx, pdf_document *doc,
fz_stream *file, pdf_lexbuf *buf,
int *onum, int *ogen, int *ostmofs, int *try_repair)
{
@@ -501,11 +495,10 @@ pdf_parse_ind_obj(pdf_document *doc,
int num = 0, gen = 0, stm_ofs;
pdf_token tok;
int a, b;
- fz_context *ctx = file->ctx;
fz_var(obj);
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_INT)
{
if (try_repair)
@@ -514,7 +507,7 @@ pdf_parse_ind_obj(pdf_document *doc,
}
num = buf->i;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_INT)
{
if (try_repair)
@@ -523,7 +516,7 @@ pdf_parse_ind_obj(pdf_document *doc,
}
gen = buf->i;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_OBJ)
{
if (try_repair)
@@ -531,48 +524,48 @@ pdf_parse_ind_obj(pdf_document *doc,
fz_throw(ctx, FZ_ERROR_GENERIC, "expected 'obj' keyword (%d %d ?)", num, gen);
}
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
switch (tok)
{
case PDF_TOK_OPEN_ARRAY:
- obj = pdf_parse_array(doc, file, buf);
+ obj = pdf_parse_array(ctx, doc, file, buf);
break;
case PDF_TOK_OPEN_DICT:
- obj = pdf_parse_dict(doc, file, buf);
+ obj = pdf_parse_dict(ctx, doc, file, buf);
break;
- case PDF_TOK_NAME: obj = pdf_new_name(doc, buf->scratch); break;
- case PDF_TOK_REAL: obj = pdf_new_real(doc, buf->f); break;
- case PDF_TOK_STRING: obj = pdf_new_string(doc, buf->scratch, buf->len); break;
- case PDF_TOK_TRUE: obj = pdf_new_bool(doc, 1); break;
- case PDF_TOK_FALSE: obj = pdf_new_bool(doc, 0); break;
- case PDF_TOK_NULL: obj = pdf_new_null(doc); break;
+ case PDF_TOK_NAME: obj = pdf_new_name(ctx, doc, buf->scratch); break;
+ case PDF_TOK_REAL: obj = pdf_new_real(ctx, doc, buf->f); break;
+ case PDF_TOK_STRING: obj = pdf_new_string(ctx, doc, buf->scratch, buf->len); break;
+ case PDF_TOK_TRUE: obj = pdf_new_bool(ctx, doc, 1); break;
+ case PDF_TOK_FALSE: obj = pdf_new_bool(ctx, doc, 0); break;
+ case PDF_TOK_NULL: obj = pdf_new_null(ctx, doc); break;
case PDF_TOK_INT:
a = buf->i;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_STREAM || tok == PDF_TOK_ENDOBJ)
{
- obj = pdf_new_int(doc, a);
+ obj = pdf_new_int(ctx, doc, a);
goto skip;
}
if (tok == PDF_TOK_INT)
{
b = buf->i;
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_R)
{
- obj = pdf_new_indirect(doc, a, b);
+ obj = pdf_new_indirect(ctx, doc, a, b);
break;
}
}
fz_throw(ctx, FZ_ERROR_GENERIC, "expected 'R' keyword (%d %d R)", num, gen);
case PDF_TOK_ENDOBJ:
- obj = pdf_new_null(doc);
+ obj = pdf_new_null(ctx, doc);
goto skip;
default:
@@ -581,29 +574,29 @@ pdf_parse_ind_obj(pdf_document *doc,
fz_try(ctx)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
}
fz_catch(ctx)
{
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
fz_rethrow_message(ctx, "cannot parse indirect object (%d %d R)", num, gen);
}
skip:
if (tok == PDF_TOK_STREAM)
{
- int c = fz_read_byte(file);
+ int c = fz_read_byte(ctx, file);
while (c == ' ')
- c = fz_read_byte(file);
+ c = fz_read_byte(ctx, file);
if (c == '\r')
{
- c = fz_peek_byte(file);
+ c = fz_peek_byte(ctx, file);
if (c != '\n')
fz_warn(ctx, "line feed missing after stream begin marker (%d %d R)", num, gen);
else
- fz_read_byte(file);
+ fz_read_byte(ctx, file);
}
- stm_ofs = fz_tell(file);
+ stm_ofs = fz_tell(ctx, file);
}
else if (tok == PDF_TOK_ENDOBJ)
{
diff --git a/source/pdf/pdf-pattern.c b/source/pdf/pdf-pattern.c
index f13a49c9..93fbdd3e 100644
--- a/source/pdf/pdf-pattern.c
+++ b/source/pdf/pdf-pattern.c
@@ -13,14 +13,14 @@ pdf_drop_pattern(fz_context *ctx, pdf_pattern *pat)
}
static void
-pdf_free_pattern_imp(fz_context *ctx, fz_storable *pat_)
+pdf_drop_pattern_imp(fz_context *ctx, fz_storable *pat_)
{
pdf_pattern *pat = (pdf_pattern *)pat_;
if (pat->resources)
- pdf_drop_obj(pat->resources);
+ pdf_drop_obj(ctx, pat->resources);
if (pat->contents)
- pdf_drop_obj(pat->contents);
+ pdf_drop_obj(ctx, pat->contents);
fz_free(ctx, pat);
}
@@ -33,51 +33,50 @@ pdf_pattern_size(pdf_pattern *pat)
}
pdf_pattern *
-pdf_load_pattern(pdf_document *doc, pdf_obj *dict)
+pdf_load_pattern(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
pdf_pattern *pat;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
- if ((pat = pdf_find_item(ctx, pdf_free_pattern_imp, dict)) != NULL)
+ if ((pat = pdf_find_item(ctx, pdf_drop_pattern_imp, dict)) != NULL)
{
return pat;
}
pat = fz_malloc_struct(ctx, pdf_pattern);
- FZ_INIT_STORABLE(pat, 1, pdf_free_pattern_imp);
+ FZ_INIT_STORABLE(pat, 1, pdf_drop_pattern_imp);
pat->resources = NULL;
pat->contents = NULL;
/* Store pattern now, to avoid possible recursion if objects refer back to this one */
pdf_store_item(ctx, dict, pat, pdf_pattern_size(pat));
- pat->ismask = pdf_to_int(pdf_dict_gets(dict, "PaintType")) == 2;
- pat->xstep = pdf_to_real(pdf_dict_gets(dict, "XStep"));
- pat->ystep = pdf_to_real(pdf_dict_gets(dict, "YStep"));
+ pat->ismask = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "PaintType")) == 2;
+ pat->xstep = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "XStep"));
+ pat->ystep = pdf_to_real(ctx, pdf_dict_gets(ctx, dict, "YStep"));
- obj = pdf_dict_gets(dict, "BBox");
+ obj = pdf_dict_gets(ctx, dict, "BBox");
pdf_to_rect(ctx, obj, &pat->bbox);
- obj = pdf_dict_gets(dict, "Matrix");
+ obj = pdf_dict_gets(ctx, dict, "Matrix");
if (obj)
pdf_to_matrix(ctx, obj, &pat->matrix);
else
pat->matrix = fz_identity;
- pat->resources = pdf_dict_gets(dict, "Resources");
+ pat->resources = pdf_dict_gets(ctx, dict, "Resources");
if (pat->resources)
- pdf_keep_obj(pat->resources);
+ pdf_keep_obj(ctx, pat->resources);
fz_try(ctx)
{
- pat->contents = pdf_keep_obj(dict);
+ pat->contents = pdf_keep_obj(ctx, dict);
}
fz_catch(ctx)
{
- pdf_remove_item(ctx, pdf_free_pattern_imp, dict);
+ pdf_remove_item(ctx, pdf_drop_pattern_imp, dict);
pdf_drop_pattern(ctx, pat);
- fz_rethrow_message(ctx, "cannot load pattern stream (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict));
+ fz_rethrow_message(ctx, "cannot load pattern stream (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
return pat;
}
diff --git a/source/pdf/pdf-pkcs7.c b/source/pdf/pdf-pkcs7.c
index a36d1592..c1a97599 100644
--- a/source/pdf/pdf-pkcs7.c
+++ b/source/pdf/pdf-pkcs7.c
@@ -345,22 +345,20 @@ exit:
typedef struct pdf_designated_name_openssl_s
{
pdf_designated_name base;
- fz_context *ctx;
char buf[8192];
} pdf_designated_name_openssl;
struct pdf_signer_s
{
- fz_context *ctx;
int refs;
X509 *x509;
EVP_PKEY *pkey;
};
-void pdf_free_designated_name(pdf_designated_name *dn)
+void pdf_drop_designated_name(fz_context *ctx, pdf_designated_name *dn)
{
if (dn)
- fz_free(((pdf_designated_name_openssl *)dn)->ctx, dn);
+ fz_free(ctx, dn);
}
@@ -436,7 +434,6 @@ pdf_signer *pdf_read_pfx(fz_context *ctx, const char *pfile, const char *pw)
fz_try(ctx)
{
signer = fz_malloc_struct(ctx, pdf_signer);
- signer->ctx = ctx;
signer->refs = 1;
OpenSSL_add_all_algorithms();
@@ -502,22 +499,21 @@ pdf_signer *pdf_read_pfx(fz_context *ctx, const char *pfile, const char *pw)
}
fz_catch(ctx)
{
- pdf_drop_signer(signer);
+ pdf_drop_signer(ctx, signer);
fz_rethrow(ctx);
}
return signer;
}
-pdf_signer *pdf_keep_signer(pdf_signer *signer)
+pdf_signer *pdf_keep_signer(fz_context *ctx, pdf_signer *signer)
{
if (signer)
signer->refs++;
-
return signer;
}
-void pdf_drop_signer(pdf_signer *signer)
+void pdf_drop_signer(fz_context *ctx, pdf_signer *signer)
{
if (signer)
{
@@ -525,18 +521,16 @@ void pdf_drop_signer(pdf_signer *signer)
{
X509_free(signer->x509);
EVP_PKEY_free(signer->pkey);
- fz_free(signer->ctx, signer);
+ fz_free(ctx, signer);
}
}
}
-pdf_designated_name *pdf_signer_designated_name(pdf_signer *signer)
+pdf_designated_name *pdf_signer_designated_name(fz_context *ctx, pdf_signer *signer)
{
- fz_context *ctx = signer->ctx;
pdf_designated_name_openssl *dn = fz_malloc_struct(ctx, pdf_designated_name_openssl);
char *p;
- dn->ctx = ctx;
X509_NAME_oneline(X509_get_subject_name(signer->x509), dn->buf, sizeof(dn->buf));
p = strstr(dn->buf, "/CN=");
if (p) dn->base.cn = p+4;
@@ -556,9 +550,8 @@ pdf_designated_name *pdf_signer_designated_name(pdf_signer *signer)
return (pdf_designated_name *)dn;
}
-void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer)
+void pdf_write_digest(fz_context *ctx, pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer)
{
- fz_context *ctx = doc->ctx;
BIO *bdata = NULL;
BIO *bsegs = NULL;
BIO *bp7in = NULL;
@@ -568,7 +561,7 @@ void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, in
FILE *f = NULL;
int (*brange)[2] = NULL;
- int brange_len = pdf_array_len(byte_range)/2;
+ int brange_len = pdf_array_len(ctx, byte_range)/2;
fz_var(bdata);
fz_var(bsegs);
@@ -586,8 +579,8 @@ void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, in
brange = fz_calloc(ctx, brange_len, sizeof(*brange));
for (i = 0; i < brange_len; i++)
{
- brange[i][0] = pdf_to_int(pdf_array_get(byte_range, 2*i));
- brange[i][1] = pdf_to_int(pdf_array_get(byte_range, 2*i+1));
+ brange[i][0] = pdf_to_int(ctx, pdf_array_get(ctx, byte_range, 2*i));
+ brange[i][1] = pdf_to_int(ctx, pdf_array_get(ctx, byte_range, 2*i+1));
}
bdata = BIO_new(BIO_s_file());
@@ -671,9 +664,8 @@ void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, in
}
}
-int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize)
+int pdf_check_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize)
{
- fz_context *ctx = doc->ctx;
int (*byte_range)[2] = NULL;
int byte_range_len;
char *contents = NULL;
@@ -696,14 +688,14 @@ int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char
fz_var(res);
fz_try(ctx);
{
- byte_range_len = pdf_signature_widget_byte_range(doc, widget, NULL);
+ byte_range_len = pdf_signature_widget_byte_range(ctx, doc, widget, NULL);
if (byte_range_len)
{
byte_range = fz_calloc(ctx, byte_range_len, sizeof(*byte_range));
- pdf_signature_widget_byte_range(doc, widget, byte_range);
+ pdf_signature_widget_byte_range(ctx, doc, widget, byte_range);
}
- contents_len = pdf_signature_widget_contents(doc, widget, &contents);
+ contents_len = pdf_signature_widget_contents(ctx, doc, widget, &contents);
if (byte_range && contents)
{
res = verify_sig(contents, contents_len, file, byte_range, byte_range_len, ebuf, ebufsize);
@@ -731,9 +723,8 @@ int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char
return res;
}
-void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password)
+void pdf_sign_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password)
{
- fz_context *ctx = doc->ctx;
pdf_signer *signer = pdf_read_pfx(ctx, sigfile, password);
pdf_designated_name *dn = NULL;
fz_buffer *fzbuf = NULL;
@@ -744,13 +735,13 @@ void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfi
pdf_obj *wobj = ((pdf_annot *)widget)->obj;
fz_rect rect = fz_empty_rect;
- pdf_signature_set_value(doc, wobj, signer);
+ pdf_signature_set_value(ctx, doc, wobj, signer);
- pdf_to_rect(ctx, pdf_dict_gets(wobj, "Rect"), &rect);
+ pdf_to_rect(ctx, pdf_dict_gets(ctx, wobj, "Rect"), &rect);
/* Create an appearance stream only if the signature is intended to be visible */
if (!fz_is_empty_rect(&rect))
{
- dn = pdf_signer_designated_name(signer);
+ dn = pdf_signer_designated_name(ctx, signer);
fzbuf = fz_new_buffer(ctx, 256);
if (!dn->cn)
fz_throw(ctx, FZ_ERROR_GENERIC, "Certificate has no common name");
@@ -770,13 +761,13 @@ void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfi
fz_buffer_printf(ctx, fzbuf, ", c=%s", dn->c);
(void)fz_buffer_storage(ctx, fzbuf, (unsigned char **) &dn_str);
- pdf_set_signature_appearance(doc, (pdf_annot *)widget, dn->cn, dn_str, NULL);
+ pdf_set_signature_appearance(ctx, doc, (pdf_annot *)widget, dn->cn, dn_str, NULL);
}
}
fz_always(ctx)
{
- pdf_drop_signer(signer);
- pdf_free_designated_name(dn);
+ pdf_drop_signer(ctx, signer);
+ pdf_drop_designated_name(ctx, dn);
fz_drop_buffer(ctx, fzbuf);
}
fz_catch(ctx)
@@ -785,37 +776,37 @@ void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfi
}
}
-int pdf_signatures_supported(void)
+int pdf_signatures_supported(fz_context *ctx)
{
return 1;
}
#else /* HAVE_OPENSSL */
-int pdf_check_signature(pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize)
+int pdf_check_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, char *file, char *ebuf, int ebufsize)
{
fz_strlcpy(ebuf, "This version of MuPDF was built without signature support", ebufsize);
return 0;
}
-void pdf_sign_signature(pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password)
+void pdf_sign_signature(fz_context *ctx, pdf_document *doc, pdf_widget *widget, const char *sigfile, const char *password)
{
}
-pdf_signer *pdf_keep_signer(pdf_signer *signer)
+pdf_signer *pdf_keep_signer(fz_context *ctx, pdf_signer *signer)
{
return NULL;
}
-void pdf_drop_signer(pdf_signer *signer)
+void pdf_drop_signer(fz_context *ctx, pdf_signer *signer)
{
}
-void pdf_write_digest(pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer)
+void pdf_write_digest(fz_context *ctx, pdf_document *doc, char *filename, pdf_obj *byte_range, int digest_offset, int digest_length, pdf_signer *signer)
{
}
-int pdf_signatures_supported(void)
+int pdf_signatures_supported(fz_context *ctx)
{
return 0;
}
diff --git a/source/pdf/pdf-repair.c b/source/pdf/pdf-repair.c
index 7e35c5fb..0c1c504c 100644
--- a/source/pdf/pdf-repair.c
+++ b/source/pdf/pdf-repair.c
@@ -15,12 +15,11 @@ struct entry
};
int
-pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, pdf_obj **encrypt, pdf_obj **id, pdf_obj **page, int *tmpofs)
+pdf_repair_obj(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, pdf_obj **encrypt, pdf_obj **id, pdf_obj **page, int *tmpofs)
{
+ fz_stream *file = doc->file;
pdf_token tok;
int stm_len;
- fz_stream *file = doc->file;
- fz_context *ctx = file->ctx;
*stmofsp = 0;
if (stmlenp)
@@ -32,7 +31,7 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p
* '<int> <int> obj'. We expect the next thing we see to be a
* pdf object. Regardless of the type of thing we meet next
* we only need to fully parse it if it is a dictionary. */
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok == PDF_TOK_OPEN_DICT)
{
@@ -41,7 +40,7 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p
/* Send NULL xref so we don't try to resolve references */
fz_try(ctx)
{
- dict = pdf_parse_dict(doc, file, buf);
+ dict = pdf_parse_dict(ctx, doc, file, buf);
}
fz_catch(ctx)
{
@@ -50,45 +49,45 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p
if (file->eof)
fz_rethrow_message(ctx, "broken object at EOF ignored");
/* Silently swallow the error */
- dict = pdf_new_dict(doc, 2);
+ dict = pdf_new_dict(ctx, doc, 2);
}
if (encrypt && id)
{
- obj = pdf_dict_gets(dict, "Type");
- if (pdf_is_name(obj) && !strcmp(pdf_to_name(obj), "XRef"))
+ obj = pdf_dict_gets(ctx, dict, "Type");
+ if (pdf_is_name(ctx, obj) && !strcmp(pdf_to_name(ctx, obj), "XRef"))
{
- obj = pdf_dict_gets(dict, "Encrypt");
+ obj = pdf_dict_gets(ctx, dict, "Encrypt");
if (obj)
{
- pdf_drop_obj(*encrypt);
- *encrypt = pdf_keep_obj(obj);
+ pdf_drop_obj(ctx, *encrypt);
+ *encrypt = pdf_keep_obj(ctx, obj);
}
- obj = pdf_dict_gets(dict, "ID");
+ obj = pdf_dict_gets(ctx, dict, "ID");
if (obj)
{
- pdf_drop_obj(*id);
- *id = pdf_keep_obj(obj);
+ pdf_drop_obj(ctx, *id);
+ *id = pdf_keep_obj(ctx, obj);
}
}
}
- obj = pdf_dict_gets(dict, "Length");
- if (!pdf_is_indirect(obj) && pdf_is_int(obj))
- stm_len = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "Length");
+ if (!pdf_is_indirect(ctx, obj) && pdf_is_int(ctx, obj))
+ stm_len = pdf_to_int(ctx, obj);
if (doc->file_reading_linearly && page)
{
- obj = pdf_dict_gets(dict, "Type");
- if (!strcmp(pdf_to_name(obj), "Page"))
+ obj = pdf_dict_gets(ctx, dict, "Type");
+ if (!strcmp(pdf_to_name(ctx, obj), "Page"))
{
- pdf_drop_obj(*page);
- *page = pdf_keep_obj(dict);
+ pdf_drop_obj(ctx, *page);
+ *page = pdf_keep_obj(ctx, dict);
}
}
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
}
while ( tok != PDF_TOK_STREAM &&
@@ -97,31 +96,31 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p
tok != PDF_TOK_EOF &&
tok != PDF_TOK_INT )
{
- *tmpofs = fz_tell(file);
+ *tmpofs = fz_tell(ctx, file);
if (*tmpofs < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file");
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
}
if (tok == PDF_TOK_STREAM)
{
- int c = fz_read_byte(file);
+ int c = fz_read_byte(ctx, file);
if (c == '\r') {
- c = fz_peek_byte(file);
+ c = fz_peek_byte(ctx, file);
if (c == '\n')
- fz_read_byte(file);
+ fz_read_byte(ctx, file);
}
- *stmofsp = fz_tell(file);
+ *stmofsp = fz_tell(ctx, file);
if (*stmofsp < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot seek in file");
if (stm_len > 0)
{
- fz_seek(file, *stmofsp + stm_len, 0);
+ fz_seek(ctx, file, *stmofsp + stm_len, 0);
fz_try(ctx)
{
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
}
fz_catch(ctx)
{
@@ -130,14 +129,14 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p
}
if (tok == PDF_TOK_ENDSTREAM)
goto atobjend;
- fz_seek(file, *stmofsp, 0);
+ fz_seek(ctx, file, *stmofsp, 0);
}
- (void)fz_read(file, (unsigned char *) buf->scratch, 9);
+ (void)fz_read(ctx, file, (unsigned char *) buf->scratch, 9);
while (memcmp(buf->scratch, "endstream", 9) != 0)
{
- c = fz_read_byte(file);
+ c = fz_read_byte(ctx, file);
if (c == EOF)
break;
memmove(&buf->scratch[0], &buf->scratch[1], 8);
@@ -145,35 +144,34 @@ pdf_repair_obj(pdf_document *doc, pdf_lexbuf *buf, int *stmofsp, int *stmlenp, p
}
if (stmlenp)
- *stmlenp = fz_tell(file) - *stmofsp - 9;
+ *stmlenp = fz_tell(ctx, file) - *stmofsp - 9;
atobjend:
- *tmpofs = fz_tell(file);
+ *tmpofs = fz_tell(ctx, file);
if (*tmpofs < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file");
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_ENDOBJ)
fz_warn(ctx, "object missing 'endobj' token");
else
{
/* Read another token as we always return the next one */
- *tmpofs = fz_tell(file);
+ *tmpofs = fz_tell(ctx, file);
if (*tmpofs < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file");
- tok = pdf_lex(file, buf);
+ tok = pdf_lex(ctx, file, buf);
}
}
return tok;
}
static void
-pdf_repair_obj_stm(pdf_document *doc, int num, int gen)
+pdf_repair_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen)
{
pdf_obj *obj;
fz_stream *stm = NULL;
pdf_token tok;
int i, n, count;
- fz_context *ctx = doc->ctx;
pdf_lexbuf buf;
fz_var(stm);
@@ -182,19 +180,19 @@ pdf_repair_obj_stm(pdf_document *doc, int num, int gen)
fz_try(ctx)
{
- obj = pdf_load_object(doc, num, gen);
+ obj = pdf_load_object(ctx, doc, num, gen);
- count = pdf_to_int(pdf_dict_gets(obj, "N"));
+ count = pdf_to_int(ctx, pdf_dict_gets(ctx, obj, "N"));
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
- stm = pdf_open_stream(doc, num, gen);
+ stm = pdf_open_stream(ctx, doc, num, gen);
for (i = 0; i < count; i++)
{
pdf_xref_entry *entry;
- tok = pdf_lex(stm, &buf);
+ tok = pdf_lex(ctx, stm, &buf);
if (tok != PDF_TOK_INT)
fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen);
@@ -204,29 +202,29 @@ pdf_repair_obj_stm(pdf_document *doc, int num, int gen)
fz_warn(ctx, "ignoring object with invalid object number (%d %d R)", n, i);
continue;
}
- else if (n >= pdf_xref_len(doc))
+ else if (n >= pdf_xref_len(ctx, doc))
{
fz_warn(ctx, "ignoring object with invalid object number (%d %d R)", n, i);
continue;
}
- entry = pdf_get_populating_xref_entry(doc, n);
+ entry = pdf_get_populating_xref_entry(ctx, doc, n);
entry->ofs = num;
entry->gen = i;
entry->stm_ofs = 0;
- pdf_drop_obj(entry->obj);
+ pdf_drop_obj(ctx, entry->obj);
entry->obj = NULL;
entry->type = 'o';
- tok = pdf_lex(stm, &buf);
+ tok = pdf_lex(ctx, stm, &buf);
if (tok != PDF_TOK_INT)
fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen);
}
}
fz_always(ctx)
{
- fz_close(stm);
- pdf_lexbuf_fin(&buf);
+ fz_drop_stream(ctx, stm);
+ pdf_lexbuf_fin(ctx, &buf);
}
fz_catch(ctx)
{
@@ -235,7 +233,7 @@ pdf_repair_obj_stm(pdf_document *doc, int num, int gen)
}
void
-pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
+pdf_repair_xref(fz_context *ctx, pdf_document *doc)
{
pdf_obj *dict, *obj = NULL;
pdf_obj *length;
@@ -257,7 +255,7 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
pdf_token tok;
int next;
int i, n, c;
- fz_context *ctx = doc->ctx;
+ pdf_lexbuf *buf = &doc->lexbuf.base;
fz_var(encrypt);
fz_var(id);
@@ -267,14 +265,14 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
fz_var(obj);
if (doc->repair_attempted)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "Repair failed already - not trying again");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Repair failed already - not trying again");
doc->repair_attempted = 1;
doc->dirty = 1;
/* Can't support incremental update after repair */
doc->freeze_updates = 1;
- fz_seek(doc->file, 0, 0);
+ fz_seek(ctx, doc->file, 0, 0);
fz_try(ctx)
{
@@ -284,34 +282,34 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
list = fz_malloc_array(ctx, listcap, sizeof(struct entry));
/* look for '%PDF' version marker within first kilobyte of file */
- n = fz_read(doc->file, (unsigned char *)buf->scratch, fz_mini(buf->size, 1024));
+ n = fz_read(ctx, doc->file, (unsigned char *)buf->scratch, fz_mini(buf->size, 1024));
- fz_seek(doc->file, 0, 0);
+ fz_seek(ctx, doc->file, 0, 0);
for (i = 0; i < n - 4; i++)
{
if (memcmp(&buf->scratch[i], "%PDF", 4) == 0)
{
- fz_seek(doc->file, i + 8, 0); /* skip "%PDF-X.Y" */
+ fz_seek(ctx, doc->file, i + 8, 0); /* skip "%PDF-X.Y" */
break;
}
}
/* skip comment line after version marker since some generators
* forget to terminate the comment with a newline */
- c = fz_read_byte(doc->file);
+ c = fz_read_byte(ctx, doc->file);
while (c >= 0 && (c == ' ' || c == '%'))
- c = fz_read_byte(doc->file);
- fz_unread_byte(doc->file);
+ c = fz_read_byte(ctx, doc->file);
+ fz_unread_byte(ctx, doc->file);
while (1)
{
- tmpofs = fz_tell(doc->file);
+ tmpofs = fz_tell(ctx, doc->file);
if (tmpofs < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file");
fz_try(ctx)
{
- tok = pdf_lex_no_string(doc->file, buf);
+ tok = pdf_lex_no_string(ctx, doc->file, buf);
}
fz_catch(ctx)
{
@@ -345,7 +343,7 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
{
stm_len = 0;
stm_ofs = 0;
- tok = pdf_repair_obj(doc, buf, &stm_ofs, &stm_len, &encrypt, &id, NULL, &tmpofs);
+ tok = pdf_repair_obj(ctx, doc, buf, &stm_ofs, &stm_len, &encrypt, &id, NULL, &tmpofs);
}
fz_catch(ctx)
{
@@ -393,7 +391,7 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
{
fz_try(ctx)
{
- dict = pdf_parse_dict(doc, doc->file, buf);
+ dict = pdf_parse_dict(ctx, doc, doc->file, buf);
}
fz_catch(ctx)
{
@@ -405,35 +403,35 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
continue;
}
- obj = pdf_dict_gets(dict, "Encrypt");
+ obj = pdf_dict_gets(ctx, dict, "Encrypt");
if (obj)
{
- pdf_drop_obj(encrypt);
- encrypt = pdf_keep_obj(obj);
+ pdf_drop_obj(ctx, encrypt);
+ encrypt = pdf_keep_obj(ctx, obj);
}
- obj = pdf_dict_gets(dict, "ID");
- if (obj && (!id || !encrypt || pdf_dict_gets(dict, "Encrypt")))
+ obj = pdf_dict_gets(ctx, dict, "ID");
+ if (obj && (!id || !encrypt || pdf_dict_gets(ctx, dict, "Encrypt")))
{
- pdf_drop_obj(id);
- id = pdf_keep_obj(obj);
+ pdf_drop_obj(ctx, id);
+ id = pdf_keep_obj(ctx, obj);
}
- obj = pdf_dict_gets(dict, "Root");
+ obj = pdf_dict_gets(ctx, dict, "Root");
if (obj)
{
- pdf_drop_obj(root);
- root = pdf_keep_obj(obj);
+ pdf_drop_obj(ctx, root);
+ root = pdf_keep_obj(ctx, obj);
}
- obj = pdf_dict_gets(dict, "Info");
+ obj = pdf_dict_gets(ctx, dict, "Info");
if (obj)
{
- pdf_drop_obj(info);
- info = pdf_keep_obj(obj);
+ pdf_drop_obj(ctx, info);
+ info = pdf_keep_obj(ctx, obj);
}
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
obj = NULL;
}
@@ -442,7 +440,7 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
else
{
if (tok == PDF_TOK_ERROR)
- fz_read_byte(doc->file);
+ fz_read_byte(ctx, doc->file);
num = 0;
gen = 0;
}
@@ -457,11 +455,11 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
*/
/* Ensure that the first xref table is a 'solid' one from
* 0 to maxnum. */
- pdf_ensure_solid_xref(doc, maxnum);
+ pdf_ensure_solid_xref(ctx, doc, maxnum);
for (i = 0; i < listlen; i++)
{
- entry = pdf_get_populating_xref_entry(doc, list[i].num);
+ entry = pdf_get_populating_xref_entry(ctx, doc, list[i].num);
entry->type = 'n';
entry->ofs = list[i].ofs;
entry->gen = list[i].gen;
@@ -471,26 +469,26 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
/* correct stream length for unencrypted documents */
if (!encrypt && list[i].stm_len >= 0)
{
- dict = pdf_load_object(doc, list[i].num, list[i].gen);
+ dict = pdf_load_object(ctx, doc, list[i].num, list[i].gen);
- length = pdf_new_int(doc, list[i].stm_len);
- pdf_dict_puts(dict, "Length", length);
- pdf_drop_obj(length);
+ length = pdf_new_int(ctx, doc, list[i].stm_len);
+ pdf_dict_puts(ctx, dict, "Length", length);
+ pdf_drop_obj(ctx, length);
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
}
}
- entry = pdf_get_populating_xref_entry(doc, 0);
+ entry = pdf_get_populating_xref_entry(ctx, doc, 0);
entry->type = 'f';
entry->ofs = 0;
entry->gen = 65535;
entry->stm_ofs = 0;
next = 0;
- for (i = pdf_xref_len(doc) - 1; i >= 0; i--)
+ for (i = pdf_xref_len(ctx, doc) - 1; i >= 0; i--)
{
- entry = pdf_get_populating_xref_entry(doc, i);
+ entry = pdf_get_populating_xref_entry(ctx, doc, i);
if (entry->type == 'f')
{
entry->ofs = next;
@@ -502,57 +500,57 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
/* create a repaired trailer, Root will be added later */
- obj = pdf_new_dict(doc, 5);
+ obj = pdf_new_dict(ctx, doc, 5);
/* During repair there is only a single xref section */
- pdf_set_populating_xref_trailer(doc, obj);
- pdf_drop_obj(obj);
+ pdf_set_populating_xref_trailer(ctx, doc, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- obj = pdf_new_int(doc, maxnum + 1);
- pdf_dict_puts(pdf_trailer(doc), "Size", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_int(ctx, doc, maxnum + 1);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Size", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
if (root)
{
- pdf_dict_puts(pdf_trailer(doc), "Root", root);
- pdf_drop_obj(root);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Root", root);
+ pdf_drop_obj(ctx, root);
root = NULL;
}
if (info)
{
- pdf_dict_puts(pdf_trailer(doc), "Info", info);
- pdf_drop_obj(info);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Info", info);
+ pdf_drop_obj(ctx, info);
info = NULL;
}
if (encrypt)
{
- if (pdf_is_indirect(encrypt))
+ if (pdf_is_indirect(ctx, encrypt))
{
/* create new reference with non-NULL xref pointer */
- obj = pdf_new_indirect(doc, pdf_to_num(encrypt), pdf_to_gen(encrypt));
- pdf_drop_obj(encrypt);
+ obj = pdf_new_indirect(ctx, doc, pdf_to_num(ctx, encrypt), pdf_to_gen(ctx, encrypt));
+ pdf_drop_obj(ctx, encrypt);
encrypt = obj;
obj = NULL;
}
- pdf_dict_puts(pdf_trailer(doc), "Encrypt", encrypt);
- pdf_drop_obj(encrypt);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Encrypt", encrypt);
+ pdf_drop_obj(ctx, encrypt);
encrypt = NULL;
}
if (id)
{
- if (pdf_is_indirect(id))
+ if (pdf_is_indirect(ctx, id))
{
/* create new reference with non-NULL xref pointer */
- obj = pdf_new_indirect(doc, pdf_to_num(id), pdf_to_gen(id));
- pdf_drop_obj(id);
+ obj = pdf_new_indirect(ctx, doc, pdf_to_num(ctx, id), pdf_to_gen(ctx, id));
+ pdf_drop_obj(ctx, id);
id = obj;
obj = NULL;
}
- pdf_dict_puts(pdf_trailer(doc), "ID", id);
- pdf_drop_obj(id);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "ID", id);
+ pdf_drop_obj(ctx, id);
id = NULL;
}
@@ -560,50 +558,49 @@ pdf_repair_xref(pdf_document *doc, pdf_lexbuf *buf)
}
fz_catch(ctx)
{
- pdf_drop_obj(encrypt);
- pdf_drop_obj(id);
- pdf_drop_obj(root);
- pdf_drop_obj(obj);
- pdf_drop_obj(info);
+ pdf_drop_obj(ctx, encrypt);
+ pdf_drop_obj(ctx, id);
+ pdf_drop_obj(ctx, root);
+ pdf_drop_obj(ctx, obj);
+ pdf_drop_obj(ctx, info);
fz_free(ctx, list);
fz_rethrow(ctx);
}
}
void
-pdf_repair_obj_stms(pdf_document *doc)
+pdf_repair_obj_stms(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
pdf_obj *dict;
int i;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
for (i = 0; i < xref_len; i++)
{
- pdf_xref_entry *entry = pdf_get_populating_xref_entry(doc, i);
+ pdf_xref_entry *entry = pdf_get_populating_xref_entry(ctx, doc, i);
if (entry->stm_ofs)
{
- dict = pdf_load_object(doc, i, 0);
+ dict = pdf_load_object(ctx, doc, i, 0);
fz_try(ctx)
{
- if (!strcmp(pdf_to_name(pdf_dict_gets(dict, "Type")), "ObjStm"))
- pdf_repair_obj_stm(doc, i, 0);
+ if (!strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "Type")), "ObjStm"))
+ pdf_repair_obj_stm(ctx, doc, i, 0);
}
fz_catch(ctx)
{
fz_warn(ctx, "ignoring broken object stream (%d 0 R)", i);
}
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
}
}
/* Ensure that streamed objects reside inside a known non-streamed object */
for (i = 0; i < xref_len; i++)
{
- pdf_xref_entry *entry = pdf_get_populating_xref_entry(doc, i);
+ pdf_xref_entry *entry = pdf_get_populating_xref_entry(ctx, doc, i);
- if (entry->type == 'o' && pdf_get_populating_xref_entry(doc, entry->ofs)->type != 'n')
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "invalid reference to non-object-stream: %d (%d 0 R)", entry->ofs, i);
+ if (entry->type == 'o' && pdf_get_populating_xref_entry(ctx, doc, entry->ofs)->type != 'n')
+ fz_throw(ctx, FZ_ERROR_GENERIC, "invalid reference to non-object-stream: %d (%d 0 R)", entry->ofs, i);
}
}
diff --git a/source/pdf/pdf-run.c b/source/pdf/pdf-run.c
index d52d8282..e6f3d5b9 100644
--- a/source/pdf/pdf-run.c
+++ b/source/pdf/pdf-run.c
@@ -1,19 +1,19 @@
#include "pdf-interpret-imp.h"
static void
-pdf_run_annot_with_usage(pdf_document *doc, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
+pdf_run_annot_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
{
fz_matrix local_ctm;
pdf_process process;
fz_concat(&local_ctm, &page->ctm, ctm);
- pdf_process_run(&process, dev, &local_ctm, event, NULL, 0);
+ pdf_init_process_run(ctx, &process, dev, &local_ctm, event, NULL, 0);
- pdf_process_annot(doc, page, annot, &process, cookie);
+ pdf_process_annot(ctx, doc, page, annot, &process, cookie);
}
-static void pdf_run_page_contents_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
+static void pdf_run_page_contents_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
{
fz_matrix local_ctm;
pdf_process process;
@@ -23,67 +23,70 @@ static void pdf_run_page_contents_with_usage(pdf_document *doc, pdf_page *page,
if (page->transparency)
{
fz_rect mediabox = page->mediabox;
- fz_begin_group(dev, fz_transform_rect(&mediabox, &local_ctm), 1, 0, 0, 1);
+ fz_begin_group(ctx, dev, fz_transform_rect(&mediabox, &local_ctm), 1, 0, 0, 1);
}
- pdf_process_run(&process, dev, &local_ctm, event, NULL, 0);
+ pdf_init_process_run(ctx, &process, dev, &local_ctm, event, NULL, 0);
- pdf_process_stream_object(doc, page->contents, &process, page->resources, cookie);
+ pdf_process_stream_object(ctx, doc, page->contents, &process, page->resources, cookie);
if (page->transparency)
- fz_end_group(dev);
+ fz_end_group(ctx, dev);
}
-void pdf_run_page_contents(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+void pdf_run_page_contents(fz_context *ctx, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
- int nocache = !!(dev->hints & FZ_NO_CACHE);
+ pdf_document *doc = page->doc;
+ int nocache;
+ nocache = !!(dev->hints & FZ_NO_CACHE);
if (nocache)
- pdf_mark_xref(doc);
+ pdf_mark_xref(ctx, doc);
+
fz_try(ctx)
{
- pdf_run_page_contents_with_usage(doc, page, dev, ctm, "View", cookie);
+ pdf_run_page_contents_with_usage(ctx, doc, page, dev, ctm, "View", cookie);
}
fz_always(ctx)
{
if (nocache)
- pdf_clear_xref_to_mark(doc);
+ pdf_clear_xref_to_mark(ctx, doc);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
if (page->incomplete & PDF_PAGE_INCOMPLETE_CONTENTS)
- fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
}
-void pdf_run_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+void pdf_run_annot(fz_context *ctx, pdf_page *page, pdf_annot *annot, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
- int nocache = !!(dev->hints & FZ_NO_CACHE);
+ pdf_document *doc = page->doc;
+ int nocache;
+ nocache = !!(dev->hints & FZ_NO_CACHE);
if (nocache)
- pdf_mark_xref(doc);
+ pdf_mark_xref(ctx, doc);
fz_try(ctx)
{
- pdf_run_annot_with_usage(doc, page, annot, dev, ctm, "View", cookie);
+ pdf_run_annot_with_usage(ctx, doc, page, annot, dev, ctm, "View", cookie);
}
fz_always(ctx)
{
if (nocache)
- pdf_clear_xref_to_mark(doc);
+ pdf_clear_xref_to_mark(ctx, doc);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
if (page->incomplete & PDF_PAGE_INCOMPLETE_ANNOTS)
- fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
}
-static void pdf_run_page_annots_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
+static void pdf_run_page_annots_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
{
pdf_annot *annot;
@@ -105,52 +108,51 @@ static void pdf_run_page_annots_with_usage(pdf_document *doc, pdf_page *page, fz
cookie->progress++;
}
- pdf_run_annot_with_usage(doc, page, annot, dev, ctm, event, cookie);
+ pdf_run_annot_with_usage(ctx, doc, page, annot, dev, ctm, event, cookie);
}
}
void
-pdf_run_page_with_usage(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
+pdf_run_page_with_usage(fz_context *ctx, pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, char *event, fz_cookie *cookie)
{
- fz_context *ctx = doc->ctx;
int nocache = !!(dev->hints & FZ_NO_CACHE);
if (nocache)
- pdf_mark_xref(doc);
+ pdf_mark_xref(ctx, doc);
fz_try(ctx)
{
- pdf_run_page_contents_with_usage(doc, page, dev, ctm, event, cookie);
- pdf_run_page_annots_with_usage(doc, page, dev, ctm, event, cookie);
+ pdf_run_page_contents_with_usage(ctx, doc, page, dev, ctm, event, cookie);
+ pdf_run_page_annots_with_usage(ctx, doc, page, dev, ctm, event, cookie);
}
fz_always(ctx)
{
if (nocache)
- pdf_clear_xref_to_mark(doc);
+ pdf_clear_xref_to_mark(ctx, doc);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
if (page->incomplete)
- fz_throw(doc->ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
+ fz_throw(ctx, FZ_ERROR_TRYLATER, "incomplete rendering");
}
void
-pdf_run_page(pdf_document *doc, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+pdf_run_page(fz_context *ctx, pdf_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
{
- pdf_run_page_with_usage(doc, page, dev, ctm, "View", cookie);
+ pdf_document *doc = page->doc;
+ pdf_run_page_with_usage(ctx, doc, page, dev, ctm, "View", cookie);
}
void
-pdf_run_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth)
+pdf_run_glyph(fz_context *ctx, pdf_document *doc, pdf_obj *resources, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth)
{
- fz_context *ctx = doc->ctx;
pdf_process process;
if (nested_depth > 10)
fz_throw(ctx, FZ_ERROR_GENERIC, "Too many nestings of Type3 glyphs");
- pdf_process_run(&process, dev, ctm, "View", gstate, nested_depth+1);
+ pdf_init_process_run(ctx, &process, dev, ctm, "View", gstate, nested_depth+1);
- pdf_process_glyph(doc, resources, contents, &process);
+ pdf_process_glyph(ctx, doc, resources, contents, &process);
}
diff --git a/source/pdf/pdf-shade.c b/source/pdf/pdf-shade.c
index 40728dc7..4203d1b0 100644
--- a/source/pdf/pdf-shade.c
+++ b/source/pdf/pdf-shade.c
@@ -47,28 +47,27 @@ pdf_sample_shade_function(fz_context *ctx, fz_shade *shade, int funcs, fz_functi
/* Type 1-3 -- Function-based, linear and radial shadings */
static void
-pdf_load_function_based_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, fz_function *func)
+pdf_load_function_based_shading(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, fz_function *func)
{
pdf_obj *obj;
float x0, y0, x1, y1;
float fv[2];
fz_matrix matrix;
int xx, yy;
- fz_context *ctx = doc->ctx;
float *p;
x0 = y0 = 0;
x1 = y1 = 1;
- obj = pdf_dict_gets(dict, "Domain");
+ obj = pdf_dict_gets(ctx, dict, "Domain");
if (obj)
{
- x0 = pdf_to_real(pdf_array_get(obj, 0));
- x1 = pdf_to_real(pdf_array_get(obj, 1));
- y0 = pdf_to_real(pdf_array_get(obj, 2));
- y1 = pdf_to_real(pdf_array_get(obj, 3));
+ x0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0));
+ x1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1));
+ y0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2));
+ y1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3));
}
- obj = pdf_dict_gets(dict, "Matrix");
+ obj = pdf_dict_gets(ctx, dict, "Matrix");
if (obj)
pdf_to_matrix(ctx, obj, &matrix);
else
@@ -98,34 +97,33 @@ pdf_load_function_based_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dic
}
static void
-pdf_load_linear_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, int funcs, fz_function **func)
+pdf_load_linear_shading(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func)
{
pdf_obj *obj;
float d0, d1;
int e0, e1;
- fz_context *ctx = doc->ctx;
- obj = pdf_dict_gets(dict, "Coords");
- shade->u.l_or_r.coords[0][0] = pdf_to_real(pdf_array_get(obj, 0));
- shade->u.l_or_r.coords[0][1] = pdf_to_real(pdf_array_get(obj, 1));
- shade->u.l_or_r.coords[1][0] = pdf_to_real(pdf_array_get(obj, 2));
- shade->u.l_or_r.coords[1][1] = pdf_to_real(pdf_array_get(obj, 3));
+ obj = pdf_dict_gets(ctx, dict, "Coords");
+ shade->u.l_or_r.coords[0][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0));
+ shade->u.l_or_r.coords[0][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1));
+ shade->u.l_or_r.coords[1][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2));
+ shade->u.l_or_r.coords[1][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3));
d0 = 0;
d1 = 1;
- obj = pdf_dict_gets(dict, "Domain");
+ obj = pdf_dict_gets(ctx, dict, "Domain");
if (obj)
{
- d0 = pdf_to_real(pdf_array_get(obj, 0));
- d1 = pdf_to_real(pdf_array_get(obj, 1));
+ d0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0));
+ d1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1));
}
e0 = e1 = 0;
- obj = pdf_dict_gets(dict, "Extend");
+ obj = pdf_dict_gets(ctx, dict, "Extend");
if (obj)
{
- e0 = pdf_to_bool(pdf_array_get(obj, 0));
- e1 = pdf_to_bool(pdf_array_get(obj, 1));
+ e0 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 0));
+ e1 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 1));
}
pdf_sample_shade_function(ctx, shade, funcs, func, d0, d1);
@@ -135,36 +133,35 @@ pdf_load_linear_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, int f
}
static void
-pdf_load_radial_shading(fz_shade *shade, pdf_document *doc, pdf_obj *dict, int funcs, fz_function **func)
+pdf_load_radial_shading(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func)
{
pdf_obj *obj;
float d0, d1;
int e0, e1;
- fz_context *ctx = doc->ctx;
- obj = pdf_dict_gets(dict, "Coords");
- shade->u.l_or_r.coords[0][0] = pdf_to_real(pdf_array_get(obj, 0));
- shade->u.l_or_r.coords[0][1] = pdf_to_real(pdf_array_get(obj, 1));
- shade->u.l_or_r.coords[0][2] = pdf_to_real(pdf_array_get(obj, 2));
- shade->u.l_or_r.coords[1][0] = pdf_to_real(pdf_array_get(obj, 3));
- shade->u.l_or_r.coords[1][1] = pdf_to_real(pdf_array_get(obj, 4));
- shade->u.l_or_r.coords[1][2] = pdf_to_real(pdf_array_get(obj, 5));
+ obj = pdf_dict_gets(ctx, dict, "Coords");
+ shade->u.l_or_r.coords[0][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0));
+ shade->u.l_or_r.coords[0][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1));
+ shade->u.l_or_r.coords[0][2] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2));
+ shade->u.l_or_r.coords[1][0] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3));
+ shade->u.l_or_r.coords[1][1] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 4));
+ shade->u.l_or_r.coords[1][2] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 5));
d0 = 0;
d1 = 1;
- obj = pdf_dict_gets(dict, "Domain");
+ obj = pdf_dict_gets(ctx, dict, "Domain");
if (obj)
{
- d0 = pdf_to_real(pdf_array_get(obj, 0));
- d1 = pdf_to_real(pdf_array_get(obj, 1));
+ d0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0));
+ d1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1));
}
e0 = e1 = 0;
- obj = pdf_dict_gets(dict, "Extend");
+ obj = pdf_dict_gets(ctx, dict, "Extend");
if (obj)
{
- e0 = pdf_to_bool(pdf_array_get(obj, 0));
- e1 = pdf_to_bool(pdf_array_get(obj, 1));
+ e0 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 0));
+ e1 = pdf_to_bool(ctx, pdf_array_get(ctx, obj, 1));
}
pdf_sample_shade_function(ctx, shade, funcs, func, d0, d1);
@@ -188,9 +185,8 @@ struct mesh_params
};
static void
-pdf_load_mesh_params(fz_shade *shade, pdf_document *doc, pdf_obj *dict)
+pdf_load_mesh_params(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict)
{
- fz_context *ctx = doc->ctx;
pdf_obj *obj;
int i, n;
@@ -202,23 +198,23 @@ pdf_load_mesh_params(fz_shade *shade, pdf_document *doc, pdf_obj *dict)
shade->u.m.c1[i] = 1;
}
- shade->u.m.vprow = pdf_to_int(pdf_dict_gets(dict, "VerticesPerRow"));
- shade->u.m.bpflag = pdf_to_int(pdf_dict_gets(dict, "BitsPerFlag"));
- shade->u.m.bpcoord = pdf_to_int(pdf_dict_gets(dict, "BitsPerCoordinate"));
- shade->u.m.bpcomp = pdf_to_int(pdf_dict_gets(dict, "BitsPerComponent"));
+ shade->u.m.vprow = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "VerticesPerRow"));
+ shade->u.m.bpflag = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "BitsPerFlag"));
+ shade->u.m.bpcoord = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "BitsPerCoordinate"));
+ shade->u.m.bpcomp = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "BitsPerComponent"));
- obj = pdf_dict_gets(dict, "Decode");
- if (pdf_array_len(obj) >= 6)
+ obj = pdf_dict_gets(ctx, dict, "Decode");
+ if (pdf_array_len(ctx, obj) >= 6)
{
- n = (pdf_array_len(obj) - 4) / 2;
- shade->u.m.x0 = pdf_to_real(pdf_array_get(obj, 0));
- shade->u.m.x1 = pdf_to_real(pdf_array_get(obj, 1));
- shade->u.m.y0 = pdf_to_real(pdf_array_get(obj, 2));
- shade->u.m.y1 = pdf_to_real(pdf_array_get(obj, 3));
+ n = (pdf_array_len(ctx, obj) - 4) / 2;
+ shade->u.m.x0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 0));
+ shade->u.m.x1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 1));
+ shade->u.m.y0 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 2));
+ shade->u.m.y1 = pdf_to_real(ctx, pdf_array_get(ctx, obj, 3));
for (i = 0; i < n; i++)
{
- shade->u.m.c0[i] = pdf_to_real(pdf_array_get(obj, 4 + i * 2));
- shade->u.m.c1[i] = pdf_to_real(pdf_array_get(obj, 5 + i * 2));
+ shade->u.m.c0[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 4 + i * 2));
+ shade->u.m.c1[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, 5 + i * 2));
}
}
@@ -252,67 +248,59 @@ pdf_load_mesh_params(fz_shade *shade, pdf_document *doc, pdf_obj *dict)
}
static void
-pdf_load_type4_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict,
- int funcs, fz_function **func)
+pdf_load_type4_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func)
{
- fz_context *ctx = doc->ctx;
- pdf_load_mesh_params(shade, doc, dict);
+ pdf_load_mesh_params(ctx, doc, shade, dict);
if (funcs > 0)
pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]);
- shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict));
+ shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
static void
-pdf_load_type5_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict,
- int funcs, fz_function **func)
+pdf_load_type5_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func)
{
- fz_context *ctx = doc->ctx;
- pdf_load_mesh_params(shade, doc, dict);
+ pdf_load_mesh_params(ctx, doc, shade, dict);
if (funcs > 0)
pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]);
- shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict));
+ shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
/* Type 6 & 7 -- Patch mesh shadings */
static void
-pdf_load_type6_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict,
- int funcs, fz_function **func)
+pdf_load_type6_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func)
{
- fz_context *ctx = doc->ctx;
- pdf_load_mesh_params(shade, doc, dict);
+ pdf_load_mesh_params(ctx, doc, shade, dict);
if (funcs > 0)
pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]);
- shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict));
+ shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
static void
-pdf_load_type7_shade(fz_shade *shade, pdf_document *doc, pdf_obj *dict,
- int funcs, fz_function **func)
+pdf_load_type7_shade(fz_context *ctx, pdf_document *doc, fz_shade *shade, pdf_obj *dict, int funcs, fz_function **func)
{
- fz_context *ctx = doc->ctx;
- pdf_load_mesh_params(shade, doc, dict);
+ pdf_load_mesh_params(ctx, doc, shade, dict);
if (funcs > 0)
pdf_sample_shade_function(ctx, shade, funcs, func, shade->u.m.c0[0], shade->u.m.c1[0]);
- shade->buffer = pdf_load_compressed_stream(doc, pdf_to_num(dict), pdf_to_gen(dict));
+ shade->buffer = pdf_load_compressed_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
/* Load all of the shading dictionary parameters, then switch on the shading type. */
static fz_shade *
-pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transform)
+pdf_load_shading_dict(fz_context *ctx, pdf_document *doc, pdf_obj *dict, const fz_matrix *transform)
{
fz_shade *shade = NULL;
fz_function *func[FZ_MAX_COLORS] = { NULL };
@@ -320,7 +308,6 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo
int funcs = 0;
int type = 0;
int i, in, out;
- fz_context *ctx = doc->ctx;
fz_var(shade);
fz_var(func);
@@ -330,7 +317,7 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo
fz_try(ctx)
{
shade = fz_malloc_struct(ctx, fz_shade);
- FZ_INIT_STORABLE(shade, 1, fz_free_shade_imp);
+ FZ_INIT_STORABLE(shade, 1, fz_drop_shade_imp);
shade->type = FZ_MESH_TYPE4;
shade->use_background = 0;
shade->use_function = 0;
@@ -341,28 +328,28 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo
funcs = 0;
- obj = pdf_dict_gets(dict, "ShadingType");
- type = pdf_to_int(obj);
+ obj = pdf_dict_gets(ctx, dict, "ShadingType");
+ type = pdf_to_int(ctx, obj);
- obj = pdf_dict_gets(dict, "ColorSpace");
+ obj = pdf_dict_gets(ctx, dict, "ColorSpace");
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "shading colorspace is missing");
- shade->colorspace = pdf_load_colorspace(doc, obj);
+ shade->colorspace = pdf_load_colorspace(ctx, doc, obj);
- obj = pdf_dict_gets(dict, "Background");
+ obj = pdf_dict_gets(ctx, dict, "Background");
if (obj)
{
shade->use_background = 1;
for (i = 0; i < shade->colorspace->n; i++)
- shade->background[i] = pdf_to_real(pdf_array_get(obj, i));
+ shade->background[i] = pdf_to_real(ctx, pdf_array_get(ctx, obj, i));
}
- obj = pdf_dict_gets(dict, "BBox");
- if (pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, dict, "BBox");
+ if (pdf_is_array(ctx, obj))
pdf_to_rect(ctx, obj, &shade->bbox);
- obj = pdf_dict_gets(dict, "Function");
- if (pdf_is_dict(obj))
+ obj = pdf_dict_gets(ctx, dict, "Function");
+ if (pdf_is_dict(ctx, obj))
{
funcs = 1;
@@ -372,13 +359,13 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo
in = 1;
out = shade->colorspace->n;
- func[0] = pdf_load_function(doc, obj, in, out);
+ func[0] = pdf_load_function(ctx, doc, obj, in, out);
if (!func[0])
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
- funcs = pdf_array_len(obj);
+ funcs = pdf_array_len(ctx, obj);
if (funcs != 1 && funcs != shade->colorspace->n)
{
funcs = 0;
@@ -398,27 +385,27 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo
for (i = 0; i < funcs; i++)
{
- func[i] = pdf_load_function(doc, pdf_array_get(obj, i), in, out);
+ func[i] = pdf_load_function(ctx, doc, pdf_array_get(ctx, obj, i), in, out);
if (!func[i])
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
}
else if (type < 4)
{
/* Functions are compulsory for types 1,2,3 */
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load shading function (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
}
shade->type = type;
switch (type)
{
- case 1: pdf_load_function_based_shading(shade, doc, dict, func[0]); break;
- case 2: pdf_load_linear_shading(shade, doc, dict, funcs, func); break;
- case 3: pdf_load_radial_shading(shade, doc, dict, funcs, func); break;
- case 4: pdf_load_type4_shade(shade, doc, dict, funcs, func); break;
- case 5: pdf_load_type5_shade(shade, doc, dict, funcs, func); break;
- case 6: pdf_load_type6_shade(shade, doc, dict, funcs, func); break;
- case 7: pdf_load_type7_shade(shade, doc, dict, funcs, func); break;
+ case 1: pdf_load_function_based_shading(ctx, doc, shade, dict, func[0]); break;
+ case 2: pdf_load_linear_shading(ctx, doc, shade, dict, funcs, func); break;
+ case 3: pdf_load_radial_shading(ctx, doc, shade, dict, funcs, func); break;
+ case 4: pdf_load_type4_shade(ctx, doc, shade, dict, funcs, func); break;
+ case 5: pdf_load_type5_shade(ctx, doc, shade, dict, funcs, func); break;
+ case 6: pdf_load_type6_shade(ctx, doc, shade, dict, funcs, func); break;
+ case 7: pdf_load_type7_shade(ctx, doc, shade, dict, funcs, func); break;
default:
fz_throw(ctx, FZ_ERROR_GENERIC, "unknown shading type: %d", type);
}
@@ -433,7 +420,7 @@ pdf_load_shading_dict(pdf_document *doc, pdf_obj *dict, const fz_matrix *transfo
{
fz_drop_shade(ctx, shade);
- fz_rethrow_message(ctx, "cannot load shading type %d (%d %d R)", type, pdf_to_num(dict), pdf_to_gen(dict));
+ fz_rethrow_message(ctx, "cannot load shading type %d (%d %d R)", type, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
return shade;
}
@@ -449,47 +436,46 @@ fz_shade_size(fz_shade *s)
}
fz_shade *
-pdf_load_shading(pdf_document *doc, pdf_obj *dict)
+pdf_load_shading(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
fz_matrix mat;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
fz_shade *shade;
- if ((shade = pdf_find_item(ctx, fz_free_shade_imp, dict)) != NULL)
+ if ((shade = pdf_find_item(ctx, fz_drop_shade_imp, dict)) != NULL)
{
return shade;
}
/* Type 2 pattern dictionary */
- if (pdf_dict_gets(dict, "PatternType"))
+ if (pdf_dict_gets(ctx, dict, "PatternType"))
{
- obj = pdf_dict_gets(dict, "Matrix");
+ obj = pdf_dict_gets(ctx, dict, "Matrix");
if (obj)
pdf_to_matrix(ctx, obj, &mat);
else
mat = fz_identity;
- obj = pdf_dict_gets(dict, "ExtGState");
+ obj = pdf_dict_gets(ctx, dict, "ExtGState");
if (obj)
{
- if (pdf_dict_gets(obj, "CA") || pdf_dict_gets(obj, "ca"))
+ if (pdf_dict_gets(ctx, obj, "CA") || pdf_dict_gets(ctx, obj, "ca"))
{
fz_warn(ctx, "shading with alpha not supported");
}
}
- obj = pdf_dict_gets(dict, "Shading");
+ obj = pdf_dict_gets(ctx, dict, "Shading");
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: missing shading dictionary");
- shade = pdf_load_shading_dict(doc, obj, &mat);
+ shade = pdf_load_shading_dict(ctx, doc, obj, &mat);
}
/* Naked shading dictionary */
else
{
- shade = pdf_load_shading_dict(doc, dict, &fz_identity);
+ shade = pdf_load_shading_dict(ctx, doc, dict, &fz_identity);
}
pdf_store_item(ctx, dict, shade, fz_shade_size(shade));
diff --git a/source/pdf/pdf-store.c b/source/pdf/pdf-store.c
index dfb2f54c..51255414 100644
--- a/source/pdf/pdf-store.c
+++ b/source/pdf/pdf-store.c
@@ -1,47 +1,48 @@
#include "mupdf/pdf.h"
static int
-pdf_make_hash_key(fz_store_hash *hash, void *key_)
+pdf_make_hash_key(fz_context *ctx, fz_store_hash *hash, void *key_)
{
pdf_obj *key = (pdf_obj *)key_;
- if (!pdf_is_indirect(key))
+ if (!pdf_is_indirect(ctx, key))
return 0;
- hash->u.i.i0 = pdf_to_num(key);
- hash->u.i.i1 = pdf_to_gen(key);
- hash->u.i.ptr = pdf_get_indirect_document(key);
+ hash->u.i.i0 = pdf_to_num(ctx, key);
+ hash->u.i.i1 = pdf_to_gen(ctx, key);
+ hash->u.i.ptr = pdf_get_indirect_document(ctx, key);
return 1;
}
static void *
pdf_keep_key(fz_context *ctx, void *key)
{
- return (void *)pdf_keep_obj((pdf_obj *)key);
+ return (void *)pdf_keep_obj(ctx, (pdf_obj *)key);
}
static void
pdf_drop_key(fz_context *ctx, void *key)
{
- pdf_drop_obj((pdf_obj *)key);
+ pdf_drop_obj(ctx, (pdf_obj *)key);
}
static int
-pdf_cmp_key(void *k0, void *k1)
+pdf_cmp_key(fz_context *ctx, void *k0, void *k1)
{
- return pdf_objcmp((pdf_obj *)k0, (pdf_obj *)k1);
+ return pdf_objcmp(ctx, (pdf_obj *)k0, (pdf_obj *)k1);
}
#ifndef NDEBUG
static void
-pdf_debug_key(FILE *out, void *key_)
+pdf_debug_key(fz_context *ctx, FILE *out, void *key_)
{
pdf_obj *key = (pdf_obj *)key_;
- if (pdf_is_indirect(key))
+ if (pdf_is_indirect(ctx, key))
{
- fprintf(out, "(%d %d R) ", pdf_to_num(key), pdf_to_gen(key));
- } else
- pdf_fprint_obj(out, key, 0);
+ fprintf(out, "(%d %d R) ", pdf_to_num(ctx, key), pdf_to_gen(ctx, key));
+ }
+ else
+ pdf_fprint_obj(ctx, out, key, 0);
}
#endif
@@ -65,13 +66,13 @@ 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)
+pdf_find_item(fz_context *ctx, fz_store_drop_fn *drop, pdf_obj *key)
{
- return fz_find_item(ctx, free, key, &pdf_obj_store_type);
+ return fz_find_item(ctx, drop, key, &pdf_obj_store_type);
}
void
-pdf_remove_item(fz_context *ctx, fz_store_free_fn *free, pdf_obj *key)
+pdf_remove_item(fz_context *ctx, fz_store_drop_fn *drop, pdf_obj *key)
{
- fz_remove_item(ctx, free, key, &pdf_obj_store_type);
+ fz_remove_item(ctx, drop, key, &pdf_obj_store_type);
}
diff --git a/source/pdf/pdf-stream.c b/source/pdf/pdf-stream.c
index eb6b616e..2335e67a 100644
--- a/source/pdf/pdf-stream.c
+++ b/source/pdf/pdf-stream.c
@@ -4,16 +4,15 @@
* Check if an object is a stream or not.
*/
int
-pdf_is_stream(pdf_document *doc, int num, int gen)
+pdf_is_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
{
pdf_xref_entry *entry;
- if (num <= 0 || num >= pdf_xref_len(doc))
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
return 0;
- pdf_cache_object(doc, num, gen);
+ entry = pdf_cache_object(ctx, doc, num, gen);
- entry = pdf_get_xref_entry(doc, num);
return entry->stm_ofs != 0 || entry->stm_buf;
}
@@ -27,18 +26,18 @@ pdf_stream_has_crypt(fz_context *ctx, pdf_obj *stm)
pdf_obj *obj;
int i;
- filters = pdf_dict_getsa(stm, "Filter", "F");
+ filters = pdf_dict_getsa(ctx, stm, "Filter", "F");
if (filters)
{
- if (!strcmp(pdf_to_name(filters), "Crypt"))
+ if (!strcmp(pdf_to_name(ctx, filters), "Crypt"))
return 1;
- if (pdf_is_array(filters))
+ if (pdf_is_array(ctx, filters))
{
- int n = pdf_array_len(filters);
+ int n = pdf_array_len(ctx, filters);
for (i = 0; i < n; i++)
{
- obj = pdf_array_get(filters, i);
- if (!strcmp(pdf_to_name(obj), "Crypt"))
+ obj = pdf_array_get(ctx, filters, i);
+ if (!strcmp(pdf_to_name(ctx, obj), "Crypt"))
return 1;
}
}
@@ -47,22 +46,21 @@ pdf_stream_has_crypt(fz_context *ctx, pdf_obj *stm)
}
static fz_jbig2_globals *
-pdf_load_jbig2_globals(pdf_document *doc, pdf_obj *dict)
+pdf_load_jbig2_globals(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
fz_jbig2_globals *globals;
- fz_context *ctx = doc->ctx;
fz_buffer *buf = NULL;
fz_var(buf);
- if ((globals = pdf_find_item(ctx, fz_free_jbig2_globals_imp, dict)) != NULL)
+ if ((globals = pdf_find_item(ctx, fz_drop_jbig2_globals_imp, dict)) != NULL)
{
return globals;
}
fz_try(ctx)
{
- buf = pdf_load_stream(doc, pdf_to_num(dict), pdf_to_gen(dict));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
globals = fz_load_jbig2_globals(ctx, buf->data, buf->len);
pdf_store_item(ctx, dict, globals, buf->len);
}
@@ -82,68 +80,67 @@ pdf_load_jbig2_globals(pdf_document *doc, pdf_obj *dict)
* Create a filter given a name and param dictionary.
*/
static fz_stream *
-build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int num, int gen, fz_compression_params *params)
+build_filter(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int num, int gen, fz_compression_params *params)
{
- fz_context *ctx = chain->ctx;
- char *s = pdf_to_name(f);
+ char *s = pdf_to_name(ctx, f);
- int predictor = pdf_to_int(pdf_dict_gets(p, "Predictor"));
- pdf_obj *columns_obj = pdf_dict_gets(p, "Columns");
- int columns = pdf_to_int(columns_obj);
- int colors = pdf_to_int(pdf_dict_gets(p, "Colors"));
- int bpc = pdf_to_int(pdf_dict_gets(p, "BitsPerComponent"));
+ int predictor = pdf_to_int(ctx, pdf_dict_gets(ctx, p, "Predictor"));
+ pdf_obj *columns_obj = pdf_dict_gets(ctx, p, "Columns");
+ int columns = pdf_to_int(ctx, columns_obj);
+ int colors = pdf_to_int(ctx, pdf_dict_gets(ctx, p, "Colors"));
+ int bpc = pdf_to_int(ctx, pdf_dict_gets(ctx, p, "BitsPerComponent"));
if (params)
params->type = FZ_IMAGE_RAW;
if (!strcmp(s, "ASCIIHexDecode") || !strcmp(s, "AHx"))
- return fz_open_ahxd(chain);
+ return fz_open_ahxd(ctx, chain);
else if (!strcmp(s, "ASCII85Decode") || !strcmp(s, "A85"))
- return fz_open_a85d(chain);
+ return fz_open_a85d(ctx, chain);
else if (!strcmp(s, "CCITTFaxDecode") || !strcmp(s, "CCF"))
{
- pdf_obj *k = pdf_dict_gets(p, "K");
- pdf_obj *eol = pdf_dict_gets(p, "EndOfLine");
- pdf_obj *eba = pdf_dict_gets(p, "EncodedByteAlign");
- pdf_obj *rows = pdf_dict_gets(p, "Rows");
- pdf_obj *eob = pdf_dict_gets(p, "EndOfBlock");
- pdf_obj *bi1 = pdf_dict_gets(p, "BlackIs1");
+ pdf_obj *k = pdf_dict_gets(ctx, p, "K");
+ pdf_obj *eol = pdf_dict_gets(ctx, p, "EndOfLine");
+ pdf_obj *eba = pdf_dict_gets(ctx, p, "EncodedByteAlign");
+ pdf_obj *rows = pdf_dict_gets(ctx, p, "Rows");
+ pdf_obj *eob = pdf_dict_gets(ctx, p, "EndOfBlock");
+ pdf_obj *bi1 = pdf_dict_gets(ctx, p, "BlackIs1");
if (params)
{
/* We will shortstop here */
params->type = FZ_IMAGE_FAX;
- params->u.fax.k = (k ? pdf_to_int(k) : 0);
- params->u.fax.end_of_line = (eol ? pdf_to_bool(eol) : 0);
- params->u.fax.encoded_byte_align = (eba ? pdf_to_bool(eba) : 0);
+ params->u.fax.k = (k ? pdf_to_int(ctx, k) : 0);
+ params->u.fax.end_of_line = (eol ? pdf_to_bool(ctx, eol) : 0);
+ params->u.fax.encoded_byte_align = (eba ? pdf_to_bool(ctx, eba) : 0);
params->u.fax.columns = (columns_obj ? columns : 1728);
- params->u.fax.rows = (rows ? pdf_to_int(rows) : 0);
- params->u.fax.end_of_block = (eob ? pdf_to_bool(eob) : 1);
- params->u.fax.black_is_1 = (bi1 ? pdf_to_bool(bi1) : 0);
+ params->u.fax.rows = (rows ? pdf_to_int(ctx, rows) : 0);
+ params->u.fax.end_of_block = (eob ? pdf_to_bool(ctx, eob) : 1);
+ params->u.fax.black_is_1 = (bi1 ? pdf_to_bool(ctx, bi1) : 0);
return chain;
}
- return fz_open_faxd(chain,
- k ? pdf_to_int(k) : 0,
- eol ? pdf_to_bool(eol) : 0,
- eba ? pdf_to_bool(eba) : 0,
+ return fz_open_faxd(ctx, chain,
+ k ? pdf_to_int(ctx, k) : 0,
+ eol ? pdf_to_bool(ctx, eol) : 0,
+ eba ? pdf_to_bool(ctx, eba) : 0,
columns_obj ? columns : 1728,
- rows ? pdf_to_int(rows) : 0,
- eob ? pdf_to_bool(eob) : 1,
- bi1 ? pdf_to_bool(bi1) : 0);
+ rows ? pdf_to_int(ctx, rows) : 0,
+ eob ? pdf_to_bool(ctx, eob) : 1,
+ bi1 ? pdf_to_bool(ctx, bi1) : 0);
}
else if (!strcmp(s, "DCTDecode") || !strcmp(s, "DCT"))
{
- pdf_obj *ct = pdf_dict_gets(p, "ColorTransform");
+ pdf_obj *ct = pdf_dict_gets(ctx, p, "ColorTransform");
if (params)
{
/* We will shortstop here */
params->type = FZ_IMAGE_JPEG;
- params->u.jpeg.color_transform = (ct ? pdf_to_int(ct) : -1);
+ params->u.jpeg.color_transform = (ct ? pdf_to_int(ctx, ct) : -1);
return chain;
}
- return fz_open_dctd(chain, ct ? pdf_to_int(ct) : -1, 0, NULL);
+ return fz_open_dctd(ctx, chain, ct ? pdf_to_int(ctx, ct) : -1, 0, NULL);
}
else if (!strcmp(s, "RunLengthDecode") || !strcmp(s, "RL"))
@@ -154,7 +151,7 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu
params->type = FZ_IMAGE_RLD;
return chain;
}
- return fz_open_rld(chain);
+ return fz_open_rld(ctx, chain);
}
else if (!strcmp(s, "FlateDecode") || !strcmp(s, "Fl"))
{
@@ -168,15 +165,15 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu
params->u.flate.bpc = bpc;
return chain;
}
- chain = fz_open_flated(chain, 15);
+ chain = fz_open_flated(ctx, chain, 15);
if (predictor > 1)
- chain = fz_open_predict(chain, predictor, columns, colors, bpc);
+ chain = fz_open_predict(ctx, chain, predictor, columns, colors, bpc);
return chain;
}
else if (!strcmp(s, "LZWDecode") || !strcmp(s, "LZW"))
{
- pdf_obj *ec = pdf_dict_gets(p, "EarlyChange");
+ pdf_obj *ec = pdf_dict_gets(ctx, p, "EarlyChange");
if (params)
{
/* We will shortstop here */
@@ -185,23 +182,23 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu
params->u.lzw.columns = columns;
params->u.lzw.colors = colors;
params->u.lzw.bpc = bpc;
- params->u.lzw.early_change = (ec ? pdf_to_int(ec) : 1);
+ params->u.lzw.early_change = (ec ? pdf_to_int(ctx, ec) : 1);
return chain;
}
- chain = fz_open_lzwd(chain, ec ? pdf_to_int(ec) : 1);
+ chain = fz_open_lzwd(ctx, chain, ec ? pdf_to_int(ctx, ec) : 1);
if (predictor > 1)
- chain = fz_open_predict(chain, predictor, columns, colors, bpc);
+ chain = fz_open_predict(ctx, chain, predictor, columns, colors, bpc);
return chain;
}
else if (!strcmp(s, "JBIG2Decode"))
{
fz_jbig2_globals *globals = NULL;
- pdf_obj *obj = pdf_dict_gets(p, "JBIG2Globals");
- if (pdf_is_indirect(obj))
- globals = pdf_load_jbig2_globals(doc, obj);
+ pdf_obj *obj = pdf_dict_gets(ctx, p, "JBIG2Globals");
+ if (pdf_is_indirect(ctx, obj))
+ globals = pdf_load_jbig2_globals(ctx, doc, obj);
/* fz_open_jbig2d takes possession of globals */
- return fz_open_jbig2d(chain, globals);
+ return fz_open_jbig2d(ctx, chain, globals);
}
else if (!strcmp(s, "JPXDecode"))
@@ -217,9 +214,9 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu
return chain;
}
- name = pdf_dict_gets(p, "Name");
- if (pdf_is_name(name))
- return pdf_open_crypt_with_filter(chain, doc->crypt, pdf_to_name(name), num, gen);
+ name = pdf_dict_gets(ctx, p, "Name");
+ if (pdf_is_name(ctx, name))
+ return pdf_open_crypt_with_filter(ctx, chain, doc->crypt, pdf_to_name(ctx, name), num, gen);
return chain;
}
@@ -234,30 +231,29 @@ build_filter(fz_stream *chain, pdf_document *doc, pdf_obj *f, pdf_obj *p, int nu
* Assume ownership of head.
*/
static fz_stream *
-build_filter_chain(fz_stream *chain, pdf_document *doc, pdf_obj *fs, pdf_obj *ps, int num, int gen, fz_compression_params *params)
+build_filter_chain(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_obj *fs, pdf_obj *ps, int num, int gen, fz_compression_params *params)
{
pdf_obj *f;
pdf_obj *p;
int i, n;
- fz_context *ctx = chain->ctx;
fz_try(ctx)
{
- n = pdf_array_len(fs);
+ n = pdf_array_len(ctx, fs);
for (i = 0; i < n; i++)
{
fz_stream *chain2;
- f = pdf_array_get(fs, i);
- p = pdf_array_get(ps, i);
+ f = pdf_array_get(ctx, fs, i);
+ p = pdf_array_get(ctx, ps, i);
chain2 = chain;
chain = NULL;
- chain = build_filter(chain2, doc, f, p, num, gen, (i == n-1 ? params : NULL));
+ chain = build_filter(ctx, chain2, doc, f, p, num, gen, (i == n-1 ? params : NULL));
}
}
fz_catch(ctx)
{
- fz_close(chain);
+ fz_drop_stream(ctx, chain);
fz_rethrow(ctx);
}
@@ -273,28 +269,27 @@ build_filter_chain(fz_stream *chain, pdf_document *doc, pdf_obj *fs, pdf_obj *ps
* orig_num and orig_gen are used purely to seed the encryption.
*/
static fz_stream *
-pdf_open_raw_filter(fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, int orig_num, int orig_gen, int offset)
+pdf_open_raw_filter(fz_context *ctx, fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, int orig_num, int orig_gen, int offset)
{
- fz_context *ctx = chain->ctx;
int hascrypt;
int len;
- if (num > 0 && num < pdf_xref_len(doc))
+ if (num > 0 && num < pdf_xref_len(ctx, doc))
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, num);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num);
if (entry->stm_buf)
return fz_open_buffer(ctx, entry->stm_buf);
}
/* don't close chain when we close this filter */
- fz_keep_stream(chain);
+ fz_keep_stream(ctx, chain);
- len = pdf_to_int(pdf_dict_gets(stmobj, "Length"));
- chain = fz_open_null(chain, len, offset);
+ len = pdf_to_int(ctx, pdf_dict_gets(ctx, stmobj, "Length"));
+ chain = fz_open_null(ctx, chain, len, offset);
hascrypt = pdf_stream_has_crypt(ctx, stmobj);
if (doc->crypt && !hascrypt)
- chain = pdf_open_crypt(chain, doc->crypt, orig_num, orig_gen);
+ chain = pdf_open_crypt(ctx, chain, doc->crypt, orig_num, orig_gen);
return chain;
}
@@ -304,37 +299,37 @@ pdf_open_raw_filter(fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int nu
* to stream length and decrypting.
*/
static fz_stream *
-pdf_open_filter(fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, int gen, int offset, fz_compression_params *imparams)
+pdf_open_filter(fz_context *ctx, pdf_document *doc, fz_stream *chain, pdf_obj *stmobj, int num, int gen, int offset, fz_compression_params *imparams)
{
pdf_obj *filters;
pdf_obj *params;
- filters = pdf_dict_getsa(stmobj, "Filter", "F");
- params = pdf_dict_getsa(stmobj, "DecodeParms", "DP");
+ filters = pdf_dict_getsa(ctx, stmobj, "Filter", "F");
+ params = pdf_dict_getsa(ctx, stmobj, "DecodeParms", "DP");
- chain = pdf_open_raw_filter(chain, doc, stmobj, num, num, gen, offset);
+ chain = pdf_open_raw_filter(ctx, chain, doc, stmobj, num, num, gen, offset);
fz_var(chain);
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- if (pdf_is_name(filters))
+ if (pdf_is_name(ctx, filters))
{
fz_stream *chain2 = chain;
chain = NULL;
- chain = build_filter(chain2, doc, filters, params, num, gen, imparams);
+ chain = build_filter(ctx, chain2, doc, filters, params, num, gen, imparams);
}
- else if (pdf_array_len(filters) > 0)
+ else if (pdf_array_len(ctx, filters) > 0)
{
fz_stream *chain2 = chain;
chain = NULL;
- chain = build_filter_chain(chain2, doc, filters, params, num, gen, imparams);
+ chain = build_filter_chain(ctx, chain2, doc, filters, params, num, gen, imparams);
}
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_close(chain);
- fz_rethrow(doc->ctx);
+ fz_drop_stream(ctx, chain);
+ fz_rethrow(ctx);
}
return chain;
@@ -345,31 +340,30 @@ pdf_open_filter(fz_stream *chain, pdf_document *doc, pdf_obj *stmobj, int num, i
* constraining to stream length, and without decryption.
*/
fz_stream *
-pdf_open_inline_stream(pdf_document *doc, pdf_obj *stmobj, int length, fz_stream *chain, fz_compression_params *imparams)
+pdf_open_inline_stream(fz_context *ctx, pdf_document *doc, pdf_obj *stmobj, int length, fz_stream *chain, fz_compression_params *imparams)
{
pdf_obj *filters;
pdf_obj *params;
- filters = pdf_dict_getsa(stmobj, "Filter", "F");
- params = pdf_dict_getsa(stmobj, "DecodeParms", "DP");
+ filters = pdf_dict_getsa(ctx, stmobj, "Filter", "F");
+ params = pdf_dict_getsa(ctx, stmobj, "DecodeParms", "DP");
/* don't close chain when we close this filter */
- fz_keep_stream(chain);
+ fz_keep_stream(ctx, chain);
- if (pdf_is_name(filters))
- return build_filter(chain, doc, filters, params, 0, 0, imparams);
- if (pdf_array_len(filters) > 0)
- return build_filter_chain(chain, doc, filters, params, 0, 0, imparams);
+ if (pdf_is_name(ctx, filters))
+ return build_filter(ctx, chain, doc, filters, params, 0, 0, imparams);
+ if (pdf_array_len(ctx, filters) > 0)
+ return build_filter_chain(ctx, chain, doc, filters, params, 0, 0, imparams);
if (imparams)
imparams->type = FZ_IMAGE_RAW;
- return fz_open_null(chain, length, fz_tell(chain));
+ return fz_open_null(ctx, chain, length, fz_tell(ctx, chain));
}
void
-pdf_load_compressed_inline_image(pdf_document *doc, pdf_obj *dict, int length, fz_stream *stm, int indexed, fz_image *image)
+pdf_load_compressed_inline_image(fz_context *ctx, pdf_document *doc, pdf_obj *dict, int length, fz_stream *stm, int indexed, fz_image *image)
{
- fz_context *ctx = doc->ctx;
fz_compressed_buffer *bc = fz_malloc_struct(ctx, fz_compressed_buffer);
fz_try(ctx)
@@ -377,15 +371,15 @@ pdf_load_compressed_inline_image(pdf_document *doc, pdf_obj *dict, int length, f
int dummy_l2factor = 0;
bc->buffer = fz_new_buffer(ctx, 1024);
- stm = pdf_open_inline_stream(doc, dict, length, stm, &bc->params);
- stm = fz_open_leecher(stm, bc->buffer);
+ stm = pdf_open_inline_stream(ctx, doc, dict, length, stm, &bc->params);
+ stm = fz_open_leecher(ctx, stm, bc->buffer);
stm = fz_open_image_decomp_stream(ctx, stm, &bc->params, &dummy_l2factor);
image->tile = fz_decomp_image_from_stream(ctx, stm, image, indexed, 0, 0);
}
fz_catch(ctx)
{
- fz_free_compressed_buffer(ctx, bc);
+ fz_drop_compressed_buffer(ctx, bc);
fz_rethrow(ctx);
}
image->buffer = bc;
@@ -395,43 +389,39 @@ pdf_load_compressed_inline_image(pdf_document *doc, pdf_obj *dict, int length, f
* Open a stream for reading the raw (compressed but decrypted) data.
*/
fz_stream *
-pdf_open_raw_stream(pdf_document *doc, int num, int gen)
+pdf_open_raw_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
{
- return pdf_open_raw_renumbered_stream(doc, num, gen, num, gen);
+ return pdf_open_raw_renumbered_stream(ctx, doc, num, gen, num, gen);
}
fz_stream *
-pdf_open_raw_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen)
+pdf_open_raw_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen)
{
pdf_xref_entry *x;
- if (num <= 0 || num >= pdf_xref_len(doc))
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen);
-
- pdf_cache_object(doc, num, gen);
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen);
- x = pdf_get_xref_entry(doc, num);
+ x = pdf_cache_object(ctx, doc, num, gen);
if (x->stm_ofs == 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object is not a stream");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object is not a stream");
- return pdf_open_raw_filter(doc->file, doc, x->obj, num, orig_num, orig_gen, x->stm_ofs);
+ return pdf_open_raw_filter(ctx, doc->file, doc, x->obj, num, orig_num, orig_gen, x->stm_ofs);
}
static fz_stream *
-pdf_open_image_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params)
+pdf_open_image_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params)
{
pdf_xref_entry *x;
- if (num <= 0 || num >= pdf_xref_len(doc))
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen);
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object id out of range (%d %d R)", num, gen);
- pdf_cache_object(doc, num, gen);
-
- x = pdf_get_xref_entry(doc, num);
+ x = pdf_cache_object(ctx, doc, num, gen);
if (x->stm_ofs == 0 && x->stm_buf == NULL)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object is not a stream");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object is not a stream");
- return pdf_open_filter(doc->file, doc, x->obj, orig_num, orig_gen, x->stm_ofs, params);
+ return pdf_open_filter(ctx, doc, doc->file, x->obj, orig_num, orig_gen, x->stm_ofs, params);
}
/*
@@ -440,55 +430,55 @@ pdf_open_image_stream(pdf_document *doc, int num, int gen, int orig_num, int ori
* Using doc->file while a stream is open is a Bad idea.
*/
fz_stream *
-pdf_open_stream(pdf_document *doc, int num, int gen)
+pdf_open_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
{
- return pdf_open_image_stream(doc, num, gen, num, gen, NULL);
+ return pdf_open_image_stream(ctx, doc, num, gen, num, gen, NULL);
}
fz_stream *
-pdf_open_stream_with_offset(pdf_document *doc, int num, int gen, pdf_obj *dict, int stm_ofs)
+pdf_open_stream_with_offset(fz_context *ctx, pdf_document *doc, int num, int gen, pdf_obj *dict, int stm_ofs)
{
if (stm_ofs == 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object is not a stream");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object is not a stream");
- return pdf_open_filter(doc->file, doc, dict, num, gen, stm_ofs, NULL);
+ return pdf_open_filter(ctx, doc, doc->file, dict, num, gen, stm_ofs, NULL);
}
/*
* Load raw (compressed but decrypted) contents of a stream into buf.
*/
fz_buffer *
-pdf_load_raw_stream(pdf_document *doc, int num, int gen)
+pdf_load_raw_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
{
- return pdf_load_raw_renumbered_stream(doc, num, gen, num, gen);
+ return pdf_load_raw_renumbered_stream(ctx, doc, num, gen, num, gen);
}
fz_buffer *
-pdf_load_raw_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen)
+pdf_load_raw_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen)
{
fz_stream *stm;
pdf_obj *dict;
int len;
fz_buffer *buf;
- if (num > 0 && num < pdf_xref_len(doc))
+ if (num > 0 && num < pdf_xref_len(ctx, doc))
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, num);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num);
if (entry->stm_buf)
- return fz_keep_buffer(doc->ctx, entry->stm_buf);
+ return fz_keep_buffer(ctx, entry->stm_buf);
}
- dict = pdf_load_object(doc, num, gen);
+ dict = pdf_load_object(ctx, doc, num, gen);
- len = pdf_to_int(pdf_dict_gets(dict, "Length"));
+ len = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "Length"));
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
- stm = pdf_open_raw_renumbered_stream(doc, num, gen, orig_num, orig_gen);
+ stm = pdf_open_raw_renumbered_stream(ctx, doc, num, gen, orig_num, orig_gen);
- buf = fz_read_all(stm, len);
+ buf = fz_read_all(ctx, stm, len);
- fz_close(stm);
+ fz_drop_stream(ctx, stm);
return buf;
}
@@ -509,9 +499,8 @@ pdf_guess_filter_length(int len, char *filter)
}
static fz_buffer *
-pdf_load_image_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params, int *truncated)
+pdf_load_image_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, fz_compression_params *params, int *truncated)
{
- fz_context *ctx = doc->ctx;
fz_stream *stm = NULL;
pdf_obj *dict, *obj;
int i, len, n;
@@ -519,36 +508,36 @@ pdf_load_image_stream(pdf_document *doc, int num, int gen, int orig_num, int ori
fz_var(buf);
- if (num > 0 && num < pdf_xref_len(doc))
+ if (num > 0 && num < pdf_xref_len(ctx, doc))
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, num);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num);
if (entry->stm_buf)
- return fz_keep_buffer(doc->ctx, entry->stm_buf);
+ return fz_keep_buffer(ctx, entry->stm_buf);
}
- dict = pdf_load_object(doc, num, gen);
+ dict = pdf_load_object(ctx, doc, num, gen);
- len = pdf_to_int(pdf_dict_gets(dict, "Length"));
- obj = pdf_dict_gets(dict, "Filter");
- len = pdf_guess_filter_length(len, pdf_to_name(obj));
- n = pdf_array_len(obj);
+ len = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "Length"));
+ obj = pdf_dict_gets(ctx, dict, "Filter");
+ len = pdf_guess_filter_length(len, pdf_to_name(ctx, obj));
+ n = pdf_array_len(ctx, obj);
for (i = 0; i < n; i++)
- len = pdf_guess_filter_length(len, pdf_to_name(pdf_array_get(obj, i)));
+ len = pdf_guess_filter_length(len, pdf_to_name(ctx, pdf_array_get(ctx, obj, i)));
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
- stm = pdf_open_image_stream(doc, num, gen, orig_num, orig_gen, params);
+ stm = pdf_open_image_stream(ctx, doc, num, gen, orig_num, orig_gen, params);
fz_try(ctx)
{
if (truncated)
- buf = fz_read_best(stm, len, truncated);
+ buf = fz_read_best(ctx, stm, len, truncated);
else
- buf = fz_read_all(stm, len);
+ buf = fz_read_all(ctx, stm, len);
}
fz_always(ctx)
{
- fz_close(stm);
+ fz_drop_stream(ctx, stm);
}
fz_catch(ctx)
{
@@ -562,26 +551,25 @@ pdf_load_image_stream(pdf_document *doc, int num, int gen, int orig_num, int ori
* Load uncompressed contents of a stream into buf.
*/
fz_buffer *
-pdf_load_stream(pdf_document *doc, int num, int gen)
+pdf_load_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
{
- return pdf_load_image_stream(doc, num, gen, num, gen, NULL, NULL);
+ return pdf_load_image_stream(ctx, doc, num, gen, num, gen, NULL, NULL);
}
fz_buffer *
-pdf_load_renumbered_stream(pdf_document *doc, int num, int gen, int orig_num, int orig_gen, int *truncated)
+pdf_load_renumbered_stream(fz_context *ctx, pdf_document *doc, int num, int gen, int orig_num, int orig_gen, int *truncated)
{
- return pdf_load_image_stream(doc, num, gen, orig_num, orig_gen, NULL, truncated);
+ return pdf_load_image_stream(ctx, doc, num, gen, orig_num, orig_gen, NULL, truncated);
}
fz_compressed_buffer *
-pdf_load_compressed_stream(pdf_document *doc, int num, int gen)
+pdf_load_compressed_stream(fz_context *ctx, pdf_document *doc, int num, int gen)
{
- fz_context *ctx = doc->ctx;
fz_compressed_buffer *bc = fz_malloc_struct(ctx, fz_compressed_buffer);
fz_try(ctx)
{
- bc->buffer = pdf_load_image_stream(doc, num, gen, num, gen, &bc->params, NULL);
+ bc->buffer = pdf_load_image_stream(ctx, doc, num, gen, num, gen, &bc->params, NULL);
}
fz_catch(ctx)
{
@@ -592,22 +580,21 @@ pdf_load_compressed_stream(pdf_document *doc, int num, int gen)
}
static fz_stream *
-pdf_open_object_array(pdf_document *doc, pdf_obj *list)
+pdf_open_object_array(fz_context *ctx, pdf_document *doc, pdf_obj *list)
{
- int i, n;
- fz_context *ctx = doc->ctx;
fz_stream *stm;
+ int i, n;
- n = pdf_array_len(list);
+ n = pdf_array_len(ctx, list);
stm = fz_open_concat(ctx, n, 1);
fz_var(i); /* Workaround Mac compiler bug */
for (i = 0; i < n; i++)
{
- pdf_obj *obj = pdf_array_get(list, i);
+ pdf_obj *obj = pdf_array_get(ctx, list, i);
fz_try(ctx)
{
- fz_concat_push(stm, pdf_open_stream(doc, pdf_to_num(obj), pdf_to_gen(obj)));
+ fz_concat_push(ctx, stm, pdf_open_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)));
}
fz_catch(ctx)
{
@@ -621,18 +608,17 @@ pdf_open_object_array(pdf_document *doc, pdf_obj *list)
}
fz_stream *
-pdf_open_contents_stream(pdf_document *doc, pdf_obj *obj)
+pdf_open_contents_stream(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- fz_context *ctx = doc->ctx;
int num, gen;
- if (pdf_is_array(obj))
- return pdf_open_object_array(doc, obj);
+ if (pdf_is_array(ctx, obj))
+ return pdf_open_object_array(ctx, doc, obj);
- num = pdf_to_num(obj);
- gen = pdf_to_gen(obj);
- if (pdf_is_stream(doc, num, gen))
- return pdf_open_image_stream(doc, num, gen, num, gen, NULL);
+ num = pdf_to_num(ctx, obj);
+ gen = pdf_to_gen(ctx, obj);
+ if (pdf_is_stream(ctx, doc, num, gen))
+ return pdf_open_image_stream(ctx, doc, num, gen, num, gen, NULL);
fz_warn(ctx, "pdf object stream missing (%d %d R)", num, gen);
return NULL;
diff --git a/source/pdf/pdf-type3.c b/source/pdf/pdf-type3.c
index 3bb01a1c..3da74806 100644
--- a/source/pdf/pdf-type3.c
+++ b/source/pdf/pdf-type3.c
@@ -1,20 +1,20 @@
#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)
+pdf_run_glyph_func(fz_context *ctx, void *doc, void *rdb, fz_buffer *contents, fz_device *dev, const fz_matrix *ctm, void *gstate, int nested_depth)
{
- pdf_run_glyph(doc, (pdf_obj *)rdb, contents, dev, ctm, gstate, nested_depth);
+ pdf_run_glyph(ctx, doc, (pdf_obj *)rdb, contents, dev, ctm, gstate, nested_depth);
}
static void
-pdf_t3_free_resources(void *doc, void *rdb_)
+pdf_t3_free_resources(fz_context *ctx, void *doc, void *rdb_)
{
pdf_obj *rdb = (pdf_obj *)rdb_;
- pdf_drop_obj(rdb);
+ pdf_drop_obj(ctx, rdb);
}
pdf_font_desc *
-pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
+pdf_load_type3_font(fz_context *ctx, pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
{
char buf[256];
char *estrings[256];
@@ -27,7 +27,6 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
int i, k, n;
fz_rect bbox;
fz_matrix matrix;
- fz_context *ctx = doc->ctx;
fz_var(fontdesc);
@@ -38,24 +37,24 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
if (new_max == 0)
new_max = 4;
- doc->type3_fonts = fz_resize_array(doc->ctx, doc->type3_fonts, new_max, sizeof(*doc->type3_fonts));
+ doc->type3_fonts = fz_resize_array(ctx, doc->type3_fonts, new_max, sizeof(*doc->type3_fonts));
doc->max_type3_fonts = new_max;
}
fz_try(ctx)
{
- obj = pdf_dict_gets(dict, "Name");
- if (pdf_is_name(obj))
- fz_strlcpy(buf, pdf_to_name(obj), sizeof buf);
+ obj = pdf_dict_gets(ctx, dict, "Name");
+ if (pdf_is_name(ctx, obj))
+ fz_strlcpy(buf, pdf_to_name(ctx, obj), sizeof buf);
else
fz_strlcpy(buf, "Unnamed-T3", sizeof buf);
fontdesc = pdf_new_font_desc(ctx);
- obj = pdf_dict_gets(dict, "FontMatrix");
+ obj = pdf_dict_gets(ctx, dict, "FontMatrix");
pdf_to_matrix(ctx, obj, &matrix);
- obj = pdf_dict_gets(dict, "FontBBox");
+ obj = pdf_dict_gets(ctx, dict, "FontBBox");
fz_transform_rect(pdf_to_rect(ctx, obj, &bbox), &matrix);
fontdesc->font = fz_new_type3_font(ctx, buf, &matrix);
@@ -68,35 +67,35 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
for (i = 0; i < 256; i++)
estrings[i] = NULL;
- encoding = pdf_dict_gets(dict, "Encoding");
+ encoding = pdf_dict_gets(ctx, dict, "Encoding");
if (!encoding)
{
fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: Type3 font missing Encoding");
}
- if (pdf_is_name(encoding))
- pdf_load_encoding(estrings, pdf_to_name(encoding));
+ if (pdf_is_name(ctx, encoding))
+ pdf_load_encoding(estrings, pdf_to_name(ctx, encoding));
- if (pdf_is_dict(encoding))
+ if (pdf_is_dict(ctx, encoding))
{
pdf_obj *base, *diff, *item;
- base = pdf_dict_gets(encoding, "BaseEncoding");
- if (pdf_is_name(base))
- pdf_load_encoding(estrings, pdf_to_name(base));
+ base = pdf_dict_gets(ctx, encoding, "BaseEncoding");
+ if (pdf_is_name(ctx, base))
+ pdf_load_encoding(estrings, pdf_to_name(ctx, base));
- diff = pdf_dict_gets(encoding, "Differences");
- if (pdf_is_array(diff))
+ diff = pdf_dict_gets(ctx, encoding, "Differences");
+ if (pdf_is_array(ctx, diff))
{
- n = pdf_array_len(diff);
+ n = pdf_array_len(ctx, diff);
k = 0;
for (i = 0; i < n; i++)
{
- item = pdf_array_get(diff, i);
- if (pdf_is_int(item))
- k = pdf_to_int(item);
- if (pdf_is_name(item) && k >= 0 && k < nelem(estrings))
- estrings[k++] = pdf_to_name(item);
+ item = pdf_array_get(ctx, diff, i);
+ if (pdf_is_int(ctx, item))
+ k = pdf_to_int(ctx, item);
+ if (pdf_is_name(ctx, item) && k >= 0 && k < nelem(estrings))
+ estrings[k++] = pdf_to_name(ctx, item);
}
}
}
@@ -104,19 +103,19 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
fontdesc->encoding = pdf_new_identity_cmap(ctx, 0, 1);
fontdesc->size += pdf_cmap_size(ctx, fontdesc->encoding);
- pdf_load_to_unicode(doc, fontdesc, estrings, NULL, pdf_dict_gets(dict, "ToUnicode"));
+ pdf_load_to_unicode(ctx, doc, fontdesc, estrings, NULL, pdf_dict_gets(ctx, dict, "ToUnicode"));
/* Widths */
pdf_set_default_hmtx(ctx, fontdesc, 0);
- first = pdf_to_int(pdf_dict_gets(dict, "FirstChar"));
- last = pdf_to_int(pdf_dict_gets(dict, "LastChar"));
+ first = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "FirstChar"));
+ last = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "LastChar"));
if (first < 0 || last > 255 || first > last)
first = last = 0;
- widths = pdf_dict_gets(dict, "Widths");
+ widths = pdf_dict_gets(ctx, dict, "Widths");
if (!widths)
{
fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: Type3 font missing Widths");
@@ -124,7 +123,7 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
for (i = first; i <= last; i++)
{
- float w = pdf_to_real(pdf_array_get(widths, i - first));
+ float w = pdf_to_real(ctx, pdf_array_get(ctx, widths, i - first));
w = fontdesc->font->t3matrix.a * w * 1000;
fontdesc->font->t3widths[i] = w * 0.001f;
pdf_add_hmtx(ctx, fontdesc, i, i, w);
@@ -135,11 +134,11 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
/* Resources -- inherit page resources if the font doesn't have its own */
fontdesc->font->t3freeres = pdf_t3_free_resources;
- fontdesc->font->t3resources = pdf_dict_gets(dict, "Resources");
+ fontdesc->font->t3resources = pdf_dict_gets(ctx, dict, "Resources");
if (!fontdesc->font->t3resources)
fontdesc->font->t3resources = rdb;
if (fontdesc->font->t3resources)
- pdf_keep_obj(fontdesc->font->t3resources);
+ pdf_keep_obj(ctx, fontdesc->font->t3resources);
if (!fontdesc->font->t3resources)
fz_warn(ctx, "no resource dictionary for type 3 font!");
@@ -148,7 +147,7 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
/* CharProcs */
- charprocs = pdf_dict_gets(dict, "CharProcs");
+ charprocs = pdf_dict_gets(ctx, dict, "CharProcs");
if (!charprocs)
{
fz_throw(ctx, FZ_ERROR_GENERIC, "syntaxerror: Type3 font missing CharProcs");
@@ -158,10 +157,10 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
{
if (estrings[i])
{
- obj = pdf_dict_gets(charprocs, estrings[i]);
- if (pdf_is_stream(doc, pdf_to_num(obj), pdf_to_gen(obj)))
+ obj = pdf_dict_gets(ctx, charprocs, estrings[i]);
+ if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj)))
{
- fontdesc->font->t3procs[i] = pdf_load_stream(doc, pdf_to_num(obj), pdf_to_gen(obj));
+ fontdesc->font->t3procs[i] = pdf_load_stream(ctx, doc, pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
fontdesc->size += fontdesc->font->t3procs[i]->cap;
fontdesc->size += 0; // TODO: display list size calculation
}
@@ -172,7 +171,7 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
{
if (fontdesc)
pdf_drop_font(ctx, fontdesc);
- fz_rethrow_message(ctx, "cannot load type3 font (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict));
+ fz_rethrow_message(ctx, "cannot load type3 font (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
doc->type3_fonts[doc->num_type3_fonts++] = fz_keep_font(ctx, fontdesc->font);
@@ -180,10 +179,9 @@ pdf_load_type3_font(pdf_document *doc, pdf_obj *rdb, pdf_obj *dict)
return fontdesc;
}
-void pdf_load_type3_glyphs(pdf_document *doc, pdf_font_desc *fontdesc, int nested_depth)
+void pdf_load_type3_glyphs(fz_context *ctx, pdf_document *doc, pdf_font_desc *fontdesc, int nested_depth)
{
int i;
- fz_context *ctx = doc->ctx;
fz_try(ctx)
{
diff --git a/source/pdf/pdf-unicode.c b/source/pdf/pdf-unicode.c
index d51d580b..7b04c02c 100644
--- a/source/pdf/pdf-unicode.c
+++ b/source/pdf/pdf-unicode.c
@@ -56,15 +56,14 @@ pdf_remap_cmap(fz_context *ctx, pdf_cmap *gid_from_cpt, pdf_cmap *ucs_from_cpt)
}
void
-pdf_load_to_unicode(pdf_document *doc, pdf_font_desc *font,
+pdf_load_to_unicode(fz_context *ctx, pdf_document *doc, pdf_font_desc *font,
char **strings, char *collection, pdf_obj *cmapstm)
{
- fz_context *ctx = doc->ctx;
unsigned int cpt;
- if (pdf_is_stream(doc, pdf_to_num(cmapstm), pdf_to_gen(cmapstm)))
+ if (pdf_is_stream(ctx, doc, pdf_to_num(ctx, cmapstm), pdf_to_gen(ctx, cmapstm)))
{
- pdf_cmap *ucs_from_cpt = pdf_load_embedded_cmap(doc, cmapstm);
+ pdf_cmap *ucs_from_cpt = pdf_load_embedded_cmap(ctx, doc, cmapstm);
font->to_unicode = pdf_remap_cmap(ctx, font->encoding, ucs_from_cpt);
pdf_drop_cmap(ctx, ucs_from_cpt);
font->size += pdf_cmap_size(ctx, font->to_unicode);
diff --git a/source/pdf/pdf-write.c b/source/pdf/pdf-write.c
index 078719a6..1016e8af 100644
--- a/source/pdf/pdf-write.c
+++ b/source/pdf/pdf-write.c
@@ -489,11 +489,11 @@ page_objects_dump(pdf_write_options *opts)
}
static void
-objects_dump(pdf_document *doc, pdf_write_options *opts)
+objects_dump(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
int i;
- for (i=0; i < pdf_xref_len(doc); i++)
+ for (i=0; i < pdf_xref_len(ctx, doc); i++)
{
fprintf(stderr, "Object %d use=%x offset=%d\n", i, opts->use_list[i], opts->ofs_list[i]);
}
@@ -504,13 +504,12 @@ objects_dump(pdf_document *doc, pdf_write_options *opts)
* Garbage collect objects not reachable from the trailer.
*/
-static pdf_obj *sweepref(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
+static pdf_obj *sweepref(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
{
- int num = pdf_to_num(obj);
- int gen = pdf_to_gen(obj);
- fz_context *ctx = doc->ctx;
+ int num = pdf_to_num(ctx, obj);
+ int gen = pdf_to_gen(ctx, obj);
- if (num <= 0 || num >= pdf_xref_len(doc))
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
return NULL;
if (opts->use_list[num])
return NULL;
@@ -520,14 +519,14 @@ static pdf_obj *sweepref(pdf_document *doc, pdf_write_options *opts, pdf_obj *ob
/* Bake in /Length in stream objects */
fz_try(ctx)
{
- if (pdf_is_stream(doc, num, gen))
+ if (pdf_is_stream(ctx, doc, num, gen))
{
- pdf_obj *len = pdf_dict_gets(obj, "Length");
- if (pdf_is_indirect(len))
+ pdf_obj *len = pdf_dict_gets(ctx, obj, "Length");
+ if (pdf_is_indirect(ctx, len))
{
- opts->use_list[pdf_to_num(len)] = 0;
- len = pdf_resolve_indirect(len);
- pdf_dict_puts(obj, "Length", len);
+ opts->use_list[pdf_to_num(ctx, len)] = 0;
+ len = pdf_resolve_indirect(ctx, len);
+ pdf_dict_puts(ctx, obj, "Length", len);
}
}
}
@@ -537,28 +536,28 @@ static pdf_obj *sweepref(pdf_document *doc, pdf_write_options *opts, pdf_obj *ob
/* Leave broken */
}
- return pdf_resolve_indirect(obj);
+ return pdf_resolve_indirect(ctx, obj);
}
-static void sweepobj(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
+static void sweepobj(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
{
int i;
- if (pdf_is_indirect(obj))
- obj = sweepref(doc, opts, obj);
+ if (pdf_is_indirect(ctx, obj))
+ obj = sweepref(ctx, doc, opts, obj);
- if (pdf_is_dict(obj))
+ if (pdf_is_dict(ctx, obj))
{
- int n = pdf_dict_len(obj);
+ int n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
- sweepobj(doc, opts, pdf_dict_get_val(obj, i));
+ sweepobj(ctx, doc, opts, pdf_dict_get_val(ctx, obj, i));
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
- int n = pdf_array_len(obj);
+ int n = pdf_array_len(ctx, obj);
for (i = 0; i < n; i++)
- sweepobj(doc, opts, pdf_array_get(obj, i));
+ sweepobj(ctx, doc, opts, pdf_array_get(ctx, obj, i));
}
}
@@ -566,11 +565,10 @@ static void sweepobj(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
* Scan for and remove duplicate objects (slow)
*/
-static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts)
+static void removeduplicateobjs(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
int num, other;
- fz_context *ctx = doc->ctx;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
for (num = 1; num < xref_len; num++)
{
@@ -591,8 +589,8 @@ static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts)
*/
fz_try(ctx)
{
- streama = pdf_is_stream(doc, num, 0);
- streamb = pdf_is_stream(doc, other, 0);
+ streama = pdf_is_stream(ctx, doc, num, 0);
+ streamb = pdf_is_stream(ctx, doc, other, 0);
differ = streama || streamb;
if (streama && streamb && opts->do_garbage >= 4)
differ = 0;
@@ -605,13 +603,13 @@ static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts)
if (differ)
continue;
- a = pdf_get_xref_entry(doc, num)->obj;
- b = pdf_get_xref_entry(doc, other)->obj;
+ a = pdf_get_xref_entry(ctx, doc, num)->obj;
+ b = pdf_get_xref_entry(ctx, doc, other)->obj;
- a = pdf_resolve_indirect(a);
- b = pdf_resolve_indirect(b);
+ a = pdf_resolve_indirect(ctx, a);
+ b = pdf_resolve_indirect(ctx, b);
- if (pdf_objcmp(a, b))
+ if (pdf_objcmp(ctx, a, b))
continue;
if (streama && streamb)
@@ -628,8 +626,8 @@ static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts)
{
unsigned char *dataa, *datab;
int lena, lenb;
- sa = pdf_load_raw_renumbered_stream(doc, num, 0, num, 0);
- sb = pdf_load_raw_renumbered_stream(doc, other, 0, other, 0);
+ sa = pdf_load_raw_renumbered_stream(ctx, doc, num, 0, num, 0);
+ sb = pdf_load_raw_renumbered_stream(ctx, doc, other, 0, other, 0);
lena = fz_buffer_storage(ctx, sa, &dataa);
lenb = fz_buffer_storage(ctx, sb, &datab);
if (lena == lenb && memcmp(dataa, datab, lena) == 0)
@@ -667,10 +665,10 @@ static void removeduplicateobjs(pdf_document *doc, pdf_write_options *opts)
* This code assumes that any opts->renumber_map[n] <= n for all n.
*/
-static void compactxref(pdf_document *doc, pdf_write_options *opts)
+static void compactxref(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
int num, newnum;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
/*
* Update renumber_map in-place, clustering all used
@@ -709,75 +707,74 @@ static void compactxref(pdf_document *doc, pdf_write_options *opts)
* removing duplicate objects and compacting the xref.
*/
-static void renumberobj(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
+static void renumberobj(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj)
{
int i;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
- if (pdf_is_dict(obj))
+ if (pdf_is_dict(ctx, obj))
{
- int n = pdf_dict_len(obj);
+ int n = pdf_dict_len(ctx, obj);
for (i = 0; i < n; i++)
{
- pdf_obj *key = pdf_dict_get_key(obj, i);
- pdf_obj *val = pdf_dict_get_val(obj, i);
- if (pdf_is_indirect(val))
+ pdf_obj *key = pdf_dict_get_key(ctx, obj, i);
+ pdf_obj *val = pdf_dict_get_val(ctx, obj, i);
+ if (pdf_is_indirect(ctx, val))
{
- int o = pdf_to_num(val);
+ int o = pdf_to_num(ctx, val);
if (o >= xref_len || o <= 0 || opts->renumber_map[o] == 0)
- val = pdf_new_null(doc);
+ val = pdf_new_null(ctx, doc);
else
- val = pdf_new_indirect(doc, opts->renumber_map[o], 0);
- pdf_dict_put(obj, key, val);
- pdf_drop_obj(val);
+ val = pdf_new_indirect(ctx, doc, opts->renumber_map[o], 0);
+ pdf_dict_put(ctx, obj, key, val);
+ pdf_drop_obj(ctx, val);
}
else
{
- renumberobj(doc, opts, val);
+ renumberobj(ctx, doc, opts, val);
}
}
}
- else if (pdf_is_array(obj))
+ else if (pdf_is_array(ctx, obj))
{
- int n = pdf_array_len(obj);
+ int n = pdf_array_len(ctx, obj);
for (i = 0; i < n; i++)
{
- pdf_obj *val = pdf_array_get(obj, i);
- if (pdf_is_indirect(val))
+ pdf_obj *val = pdf_array_get(ctx, obj, i);
+ if (pdf_is_indirect(ctx, val))
{
- int o = pdf_to_num(val);
+ int o = pdf_to_num(ctx, val);
if (o >= xref_len || o <= 0 || opts->renumber_map[o] == 0)
- val = pdf_new_null(doc);
+ val = pdf_new_null(ctx, doc);
else
- val = pdf_new_indirect(doc, opts->renumber_map[o], 0);
- pdf_array_put(obj, i, val);
- pdf_drop_obj(val);
+ val = pdf_new_indirect(ctx, doc, opts->renumber_map[o], 0);
+ pdf_array_put(ctx, obj, i, val);
+ pdf_drop_obj(ctx, val);
}
else
{
- renumberobj(doc, opts, val);
+ renumberobj(ctx, doc, opts, val);
}
}
}
}
-static void renumberobjs(pdf_document *doc, pdf_write_options *opts)
+static void renumberobjs(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
pdf_xref_entry *newxref = NULL;
int newlen;
int num;
- fz_context *ctx = doc->ctx;
int *new_use_list;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
- new_use_list = fz_calloc(ctx, pdf_xref_len(doc)+3, sizeof(int));
+ new_use_list = fz_calloc(ctx, pdf_xref_len(ctx, doc)+3, sizeof(int));
fz_var(newxref);
fz_try(ctx)
{
/* Apply renumber map to indirect references in all objects in xref */
- renumberobj(doc, opts, pdf_trailer(doc));
+ renumberobj(ctx, doc, opts, pdf_trailer(ctx, doc));
for (num = 0; num < xref_len; num++)
{
pdf_obj *obj;
@@ -787,23 +784,23 @@ static void renumberobjs(pdf_document *doc, pdf_write_options *opts)
if (to == 0)
continue;
- obj = pdf_get_xref_entry(doc, num)->obj;
+ obj = pdf_get_xref_entry(ctx, doc, num)->obj;
- if (pdf_is_indirect(obj))
+ if (pdf_is_indirect(ctx, obj))
{
- obj = pdf_new_indirect(doc, to, 0);
- pdf_update_object(doc, num, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_indirect(ctx, doc, to, 0);
+ pdf_update_object(ctx, doc, num, obj);
+ pdf_drop_obj(ctx, obj);
}
else
{
- renumberobj(doc, opts, obj);
+ renumberobj(ctx, doc, opts, obj);
}
}
/* Create new table for the reordered, compacted xref */
newxref = fz_malloc_array(ctx, xref_len + 3, sizeof(pdf_xref_entry));
- newxref[0] = *pdf_get_xref_entry(doc, 0);
+ newxref[0] = *pdf_get_xref_entry(ctx, doc, 0);
/* Move used objects into the new compacted xref */
newlen = 0;
@@ -814,24 +811,24 @@ static void renumberobjs(pdf_document *doc, pdf_write_options *opts)
pdf_xref_entry *e;
if (newlen < opts->renumber_map[num])
newlen = opts->renumber_map[num];
- e = pdf_get_xref_entry(doc, num);
+ e = pdf_get_xref_entry(ctx, doc, num);
newxref[opts->renumber_map[num]] = *e;
if (e->obj)
{
- pdf_set_obj_parent(e->obj, opts->renumber_map[num]);
+ pdf_set_obj_parent(ctx, e->obj, opts->renumber_map[num]);
e->obj = NULL;
}
new_use_list[opts->renumber_map[num]] = opts->use_list[num];
}
else
{
- pdf_xref_entry *e = pdf_get_xref_entry(doc, num);
- pdf_drop_obj(e->obj);
+ pdf_xref_entry *e = pdf_get_xref_entry(ctx, doc, num);
+ pdf_drop_obj(ctx, e->obj);
e->obj = NULL;
}
}
- pdf_replace_xref(doc, newxref, newlen + 1);
+ pdf_replace_xref(ctx, doc, newxref, newlen + 1);
newxref = NULL;
}
fz_catch(ctx)
@@ -865,18 +862,17 @@ static void page_objects_list_renumber(pdf_write_options *opts)
}
static void
-mark_all(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int flag, int page)
+mark_all(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int flag, int page)
{
- fz_context *ctx = doc->ctx;
- if (pdf_mark_obj(val))
+ if (pdf_mark_obj(ctx, val))
return;
fz_try(ctx)
{
- if (pdf_is_indirect(val))
+ if (pdf_is_indirect(ctx, val))
{
- int num = pdf_to_num(val);
+ int num = pdf_to_num(ctx, val);
if (opts->use_list[num] & USE_PAGE_MASK)
/* Already used */
opts->use_list[num] |= USE_SHARED;
@@ -886,28 +882,28 @@ mark_all(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int flag, int
page_objects_list_insert(ctx, opts, page, num);
}
- if (pdf_is_dict(val))
+ if (pdf_is_dict(ctx, val))
{
- int i, n = pdf_dict_len(val);
+ int i, n = pdf_dict_len(ctx, val);
for (i = 0; i < n; i++)
{
- mark_all(doc, opts, pdf_dict_get_val(val, i), flag, page);
+ mark_all(ctx, doc, opts, pdf_dict_get_val(ctx, val, i), flag, page);
}
}
- else if (pdf_is_array(val))
+ else if (pdf_is_array(ctx, val))
{
- int i, n = pdf_array_len(val);
+ int i, n = pdf_array_len(ctx, val);
for (i = 0; i < n; i++)
{
- mark_all(doc, opts, pdf_array_get(val, i), flag, page);
+ mark_all(ctx, doc, opts, pdf_array_get(ctx, val, i), flag, page);
}
}
}
fz_always(ctx)
{
- pdf_unmark_obj(val);
+ pdf_unmark_obj(ctx, val);
}
fz_catch(ctx)
{
@@ -916,66 +912,65 @@ mark_all(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int flag, int
}
static int
-mark_pages(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int pagenum)
+mark_pages(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int pagenum)
{
- fz_context *ctx = doc->ctx;
- if (pdf_mark_obj(val))
+ if (pdf_mark_obj(ctx, val))
return pagenum;
fz_try(ctx)
{
- if (pdf_is_dict(val))
+ if (pdf_is_dict(ctx, val))
{
- if (!strcmp("Page", pdf_to_name(pdf_dict_gets(val, "Type"))))
+ if (!strcmp("Page", pdf_to_name(ctx, pdf_dict_gets(ctx, val, "Type"))))
{
- int num = pdf_to_num(val);
- pdf_unmark_obj(val);
- mark_all(doc, opts, val, pagenum == 0 ? USE_PAGE1 : (pagenum<<USE_PAGE_SHIFT), pagenum);
+ int num = pdf_to_num(ctx, val);
+ pdf_unmark_obj(ctx, val);
+ mark_all(ctx, doc, opts, val, pagenum == 0 ? USE_PAGE1 : (pagenum<<USE_PAGE_SHIFT), pagenum);
page_objects_list_set_page_object(ctx, opts, pagenum, num);
pagenum++;
opts->use_list[num] |= USE_PAGE_OBJECT;
}
else
{
- int i, n = pdf_dict_len(val);
+ int i, n = pdf_dict_len(ctx, val);
for (i = 0; i < n; i++)
{
- pdf_obj *key = pdf_dict_get_key(val, i);
- pdf_obj *obj = pdf_dict_get_val(val, i);
+ pdf_obj *key = pdf_dict_get_key(ctx, val, i);
+ pdf_obj *obj = pdf_dict_get_val(ctx, val, i);
- if (!strcmp("Kids", pdf_to_name(key)))
- pagenum = mark_pages(doc, opts, obj, pagenum);
+ if (!strcmp("Kids", pdf_to_name(ctx, key)))
+ pagenum = mark_pages(ctx, doc, opts, obj, pagenum);
else
- mark_all(doc, opts, obj, USE_CATALOGUE, -1);
+ mark_all(ctx, doc, opts, obj, USE_CATALOGUE, -1);
}
- if (pdf_is_indirect(val))
+ if (pdf_is_indirect(ctx, val))
{
- int num = pdf_to_num(val);
+ int num = pdf_to_num(ctx, val);
opts->use_list[num] |= USE_CATALOGUE;
}
}
}
- else if (pdf_is_array(val))
+ else if (pdf_is_array(ctx, val))
{
- int i, n = pdf_array_len(val);
+ int i, n = pdf_array_len(ctx, val);
for (i = 0; i < n; i++)
{
- pagenum = mark_pages(doc, opts, pdf_array_get(val, i), pagenum);
+ pagenum = mark_pages(ctx, doc, opts, pdf_array_get(ctx, val, i), pagenum);
}
- if (pdf_is_indirect(val))
+ if (pdf_is_indirect(ctx, val))
{
- int num = pdf_to_num(val);
+ int num = pdf_to_num(ctx, val);
opts->use_list[num] |= USE_CATALOGUE;
}
}
}
fz_always(ctx)
{
- pdf_unmark_obj(val);
+ pdf_unmark_obj(ctx, val);
}
fz_catch(ctx)
{
@@ -985,51 +980,50 @@ mark_pages(pdf_document *doc, pdf_write_options *opts, pdf_obj *val, int pagenum
}
static void
-mark_root(pdf_document *doc, pdf_write_options *opts, pdf_obj *dict)
+mark_root(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *dict)
{
- fz_context *ctx = doc->ctx;
- int i, n = pdf_dict_len(dict);
+ int i, n = pdf_dict_len(ctx, dict);
- if (pdf_mark_obj(dict))
+ if (pdf_mark_obj(ctx, dict))
return;
fz_try(ctx)
{
- if (pdf_is_indirect(dict))
+ if (pdf_is_indirect(ctx, dict))
{
- int num = pdf_to_num(dict);
+ int num = pdf_to_num(ctx, dict);
opts->use_list[num] |= USE_CATALOGUE;
}
for (i = 0; i < n; i++)
{
- char *key = pdf_to_name(pdf_dict_get_key(dict, i));
- pdf_obj *val = pdf_dict_get_val(dict, i);
+ char *key = pdf_to_name(ctx, pdf_dict_get_key(ctx, dict, i));
+ pdf_obj *val = pdf_dict_get_val(ctx, dict, i);
if (!strcmp("Pages", key))
- opts->page_count = mark_pages(doc, opts, val, 0);
+ opts->page_count = mark_pages(ctx, doc, opts, val, 0);
else if (!strcmp("Names", key))
- mark_all(doc, opts, val, USE_OTHER_OBJECTS, -1);
+ mark_all(ctx, doc, opts, val, USE_OTHER_OBJECTS, -1);
else if (!strcmp("Dests", key))
- mark_all(doc, opts, val, USE_OTHER_OBJECTS, -1);
+ mark_all(ctx, doc, opts, val, USE_OTHER_OBJECTS, -1);
else if (!strcmp("Outlines", key))
{
int section;
/* Look at PageMode to decide whether to
* USE_OTHER_OBJECTS or USE_PAGE1 here. */
- if (strcmp(pdf_to_name(pdf_dict_gets(dict, "PageMode")), "UseOutlines") == 0)
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, dict, "PageMode")), "UseOutlines") == 0)
section = USE_PAGE1;
else
section = USE_OTHER_OBJECTS;
- mark_all(doc, opts, val, section, -1);
+ mark_all(ctx, doc, opts, val, section, -1);
}
else
- mark_all(doc, opts, val, USE_CATALOGUE, -1);
+ mark_all(ctx, doc, opts, val, USE_CATALOGUE, -1);
}
}
fz_always(ctx)
{
- pdf_unmark_obj(dict);
+ pdf_unmark_obj(ctx, dict);
}
fz_catch(ctx)
{
@@ -1038,30 +1032,29 @@ mark_root(pdf_document *doc, pdf_write_options *opts, pdf_obj *dict)
}
static void
-mark_trailer(pdf_document *doc, pdf_write_options *opts, pdf_obj *dict)
+mark_trailer(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *dict)
{
- fz_context *ctx = doc->ctx;
- int i, n = pdf_dict_len(dict);
+ int i, n = pdf_dict_len(ctx, dict);
- if (pdf_mark_obj(dict))
+ if (pdf_mark_obj(ctx, dict))
return;
fz_try(ctx)
{
for (i = 0; i < n; i++)
{
- char *key = pdf_to_name(pdf_dict_get_key(dict, i));
- pdf_obj *val = pdf_dict_get_val(dict, i);
+ char *key = pdf_to_name(ctx, pdf_dict_get_key(ctx, dict, i));
+ pdf_obj *val = pdf_dict_get_val(ctx, dict, i);
if (!strcmp("Root", key))
- mark_root(doc, opts, val);
+ mark_root(ctx, doc, opts, val);
else
- mark_all(doc, opts, val, USE_CATALOGUE, -1);
+ mark_all(ctx, doc, opts, val, USE_CATALOGUE, -1);
}
}
fz_always(ctx)
{
- pdf_unmark_obj(dict);
+ pdf_unmark_obj(ctx, dict);
}
fz_catch(ctx)
{
@@ -1070,7 +1063,7 @@ mark_trailer(pdf_document *doc, pdf_write_options *opts, pdf_obj *dict)
}
static void
-add_linearization_objs(pdf_document *doc, pdf_write_options *opts)
+add_linearization_objs(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
pdf_obj *params_obj = NULL;
pdf_obj *params_ref = NULL;
@@ -1078,7 +1071,6 @@ add_linearization_objs(pdf_document *doc, pdf_write_options *opts)
pdf_obj *hint_ref = NULL;
pdf_obj *o = NULL;
int params_num, hint_num;
- fz_context *ctx = doc->ctx;
fz_var(params_obj);
fz_var(params_ref);
@@ -1089,47 +1081,47 @@ add_linearization_objs(pdf_document *doc, pdf_write_options *opts)
fz_try(ctx)
{
/* Linearization params */
- params_obj = pdf_new_dict(doc, 10);
- params_ref = pdf_new_ref(doc, params_obj);
- params_num = pdf_to_num(params_ref);
+ params_obj = pdf_new_dict(ctx, doc, 10);
+ params_ref = pdf_new_ref(ctx, doc, params_obj);
+ params_num = pdf_to_num(ctx, params_ref);
opts->use_list[params_num] = USE_PARAMS;
opts->renumber_map[params_num] = params_num;
opts->rev_renumber_map[params_num] = params_num;
opts->gen_list[params_num] = 0;
opts->rev_gen_list[params_num] = 0;
- pdf_dict_puts_drop(params_obj, "Linearized", pdf_new_real(doc, 1.0));
- opts->linear_l = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(params_obj, "L", opts->linear_l);
- opts->linear_h0 = pdf_new_int(doc, INT_MIN);
- o = pdf_new_array(doc, 2);
- pdf_array_push(o, opts->linear_h0);
- opts->linear_h1 = pdf_new_int(doc, INT_MIN);
- pdf_array_push(o, opts->linear_h1);
- pdf_dict_puts_drop(params_obj, "H", o);
+ pdf_dict_puts_drop(ctx, params_obj, "Linearized", pdf_new_real(ctx, doc, 1.0));
+ opts->linear_l = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, params_obj, "L", opts->linear_l);
+ opts->linear_h0 = pdf_new_int(ctx, doc, INT_MIN);
+ o = pdf_new_array(ctx, doc, 2);
+ pdf_array_push(ctx, o, opts->linear_h0);
+ opts->linear_h1 = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_array_push(ctx, o, opts->linear_h1);
+ pdf_dict_puts_drop(ctx, params_obj, "H", o);
o = NULL;
- opts->linear_o = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(params_obj, "O", opts->linear_o);
- opts->linear_e = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(params_obj, "E", opts->linear_e);
- opts->linear_n = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(params_obj, "N", opts->linear_n);
- opts->linear_t = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(params_obj, "T", opts->linear_t);
+ opts->linear_o = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, params_obj, "O", opts->linear_o);
+ opts->linear_e = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, params_obj, "E", opts->linear_e);
+ opts->linear_n = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, params_obj, "N", opts->linear_n);
+ opts->linear_t = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, params_obj, "T", opts->linear_t);
/* Primary hint stream */
- hint_obj = pdf_new_dict(doc, 10);
- hint_ref = pdf_new_ref(doc, hint_obj);
- hint_num = pdf_to_num(hint_ref);
+ hint_obj = pdf_new_dict(ctx, doc, 10);
+ hint_ref = pdf_new_ref(ctx, doc, hint_obj);
+ hint_num = pdf_to_num(ctx, hint_ref);
opts->use_list[hint_num] = USE_HINTS;
opts->renumber_map[hint_num] = hint_num;
opts->rev_renumber_map[hint_num] = hint_num;
opts->gen_list[hint_num] = 0;
opts->rev_gen_list[hint_num] = 0;
- pdf_dict_puts_drop(hint_obj, "P", pdf_new_int(doc, 0));
- opts->hints_s = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(hint_obj, "S", opts->hints_s);
+ pdf_dict_puts_drop(ctx, hint_obj, "P", pdf_new_int(ctx, doc, 0));
+ opts->hints_s = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, hint_obj, "S", opts->hints_s);
/* FIXME: Do we have thumbnails? Do a T entry */
/* FIXME: Do we have outlines? Do an O entry */
/* FIXME: Do we have article threads? Do an A entry */
@@ -1138,18 +1130,18 @@ add_linearization_objs(pdf_document *doc, pdf_write_options *opts)
/* FIXME: Do we have document information? Do an I entry */
/* FIXME: Do we have logical structure heirarchy? Do a C entry */
/* FIXME: Do L, Page Label hint table */
- pdf_dict_puts_drop(hint_obj, "Filter", pdf_new_name(doc, "FlateDecode"));
- opts->hints_length = pdf_new_int(doc, INT_MIN);
- pdf_dict_puts(hint_obj, "Length", opts->hints_length);
- pdf_get_xref_entry(doc, hint_num)->stm_ofs = -1;
+ pdf_dict_puts_drop(ctx, hint_obj, "Filter", pdf_new_name(ctx, doc, "FlateDecode"));
+ opts->hints_length = pdf_new_int(ctx, doc, INT_MIN);
+ pdf_dict_puts(ctx, hint_obj, "Length", opts->hints_length);
+ pdf_get_xref_entry(ctx, doc, hint_num)->stm_ofs = -1;
}
fz_always(ctx)
{
- pdf_drop_obj(params_obj);
- pdf_drop_obj(params_ref);
- pdf_drop_obj(hint_ref);
- pdf_drop_obj(hint_obj);
- pdf_drop_obj(o);
+ pdf_drop_obj(ctx, params_obj);
+ pdf_drop_obj(ctx, params_ref);
+ pdf_drop_obj(ctx, hint_ref);
+ pdf_drop_obj(ctx, hint_obj);
+ pdf_drop_obj(ctx, o);
}
fz_catch(ctx)
{
@@ -1164,39 +1156,39 @@ lpr_inherit_res_contents(fz_context *ctx, pdf_obj *res, pdf_obj *dict, char *tex
int i, n;
/* If the parent node doesn't have an entry of this type, give up. */
- o = pdf_dict_gets(dict, text);
+ o = pdf_dict_gets(ctx, dict, text);
if (!o)
return;
/* If the resources dict we are building doesn't have an entry of this
* type yet, then just copy it (ensuring it's not a reference) */
- r = pdf_dict_gets(res, text);
+ r = pdf_dict_gets(ctx, res, text);
if (r == NULL)
{
- o = pdf_resolve_indirect(o);
- if (pdf_is_dict(o))
- o = pdf_copy_dict(o);
- else if (pdf_is_array(o))
- o = pdf_copy_array(o);
+ o = pdf_resolve_indirect(ctx, o);
+ if (pdf_is_dict(ctx, o))
+ o = pdf_copy_dict(ctx, o);
+ else if (pdf_is_array(ctx, o))
+ o = pdf_copy_array(ctx, o);
else
o = NULL;
if (o)
- pdf_dict_puts(res, text, o);
+ pdf_dict_puts(ctx, res, text, o);
return;
}
/* Otherwise we need to merge o into r */
- if (pdf_is_dict(o))
+ if (pdf_is_dict(ctx, o))
{
- n = pdf_dict_len(o);
+ n = pdf_dict_len(ctx, o);
for (i = 0; i < n; i++)
{
- pdf_obj *key = pdf_dict_get_key(o, i);
- pdf_obj *val = pdf_dict_get_val(o, i);
+ pdf_obj *key = pdf_dict_get_key(ctx, o, i);
+ pdf_obj *val = pdf_dict_get_val(ctx, o, i);
- if (pdf_dict_gets(res, pdf_to_name(key)))
+ if (pdf_dict_gets(ctx, res, pdf_to_name(ctx, key)))
continue;
- pdf_dict_puts(res, pdf_to_name(key), val);
+ pdf_dict_puts(ctx, res, pdf_to_name(ctx, key), val);
}
}
}
@@ -1208,12 +1200,12 @@ lpr_inherit_res(fz_context *ctx, pdf_obj *node, int depth, pdf_obj *dict)
{
pdf_obj *o;
- node = pdf_dict_gets(node, "Parent");
+ node = pdf_dict_gets(ctx, node, "Parent");
depth--;
if (!node || depth < 0)
break;
- o = pdf_dict_gets(node, "Resources");
+ o = pdf_dict_gets(ctx, node, "Resources");
if (o)
{
lpr_inherit_res_contents(ctx, dict, o, "ExtGState");
@@ -1233,11 +1225,11 @@ lpr_inherit(fz_context *ctx, pdf_obj *node, char *text, int depth)
{
do
{
- pdf_obj *o = pdf_dict_gets(node, text);
+ pdf_obj *o = pdf_dict_gets(ctx, node, text);
if (o)
- return pdf_resolve_indirect(o);
- node = pdf_dict_gets(node, "Parent");
+ return pdf_resolve_indirect(ctx, o);
+ node = pdf_dict_gets(ctx, node, "Parent");
depth--;
}
while (depth >= 0 && node);
@@ -1246,103 +1238,101 @@ lpr_inherit(fz_context *ctx, pdf_obj *node, char *text, int depth)
}
static int
-lpr(pdf_document *doc, pdf_obj *node, int depth, int page)
+lpr(fz_context *ctx, pdf_document *doc, pdf_obj *node, int depth, int page)
{
pdf_obj *kids;
pdf_obj *o = NULL;
int i, n;
- fz_context *ctx = doc->ctx;
- if (pdf_mark_obj(node))
+ if (pdf_mark_obj(ctx, node))
return page;
fz_var(o);
fz_try(ctx)
{
- if (!strcmp("Page", pdf_to_name(pdf_dict_gets(node, "Type"))))
+ if (!strcmp("Page", pdf_to_name(ctx, pdf_dict_gets(ctx, node, "Type"))))
{
pdf_obj *r; /* r is deliberately not cleaned up */
/* Copy resources down to the child */
- o = pdf_keep_obj(pdf_dict_gets(node, "Resources"));
+ o = pdf_keep_obj(ctx, pdf_dict_gets(ctx, node, "Resources"));
if (!o)
{
- o = pdf_keep_obj(pdf_new_dict(doc, 2));
- pdf_dict_puts(node, "Resources", o);
+ o = pdf_keep_obj(ctx, pdf_new_dict(ctx, doc, 2));
+ pdf_dict_puts(ctx, node, "Resources", o);
}
lpr_inherit_res(ctx, node, depth, o);
r = lpr_inherit(ctx, node, "MediaBox", depth);
if (r)
- pdf_dict_puts(node, "MediaBox", r);
+ pdf_dict_puts(ctx, node, "MediaBox", r);
r = lpr_inherit(ctx, node, "CropBox", depth);
if (r)
- pdf_dict_puts(node, "CropBox", r);
+ pdf_dict_puts(ctx, node, "CropBox", r);
r = lpr_inherit(ctx, node, "BleedBox", depth);
if (r)
- pdf_dict_puts(node, "BleedBox", r);
+ pdf_dict_puts(ctx, node, "BleedBox", r);
r = lpr_inherit(ctx, node, "TrimBox", depth);
if (r)
- pdf_dict_puts(node, "TrimBox", r);
+ pdf_dict_puts(ctx, node, "TrimBox", r);
r = lpr_inherit(ctx, node, "ArtBox", depth);
if (r)
- pdf_dict_puts(node, "ArtBox", r);
+ pdf_dict_puts(ctx, node, "ArtBox", r);
r = lpr_inherit(ctx, node, "Rotate", depth);
if (r)
- pdf_dict_puts(node, "Rotate", r);
+ pdf_dict_puts(ctx, node, "Rotate", r);
page++;
}
else
{
- kids = pdf_dict_gets(node, "Kids");
- n = pdf_array_len(kids);
+ kids = pdf_dict_gets(ctx, node, "Kids");
+ n = pdf_array_len(ctx, kids);
for(i = 0; i < n; i++)
{
- page = lpr(doc, pdf_array_get(kids, i), depth+1, page);
+ page = lpr(ctx, doc, pdf_array_get(ctx, kids, i), depth+1, page);
}
- pdf_dict_dels(node, "Resources");
- pdf_dict_dels(node, "MediaBox");
- pdf_dict_dels(node, "CropBox");
- pdf_dict_dels(node, "BleedBox");
- pdf_dict_dels(node, "TrimBox");
- pdf_dict_dels(node, "ArtBox");
- pdf_dict_dels(node, "Rotate");
+ pdf_dict_dels(ctx, node, "Resources");
+ pdf_dict_dels(ctx, node, "MediaBox");
+ pdf_dict_dels(ctx, node, "CropBox");
+ pdf_dict_dels(ctx, node, "BleedBox");
+ pdf_dict_dels(ctx, node, "TrimBox");
+ pdf_dict_dels(ctx, node, "ArtBox");
+ pdf_dict_dels(ctx, node, "Rotate");
}
}
fz_always(ctx)
{
- pdf_drop_obj(o);
+ pdf_drop_obj(ctx, o);
}
fz_catch(ctx)
{
fz_rethrow(ctx);
}
- pdf_unmark_obj(node);
+ pdf_unmark_obj(ctx, node);
return page;
}
void
-pdf_localise_page_resources(pdf_document *doc)
+pdf_localise_page_resources(fz_context *ctx, pdf_document *doc)
{
if (doc->resources_localised)
return;
- lpr(doc, pdf_dict_getp(pdf_trailer(doc), "Root/Pages"), 0, 0);
+ lpr(ctx, doc, pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/Pages"), 0, 0);
doc->resources_localised = 1;
}
static void
-linearize(pdf_document *doc, pdf_write_options *opts)
+linearize(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
int i;
- int n = pdf_xref_len(doc) + 2;
+ int n = pdf_xref_len(ctx, doc) + 2;
int *reorder;
int *rev_renumber_map;
int *rev_gen_list;
- fz_context *ctx = doc->ctx;
opts->page_object_lists = page_objects_list_create(ctx);
@@ -1350,18 +1340,18 @@ linearize(pdf_document *doc, pdf_write_options *opts)
/* FIXME: We could 'thin' the resources according to what is actually
* required for each page, but this would require us to run the page
* content streams. */
- pdf_localise_page_resources(doc);
+ pdf_localise_page_resources(ctx, doc);
/* Walk the objects for each page, marking which ones are used, where */
memset(opts->use_list, 0, n * sizeof(int));
- mark_trailer(doc, opts, pdf_trailer(doc));
+ mark_trailer(ctx, doc, opts, pdf_trailer(ctx, doc));
/* Add new objects required for linearization */
- add_linearization_objs(doc, opts);
+ add_linearization_objs(ctx, doc, opts);
#ifdef DEBUG_WRITING
fprintf(stderr, "Usage calculated:\n");
- for (i=0; i < pdf_xref_len(doc); i++)
+ for (i=0; i < pdf_xref_len(ctx, doc); i++)
{
fprintf(stderr, "%d: use=%d\n", i, opts->use_list[i]);
}
@@ -1381,7 +1371,7 @@ linearize(pdf_document *doc, pdf_write_options *opts)
#ifdef DEBUG_WRITING
fprintf(stderr, "Reordered:\n");
- for (i=1; i < pdf_xref_len(doc); i++)
+ for (i=1; i < pdf_xref_len(ctx, doc); i++)
{
fprintf(stderr, "%d: use=%d\n", i, opts->use_list[reorder[i]]);
}
@@ -1406,55 +1396,55 @@ linearize(pdf_document *doc, pdf_write_options *opts)
/* Apply the renumber_map */
page_objects_list_renumber(opts);
- renumberobjs(doc, opts);
+ renumberobjs(ctx, doc, opts);
page_objects_list_sort_and_dedupe(ctx, opts->page_object_lists);
}
static void
-update_linearization_params(pdf_document *doc, pdf_write_options *opts)
+update_linearization_params(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
int offset;
- pdf_set_int(opts->linear_l, opts->file_len);
+ pdf_set_int(ctx, opts->linear_l, opts->file_len);
/* Primary hint stream offset (of object, not stream!) */
- pdf_set_int(opts->linear_h0, opts->ofs_list[pdf_xref_len(doc)-1]);
+ pdf_set_int(ctx, opts->linear_h0, opts->ofs_list[pdf_xref_len(ctx, doc)-1]);
/* Primary hint stream length (of object, not stream!) */
offset = (opts->start == 1 ? opts->main_xref_offset : opts->ofs_list[1] + opts->hintstream_len);
- pdf_set_int(opts->linear_h1, offset - opts->ofs_list[pdf_xref_len(doc)-1]);
+ pdf_set_int(ctx, opts->linear_h1, offset - opts->ofs_list[pdf_xref_len(ctx, doc)-1]);
/* Object number of first pages page object (the first object of page 0) */
- pdf_set_int(opts->linear_o, opts->page_object_lists->page[0]->object[0]);
+ pdf_set_int(ctx, opts->linear_o, opts->page_object_lists->page[0]->object[0]);
/* Offset of end of first page (first page is followed by primary
* hint stream (object n-1) then remaining pages (object 1...). The
* primary hint stream counts as part of the first pages data, I think.
*/
offset = (opts->start == 1 ? opts->main_xref_offset : opts->ofs_list[1] + opts->hintstream_len);
- pdf_set_int(opts->linear_e, offset);
+ pdf_set_int(ctx, opts->linear_e, offset);
/* Number of pages in document */
- pdf_set_int(opts->linear_n, opts->page_count);
+ pdf_set_int(ctx, opts->linear_n, opts->page_count);
/* Offset of first entry in main xref table */
- pdf_set_int(opts->linear_t, opts->first_xref_entry_offset + opts->hintstream_len);
+ pdf_set_int(ctx, opts->linear_t, opts->first_xref_entry_offset + opts->hintstream_len);
/* Offset of shared objects hint table in the primary hint stream */
- pdf_set_int(opts->hints_s, opts->hints_shared_offset);
+ pdf_set_int(ctx, opts->hints_s, opts->hints_shared_offset);
/* Primary hint stream length */
- pdf_set_int(opts->hints_length, opts->hintstream_len);
+ pdf_set_int(ctx, opts->hints_length, opts->hintstream_len);
}
/*
* Make sure we have loaded objects from object streams.
*/
-static void preloadobjstms(pdf_document *doc)
+static void preloadobjstms(fz_context *ctx, pdf_document *doc)
{
pdf_obj *obj;
int num;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
for (num = 0; num < xref_len; num++)
{
- if (pdf_get_xref_entry(doc, num)->type == 'o')
+ if (pdf_get_xref_entry(ctx, doc, num)->type == 'o')
{
- obj = pdf_load_object(doc, num, 0);
- pdf_drop_obj(obj);
+ obj = pdf_load_object(ctx, doc, num, 0);
+ pdf_drop_obj(ctx, obj);
}
}
}
@@ -1505,103 +1495,101 @@ static fz_buffer *hexbuf(fz_context *ctx, unsigned char *p, int n)
return buf;
}
-static void addhexfilter(pdf_document *doc, pdf_obj *dict)
+static void addhexfilter(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
pdf_obj *f, *dp, *newf, *newdp;
pdf_obj *ahx, *nullobj;
- ahx = pdf_new_name(doc, "ASCIIHexDecode");
- nullobj = pdf_new_null(doc);
+ ahx = pdf_new_name(ctx, doc, "ASCIIHexDecode");
+ nullobj = pdf_new_null(ctx, doc);
newf = newdp = NULL;
- f = pdf_dict_gets(dict, "Filter");
- dp = pdf_dict_gets(dict, "DecodeParms");
+ f = pdf_dict_gets(ctx, dict, "Filter");
+ dp = pdf_dict_gets(ctx, dict, "DecodeParms");
- if (pdf_is_name(f))
+ if (pdf_is_name(ctx, f))
{
- newf = pdf_new_array(doc, 2);
- pdf_array_push(newf, ahx);
- pdf_array_push(newf, f);
+ newf = pdf_new_array(ctx, doc, 2);
+ pdf_array_push(ctx, newf, ahx);
+ pdf_array_push(ctx, newf, f);
f = newf;
- if (pdf_is_dict(dp))
+ if (pdf_is_dict(ctx, dp))
{
- newdp = pdf_new_array(doc, 2);
- pdf_array_push(newdp, nullobj);
- pdf_array_push(newdp, dp);
+ newdp = pdf_new_array(ctx, doc, 2);
+ pdf_array_push(ctx, newdp, nullobj);
+ pdf_array_push(ctx, newdp, dp);
dp = newdp;
}
}
- else if (pdf_is_array(f))
+ else if (pdf_is_array(ctx, f))
{
- pdf_array_insert(f, ahx, 0);
- if (pdf_is_array(dp))
- pdf_array_insert(dp, nullobj, 0);
+ pdf_array_insert(ctx, f, ahx, 0);
+ if (pdf_is_array(ctx, dp))
+ pdf_array_insert(ctx, dp, nullobj, 0);
}
else
f = ahx;
- pdf_dict_puts(dict, "Filter", f);
+ pdf_dict_puts(ctx, dict, "Filter", f);
if (dp)
- pdf_dict_puts(dict, "DecodeParms", dp);
+ pdf_dict_puts(ctx, dict, "DecodeParms", dp);
- pdf_drop_obj(ahx);
- pdf_drop_obj(nullobj);
- pdf_drop_obj(newf);
- pdf_drop_obj(newdp);
+ pdf_drop_obj(ctx, ahx);
+ pdf_drop_obj(ctx, nullobj);
+ pdf_drop_obj(ctx, newf);
+ pdf_drop_obj(ctx, newdp);
}
-static void copystream(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj_orig, int num, int gen)
+static void copystream(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj_orig, int num, int gen)
{
fz_buffer *buf, *tmp;
pdf_obj *newlen;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
int orig_num = opts->rev_renumber_map[num];
int orig_gen = opts->rev_gen_list[num];
- buf = pdf_load_raw_renumbered_stream(doc, num, gen, orig_num, orig_gen);
+ buf = pdf_load_raw_renumbered_stream(ctx, doc, num, gen, orig_num, orig_gen);
- obj = pdf_copy_dict(obj_orig);
+ obj = pdf_copy_dict(ctx, obj_orig);
if (opts->do_ascii && isbinarystream(buf))
{
tmp = hexbuf(ctx, buf->data, buf->len);
fz_drop_buffer(ctx, buf);
buf = tmp;
- addhexfilter(doc, obj);
+ addhexfilter(ctx, doc, obj);
- newlen = pdf_new_int(doc, buf->len);
- pdf_dict_puts(obj, "Length", newlen);
- pdf_drop_obj(newlen);
+ newlen = pdf_new_int(ctx, doc, buf->len);
+ pdf_dict_puts(ctx, obj, "Length", newlen);
+ pdf_drop_obj(ctx, newlen);
}
fprintf(opts->out, "%d %d obj\n", num, gen);
- pdf_fprint_obj(opts->out, obj, opts->do_expand == 0);
+ pdf_fprint_obj(ctx, opts->out, obj, opts->do_expand == 0);
fprintf(opts->out, "stream\n");
fwrite(buf->data, 1, buf->len, opts->out);
fprintf(opts->out, "endstream\nendobj\n\n");
fz_drop_buffer(ctx, buf);
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
-static void expandstream(pdf_document *doc, pdf_write_options *opts, pdf_obj *obj_orig, int num, int gen)
+static void expandstream(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *obj_orig, int num, int gen)
{
fz_buffer *buf, *tmp;
pdf_obj *newlen;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
int orig_num = opts->rev_renumber_map[num];
int orig_gen = opts->rev_gen_list[num];
int truncated = 0;
- buf = pdf_load_renumbered_stream(doc, num, gen, orig_num, orig_gen, (opts->continue_on_error ? &truncated : NULL));
+ buf = pdf_load_renumbered_stream(ctx, doc, num, gen, orig_num, orig_gen, (opts->continue_on_error ? &truncated : NULL));
if (truncated && opts->errors)
(*opts->errors)++;
- obj = pdf_copy_dict(obj_orig);
- pdf_dict_dels(obj, "Filter");
- pdf_dict_dels(obj, "DecodeParms");
+ obj = pdf_copy_dict(ctx, obj_orig);
+ pdf_dict_dels(ctx, obj, "Filter");
+ pdf_dict_dels(ctx, obj, "DecodeParms");
if (opts->do_ascii && isbinarystream(buf))
{
@@ -1609,21 +1597,21 @@ static void expandstream(pdf_document *doc, pdf_write_options *opts, pdf_obj *ob
fz_drop_buffer(ctx, buf);
buf = tmp;
- addhexfilter(doc, obj);
+ addhexfilter(ctx, doc, obj);
}
- newlen = pdf_new_int(doc, buf->len);
- pdf_dict_puts(obj, "Length", newlen);
- pdf_drop_obj(newlen);
+ newlen = pdf_new_int(ctx, doc, buf->len);
+ pdf_dict_puts(ctx, obj, "Length", newlen);
+ pdf_drop_obj(ctx, newlen);
fprintf(opts->out, "%d %d obj\n", num, gen);
- pdf_fprint_obj(opts->out, obj, opts->do_expand == 0);
+ pdf_fprint_obj(ctx, opts->out, obj, opts->do_expand == 0);
fprintf(opts->out, "stream\n");
fwrite(buf->data, 1, buf->len, opts->out);
fprintf(opts->out, "endstream\nendobj\n\n");
fz_drop_buffer(ctx, buf);
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
static int is_image_filter(char *s)
@@ -1637,33 +1625,32 @@ static int is_image_filter(char *s)
return 0;
}
-static int filter_implies_image(pdf_document *doc, pdf_obj *o)
+static int filter_implies_image(fz_context *ctx, pdf_document *doc, pdf_obj *o)
{
if (!o)
return 0;
- if (pdf_is_name(o))
- return is_image_filter(pdf_to_name(o));
- if (pdf_is_array(o))
+ if (pdf_is_name(ctx, o))
+ return is_image_filter(pdf_to_name(ctx, o));
+ if (pdf_is_array(ctx, o))
{
int i, len;
- len = pdf_array_len(o);
+ len = pdf_array_len(ctx, o);
for (i = 0; i < len; i++)
- if (is_image_filter(pdf_to_name(pdf_array_get(o, i))))
+ if (is_image_filter(pdf_to_name(ctx, pdf_array_get(ctx, o, i))))
return 1;
}
return 0;
}
-static void writeobject(pdf_document *doc, pdf_write_options *opts, int num, int gen, int skip_xrefs)
+static void writeobject(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int num, int gen, int skip_xrefs)
{
pdf_xref_entry *entry;
pdf_obj *obj;
pdf_obj *type;
- fz_context *ctx = doc->ctx;
fz_try(ctx)
{
- obj = pdf_load_object(doc, num, gen);
+ obj = pdf_load_object(ctx, doc, num, gen);
}
fz_catch(ctx)
{
@@ -1681,34 +1668,34 @@ static void writeobject(pdf_document *doc, pdf_write_options *opts, int num, int
}
/* skip ObjStm and XRef objects */
- if (pdf_is_dict(obj))
+ if (pdf_is_dict(ctx, obj))
{
- type = pdf_dict_gets(obj, "Type");
- if (pdf_is_name(type) && !strcmp(pdf_to_name(type), "ObjStm"))
+ type = pdf_dict_gets(ctx, obj, "Type");
+ if (pdf_is_name(ctx, type) && !strcmp(pdf_to_name(ctx, type), "ObjStm"))
{
opts->use_list[num] = 0;
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
return;
}
- if (skip_xrefs && pdf_is_name(type) && !strcmp(pdf_to_name(type), "XRef"))
+ if (skip_xrefs && pdf_is_name(ctx, type) && !strcmp(pdf_to_name(ctx, type), "XRef"))
{
opts->use_list[num] = 0;
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
return;
}
}
- entry = pdf_get_xref_entry(doc, num);
- if (!pdf_is_stream(doc, num, gen))
+ entry = pdf_get_xref_entry(ctx, doc, num);
+ if (!pdf_is_stream(ctx, doc, num, gen))
{
fprintf(opts->out, "%d %d obj\n", num, gen);
- pdf_fprint_obj(opts->out, obj, opts->do_expand == 0);
+ pdf_fprint_obj(ctx, opts->out, obj, opts->do_expand == 0);
fprintf(opts->out, "endobj\n\n");
}
else if (entry->stm_ofs < 0 && entry->stm_buf == NULL)
{
fprintf(opts->out, "%d %d obj\n", num, gen);
- pdf_fprint_obj(opts->out, obj, opts->do_expand == 0);
+ pdf_fprint_obj(ctx, opts->out, obj, opts->do_expand == 0);
fprintf(opts->out, "stream\nendstream\nendobj\n\n");
}
else
@@ -1718,34 +1705,34 @@ static void writeobject(pdf_document *doc, pdf_write_options *opts, int num, int
{
pdf_obj *o;
- if ((o = pdf_dict_gets(obj, "Type"), !strcmp(pdf_to_name(o), "XObject")) &&
- (o = pdf_dict_gets(obj, "Subtype"), !strcmp(pdf_to_name(o), "Image")))
+ if ((o = pdf_dict_gets(ctx, obj, "Type"), !strcmp(pdf_to_name(ctx, o), "XObject")) &&
+ (o = pdf_dict_gets(ctx, obj, "Subtype"), !strcmp(pdf_to_name(ctx, o), "Image")))
dontexpand = !(opts->do_expand & fz_expand_images);
- if (o = pdf_dict_gets(obj, "Type"), !strcmp(pdf_to_name(o), "Font"))
+ if (o = pdf_dict_gets(ctx, obj, "Type"), !strcmp(pdf_to_name(ctx, o), "Font"))
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (o = pdf_dict_gets(obj, "Type"), !strcmp(pdf_to_name(o), "FontDescriptor"))
+ if (o = pdf_dict_gets(ctx, obj, "Type"), !strcmp(pdf_to_name(ctx, o), "FontDescriptor"))
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (pdf_dict_gets(obj, "Length1") != NULL)
+ if (pdf_dict_gets(ctx, obj, "Length1") != NULL)
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (pdf_dict_gets(obj, "Length2") != NULL)
+ if (pdf_dict_gets(ctx, obj, "Length2") != NULL)
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (pdf_dict_gets(obj, "Length3") != NULL)
+ if (pdf_dict_gets(ctx, obj, "Length3") != NULL)
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (o = pdf_dict_gets(obj, "Subtype"), !strcmp(pdf_to_name(o), "Type1C"))
+ if (o = pdf_dict_gets(ctx, obj, "Subtype"), !strcmp(pdf_to_name(ctx, o), "Type1C"))
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (o = pdf_dict_gets(obj, "Subtype"), !strcmp(pdf_to_name(o), "CIDFontType0C"))
+ if (o = pdf_dict_gets(ctx, obj, "Subtype"), !strcmp(pdf_to_name(ctx, o), "CIDFontType0C"))
dontexpand = !(opts->do_expand & fz_expand_fonts);
- if (o = pdf_dict_gets(obj, "Filter"), filter_implies_image(doc, o))
+ if (o = pdf_dict_gets(ctx, obj, "Filter"), filter_implies_image(ctx, doc, o))
dontexpand = !(opts->do_expand & fz_expand_images);
- if (pdf_dict_gets(obj, "Width") != NULL && pdf_dict_gets(obj, "Height") != NULL)
+ if (pdf_dict_gets(ctx, obj, "Width") != NULL && pdf_dict_gets(ctx, obj, "Height") != NULL)
dontexpand = !(opts->do_expand & fz_expand_images);
}
fz_try(ctx)
{
if (opts->do_expand && !dontexpand && !pdf_is_jpx_image(ctx, obj))
- expandstream(doc, opts, obj, num, gen);
+ expandstream(ctx, doc, opts, obj, num, gen);
else
- copystream(doc, opts, obj, num, gen);
+ copystream(ctx, doc, opts, obj, num, gen);
}
fz_catch(ctx)
{
@@ -1759,13 +1746,13 @@ static void writeobject(pdf_document *doc, pdf_write_options *opts, int num, int
}
else
{
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
fz_rethrow(ctx);
}
}
}
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
static void writexrefsubsect(pdf_write_options *opts, int from, int to)
@@ -1782,12 +1769,11 @@ static void writexrefsubsect(pdf_write_options *opts, int from, int to)
}
}
-static void writexref(pdf_document *doc, pdf_write_options *opts, int from, int to, int first, int main_xref_offset, int startxref)
+static void writexref(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int from, int to, int first, int main_xref_offset, int startxref)
{
pdf_obj *trailer = NULL;
pdf_obj *obj;
pdf_obj *nobj = NULL;
- fz_context *ctx = doc->ctx;
fprintf(opts->out, "xref\n");
opts->first_xref_entry_offset = ftell(opts->out);
@@ -1799,11 +1785,11 @@ static void writexref(pdf_document *doc, pdf_write_options *opts, int from, int
while (subfrom < to)
{
- while (subfrom < to && !pdf_xref_is_incremental(doc, subfrom))
+ while (subfrom < to && !pdf_xref_is_incremental(ctx, doc, subfrom))
subfrom++;
subto = subfrom;
- while (subto < to && pdf_xref_is_incremental(doc, subto))
+ while (subto < to && pdf_xref_is_incremental(ctx, doc, subto))
subto++;
if (subfrom < subto)
@@ -1826,46 +1812,46 @@ static void writexref(pdf_document *doc, pdf_write_options *opts, int from, int
{
if (opts->do_incremental)
{
- trailer = pdf_keep_obj(pdf_trailer(doc));
- pdf_dict_puts_drop(trailer, "Size", pdf_new_int(doc, pdf_xref_len(doc)));
- pdf_dict_puts_drop(trailer, "Prev", pdf_new_int(doc, doc->startxref));
+ trailer = pdf_keep_obj(ctx, pdf_trailer(ctx, doc));
+ pdf_dict_puts_drop(ctx, trailer, "Size", pdf_new_int(ctx, doc, pdf_xref_len(ctx, doc)));
+ pdf_dict_puts_drop(ctx, trailer, "Prev", pdf_new_int(ctx, doc, doc->startxref));
doc->startxref = startxref;
}
else
{
- trailer = pdf_new_dict(doc, 5);
+ trailer = pdf_new_dict(ctx, doc, 5);
- nobj = pdf_new_int(doc, to);
- pdf_dict_puts(trailer, "Size", nobj);
- pdf_drop_obj(nobj);
+ nobj = pdf_new_int(ctx, doc, to);
+ pdf_dict_puts(ctx, trailer, "Size", nobj);
+ pdf_drop_obj(ctx, nobj);
nobj = NULL;
if (first)
{
- obj = pdf_dict_gets(pdf_trailer(doc), "Info");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info");
if (obj)
- pdf_dict_puts(trailer, "Info", obj);
+ pdf_dict_puts(ctx, trailer, "Info", obj);
- obj = pdf_dict_gets(pdf_trailer(doc), "Root");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
if (obj)
- pdf_dict_puts(trailer, "Root", obj);
+ pdf_dict_puts(ctx, trailer, "Root", obj);
- obj = pdf_dict_gets(pdf_trailer(doc), "ID");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "ID");
if (obj)
- pdf_dict_puts(trailer, "ID", obj);
+ pdf_dict_puts(ctx, trailer, "ID", obj);
}
if (main_xref_offset != 0)
{
- nobj = pdf_new_int(doc, main_xref_offset);
- pdf_dict_puts(trailer, "Prev", nobj);
- pdf_drop_obj(nobj);
+ nobj = pdf_new_int(ctx, doc, main_xref_offset);
+ pdf_dict_puts(ctx, trailer, "Prev", nobj);
+ pdf_drop_obj(ctx, nobj);
nobj = NULL;
}
}
}
fz_always(ctx)
{
- pdf_drop_obj(nobj);
+ pdf_drop_obj(ctx, nobj);
}
fz_catch(ctx)
{
@@ -1873,36 +1859,35 @@ static void writexref(pdf_document *doc, pdf_write_options *opts, int from, int
}
fprintf(opts->out, "trailer\n");
- pdf_fprint_obj(opts->out, trailer, opts->do_expand == 0);
+ pdf_fprint_obj(ctx, opts->out, trailer, opts->do_expand == 0);
fprintf(opts->out, "\n");
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
fprintf(opts->out, "startxref\n%d\n%%%%EOF\n", startxref);
doc->has_xref_streams = 0;
}
-static void writexrefstreamsubsect(pdf_document *doc, pdf_write_options *opts, pdf_obj *index, fz_buffer *fzbuf, int from, int to)
+static void writexrefstreamsubsect(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, pdf_obj *index, fz_buffer *fzbuf, int from, int to)
{
int num;
- pdf_array_push_drop(index, pdf_new_int(doc, from));
- pdf_array_push_drop(index, pdf_new_int(doc, to - from));
+ pdf_array_push_drop(ctx, index, pdf_new_int(ctx, doc, from));
+ pdf_array_push_drop(ctx, index, pdf_new_int(ctx, doc, to - from));
for (num = from; num < to; num++)
{
- fz_write_buffer_byte(doc->ctx, fzbuf, opts->use_list[num] ? 1 : 0);
- fz_write_buffer_byte(doc->ctx, fzbuf, opts->ofs_list[num]>>24);
- fz_write_buffer_byte(doc->ctx, fzbuf, opts->ofs_list[num]>>16);
- fz_write_buffer_byte(doc->ctx, fzbuf, opts->ofs_list[num]>>8);
- fz_write_buffer_byte(doc->ctx, fzbuf, opts->ofs_list[num]);
- fz_write_buffer_byte(doc->ctx, fzbuf, opts->gen_list[num]);
+ fz_write_buffer_byte(ctx, fzbuf, opts->use_list[num] ? 1 : 0);
+ fz_write_buffer_byte(ctx, fzbuf, opts->ofs_list[num]>>24);
+ fz_write_buffer_byte(ctx, fzbuf, opts->ofs_list[num]>>16);
+ fz_write_buffer_byte(ctx, fzbuf, opts->ofs_list[num]>>8);
+ fz_write_buffer_byte(ctx, fzbuf, opts->ofs_list[num]);
+ fz_write_buffer_byte(ctx, fzbuf, opts->gen_list[num]);
}
}
-static void writexrefstream(pdf_document *doc, pdf_write_options *opts, int from, int to, int first, int main_xref_offset, int startxref)
+static void writexrefstream(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int from, int to, int first, int main_xref_offset, int startxref)
{
- fz_context *ctx = doc->ctx;
int num;
pdf_obj *dict = NULL;
pdf_obj *obj;
@@ -1915,9 +1900,9 @@ static void writexrefstream(pdf_document *doc, pdf_write_options *opts, int from
fz_var(fzbuf);
fz_try(ctx)
{
- num = pdf_create_object(doc);
- dict = pdf_new_dict(doc, 6);
- pdf_update_object(doc, num, dict);
+ num = pdf_create_object(ctx, doc);
+ dict = pdf_new_dict(ctx, doc, 6);
+ pdf_update_object(ctx, doc, num, dict);
opts->first_xref_entry_offset = ftell(opts->out);
@@ -1925,49 +1910,49 @@ static void writexrefstream(pdf_document *doc, pdf_write_options *opts, int from
if (first)
{
- obj = pdf_dict_gets(pdf_trailer(doc), "Info");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info");
if (obj)
- pdf_dict_puts(dict, "Info", obj);
+ pdf_dict_puts(ctx, dict, "Info", obj);
- obj = pdf_dict_gets(pdf_trailer(doc), "Root");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
if (obj)
- pdf_dict_puts(dict, "Root", obj);
+ pdf_dict_puts(ctx, dict, "Root", obj);
- obj = pdf_dict_gets(pdf_trailer(doc), "ID");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "ID");
if (obj)
- pdf_dict_puts(dict, "ID", obj);
+ pdf_dict_puts(ctx, dict, "ID", obj);
if (opts->do_incremental)
{
- obj = pdf_dict_gets(pdf_trailer(doc), "Encrypt");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Encrypt");
if (obj)
- pdf_dict_puts(dict, "Encrypt", obj);
+ pdf_dict_puts(ctx, dict, "Encrypt", obj);
}
}
- pdf_dict_puts_drop(dict, "Size", pdf_new_int(doc, to));
+ pdf_dict_puts_drop(ctx, dict, "Size", pdf_new_int(ctx, doc, to));
if (opts->do_incremental)
{
- pdf_dict_puts_drop(dict, "Prev", pdf_new_int(doc, doc->startxref));
+ pdf_dict_puts_drop(ctx, dict, "Prev", pdf_new_int(ctx, doc, doc->startxref));
doc->startxref = startxref;
}
else
{
if (main_xref_offset != 0)
- pdf_dict_puts_drop(dict, "Prev", pdf_new_int(doc, main_xref_offset));
+ pdf_dict_puts_drop(ctx, dict, "Prev", pdf_new_int(ctx, doc, main_xref_offset));
}
- pdf_dict_puts_drop(dict, "Type", pdf_new_name(doc, "XRef"));
+ pdf_dict_puts_drop(ctx, dict, "Type", pdf_new_name(ctx, doc, "XRef"));
- w = pdf_new_array(doc, 3);
- pdf_dict_puts(dict, "W", w);
- pdf_array_push_drop(w, pdf_new_int(doc, 1));
- pdf_array_push_drop(w, pdf_new_int(doc, 4));
- pdf_array_push_drop(w, pdf_new_int(doc, 1));
+ w = pdf_new_array(ctx, doc, 3);
+ pdf_dict_puts(ctx, dict, "W", w);
+ pdf_array_push_drop(ctx, w, pdf_new_int(ctx, doc, 1));
+ pdf_array_push_drop(ctx, w, pdf_new_int(ctx, doc, 4));
+ pdf_array_push_drop(ctx, w, pdf_new_int(ctx, doc, 1));
- index = pdf_new_array(doc, 2);
- pdf_dict_puts_drop(dict, "Index", index);
+ index = pdf_new_array(ctx, doc, 2);
+ pdf_dict_puts_drop(ctx, dict, "Index", index);
opts->ofs_list[num] = opts->first_xref_entry_offset;
@@ -1980,34 +1965,34 @@ static void writexrefstream(pdf_document *doc, pdf_write_options *opts, int from
while (subfrom < to)
{
- while (subfrom < to && !pdf_xref_is_incremental(doc, subfrom))
+ while (subfrom < to && !pdf_xref_is_incremental(ctx, doc, subfrom))
subfrom++;
subto = subfrom;
- while (subto < to && pdf_xref_is_incremental(doc, subto))
+ while (subto < to && pdf_xref_is_incremental(ctx, doc, subto))
subto++;
if (subfrom < subto)
- writexrefstreamsubsect(doc, opts, index, fzbuf, subfrom, subto);
+ writexrefstreamsubsect(ctx, doc, opts, index, fzbuf, subfrom, subto);
subfrom = subto;
}
}
else
{
- writexrefstreamsubsect(doc, opts, index, fzbuf, from, to);
+ writexrefstreamsubsect(ctx, doc, opts, index, fzbuf, from, to);
}
- pdf_update_stream(doc, num, fzbuf);
- pdf_dict_puts_drop(dict, "Length", pdf_new_int(doc, fz_buffer_storage(ctx, fzbuf, NULL)));
+ pdf_update_stream(ctx, doc, num, fzbuf);
+ pdf_dict_puts_drop(ctx, dict, "Length", pdf_new_int(ctx, doc, fz_buffer_storage(ctx, fzbuf, NULL)));
- writeobject(doc, opts, num, 0, 0);
+ writeobject(ctx, doc, opts, num, 0, 0);
fprintf(opts->out, "startxref\n%d\n%%%%EOF\n", startxref);
}
fz_always(ctx)
{
- pdf_drop_obj(dict);
- pdf_drop_obj(w);
+ pdf_drop_obj(ctx, dict);
+ pdf_drop_obj(ctx, w);
fz_drop_buffer(ctx, fzbuf);
}
fz_catch(ctx)
@@ -2030,9 +2015,9 @@ padto(FILE *file, int target)
}
static void
-dowriteobject(pdf_document *doc, pdf_write_options *opts, int num, int pass)
+dowriteobject(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int num, int pass)
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, num);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, num);
if (entry->type == 'f')
opts->gen_list[num] = entry->gen;
if (entry->type == 'n')
@@ -2056,18 +2041,18 @@ dowriteobject(pdf_document *doc, pdf_write_options *opts, int num, int pass)
if (pass > 0)
padto(opts->out, opts->ofs_list[num]);
opts->ofs_list[num] = ftell(opts->out);
- if (!opts->do_incremental || pdf_xref_is_incremental(doc, num))
- writeobject(doc, opts, num, opts->gen_list[num], 1);
+ if (!opts->do_incremental || pdf_xref_is_incremental(ctx, doc, num))
+ writeobject(ctx, doc, opts, num, opts->gen_list[num], 1);
}
else
opts->use_list[num] = 0;
}
static void
-writeobjects(pdf_document *doc, pdf_write_options *opts, int pass)
+writeobjects(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, int pass)
{
int num;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
if (!opts->do_incremental)
{
@@ -2075,7 +2060,7 @@ writeobjects(pdf_document *doc, pdf_write_options *opts, int pass)
fprintf(opts->out, "%%\316\274\341\277\246\n\n");
}
- dowriteobject(doc, opts, opts->start, pass);
+ dowriteobject(ctx, doc, opts, opts->start, pass);
if (opts->do_linear)
{
@@ -2084,11 +2069,11 @@ writeobjects(pdf_document *doc, pdf_write_options *opts, int pass)
opts->first_xref_offset = ftell(opts->out);
else
padto(opts->out, opts->first_xref_offset);
- writexref(doc, opts, opts->start, pdf_xref_len(doc), 1, opts->main_xref_offset, 0);
+ writexref(ctx, doc, opts, opts->start, pdf_xref_len(ctx, doc), 1, opts->main_xref_offset, 0);
}
for (num = opts->start+1; num < xref_len; num++)
- dowriteobject(doc, opts, num, pass);
+ dowriteobject(ctx, doc, opts, num, pass);
if (opts->do_linear && pass == 1)
{
int offset = (opts->start == 1 ? opts->main_xref_offset : opts->ofs_list[1] + opts->hintstream_len);
@@ -2098,7 +2083,7 @@ writeobjects(pdf_document *doc, pdf_write_options *opts, int pass)
{
if (pass == 1)
opts->ofs_list[num] += opts->hintstream_len;
- dowriteobject(doc, opts, num, pass);
+ dowriteobject(ctx, doc, opts, num, pass);
}
}
@@ -2120,9 +2105,8 @@ my_log2(int x)
}
static void
-make_page_offset_hints(pdf_document *doc, pdf_write_options *opts, fz_buffer *buf)
+make_page_offset_hints(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, fz_buffer *buf)
{
- fz_context *ctx = doc->ctx;
int i, j;
int min_objs_per_page, max_objs_per_page;
int min_page_length, max_page_length;
@@ -2133,9 +2117,9 @@ make_page_offset_hints(pdf_document *doc, pdf_write_options *opts, fz_buffer *bu
page_objects **pop = &opts->page_object_lists->page[0];
int page_len_bits, shared_object_bits, shared_object_id_bits;
int shared_length_bits;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
- min_shared_object = pdf_xref_len(doc);
+ min_shared_object = pdf_xref_len(ctx, doc);
max_shared_object = 1;
min_shared_length = opts->file_len;
max_shared_length = 0;
@@ -2391,15 +2375,14 @@ make_page_offset_hints(pdf_document *doc, pdf_write_options *opts, fz_buffer *bu
}
static void
-make_hint_stream(pdf_document *doc, pdf_write_options *opts)
+make_hint_stream(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
- fz_context *ctx = doc->ctx;
fz_buffer *buf = fz_new_buffer(ctx, 100);
fz_try(ctx)
{
- make_page_offset_hints(doc, opts, buf);
- pdf_update_stream(doc, pdf_xref_len(doc)-1, buf);
+ make_page_offset_hints(ctx, doc, opts, buf);
+ pdf_update_stream(ctx, doc, pdf_xref_len(ctx, doc)-1, buf);
opts->hintstream_len = buf->len;
fz_drop_buffer(ctx, buf);
}
@@ -2411,18 +2394,18 @@ make_hint_stream(pdf_document *doc, pdf_write_options *opts)
}
#ifdef DEBUG_WRITING
-static void dump_object_details(pdf_document *doc, pdf_write_options *opts)
+static void dump_object_details(fz_context *ctx, pdf_document *doc, pdf_write_options *opts)
{
int i;
- for (i = 0; i < pdf_xref_len(doc); i++)
+ for (i = 0; i < pdf_xref_len(ctx, doc); i++)
{
fprintf(stderr, "%d@%d: use=%d\n", i, opts->ofs_list[i], opts->use_list[i]);
}
}
#endif
-static void presize_unsaved_signature_byteranges(pdf_document *doc)
+static void presize_unsaved_signature_byteranges(fz_context *ctx, pdf_document *doc)
{
if (doc->unsaved_sigs)
{
@@ -2441,20 +2424,19 @@ static void presize_unsaved_signature_byteranges(pdf_document *doc)
* the end and between each consecutive pair of signatures,
* hence n + 1 */
int i;
- pdf_obj *byte_range = pdf_dict_getp(usig->field, "V/ByteRange");
+ pdf_obj *byte_range = pdf_dict_getp(ctx, usig->field, "V/ByteRange");
for (i = 0; i < n+1; i++)
{
- pdf_array_push_drop(byte_range, pdf_new_int(doc, INT_MAX));
- pdf_array_push_drop(byte_range, pdf_new_int(doc, INT_MAX));
+ pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, INT_MAX));
+ pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, INT_MAX));
}
}
}
}
-static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char *filename)
+static void complete_signatures(fz_context *ctx, pdf_document *doc, pdf_write_options *opts, char *filename)
{
- fz_context *ctx = doc->ctx;
pdf_unsaved_sig *usig;
FILE *f;
char buf[5120];
@@ -2477,7 +2459,7 @@ static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char
for (usig = doc->unsaved_sigs; usig; usig = usig->next)
{
char *bstr, *cstr, *fstr;
- int pnum = pdf_obj_parent_num(pdf_dict_getp(usig->field, "V/ByteRange"));
+ int pnum = pdf_obj_parent_num(ctx, pdf_dict_getp(ctx, usig->field, "V/ByteRange"));
fseek(f, opts->ofs_list[pnum], SEEK_SET);
(void)fread(buf, 1, sizeof(buf), f);
buf[sizeof(buf)-1] = 0;
@@ -2497,25 +2479,25 @@ static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char
/* Recreate ByteRange with correct values. Initially store the
* recreated object in the first of the unsaved signatures */
- byte_range = pdf_new_array(doc, 4);
- pdf_dict_putp_drop(doc->unsaved_sigs->field, "V/ByteRange", byte_range);
+ byte_range = pdf_new_array(ctx, doc, 4);
+ pdf_dict_putp_drop(ctx, doc->unsaved_sigs->field, "V/ByteRange", byte_range);
last_end = 0;
for (usig = doc->unsaved_sigs; usig; usig = usig->next)
{
- pdf_array_push_drop(byte_range, pdf_new_int(doc, last_end));
- pdf_array_push_drop(byte_range, pdf_new_int(doc, usig->contents_start - last_end));
+ pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, last_end));
+ pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, usig->contents_start - last_end));
last_end = usig->contents_end;
}
- pdf_array_push_drop(byte_range, pdf_new_int(doc, last_end));
- pdf_array_push_drop(byte_range, pdf_new_int(doc, flen - last_end));
+ pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, last_end));
+ pdf_array_push_drop(ctx, byte_range, pdf_new_int(ctx, doc, flen - last_end));
/* Copy the new ByteRange to the other unsaved signatures */
for (usig = doc->unsaved_sigs->next; usig; usig = usig->next)
- pdf_dict_putp_drop(usig->field, "V/ByteRange", pdf_copy_array(byte_range));
+ pdf_dict_putp_drop(ctx, usig->field, "V/ByteRange", pdf_copy_array(ctx, byte_range));
/* Write the byte range into buf, padding with spaces*/
- i = pdf_sprint_obj(buf, sizeof(buf), byte_range, 1);
+ i = pdf_sprint_obj(ctx, buf, sizeof(buf), byte_range, 1);
memset(buf+i, ' ', sizeof(buf)-i);
/* Write the byte range to the file */
@@ -2529,60 +2511,59 @@ static void complete_signatures(pdf_document *doc, pdf_write_options *opts, char
/* Write the digests into the file */
for (usig = doc->unsaved_sigs; usig; usig = usig->next)
- pdf_write_digest(doc, filename, byte_range, usig->contents_start, usig->contents_end - usig->contents_start, usig->signer);
+ pdf_write_digest(ctx, doc, filename, byte_range, usig->contents_start, usig->contents_end - usig->contents_start, usig->signer);
/* delete the unsaved_sigs records */
while ((usig = doc->unsaved_sigs) != NULL)
{
doc->unsaved_sigs = usig->next;
- pdf_drop_obj(usig->field);
- pdf_drop_signer(usig->signer);
+ pdf_drop_obj(ctx, usig->field);
+ pdf_drop_signer(ctx, usig->signer);
fz_free(ctx, usig);
}
}
}
-static void sanitise(pdf_document *doc)
+static void sanitise(fz_context *ctx, pdf_document *doc)
{
- int n = pdf_count_pages(doc);
+ int n = pdf_count_pages(ctx, doc);
int i;
for (i = 0; i < n; i++)
{
- pdf_page *page = pdf_load_page(doc, i);
+ pdf_page *page = pdf_load_page(ctx, doc, i);
- pdf_clean_page_contents(doc, page, NULL);
+ pdf_clean_page_contents(ctx, doc, page, NULL);
- pdf_free_page(doc, page);
+ fz_drop_page(ctx, &page->super);
}
}
-void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_opts)
+void pdf_write_document(fz_context *ctx, pdf_document *doc, char *filename, fz_write_options *fz_opts)
{
+ fz_write_options opts_defaults = { 0 };
+ pdf_write_options opts = { 0 };
+
int lastfree;
int num;
- pdf_write_options opts = { 0 };
- fz_context *ctx;
int xref_len;
- fz_write_options fz_opts_defaults = { 0 };
if (!doc)
return;
if (!fz_opts)
- fz_opts = &fz_opts_defaults;
+ fz_opts = &opts_defaults;
doc->freeze_updates = 1;
- ctx = doc->ctx;
/* Sanitise the operator streams */
if (fz_opts->do_clean)
- sanitise(doc);
+ sanitise(ctx, doc);
- pdf_finish_edit(doc);
- presize_unsaved_signature_byteranges(doc);
+ pdf_finish_edit(ctx, doc);
+ presize_unsaved_signature_byteranges(ctx, doc);
- xref_len = pdf_xref_len(doc);
+ xref_len = pdf_xref_len(ctx, doc);
if (fz_opts->do_incremental)
{
@@ -2614,12 +2595,12 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
/* We deliberately make these arrays long enough to cope with
* 1 to n access rather than 0..n-1, and add space for 2 new
* extra entries that may be required for linearization. */
- opts.use_list = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int));
- opts.ofs_list = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int));
- opts.gen_list = fz_calloc(ctx, pdf_xref_len(doc) + 3, sizeof(int));
- opts.renumber_map = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int));
- opts.rev_renumber_map = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int));
- opts.rev_gen_list = fz_malloc_array(ctx, pdf_xref_len(doc) + 3, sizeof(int));
+ opts.use_list = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int));
+ opts.ofs_list = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int));
+ opts.gen_list = fz_calloc(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int));
+ opts.renumber_map = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int));
+ opts.rev_renumber_map = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int));
+ opts.rev_gen_list = fz_malloc_array(ctx, pdf_xref_len(ctx, doc) + 3, sizeof(int));
opts.continue_on_error = fz_opts->continue_on_error;
opts.errors = fz_opts->errors;
@@ -2629,7 +2610,7 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
opts.ofs_list[num] = 0;
opts.renumber_map[num] = num;
opts.rev_renumber_map[num] = num;
- opts.rev_gen_list[num] = pdf_get_xref_entry(doc, num)->gen;
+ opts.rev_gen_list[num] = pdf_get_xref_entry(ctx, doc, num)->gen;
}
if (opts.do_incremental && opts.do_garbage)
@@ -2640,28 +2621,28 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
/* Make sure any objects hidden in compressed streams have been loaded */
if (!opts.do_incremental)
{
- pdf_ensure_solid_xref(doc, xref_len);
- preloadobjstms(doc);
+ pdf_ensure_solid_xref(ctx, doc, xref_len);
+ preloadobjstms(ctx, doc);
}
/* Sweep & mark objects from the trailer */
if (opts.do_garbage >= 1)
- sweepobj(doc, &opts, pdf_trailer(doc));
+ sweepobj(ctx, doc, &opts, pdf_trailer(ctx, doc));
else
for (num = 0; num < xref_len; num++)
opts.use_list[num] = 1;
/* Coalesce and renumber duplicate objects */
if (opts.do_garbage >= 3)
- removeduplicateobjs(doc, &opts);
+ removeduplicateobjs(ctx, doc, &opts);
/* Compact xref by renumbering and removing unused objects */
if (opts.do_garbage >= 2 || opts.do_linear)
- compactxref(doc, &opts);
+ compactxref(ctx, doc, &opts);
/* Make renumbering affect all indirect references and update xref */
if (opts.do_garbage >= 2 || opts.do_linear)
- renumberobjs(doc, &opts);
+ renumberobjs(ctx, doc, &opts);
/* Truncate the xref after compacting and renumbering */
if (opts.do_garbage >= 2 && !opts.do_incremental)
@@ -2670,20 +2651,20 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
if (opts.do_linear)
{
- linearize(doc, &opts);
+ linearize(ctx, doc, &opts);
}
- writeobjects(doc, &opts, 0);
+ writeobjects(ctx, doc, &opts, 0);
#ifdef DEBUG_WRITING
- dump_object_details(doc, &opts);
+ dump_object_details(ctx, doc, &opts);
#endif
if (opts.do_incremental)
{
for (num = 0; num < xref_len; num++)
{
- if (!opts.use_list[num] && pdf_xref_is_incremental(doc, num))
+ if (!opts.use_list[num] && pdf_xref_is_incremental(ctx, doc, num))
{
/* Make unreusable. FIXME: would be better to link to existing free list */
opts.gen_list[num] = 65535;
@@ -2709,31 +2690,31 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
if (opts.do_linear)
{
opts.main_xref_offset = ftell(opts.out);
- writexref(doc, &opts, 0, opts.start, 0, 0, opts.first_xref_offset);
+ writexref(ctx, doc, &opts, 0, opts.start, 0, 0, opts.first_xref_offset);
opts.file_len = ftell(opts.out);
- make_hint_stream(doc, &opts);
+ make_hint_stream(ctx, doc, &opts);
opts.file_len += opts.hintstream_len;
opts.main_xref_offset += opts.hintstream_len;
- update_linearization_params(doc, &opts);
+ update_linearization_params(ctx, doc, &opts);
fseek(opts.out, 0, 0);
- writeobjects(doc, &opts, 1);
+ writeobjects(ctx, doc, &opts, 1);
padto(opts.out, opts.main_xref_offset);
- writexref(doc, &opts, 0, opts.start, 0, 0, opts.first_xref_offset);
+ writexref(ctx, doc, &opts, 0, opts.start, 0, 0, opts.first_xref_offset);
}
else
{
opts.first_xref_offset = ftell(opts.out);
if (opts.do_incremental && doc->has_xref_streams)
- writexrefstream(doc, &opts, 0, xref_len, 1, 0, opts.first_xref_offset);
+ writexrefstream(ctx, doc, &opts, 0, xref_len, 1, 0, opts.first_xref_offset);
else
- writexref(doc, &opts, 0, xref_len, 1, 0, opts.first_xref_offset);
+ writexref(ctx, doc, &opts, 0, xref_len, 1, 0, opts.first_xref_offset);
}
fclose(opts.out);
opts.out = NULL;
- complete_signatures(doc, &opts, filename);
+ complete_signatures(ctx, doc, &opts, filename);
doc->dirty = 0;
}
@@ -2741,7 +2722,7 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
{
#ifdef DEBUG_LINEARIZATION
page_objects_dump(&opts);
- objects_dump(doc, &opts);
+ objects_dump(ctx, doc, &opts);
#endif
fz_free(ctx, opts.use_list);
fz_free(ctx, opts.ofs_list);
@@ -2749,15 +2730,15 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
fz_free(ctx, opts.renumber_map);
fz_free(ctx, opts.rev_renumber_map);
fz_free(ctx, opts.rev_gen_list);
- pdf_drop_obj(opts.linear_l);
- pdf_drop_obj(opts.linear_h0);
- pdf_drop_obj(opts.linear_h1);
- pdf_drop_obj(opts.linear_o);
- pdf_drop_obj(opts.linear_e);
- pdf_drop_obj(opts.linear_n);
- pdf_drop_obj(opts.linear_t);
- pdf_drop_obj(opts.hints_s);
- pdf_drop_obj(opts.hints_length);
+ pdf_drop_obj(ctx, opts.linear_l);
+ pdf_drop_obj(ctx, opts.linear_h0);
+ pdf_drop_obj(ctx, opts.linear_h1);
+ pdf_drop_obj(ctx, opts.linear_o);
+ pdf_drop_obj(ctx, opts.linear_e);
+ pdf_drop_obj(ctx, opts.linear_n);
+ pdf_drop_obj(ctx, opts.linear_t);
+ pdf_drop_obj(ctx, opts.hints_s);
+ pdf_drop_obj(ctx, opts.hints_length);
page_objects_list_destroy(ctx, opts.page_object_lists);
if (opts.out)
fclose(opts.out);
@@ -2773,12 +2754,11 @@ void pdf_write_document(pdf_document *doc, char *filename, fz_write_options *fz_
#if 0
-// TODO: pdf_rebalance_page_tree(doc);
+// TODO: pdf_rebalance_page_tree(ctx, doc);
static pdf_obj *
-make_page_tree_node(pdf_document *doc, int l, int r, pdf_obj *parent_ref, int root)
+make_page_tree_node(fz_context *ctx, pdf_document *doc, int l, int r, pdf_obj *parent_ref, int root)
{
- fz_context *ctx = doc->ctx;
int count_per_kid, spaces;
pdf_obj *a = NULL;
pdf_obj *me = NULL;
@@ -2796,52 +2776,52 @@ make_page_tree_node(pdf_document *doc, int l, int r, pdf_obj *parent_ref, int ro
fz_try(ctx)
{
- me = pdf_new_dict(doc, 2);
- pdf_dict_puts_drop(me, "Type", pdf_new_name(doc, "Pages"));
- pdf_dict_puts_drop(me, "Count", pdf_new_int(doc, r-l));
+ me = pdf_new_dict(ctx, doc, 2);
+ pdf_dict_puts_drop(ctx, me, "Type", pdf_new_name(ctx, doc, "Pages"));
+ pdf_dict_puts_drop(ctx, me, "Count", pdf_new_int(ctx, doc, r-l));
if (!root)
- pdf_dict_puts(me, "Parent", parent_ref);
- a = pdf_new_array(doc, KIDS_PER_LEVEL);
- me_ref = pdf_new_ref(doc, me);
+ pdf_dict_puts(ctx, me, "Parent", parent_ref);
+ a = pdf_new_array(ctx, doc, KIDS_PER_LEVEL);
+ me_ref = pdf_new_ref(ctx, doc, me);
for (spaces = KIDS_PER_LEVEL; l < r; spaces--)
{
if (spaces >= r-l)
{
- o = pdf_keep_obj(doc->page_refs[l++]);
- pdf_dict_puts(o, "Parent", me_ref);
+ o = pdf_keep_obj(ctx, doc->page_refs[l++]);
+ pdf_dict_puts(ctx, o, "Parent", me_ref);
}
else
{
int j = l+count_per_kid;
if (j > r)
j = r;
- o = make_page_tree_node(doc, l, j, me_ref, 0);
+ o = make_page_tree_node(ctx, doc, l, j, me_ref, 0);
l = j;
}
- pdf_array_push(a, o);
- pdf_drop_obj(o);
+ pdf_array_push(ctx, a, o);
+ pdf_drop_obj(ctx, o);
o = NULL;
}
- pdf_dict_puts_drop(me, "Kids", a);
+ pdf_dict_puts_drop(ctx, me, "Kids", a);
a = NULL;
}
fz_always(ctx)
{
- pdf_drop_obj(me);
+ pdf_drop_obj(ctx, me);
}
fz_catch(ctx)
{
- pdf_drop_obj(a);
- pdf_drop_obj(o);
- pdf_drop_obj(me);
+ pdf_drop_obj(ctx, a);
+ pdf_drop_obj(ctx, o);
+ pdf_drop_obj(ctx, me);
fz_rethrow_message(ctx, "Failed to synthesize new page tree");
}
return me_ref;
}
static void
-pdf_rebalance_page_tree(pdf_document *doc)
+pdf_rebalance_page_tree(fz_context *ctx, pdf_document *doc)
{
pdf_obj *catalog;
pdf_obj *pages;
@@ -2849,9 +2829,9 @@ pdf_rebalance_page_tree(pdf_document *doc)
if (!doc || !doc->needs_page_tree_rebuild)
return;
- catalog = pdf_dict_gets(pdf_trailer(doc), "Root");
- pages = make_page_tree_node(doc, 0, doc->page_len, catalog, 1);
- pdf_dict_puts_drop(catalog, "Pages", pages);
+ catalog = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pages = make_page_tree_node(ctx, doc, 0, doc->page_len, catalog, 1);
+ pdf_dict_puts_drop(ctx, catalog, "Pages", pages);
doc->needs_page_tree_rebuild = 0;
}
@@ -2859,13 +2839,13 @@ pdf_rebalance_page_tree(pdf_document *doc)
#endif
static void
-pdf_rebalance_page_tree(pdf_document *doc)
+pdf_rebalance_page_tree(fz_context *ctx, pdf_document *doc)
{
}
-void pdf_finish_edit(pdf_document *doc)
+void pdf_finish_edit(fz_context *ctx, pdf_document *doc)
{
if (!doc)
return;
- pdf_rebalance_page_tree(doc);
+ pdf_rebalance_page_tree(ctx, doc);
}
diff --git a/source/pdf/pdf-xobject.c b/source/pdf/pdf-xobject.c
index c4259466..e169a27a 100644
--- a/source/pdf/pdf-xobject.c
+++ b/source/pdf/pdf-xobject.c
@@ -13,15 +13,15 @@ pdf_drop_xobject(fz_context *ctx, pdf_xobject *xobj)
}
static void
-pdf_free_xobject_imp(fz_context *ctx, fz_storable *xobj_)
+pdf_drop_xobject_imp(fz_context *ctx, fz_storable *xobj_)
{
pdf_xobject *xobj = (pdf_xobject *)xobj_;
if (xobj->colorspace)
fz_drop_colorspace(ctx, xobj->colorspace);
- pdf_drop_obj(xobj->resources);
- pdf_drop_obj(xobj->contents);
- pdf_drop_obj(xobj->me);
+ pdf_drop_obj(ctx, xobj->resources);
+ pdf_drop_obj(ctx, xobj->contents);
+ pdf_drop_obj(ctx, xobj->me);
fz_free(ctx, xobj);
}
@@ -34,19 +34,18 @@ pdf_xobject_size(pdf_xobject *xobj)
}
pdf_xobject *
-pdf_load_xobject(pdf_document *doc, pdf_obj *dict)
+pdf_load_xobject(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
{
pdf_xobject *form;
pdf_obj *obj;
- fz_context *ctx = doc->ctx;
- if ((form = pdf_find_item(ctx, pdf_free_xobject_imp, dict)) != NULL)
+ if ((form = pdf_find_item(ctx, pdf_drop_xobject_imp, dict)) != NULL)
{
return form;
}
form = fz_malloc_struct(ctx, pdf_xobject);
- FZ_INIT_STORABLE(form, 1, pdf_free_xobject_imp);
+ FZ_INIT_STORABLE(form, 1, pdf_drop_xobject_imp);
form->resources = NULL;
form->contents = NULL;
form->colorspace = NULL;
@@ -58,10 +57,10 @@ pdf_load_xobject(pdf_document *doc, pdf_obj *dict)
fz_try(ctx)
{
- obj = pdf_dict_gets(dict, "BBox");
+ obj = pdf_dict_gets(ctx, dict, "BBox");
pdf_to_rect(ctx, obj, &form->bbox);
- obj = pdf_dict_gets(dict, "Matrix");
+ obj = pdf_dict_gets(ctx, dict, "Matrix");
if (obj)
pdf_to_matrix(ctx, obj, &form->matrix);
else
@@ -71,24 +70,24 @@ pdf_load_xobject(pdf_document *doc, pdf_obj *dict)
form->knockout = 0;
form->transparency = 0;
- obj = pdf_dict_gets(dict, "Group");
+ obj = pdf_dict_gets(ctx, dict, "Group");
if (obj)
{
pdf_obj *attrs = obj;
- form->isolated = pdf_to_bool(pdf_dict_gets(attrs, "I"));
- form->knockout = pdf_to_bool(pdf_dict_gets(attrs, "K"));
+ form->isolated = pdf_to_bool(ctx, pdf_dict_gets(ctx, attrs, "I"));
+ form->knockout = pdf_to_bool(ctx, pdf_dict_gets(ctx, attrs, "K"));
- obj = pdf_dict_gets(attrs, "S");
- if (pdf_is_name(obj) && !strcmp(pdf_to_name(obj), "Transparency"))
+ obj = pdf_dict_gets(ctx, attrs, "S");
+ if (pdf_is_name(ctx, obj) && !strcmp(pdf_to_name(ctx, obj), "Transparency"))
form->transparency = 1;
- obj = pdf_dict_gets(attrs, "CS");
+ obj = pdf_dict_gets(ctx, attrs, "CS");
if (obj)
{
fz_try(ctx)
{
- form->colorspace = pdf_load_colorspace(doc, obj);
+ form->colorspace = pdf_load_colorspace(ctx, doc, obj);
}
fz_catch(ctx)
{
@@ -97,25 +96,25 @@ pdf_load_xobject(pdf_document *doc, pdf_obj *dict)
}
}
- form->resources = pdf_dict_gets(dict, "Resources");
+ form->resources = pdf_dict_gets(ctx, dict, "Resources");
if (form->resources)
- pdf_keep_obj(form->resources);
+ pdf_keep_obj(ctx, form->resources);
- form->contents = pdf_keep_obj(dict);
+ form->contents = pdf_keep_obj(ctx, dict);
}
fz_catch(ctx)
{
- pdf_remove_item(ctx, pdf_free_xobject_imp, dict);
+ pdf_remove_item(ctx, pdf_drop_xobject_imp, dict);
pdf_drop_xobject(ctx, form);
- fz_rethrow_message(ctx, "cannot load xobject content stream (%d %d R)", pdf_to_num(dict), pdf_to_gen(dict));
+ fz_rethrow_message(ctx, "cannot load xobject content stream (%d %d R)", pdf_to_num(ctx, dict), pdf_to_gen(ctx, dict));
}
- form->me = pdf_keep_obj(dict);
+ form->me = pdf_keep_obj(ctx, dict);
return form;
}
pdf_obj *
-pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
+pdf_new_xobject(fz_context *ctx, pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
{
int idict_num;
pdf_obj *idict = NULL;
@@ -124,7 +123,6 @@ pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
pdf_obj *obj = NULL;
pdf_obj *res = NULL;
pdf_obj *procset = NULL;
- fz_context *ctx = doc->ctx;
fz_var(idict);
fz_var(dict);
@@ -134,55 +132,55 @@ pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
fz_var(procset);
fz_try(ctx)
{
- dict = pdf_new_dict(doc, 0);
+ dict = pdf_new_dict(ctx, doc, 0);
- obj = pdf_new_rect(doc, bbox);
- pdf_dict_puts(dict, "BBox", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_rect(ctx, doc, bbox);
+ pdf_dict_puts(ctx, dict, "BBox", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- obj = pdf_new_int(doc, 1);
- pdf_dict_puts(dict, "FormType", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_int(ctx, doc, 1);
+ pdf_dict_puts(ctx, dict, "FormType", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- obj = pdf_new_int(doc, 0);
- pdf_dict_puts(dict, "Length", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_int(ctx, doc, 0);
+ pdf_dict_puts(ctx, dict, "Length", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- obj = pdf_new_matrix(doc, mat);
- pdf_dict_puts(dict, "Matrix", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_matrix(ctx, doc, mat);
+ pdf_dict_puts(ctx, dict, "Matrix", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- res = pdf_new_dict(doc, 0);
- procset = pdf_new_array(doc, 2);
- obj = pdf_new_name(doc, "PDF");
- pdf_array_push(procset, obj);
- pdf_drop_obj(obj);
+ res = pdf_new_dict(ctx, doc, 0);
+ procset = pdf_new_array(ctx, doc, 2);
+ obj = pdf_new_name(ctx, doc, "PDF");
+ pdf_array_push(ctx, procset, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- obj = pdf_new_name(doc, "Text");
- pdf_array_push(procset, obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_name(ctx, doc, "Text");
+ pdf_array_push(ctx, procset, obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- pdf_dict_puts(res, "ProcSet", procset);
- pdf_drop_obj(procset);
+ pdf_dict_puts(ctx, res, "ProcSet", procset);
+ pdf_drop_obj(ctx, procset);
procset = NULL;
- pdf_dict_puts(dict, "Resources", res);
+ pdf_dict_puts(ctx, dict, "Resources", res);
- obj = pdf_new_name(doc, "Form");
- pdf_dict_puts(dict, "Subtype", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_name(ctx, doc, "Form");
+ pdf_dict_puts(ctx, dict, "Subtype", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
- obj = pdf_new_name(doc, "XObject");
- pdf_dict_puts(dict, "Type", obj);
- pdf_drop_obj(obj);
+ obj = pdf_new_name(ctx, doc, "XObject");
+ pdf_dict_puts(ctx, dict, "Type", obj);
+ pdf_drop_obj(ctx, obj);
obj = NULL;
form = fz_malloc_struct(ctx, pdf_xobject);
- FZ_INIT_STORABLE(form, 1, pdf_free_xobject_imp);
+ FZ_INIT_STORABLE(form, 1, pdf_drop_xobject_imp);
form->resources = NULL;
form->contents = NULL;
form->colorspace = NULL;
@@ -200,27 +198,27 @@ pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
form->resources = res;
res = NULL;
- idict_num = pdf_create_object(doc);
- pdf_update_object(doc, idict_num, dict);
- idict = pdf_new_indirect(doc, idict_num, 0);
- pdf_drop_obj(dict);
+ idict_num = pdf_create_object(ctx, doc);
+ pdf_update_object(ctx, doc, idict_num, dict);
+ idict = pdf_new_indirect(ctx, doc, idict_num, 0);
+ pdf_drop_obj(ctx, dict);
dict = NULL;
pdf_store_item(ctx, idict, form, pdf_xobject_size(form));
- form->contents = pdf_keep_obj(idict);
- form->me = pdf_keep_obj(idict);
+ form->contents = pdf_keep_obj(ctx, idict);
+ form->me = pdf_keep_obj(ctx, idict);
pdf_drop_xobject(ctx, form);
form = NULL;
}
fz_catch(ctx)
{
- pdf_drop_obj(procset);
- pdf_drop_obj(res);
- pdf_drop_obj(obj);
- pdf_drop_obj(dict);
- pdf_drop_obj(idict);
+ pdf_drop_obj(ctx, procset);
+ pdf_drop_obj(ctx, res);
+ pdf_drop_obj(ctx, obj);
+ pdf_drop_obj(ctx, dict);
+ pdf_drop_obj(ctx, idict);
pdf_drop_xobject(ctx, form);
fz_rethrow_message(ctx, "failed to create xobject)");
}
@@ -228,10 +226,10 @@ pdf_new_xobject(pdf_document *doc, const fz_rect *bbox, const fz_matrix *mat)
return idict;
}
-void pdf_update_xobject_contents(pdf_document *doc, pdf_xobject *form, fz_buffer *buffer)
+void pdf_update_xobject_contents(fz_context *ctx, pdf_document *doc, pdf_xobject *form, fz_buffer *buffer)
{
- pdf_dict_dels(form->contents, "Filter");
- pdf_dict_puts_drop(form->contents, "Length", pdf_new_int(doc, buffer->len));
- pdf_update_stream(doc, pdf_to_num(form->contents), buffer);
+ pdf_dict_dels(ctx, form->contents, "Filter");
+ pdf_dict_puts_drop(ctx, form->contents, "Length", pdf_new_int(ctx, doc, buffer->len));
+ pdf_update_stream(ctx, doc, pdf_to_num(ctx, form->contents), buffer);
form->iteration ++;
}
diff --git a/source/pdf/pdf-xref-aux.c b/source/pdf/pdf-xref-aux.c
index aac323de..d257fa60 100644
--- a/source/pdf/pdf-xref-aux.c
+++ b/source/pdf/pdf-xref-aux.c
@@ -12,8 +12,7 @@ pdf_document *
pdf_open_document_with_stream(fz_context *ctx, fz_stream *file)
{
pdf_document *doc = pdf_open_document_no_run_with_stream(ctx, file);
- doc->super.run_page_contents = (fz_document_run_page_contents_fn *)pdf_run_page_contents;
- doc->super.run_annot = (fz_document_run_annot_fn *)pdf_run_annot;
+ doc->super.load_page = (fz_document_load_page_fn*)pdf_load_page;
doc->update_appearance = pdf_update_appearance;
return doc;
}
@@ -22,8 +21,7 @@ pdf_document *
pdf_open_document(fz_context *ctx, const char *filename)
{
pdf_document *doc = pdf_open_document_no_run(ctx, filename);
- doc->super.run_page_contents = (fz_document_run_page_contents_fn *)pdf_run_page_contents;
- doc->super.run_annot = (fz_document_run_annot_fn *)pdf_run_annot;
+ doc->super.load_page = (fz_document_load_page_fn*)pdf_load_page;
doc->update_appearance = pdf_update_appearance;
return doc;
}
diff --git a/source/pdf/pdf-xref.c b/source/pdf/pdf-xref.c
index 5308a272..586aab2d 100644
--- a/source/pdf/pdf-xref.c
+++ b/source/pdf/pdf-xref.c
@@ -20,9 +20,8 @@ static inline int iswhite(int ch)
* xref tables
*/
-static void pdf_free_xref_sections(pdf_document *doc)
+static void pdf_drop_xref_sections(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
int x, e;
for (x = 0; x < doc->num_xref_sections; x++)
@@ -39,7 +38,7 @@ static void pdf_free_xref_sections(pdf_document *doc)
if (entry->obj)
{
- pdf_drop_obj(entry->obj);
+ pdf_drop_obj(ctx, entry->obj);
fz_drop_buffer(ctx, entry->stm_buf);
}
}
@@ -48,8 +47,8 @@ static void pdf_free_xref_sections(pdf_document *doc)
sub = next_sub;
}
- pdf_drop_obj(xref->pre_repair_trailer);
- pdf_drop_obj(xref->trailer);
+ pdf_drop_obj(ctx, xref->pre_repair_trailer);
+ pdf_drop_obj(ctx, xref->trailer);
}
fz_free(ctx, doc->xref_sections);
@@ -57,6 +56,19 @@ static void pdf_free_xref_sections(pdf_document *doc)
doc->num_xref_sections = 0;
}
+static void
+extend_xref_index(fz_context *ctx, pdf_document *doc, int newlen)
+{
+ int i;
+
+ doc->xref_index = fz_resize_array(ctx, doc->xref_index, newlen, sizeof(int));
+ for (i = doc->max_xref_len; i < newlen; i++)
+ {
+ doc->xref_index[i] = 0;
+ }
+ doc->max_xref_len = newlen;
+}
+
/* This is only ever called when we already have an incremental
* xref. This means there will only be 1 subsec, and it will be
* a complete subsec. */
@@ -84,13 +96,13 @@ static void pdf_resize_xref(fz_context *ctx, pdf_document *doc, int newlen)
xref->num_objects = newlen;
sub->len = newlen;
if (doc->max_xref_len < newlen)
- doc->max_xref_len = newlen;
+ extend_xref_index(ctx, doc, newlen);
}
-static void pdf_populate_next_xref_level(pdf_document *doc)
+static void pdf_populate_next_xref_level(fz_context *ctx, pdf_document *doc)
{
pdf_xref *xref;
- doc->xref_sections = fz_resize_array(doc->ctx, doc->xref_sections, doc->num_xref_sections + 1, sizeof(pdf_xref));
+ doc->xref_sections = fz_resize_array(ctx, doc->xref_sections, doc->num_xref_sections + 1, sizeof(pdf_xref));
doc->num_xref_sections++;
xref = &doc->xref_sections[doc->num_xref_sections - 1];
@@ -100,7 +112,7 @@ static void pdf_populate_next_xref_level(pdf_document *doc)
xref->pre_repair_trailer = NULL;
}
-pdf_obj *pdf_trailer(pdf_document *doc)
+pdf_obj *pdf_trailer(fz_context *ctx, pdf_document *doc)
{
/* Return the document's final trailer */
pdf_xref *xref = &doc->xref_sections[0];
@@ -108,19 +120,19 @@ pdf_obj *pdf_trailer(pdf_document *doc)
return xref->trailer;
}
-void pdf_set_populating_xref_trailer(pdf_document *doc, pdf_obj *trailer)
+void pdf_set_populating_xref_trailer(fz_context *ctx, pdf_document *doc, pdf_obj *trailer)
{
/* Update the trailer of the xref section being populated */
pdf_xref *xref = &doc->xref_sections[doc->num_xref_sections - 1];
if (xref->trailer)
{
- pdf_drop_obj(xref->pre_repair_trailer);
+ pdf_drop_obj(ctx, xref->pre_repair_trailer);
xref->pre_repair_trailer = xref->trailer;
}
- xref->trailer = pdf_keep_obj(trailer);
+ xref->trailer = pdf_keep_obj(ctx, trailer);
}
-int pdf_xref_len(pdf_document *doc)
+int pdf_xref_len(fz_context *ctx, pdf_document *doc)
{
return doc->max_xref_len;
}
@@ -128,9 +140,8 @@ int pdf_xref_len(pdf_document *doc)
/* Ensure that the given xref has a single subsection
* that covers the entire range. */
static void
-ensure_solid_xref(pdf_document *doc, int num, int which)
+ensure_solid_xref(fz_context *ctx, pdf_document *doc, int num, int which)
{
- fz_context *ctx = doc->ctx;
pdf_xref *xref = &doc->xref_sections[which];
pdf_xref_subsec *sub = xref->subsec;
pdf_xref_subsec *new_sub;
@@ -174,11 +185,11 @@ ensure_solid_xref(pdf_document *doc, int num, int which)
xref->num_objects = num;
xref->subsec = new_sub;
if (doc->max_xref_len < num)
- doc->max_xref_len = num;
+ extend_xref_index(ctx, doc, num);
}
/* Used while reading the individual xref sections from a file */
-pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int num)
+pdf_xref_entry *pdf_get_populating_xref_entry(fz_context *ctx, pdf_document *doc, int num)
{
/* Return an entry within the xref currently being populated */
pdf_xref *xref;
@@ -186,13 +197,13 @@ pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int num)
if (doc->num_xref_sections == 0)
{
- doc->xref_sections = fz_calloc(doc->ctx, 1, sizeof(pdf_xref));
+ doc->xref_sections = fz_calloc(ctx, 1, sizeof(pdf_xref));
doc->num_xref_sections = 1;
}
/* Prevent accidental heap underflow */
if (num < 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "object number must not be negative (%d)", num);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object number must not be negative (%d)", num);
/* Return the pointer to the entry in the last section. */
xref = &doc->xref_sections[doc->num_xref_sections-1];
@@ -204,7 +215,7 @@ pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int num)
}
/* We've been asked for an object that's not in a subsec. */
- ensure_solid_xref(doc, num+1, doc->num_xref_sections-1);
+ ensure_solid_xref(ctx, doc, num+1, doc->num_xref_sections-1);
xref = &doc->xref_sections[doc->num_xref_sections-1];
sub = xref->subsec;
@@ -215,9 +226,8 @@ pdf_xref_entry *pdf_get_populating_xref_entry(pdf_document *doc, int num)
/* This will never throw anything, or return NULL if it is
* only asked to return objects in range within a 'solid'
* xref. */
-pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i)
+pdf_xref_entry *pdf_get_xref_entry(fz_context *ctx, pdf_document *doc, int i)
{
- fz_context *ctx = doc->ctx;
pdf_xref *xref;
pdf_xref_subsec *sub;
int j;
@@ -225,12 +235,17 @@ pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i)
if (i < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "Negative object number requested");
+ if (i <= doc->max_xref_len)
+ j = doc->xref_index[i];
+ else
+ j = 0;
+
/* Find the first xref section where the entry is defined. */
- for (j = 0; j < doc->num_xref_sections; j++)
+ for (; j < doc->num_xref_sections; j++)
{
xref = &doc->xref_sections[j];
- if (i >= 0 && i < xref->num_objects)
+ if (i < xref->num_objects)
{
for (sub = xref->subsec; sub != NULL; sub = sub->next)
{
@@ -241,13 +256,17 @@ pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i)
entry = &sub->table[i - sub->start];
if (entry->type)
+ {
+ doc->xref_index[i] = j;
return entry;
+ }
}
}
}
/* Didn't find the entry in any section. Return the entry from
* the final section. */
+ doc->xref_index[i] = 0;
if (i < xref->num_objects)
{
xref = &doc->xref_sections[0];
@@ -262,7 +281,7 @@ pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i)
* can return a pointer. This is the only case where this function
* might throw an exception, and it will never happen when we are
* working within a 'solid' xref. */
- ensure_solid_xref(doc, i+1, 0);
+ ensure_solid_xref(ctx, doc, i+1, 0);
xref = &doc->xref_sections[0];
sub = xref->subsec;
return &sub->table[i - sub->start];
@@ -273,9 +292,8 @@ pdf_xref_entry *pdf_get_xref_entry(pdf_document *doc, int i)
updated versions of indirect objects. This is a new xref section
consisting of a single xref subsection.
*/
-static void ensure_incremental_xref(pdf_document *doc)
+static void ensure_incremental_xref(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
if (!doc->xref_altered)
{
@@ -284,12 +302,13 @@ static void ensure_incremental_xref(pdf_document *doc)
pdf_xref_entry *new_table = fz_calloc(ctx, xref->num_objects, sizeof(pdf_xref_entry));
pdf_xref_subsec *sub;
pdf_obj *trailer = NULL;
+ int i;
fz_var(trailer);
fz_try(ctx)
{
sub = fz_malloc_struct(ctx, pdf_xref_subsec);
- trailer = pdf_copy_dict(xref->trailer);
+ trailer = pdf_copy_dict(ctx, xref->trailer);
doc->xref_sections = fz_resize_array(ctx, doc->xref_sections, doc->num_xref_sections + 1, sizeof(pdf_xref));
xref = &doc->xref_sections[0];
pxref = &doc->xref_sections[1];
@@ -308,21 +327,26 @@ static void ensure_incremental_xref(pdf_document *doc)
fz_catch(ctx)
{
fz_free(ctx, new_table);
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
fz_rethrow(ctx);
}
+
+ /* Update the xref_index */
+ for (i = 0; i < doc->max_xref_len; i++)
+ {
+ doc->xref_index[i]++;
+ }
}
}
/* Used when altering a document */
-static pdf_xref_entry *pdf_get_incremental_xref_entry(pdf_document *doc, int i)
+static pdf_xref_entry *pdf_get_incremental_xref_entry(fz_context *ctx, pdf_document *doc, int i)
{
- fz_context *ctx = doc->ctx;
pdf_xref *xref;
pdf_xref_subsec *sub;
/* Make a new final xref section if we haven't already */
- ensure_incremental_xref(doc);
+ ensure_incremental_xref(ctx, doc);
xref = &doc->xref_sections[0];
if (i >= xref->num_objects)
@@ -331,10 +355,11 @@ static pdf_xref_entry *pdf_get_incremental_xref_entry(pdf_document *doc, int i)
sub = xref->subsec;
assert(sub != NULL && sub->next == NULL);
assert(i >= sub->start && i < sub->start + sub->len);
+ doc->xref_index[i] = 0;
return &sub->table[i - sub->start];
}
-int pdf_xref_is_incremental(pdf_document *doc, int num)
+int pdf_xref_is_incremental(fz_context *ctx, pdf_document *doc, int num)
{
pdf_xref *xref = &doc->xref_sections[0];
pdf_xref_subsec *sub = xref->subsec;
@@ -346,26 +371,26 @@ int pdf_xref_is_incremental(pdf_document *doc, int num)
/* Ensure that the current populating xref has a single subsection
* that covers the entire range. */
-void pdf_ensure_solid_xref(pdf_document *doc, int num)
+void pdf_ensure_solid_xref(fz_context *ctx, pdf_document *doc, int num)
{
if (doc->num_xref_sections == 0)
- pdf_populate_next_xref_level(doc);
+ pdf_populate_next_xref_level(ctx, doc);
- ensure_solid_xref(doc, num, doc->num_xref_sections-1);
+ ensure_solid_xref(ctx, doc, num, doc->num_xref_sections-1);
}
/* Ensure that an object has been cloned into the incremental xref section */
-void pdf_xref_ensure_incremental_object(pdf_document *doc, int num)
+void pdf_xref_ensure_incremental_object(fz_context *ctx, pdf_document *doc, int num)
{
pdf_xref_entry *new_entry, *old_entry;
pdf_xref_subsec *sub = NULL;
int i;
/* Make sure we have created an xref section for incremental updates */
- ensure_incremental_xref(doc);
+ ensure_incremental_xref(ctx, doc);
/* Search for the section that contains this object */
- for (i = 0; i < doc->num_xref_sections; i++)
+ for (i = doc->xref_index[num]; i < doc->num_xref_sections; i++)
{
pdf_xref *xref = &doc->xref_sections[i];
@@ -386,28 +411,29 @@ void pdf_xref_ensure_incremental_object(pdf_document *doc, int num)
return;
/* Move the object to the incremental section */
+ doc->xref_index[num] = 0;
old_entry = &sub->table[num - sub->start];
- new_entry = pdf_get_incremental_xref_entry(doc, num);
+ new_entry = pdf_get_incremental_xref_entry(ctx, doc, num);
*new_entry = *old_entry;
old_entry->obj = NULL;
old_entry->stm_buf = NULL;
}
-void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n)
+void pdf_replace_xref(fz_context *ctx, pdf_document *doc, pdf_xref_entry *entries, int n)
{
- fz_context *ctx = doc->ctx;
- pdf_xref *xref;
+ pdf_xref *xref = NULL;
pdf_xref_subsec *sub;
- pdf_obj *trailer = pdf_keep_obj(pdf_trailer(doc));
+ pdf_obj *trailer = pdf_keep_obj(ctx, pdf_trailer(ctx, doc));
fz_var(xref);
fz_try(ctx)
{
+ doc->xref_index = fz_calloc(ctx, n, sizeof(int));
xref = fz_malloc_struct(ctx, pdf_xref);
sub = fz_malloc_struct(ctx, pdf_xref_subsec);
/* The new table completely replaces the previous separate sections */
- pdf_free_xref_sections(doc);
+ pdf_drop_xref_sections(ctx, doc);
sub->table = entries;
sub->start = 0;
@@ -420,11 +446,13 @@ void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n)
doc->xref_sections = xref;
doc->num_xref_sections = 1;
doc->max_xref_len = n;
+
+ memset(doc->xref_index, 0, sizeof(int)*doc->max_xref_len);
}
fz_catch(ctx)
{
fz_free(ctx, xref);
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
fz_rethrow(ctx);
}
}
@@ -434,33 +462,33 @@ void pdf_replace_xref(pdf_document *doc, pdf_xref_entry *entries, int n)
*/
static void
-pdf_load_version(pdf_document *doc)
+pdf_load_version(fz_context *ctx, pdf_document *doc)
{
char buf[20];
- fz_seek(doc->file, 0, SEEK_SET);
- fz_read_line(doc->file, buf, sizeof buf);
+ fz_seek(ctx, doc->file, 0, SEEK_SET);
+ fz_read_line(ctx, doc->file, buf, sizeof buf);
if (memcmp(buf, "%PDF-", 5) != 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot recognize version marker");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot recognize version marker");
doc->version = 10 * (fz_atof(buf+5) + 0.05);
}
static void
-pdf_read_start_xref(pdf_document *doc)
+pdf_read_start_xref(fz_context *ctx, pdf_document *doc)
{
unsigned char buf[1024];
int t, n;
int i;
- fz_seek(doc->file, 0, SEEK_END);
+ fz_seek(ctx, doc->file, 0, SEEK_END);
- doc->file_size = fz_tell(doc->file);
+ doc->file_size = fz_tell(ctx, doc->file);
t = fz_maxi(0, doc->file_size - (int)sizeof buf);
- fz_seek(doc->file, t, SEEK_SET);
+ fz_seek(ctx, doc->file, t, SEEK_SET);
- n = fz_read(doc->file, buf, sizeof buf);
+ n = fz_read(ctx, doc->file, buf, sizeof buf);
for (i = n - 9; i >= 0; i--)
{
@@ -478,7 +506,7 @@ pdf_read_start_xref(pdf_document *doc)
}
}
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find startxref");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find startxref");
}
/*
@@ -486,7 +514,7 @@ pdf_read_start_xref(pdf_document *doc)
*/
static int
-pdf_xref_size_from_old_trailer(pdf_document *doc, pdf_lexbuf *buf)
+pdf_xref_size_from_old_trailer(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
{
int len;
char *s;
@@ -500,82 +528,81 @@ pdf_xref_size_from_old_trailer(pdf_document *doc, pdf_lexbuf *buf)
fz_var(trailer);
/* Record the current file read offset so that we can reinstate it */
- ofs = fz_tell(doc->file);
+ ofs = fz_tell(ctx, doc->file);
- fz_read_line(doc->file, buf->scratch, buf->size);
+ fz_read_line(ctx, doc->file, buf->scratch, buf->size);
if (strncmp(buf->scratch, "xref", 4) != 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find xref marker");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find xref marker");
while (1)
{
- c = fz_peek_byte(doc->file);
+ c = fz_peek_byte(ctx, doc->file);
if (!(c >= '0' && c <= '9'))
break;
- fz_read_line(doc->file, buf->scratch, buf->size);
+ fz_read_line(ctx, doc->file, buf->scratch, buf->size);
s = buf->scratch;
fz_strsep(&s, " "); /* ignore ofs */
if (!s)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "invalid range marker in xref");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "invalid range marker in xref");
len = fz_atoi(fz_strsep(&s, " "));
if (len < 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "xref range marker must be positive");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "xref range marker must be positive");
/* broken pdfs where the section is not on a separate line */
if (s && *s != '\0')
- fz_seek(doc->file, -(2 + (int)strlen(s)), SEEK_CUR);
+ fz_seek(ctx, doc->file, -(2 + (int)strlen(s)), SEEK_CUR);
- t = fz_tell(doc->file);
+ t = fz_tell(ctx, doc->file);
if (t < 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot tell in file");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot tell in file");
if (len > (INT_MAX - t) / 20)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "xref has too many entries");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "xref has too many entries");
- fz_seek(doc->file, t + 20 * len, SEEK_SET);
+ fz_seek(ctx, doc->file, t + 20 * len, SEEK_SET);
}
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, doc->file, buf);
if (tok != PDF_TOK_TRAILER)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected trailer marker");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "expected trailer marker");
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, doc->file, buf);
if (tok != PDF_TOK_OPEN_DICT)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected trailer dictionary");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "expected trailer dictionary");
- trailer = pdf_parse_dict(doc, doc->file, buf);
+ trailer = pdf_parse_dict(ctx, doc, doc->file, buf);
- size = pdf_to_int(pdf_dict_gets(trailer, "Size"));
+ size = pdf_to_int(ctx, pdf_dict_gets(ctx, trailer, "Size"));
if (!size)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "trailer missing Size entry");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "trailer missing Size entry");
}
- fz_always(doc->ctx)
+ fz_always(ctx)
{
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_message(doc->ctx, "cannot parse trailer");
+ fz_rethrow_message(ctx, "cannot parse trailer");
}
- fz_seek(doc->file, ofs, SEEK_SET);
+ fz_seek(ctx, doc->file, ofs, SEEK_SET);
return size;
}
pdf_obj *
-pdf_new_ref(pdf_document *doc, pdf_obj *obj)
+pdf_new_ref(fz_context *ctx, pdf_document *doc, pdf_obj *obj)
{
- int num = pdf_create_object(doc);
- pdf_update_object(doc, num, obj);
- return pdf_new_indirect(doc, num, 0);
+ int num = pdf_create_object(ctx, doc);
+ pdf_update_object(ctx, doc, num, obj);
+ return pdf_new_indirect(ctx, doc, num, 0);
}
static pdf_xref_entry *
-pdf_xref_find_subsection(pdf_document *doc, int ofs, int len)
+pdf_xref_find_subsection(fz_context *ctx, pdf_document *doc, int ofs, int len)
{
- fz_context *ctx = doc->ctx;
pdf_xref *xref = &doc->xref_sections[doc->num_xref_sections-1];
pdf_xref_subsec *sub;
int new_max;
@@ -619,20 +646,23 @@ pdf_xref_find_subsection(pdf_document *doc, int ofs, int len)
}
xref->num_objects = new_max;
if (doc->max_xref_len < new_max)
- doc->max_xref_len = new_max;
+ extend_xref_index(ctx, doc, new_max);
}
else
{
/* Case 3 */
- ensure_solid_xref(doc, new_max, 0);
+ ensure_solid_xref(ctx, doc, new_max, doc->num_xref_sections-1);
+ xref = &doc->xref_sections[doc->num_xref_sections-1];
sub = xref->subsec;
}
return &sub->table[ofs-sub->start];
}
static pdf_obj *
-pdf_read_old_xref(pdf_document *doc, pdf_lexbuf *buf)
+pdf_read_old_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
{
+ fz_stream *file = doc->file;
+
int ofs, len;
char *s;
int n;
@@ -640,20 +670,20 @@ pdf_read_old_xref(pdf_document *doc, pdf_lexbuf *buf)
int i;
int c;
pdf_obj *trailer;
- int xref_len = pdf_xref_size_from_old_trailer(doc, buf);
+ int xref_len = pdf_xref_size_from_old_trailer(ctx, doc, buf);
pdf_xref_entry *table;
- fz_read_line(doc->file, buf->scratch, buf->size);
+ fz_read_line(ctx, file, buf->scratch, buf->size);
if (strncmp(buf->scratch, "xref", 4) != 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find xref marker");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find xref marker");
while (1)
{
- c = fz_peek_byte(doc->file);
+ c = fz_peek_byte(ctx, file);
if (!(c >= '0' && c <= '9'))
break;
- fz_read_line(doc->file, buf->scratch, buf->size);
+ fz_read_line(ctx, file, buf->scratch, buf->size);
s = buf->scratch;
ofs = fz_atoi(fz_strsep(&s, " "));
len = fz_atoi(fz_strsep(&s, " "));
@@ -661,27 +691,27 @@ pdf_read_old_xref(pdf_document *doc, pdf_lexbuf *buf)
/* broken pdfs where the section is not on a separate line */
if (s && *s != '\0')
{
- fz_warn(doc->ctx, "broken xref section. proceeding anyway.");
- fz_seek(doc->file, -(2 + (int)strlen(s)), SEEK_CUR);
+ fz_warn(ctx, "broken xref section. proceeding anyway.");
+ fz_seek(ctx, file, -(2 + (int)strlen(s)), SEEK_CUR);
}
if (ofs < 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "out of range object num in xref: %d", ofs);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "out of range object num in xref: %d", ofs);
/* broken pdfs where size in trailer undershoots entries in xref sections */
if (ofs + len > xref_len)
{
- fz_warn(doc->ctx, "broken xref section, proceeding anyway.");
+ fz_warn(ctx, "broken xref section, proceeding anyway.");
}
- table = pdf_xref_find_subsection(doc, ofs, len);
+ table = pdf_xref_find_subsection(ctx, doc, ofs, len);
for (i = ofs; i < ofs + len; i++)
{
pdf_xref_entry *entry = &table[i-ofs];
- n = fz_read(doc->file, (unsigned char *) buf->scratch, 20);
+ n = fz_read(ctx, file, (unsigned char *) buf->scratch, 20);
if (n != 20)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "unexpected EOF in xref table");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unexpected EOF in xref table");
if (!entry->type)
{
s = buf->scratch;
@@ -694,42 +724,42 @@ pdf_read_old_xref(pdf_document *doc, pdf_lexbuf *buf)
entry->gen = atoi(s + 11);
entry->type = s[17];
if (s[17] != 'f' && s[17] != 'n' && s[17] != 'o')
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "unexpected xref type: %#x (%d %d R)", s[17], i, entry->gen);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "unexpected xref type: %#x (%d %d R)", s[17], i, entry->gen);
}
}
}
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_TRAILER)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected trailer marker");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "expected trailer marker");
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, file, buf);
if (tok != PDF_TOK_OPEN_DICT)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected trailer dictionary");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "expected trailer dictionary");
- trailer = pdf_parse_dict(doc, doc->file, buf);
+ trailer = pdf_parse_dict(ctx, doc, file, buf);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_message(doc->ctx, "cannot parse trailer");
+ fz_rethrow_message(ctx, "cannot parse trailer");
}
return trailer;
}
static void
-pdf_read_new_xref_section(pdf_document *doc, fz_stream *stm, int i0, int i1, int w0, int w1, int w2)
+pdf_read_new_xref_section(fz_context *ctx, pdf_document *doc, fz_stream *stm, int i0, int i1, int w0, int w1, int w2)
{
- int i, n;
pdf_xref_entry *table;
+ int i, n;
if (i0 < 0 || i1 < 0)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "negative xref stream entry index");
- //if (i0 + i1 > pdf_xref_len(doc))
- // fz_throw(doc->ctx, FZ_ERROR_GENERIC, "xref stream has too many entries");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "negative xref stream entry index");
+ //if (i0 + i1 > pdf_xref_len(ctx, doc))
+ // fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream has too many entries");
- table = pdf_xref_find_subsection(doc, i0, i1);
+ table = pdf_xref_find_subsection(ctx, doc, i0, i1);
for (i = i0; i < i0 + i1; i++)
{
pdf_xref_entry *entry = &table[i-i0];
@@ -737,15 +767,15 @@ pdf_read_new_xref_section(pdf_document *doc, fz_stream *stm, int i0, int i1, int
int b = 0;
int c = 0;
- if (fz_is_eof(stm))
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "truncated xref stream");
+ if (fz_is_eof(ctx, stm))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "truncated xref stream");
for (n = 0; n < w0; n++)
- a = (a << 8) + fz_read_byte(stm);
+ a = (a << 8) + fz_read_byte(ctx, stm);
for (n = 0; n < w1; n++)
- b = (b << 8) + fz_read_byte(stm);
+ b = (b << 8) + fz_read_byte(ctx, stm);
for (n = 0; n < w2; n++)
- c = (c << 8) + fz_read_byte(stm);
+ c = (c << 8) + fz_read_byte(ctx, stm);
if (!entry->type)
{
@@ -761,7 +791,7 @@ pdf_read_new_xref_section(pdf_document *doc, fz_stream *stm, int i0, int i1, int
/* Entered with file locked, remains locked throughout. */
static pdf_obj *
-pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf)
+pdf_read_new_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
{
fz_stream *stm = NULL;
pdf_obj *trailer = NULL;
@@ -770,19 +800,18 @@ pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf)
int num, gen, ofs, stm_ofs;
int size, w0, w1, w2;
int t;
- fz_context *ctx = doc->ctx;
fz_var(trailer);
fz_var(stm);
fz_try(ctx)
{
- ofs = fz_tell(doc->file);
- trailer = pdf_parse_ind_obj(doc, doc->file, buf, &num, &gen, &stm_ofs, NULL);
+ ofs = fz_tell(ctx, doc->file);
+ trailer = pdf_parse_ind_obj(ctx, doc, doc->file, buf, &num, &gen, &stm_ofs, NULL);
}
fz_catch(ctx)
{
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
fz_rethrow_message(ctx, "cannot parse compressed xref stream object");
}
@@ -790,18 +819,18 @@ pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf)
{
pdf_xref_entry *entry;
- obj = pdf_dict_gets(trailer, "Size");
+ obj = pdf_dict_gets(ctx, trailer, "Size");
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream missing Size entry (%d %d R)", num, gen);
- size = pdf_to_int(obj);
+ size = pdf_to_int(ctx, obj);
- obj = pdf_dict_gets(trailer, "W");
+ obj = pdf_dict_gets(ctx, trailer, "W");
if (!obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "xref stream missing W entry (%d %d R)", num, gen);
- w0 = pdf_to_int(pdf_array_get(obj, 0));
- w1 = pdf_to_int(pdf_array_get(obj, 1));
- w2 = pdf_to_int(pdf_array_get(obj, 2));
+ w0 = pdf_to_int(ctx, pdf_array_get(ctx, obj, 0));
+ w1 = pdf_to_int(ctx, pdf_array_get(ctx, obj, 1));
+ w2 = pdf_to_int(ctx, pdf_array_get(ctx, obj, 2));
if (w0 < 0)
fz_warn(ctx, "xref stream objects have corrupt type");
@@ -814,39 +843,39 @@ pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf)
w1 = w1 < 0 ? 0 : w1;
w2 = w2 < 0 ? 0 : w2;
- index = pdf_dict_gets(trailer, "Index");
+ index = pdf_dict_gets(ctx, trailer, "Index");
- stm = pdf_open_stream_with_offset(doc, num, gen, trailer, stm_ofs);
+ stm = pdf_open_stream_with_offset(ctx, doc, num, gen, trailer, stm_ofs);
if (!index)
{
- pdf_read_new_xref_section(doc, stm, 0, size, w0, w1, w2);
+ pdf_read_new_xref_section(ctx, doc, stm, 0, size, w0, w1, w2);
}
else
{
- int n = pdf_array_len(index);
+ int n = pdf_array_len(ctx, index);
for (t = 0; t < n; t += 2)
{
- int i0 = pdf_to_int(pdf_array_get(index, t + 0));
- int i1 = pdf_to_int(pdf_array_get(index, t + 1));
- pdf_read_new_xref_section(doc, stm, i0, i1, w0, w1, w2);
+ int i0 = pdf_to_int(ctx, pdf_array_get(ctx, index, t + 0));
+ int i1 = pdf_to_int(ctx, pdf_array_get(ctx, index, t + 1));
+ pdf_read_new_xref_section(ctx, doc, stm, i0, i1, w0, w1, w2);
}
}
- entry = pdf_get_populating_xref_entry(doc, num);
+ entry = pdf_get_populating_xref_entry(ctx, doc, num);
entry->ofs = ofs;
entry->gen = gen;
entry->stm_ofs = stm_ofs;
- pdf_drop_obj(entry->obj);
- entry->obj = pdf_keep_obj(trailer);
+ pdf_drop_obj(ctx, entry->obj);
+ entry->obj = pdf_keep_obj(ctx, trailer);
entry->type = 'n';
}
fz_always(ctx)
{
- fz_close(stm);
+ fz_drop_stream(ctx, stm);
}
fz_catch(ctx)
{
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
fz_rethrow(ctx);
}
@@ -854,24 +883,23 @@ pdf_read_new_xref(pdf_document *doc, pdf_lexbuf *buf)
}
static pdf_obj *
-pdf_read_xref(pdf_document *doc, int ofs, pdf_lexbuf *buf)
+pdf_read_xref(fz_context *ctx, pdf_document *doc, int ofs, pdf_lexbuf *buf)
{
- int c;
- fz_context *ctx = doc->ctx;
pdf_obj *trailer;
+ int c;
- fz_seek(doc->file, ofs, SEEK_SET);
+ fz_seek(ctx, doc->file, ofs, SEEK_SET);
- while (iswhite(fz_peek_byte(doc->file)))
- fz_read_byte(doc->file);
+ while (iswhite(fz_peek_byte(ctx, doc->file)))
+ fz_read_byte(ctx, doc->file);
fz_try(ctx)
{
- c = fz_peek_byte(doc->file);
+ c = fz_peek_byte(ctx, doc->file);
if (c == 'x')
- trailer = pdf_read_old_xref(doc, buf);
+ trailer = pdf_read_old_xref(ctx, doc, buf);
else if (c >= '0' && c <= '9')
- trailer = pdf_read_new_xref(doc, buf);
+ trailer = pdf_read_new_xref(ctx, doc, buf);
else
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot recognize xref format");
}
@@ -892,10 +920,9 @@ struct ofs_list_s
};
static int
-read_xref_section(pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets)
+read_xref_section(fz_context *ctx, pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets)
{
pdf_obj *trailer = NULL;
- fz_context *ctx = doc->ctx;
int xrefstmofs = 0;
int prevofs = 0;
@@ -922,13 +949,13 @@ read_xref_section(pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets
}
offsets->list[offsets->len++] = ofs;
- trailer = pdf_read_xref(doc, ofs, buf);
+ trailer = pdf_read_xref(ctx, doc, ofs, buf);
- pdf_set_populating_xref_trailer(doc, trailer);
+ pdf_set_populating_xref_trailer(ctx, doc, trailer);
/* FIXME: do we overwrite free entries properly? */
/* FIXME: Does this work properly with progression? */
- xrefstmofs = pdf_to_int(pdf_dict_gets(trailer, "XRefStm"));
+ xrefstmofs = pdf_to_int(ctx, pdf_dict_gets(ctx, trailer, "XRefStm"));
if (xrefstmofs)
{
if (xrefstmofs < 0)
@@ -939,16 +966,16 @@ read_xref_section(pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets
follow any Prev tag therein, as specified on Page 108 of the PDF reference
1.7
*/
- pdf_drop_obj(pdf_read_xref(doc, xrefstmofs, buf));
+ pdf_drop_obj(ctx, pdf_read_xref(ctx, doc, xrefstmofs, buf));
}
- prevofs = pdf_to_int(pdf_dict_gets(trailer, "Prev"));
+ prevofs = pdf_to_int(ctx, pdf_dict_gets(ctx, trailer, "Prev"));
if (prevofs < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "negative xref stream offset for previous xref stream");
}
fz_always(ctx)
{
- pdf_drop_obj(trailer);
+ pdf_drop_obj(ctx, trailer);
}
fz_catch(ctx)
{
@@ -959,9 +986,8 @@ read_xref_section(pdf_document *doc, int ofs, pdf_lexbuf *buf, ofs_list *offsets
}
static void
-pdf_read_xref_sections(pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_previous)
+pdf_read_xref_sections(fz_context *ctx, pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_previous)
{
- fz_context *ctx = doc->ctx;
ofs_list list;
list.len = 0;
@@ -971,8 +997,8 @@ pdf_read_xref_sections(pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_pre
{
while(ofs)
{
- pdf_populate_next_xref_level(doc);
- ofs = read_xref_section(doc, ofs, buf, &list);
+ pdf_populate_next_xref_level(ctx, doc);
+ ofs = read_xref_section(ctx, doc, ofs, buf, &list);
if (!read_previous)
break;
}
@@ -987,6 +1013,32 @@ pdf_read_xref_sections(pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_pre
}
}
+static void
+pdf_prime_xref_index(fz_context *ctx, pdf_document *doc)
+{
+ int i, j;
+ int *idx = doc->xref_index;
+
+ for (i = doc->num_xref_sections-1; i >= 0; i--)
+ {
+ pdf_xref *xref = &doc->xref_sections[i];
+ pdf_xref_subsec *subsec = xref->subsec;
+ while (subsec != NULL)
+ {
+ int start = subsec->start;
+ int end = subsec->start + subsec->len;
+ for (j = start; j < end; j++)
+ {
+ char t = subsec->table[j-start].type;
+ if (t != 0 && t != 'f')
+ idx[j] = i;
+ }
+
+ subsec = subsec->next;
+ }
+ }
+}
+
/*
* load xref tables from pdf
*
@@ -994,21 +1046,22 @@ pdf_read_xref_sections(pdf_document *doc, int ofs, pdf_lexbuf *buf, int read_pre
*/
static void
-pdf_load_xref(pdf_document *doc, pdf_lexbuf *buf)
+pdf_load_xref(fz_context *ctx, pdf_document *doc, pdf_lexbuf *buf)
{
int i;
int xref_len;
pdf_xref_entry *entry;
- fz_context *ctx = doc->ctx;
- pdf_read_start_xref(doc);
+ pdf_read_start_xref(ctx, doc);
- pdf_read_xref_sections(doc, doc->startxref, buf, 1);
+ pdf_read_xref_sections(ctx, doc, doc->startxref, buf, 1);
- if (pdf_xref_len(doc) == 0)
+ if (pdf_xref_len(ctx, doc) == 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "found xref was empty");
- entry = pdf_get_xref_entry(doc, 0);
+ pdf_prime_xref_index(ctx, doc);
+
+ entry = pdf_get_xref_entry(ctx, doc, 0);
/* broken pdfs where first object is missing */
if (!entry->type)
{
@@ -1020,10 +1073,10 @@ pdf_load_xref(pdf_document *doc, pdf_lexbuf *buf)
fz_throw(ctx, FZ_ERROR_GENERIC, "first object in xref is not free");
/* broken pdfs where object offsets are out of range */
- xref_len = pdf_xref_len(doc);
+ xref_len = pdf_xref_len(ctx, doc);
for (i = 0; i < xref_len; i++)
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, i);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, i);
if (entry->type == 'n')
{
/* Special case code: "0000000000 * n" means free,
@@ -1034,19 +1087,18 @@ pdf_load_xref(pdf_document *doc, pdf_lexbuf *buf)
fz_throw(ctx, FZ_ERROR_GENERIC, "object offset out of range: %d (%d 0 R)", entry->ofs, i);
}
if (entry->type == 'o')
- if (entry->ofs <= 0 || entry->ofs >= xref_len || pdf_get_xref_entry(doc, entry->ofs)->type != 'n')
+ if (entry->ofs <= 0 || entry->ofs >= xref_len || pdf_get_xref_entry(ctx, doc, entry->ofs)->type != 'n')
fz_throw(ctx, FZ_ERROR_GENERIC, "invalid reference to an objstm that does not exist: %d (%d 0 R)", entry->ofs, i);
}
}
static void
-pdf_load_linear(pdf_document *doc)
+pdf_load_linear(fz_context *ctx, pdf_document *doc)
{
pdf_obj *dict = NULL;
pdf_obj *hint = NULL;
pdf_obj *o;
int num, gen, stmofs, lin, len;
- fz_context *ctx = doc->ctx;
fz_var(dict);
fz_var(hint);
@@ -1055,39 +1107,39 @@ pdf_load_linear(pdf_document *doc)
{
pdf_xref_entry *entry;
- dict = pdf_parse_ind_obj(doc, doc->file, &doc->lexbuf.base, &num, &gen, &stmofs, NULL);
- if (!pdf_is_dict(dict))
+ dict = pdf_parse_ind_obj(ctx, doc, doc->file, &doc->lexbuf.base, &num, &gen, &stmofs, NULL);
+ if (!pdf_is_dict(ctx, dict))
fz_throw(ctx, FZ_ERROR_GENERIC, "Failed to read linearized dictionary");
- o = pdf_dict_gets(dict, "Linearized");
+ o = pdf_dict_gets(ctx, dict, "Linearized");
if (o == NULL)
fz_throw(ctx, FZ_ERROR_GENERIC, "Failed to read linearized dictionary");
- lin = pdf_to_int(o);
+ lin = pdf_to_int(ctx, o);
if (lin != 1)
fz_throw(ctx, FZ_ERROR_GENERIC, "Unexpected version of Linearized tag (%d)", lin);
- len = pdf_to_int(pdf_dict_gets(dict, "L"));
+ len = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "L"));
if (len != doc->file_length)
fz_throw(ctx, FZ_ERROR_GENERIC, "File has been updated since linearization");
- pdf_read_xref_sections(doc, fz_tell(doc->file), &doc->lexbuf.base, 0);
+ pdf_read_xref_sections(ctx, doc, fz_tell(ctx, doc->file), &doc->lexbuf.base, 0);
- doc->page_count = pdf_to_int(pdf_dict_gets(dict, "N"));
+ doc->page_count = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "N"));
doc->linear_page_refs = fz_resize_array(ctx, doc->linear_page_refs, doc->page_count, sizeof(pdf_obj *));
memset(doc->linear_page_refs, 0, doc->page_count * sizeof(pdf_obj*));
doc->linear_obj = dict;
- doc->linear_pos = fz_tell(doc->file);
- doc->linear_page1_obj_num = pdf_to_int(pdf_dict_gets(dict, "O"));
- doc->linear_page_refs[0] = pdf_new_indirect(doc, doc->linear_page1_obj_num, 0);
+ doc->linear_pos = fz_tell(ctx, doc->file);
+ doc->linear_page1_obj_num = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "O"));
+ doc->linear_page_refs[0] = pdf_new_indirect(ctx, doc, doc->linear_page1_obj_num, 0);
doc->linear_page_num = 0;
- hint = pdf_dict_gets(dict, "H");
- doc->hint_object_offset = pdf_to_int(pdf_array_get(hint, 0));
- doc->hint_object_length = pdf_to_int(pdf_array_get(hint, 1));
+ hint = pdf_dict_gets(ctx, dict, "H");
+ doc->hint_object_offset = pdf_to_int(ctx, pdf_array_get(ctx, hint, 0));
+ doc->hint_object_length = pdf_to_int(ctx, pdf_array_get(ctx, hint, 1));
- entry = pdf_get_populating_xref_entry(doc, 0);
+ entry = pdf_get_populating_xref_entry(ctx, doc, 0);
entry->type = 'f';
}
fz_catch(ctx)
{
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
/* Drop back to non linearized reading mode */
doc->file_reading_linearly = 0;
@@ -1095,41 +1147,41 @@ pdf_load_linear(pdf_document *doc)
}
void
-pdf_ocg_set_config(pdf_document *doc, int config)
+pdf_ocg_set_config(fz_context *ctx, pdf_document *doc, int config)
{
int i, j, len, len2;
pdf_ocg_descriptor *desc = doc->ocg;
pdf_obj *obj, *cobj;
char *name;
- obj = pdf_dict_gets(pdf_dict_gets(pdf_trailer(doc), "Root"), "OCProperties");
+ obj = pdf_dict_gets(ctx, pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"), "OCProperties");
if (!obj)
{
if (config == 0)
return;
else
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "Unknown OCG config (None known!)");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Unknown OCG config (None known!)");
}
if (config == 0)
{
- cobj = pdf_dict_gets(obj, "D");
+ cobj = pdf_dict_gets(ctx, obj, "D");
if (!cobj)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "No default OCG config");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "No default OCG config");
}
else
{
- cobj = pdf_array_get(pdf_dict_gets(obj, "Configs"), config);
+ cobj = pdf_array_get(ctx, pdf_dict_gets(ctx, obj, "Configs"), config);
if (!cobj)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "Illegal OCG config");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "Illegal OCG config");
}
- pdf_drop_obj(desc->intent);
- desc->intent = pdf_dict_gets(cobj, "Intent");
+ pdf_drop_obj(ctx, desc->intent);
+ desc->intent = pdf_dict_gets(ctx, cobj, "Intent");
if (desc->intent)
- pdf_keep_obj(desc->intent);
+ pdf_keep_obj(ctx, desc->intent);
len = desc->len;
- name = pdf_to_name(pdf_dict_gets(cobj, "BaseState"));
+ name = pdf_to_name(ctx, pdf_dict_gets(ctx, cobj, "BaseState"));
if (strcmp(name, "Unchanged") == 0)
{
/* Do nothing */
@@ -1149,13 +1201,13 @@ pdf_ocg_set_config(pdf_document *doc, int config)
}
}
- obj = pdf_dict_gets(cobj, "ON");
- len2 = pdf_array_len(obj);
+ obj = pdf_dict_gets(ctx, cobj, "ON");
+ len2 = pdf_array_len(ctx, obj);
for (i = 0; i < len2; i++)
{
- pdf_obj *o = pdf_array_get(obj, i);
- int n = pdf_to_num(o);
- int g = pdf_to_gen(o);
+ pdf_obj *o = pdf_array_get(ctx, obj, i);
+ int n = pdf_to_num(ctx, o);
+ int g = pdf_to_gen(ctx, o);
for (j=0; j < len; j++)
{
if (desc->ocgs[j].num == n && desc->ocgs[j].gen == g)
@@ -1166,13 +1218,13 @@ pdf_ocg_set_config(pdf_document *doc, int config)
}
}
- obj = pdf_dict_gets(cobj, "OFF");
- len2 = pdf_array_len(obj);
+ obj = pdf_dict_gets(ctx, cobj, "OFF");
+ len2 = pdf_array_len(ctx, obj);
for (i = 0; i < len2; i++)
{
- pdf_obj *o = pdf_array_get(obj, i);
- int n = pdf_to_num(o);
- int g = pdf_to_gen(o);
+ pdf_obj *o = pdf_array_get(ctx, obj, i);
+ int n = pdf_to_num(ctx, o);
+ int g = pdf_to_gen(ctx, o);
for (j=0; j < len; j++)
{
if (desc->ocgs[j].num == n && desc->ocgs[j].gen == g)
@@ -1199,23 +1251,22 @@ pdf_ocg_set_config(pdf_document *doc, int config)
}
static void
-pdf_read_ocg(pdf_document *doc)
+pdf_read_ocg(fz_context *ctx, pdf_document *doc)
{
pdf_obj *obj, *ocg;
int len, i;
pdf_ocg_descriptor *desc;
- fz_context *ctx = doc->ctx;
fz_var(desc);
- obj = pdf_dict_gets(pdf_dict_gets(pdf_trailer(doc), "Root"), "OCProperties");
+ obj = pdf_dict_gets(ctx, pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root"), "OCProperties");
if (!obj)
return;
- ocg = pdf_dict_gets(obj, "OCGs");
- if (!ocg || !pdf_is_array(ocg))
+ ocg = pdf_dict_gets(ctx, obj, "OCGs");
+ if (!ocg || !pdf_is_array(ctx, ocg))
/* Not ever supposed to happen, but live with it. */
return;
- len = pdf_array_len(ocg);
+ len = pdf_array_len(ctx, ocg);
fz_try(ctx)
{
desc = fz_calloc(ctx, 1, sizeof(*desc));
@@ -1224,9 +1275,9 @@ pdf_read_ocg(pdf_document *doc)
desc->intent = NULL;
for (i=0; i < len; i++)
{
- pdf_obj *o = pdf_array_get(ocg, i);
- desc->ocgs[i].num = pdf_to_num(o);
- desc->ocgs[i].gen = pdf_to_gen(o);
+ pdf_obj *o = pdf_array_get(ctx, ocg, i);
+ desc->ocgs[i].num = pdf_to_num(ctx, o);
+ desc->ocgs[i].gen = pdf_to_gen(ctx, o);
desc->ocgs[i].state = 1;
}
doc->ocg = desc;
@@ -1239,16 +1290,16 @@ pdf_read_ocg(pdf_document *doc)
fz_rethrow(ctx);
}
- pdf_ocg_set_config(doc, 0);
+ pdf_ocg_set_config(ctx, doc, 0);
}
static void
-pdf_free_ocg(fz_context *ctx, pdf_ocg_descriptor *desc)
+pdf_drop_ocg(fz_context *ctx, pdf_ocg_descriptor *desc)
{
if (!desc)
return;
- pdf_drop_obj(desc->intent);
+ pdf_drop_obj(ctx, desc->intent);
fz_free(ctx, desc->ocgs);
fz_free(ctx, desc);
}
@@ -1259,9 +1310,8 @@ pdf_free_ocg(fz_context *ctx, pdf_ocg_descriptor *desc)
*/
static void
-pdf_init_document(pdf_document *doc)
+pdf_init_document(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
pdf_obj *encrypt, *id;
pdf_obj *dict = NULL;
pdf_obj *obj;
@@ -1273,30 +1323,30 @@ pdf_init_document(pdf_document *doc)
fz_try(ctx)
{
- pdf_load_version(doc);
+ pdf_load_version(ctx, doc);
- doc->file_length = fz_stream_meta(doc->file, FZ_STREAM_META_LENGTH, 0, NULL);
+ doc->file_length = fz_stream_meta(ctx, doc->file, FZ_STREAM_META_LENGTH, 0, NULL);
if (doc->file_length < 0)
doc->file_length = 0;
/* Check to see if we should work in progressive mode */
- if (fz_stream_meta(doc->file, FZ_STREAM_META_PROGRESSIVE, 0, NULL) > 0)
+ if (fz_stream_meta(ctx, doc->file, FZ_STREAM_META_PROGRESSIVE, 0, NULL) > 0)
doc->file_reading_linearly = 1;
/* Try to load the linearized file if we are in progressive
* mode. */
if (doc->file_reading_linearly)
- pdf_load_linear(doc);
+ pdf_load_linear(ctx, doc);
/* If we aren't in progressive mode (or the linear load failed
* and has set us back to non-progressive mode), load normally.
*/
if (!doc->file_reading_linearly)
- pdf_load_xref(doc, &doc->lexbuf.base);
+ pdf_load_xref(ctx, doc, &doc->lexbuf.base);
}
fz_catch(ctx)
{
- pdf_free_xref_sections(doc);
+ pdf_drop_xref_sections(ctx, doc);
fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
fz_warn(ctx, "trying to repair broken xref");
repaired = 1;
@@ -1307,33 +1357,38 @@ pdf_init_document(pdf_document *doc)
int hasroot, hasinfo;
if (repaired)
- pdf_repair_xref(doc, &doc->lexbuf.base);
+ {
+ /* pdf_repair_xref may access xref_index, so reset it properly */
+ memset(doc->xref_index, 0, sizeof(int) * doc->max_xref_len);
+ pdf_repair_xref(ctx, doc);
+ pdf_prime_xref_index(ctx, doc);
+ }
- encrypt = pdf_dict_gets(pdf_trailer(doc), "Encrypt");
- id = pdf_dict_gets(pdf_trailer(doc), "ID");
- if (pdf_is_dict(encrypt))
+ encrypt = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Encrypt");
+ id = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "ID");
+ if (pdf_is_dict(ctx, encrypt))
doc->crypt = pdf_new_crypt(ctx, encrypt, id);
/* Allow lazy clients to read encrypted files with a blank password */
- pdf_authenticate_password(doc, "");
+ pdf_authenticate_password(ctx, doc, "");
if (repaired)
{
- int xref_len = pdf_xref_len(doc);
- pdf_repair_obj_stms(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
+ pdf_repair_obj_stms(ctx, doc);
- hasroot = (pdf_dict_gets(pdf_trailer(doc), "Root") != NULL);
- hasinfo = (pdf_dict_gets(pdf_trailer(doc), "Info") != NULL);
+ hasroot = (pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root") != NULL);
+ hasinfo = (pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info") != NULL);
for (i = 1; i < xref_len; i++)
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, i);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, i);
if (entry->type == 0 || entry->type == 'f')
continue;
fz_try(ctx)
{
- dict = pdf_load_object(doc, i, 0);
+ dict = pdf_load_object(ctx, doc, i, 0);
}
fz_catch(ctx)
{
@@ -1344,46 +1399,46 @@ pdf_init_document(pdf_document *doc)
if (!hasroot)
{
- obj = pdf_dict_gets(dict, "Type");
- if (pdf_is_name(obj) && !strcmp(pdf_to_name(obj), "Catalog"))
+ obj = pdf_dict_gets(ctx, dict, "Type");
+ if (pdf_is_name(ctx, obj) && !strcmp(pdf_to_name(ctx, obj), "Catalog"))
{
- nobj = pdf_new_indirect(doc, i, 0);
- pdf_dict_puts(pdf_trailer(doc), "Root", nobj);
- pdf_drop_obj(nobj);
+ nobj = pdf_new_indirect(ctx, doc, i, 0);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Root", nobj);
+ pdf_drop_obj(ctx, nobj);
nobj = NULL;
}
}
if (!hasinfo)
{
- if (pdf_dict_gets(dict, "Creator") || pdf_dict_gets(dict, "Producer"))
+ if (pdf_dict_gets(ctx, dict, "Creator") || pdf_dict_gets(ctx, dict, "Producer"))
{
- nobj = pdf_new_indirect(doc, i, 0);
- pdf_dict_puts(pdf_trailer(doc), "Info", nobj);
- pdf_drop_obj(nobj);
+ nobj = pdf_new_indirect(ctx, doc, i, 0);
+ pdf_dict_puts(ctx, pdf_trailer(ctx, doc), "Info", nobj);
+ pdf_drop_obj(ctx, nobj);
nobj = NULL;
}
}
- pdf_drop_obj(dict);
+ pdf_drop_obj(ctx, dict);
dict = NULL;
}
/* ensure that strings are not used in their repaired, non-decrypted form */
if (doc->crypt)
- pdf_clear_xref(doc);
+ pdf_clear_xref(ctx, doc);
}
}
fz_catch(ctx)
{
- pdf_drop_obj(dict);
- pdf_drop_obj(nobj);
+ pdf_drop_obj(ctx, dict);
+ pdf_drop_obj(ctx, nobj);
fz_rethrow_message(ctx, "cannot open document");
}
fz_try(ctx)
{
- pdf_read_ocg(doc);
+ pdf_read_ocg(ctx, doc);
}
fz_catch(ctx)
{
@@ -1393,8 +1448,8 @@ pdf_init_document(pdf_document *doc)
fz_try(ctx)
{
char *version_str;
- obj = pdf_dict_getp(pdf_trailer(doc), "Root/Version");
- version_str = pdf_to_name(obj);
+ obj = pdf_dict_getp(ctx, pdf_trailer(ctx, doc), "Root/Version");
+ version_str = pdf_to_name(ctx, obj);
if (*version_str)
{
int version = 10 * (fz_atof(version_str) + 0.05);
@@ -1406,15 +1461,13 @@ pdf_init_document(pdf_document *doc)
}
void
-pdf_close_document(pdf_document *doc)
+pdf_close_document(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx;
pdf_unsaved_sig *usig;
int i;
if (!doc)
return;
- ctx = doc->ctx;
/* Type3 glyphs in the glyph cache can contain pdf_obj pointers
* that we are about to destroy. Simplest solution is to bin the
@@ -1424,21 +1477,22 @@ pdf_close_document(pdf_document *doc)
if (doc->js)
doc->drop_js(doc->js);
- pdf_free_xref_sections(doc);
+ pdf_drop_xref_sections(ctx, doc);
+ fz_free(ctx, doc->xref_index);
if (doc->focus_obj)
- pdf_drop_obj(doc->focus_obj);
+ pdf_drop_obj(ctx, doc->focus_obj);
if (doc->file)
- fz_close(doc->file);
+ fz_drop_stream(ctx, doc->file);
if (doc->crypt)
- pdf_free_crypt(ctx, doc->crypt);
+ pdf_drop_crypt(ctx, doc->crypt);
- pdf_drop_obj(doc->linear_obj);
+ pdf_drop_obj(ctx, doc->linear_obj);
if (doc->linear_page_refs)
{
for (i=0; i < doc->page_count; i++)
{
- pdf_drop_obj(doc->linear_page_refs[i]);
+ pdf_drop_obj(ctx, doc->linear_page_refs[i]);
}
fz_free(ctx, doc->linear_page_refs);
}
@@ -1450,8 +1504,8 @@ pdf_close_document(pdf_document *doc)
while ((usig = doc->unsaved_sigs) != NULL)
{
doc->unsaved_sigs = usig->next;
- pdf_drop_obj(usig->field);
- pdf_drop_signer(usig->signer);
+ pdf_drop_obj(ctx, usig->field);
+ pdf_drop_signer(ctx, usig->signer);
fz_free(ctx, usig);
}
@@ -1462,24 +1516,24 @@ pdf_close_document(pdf_document *doc)
}
fz_free(ctx, doc->type3_fonts);
- pdf_free_ocg(ctx, doc->ocg);
+ pdf_drop_ocg(ctx, doc->ocg);
fz_empty_store(ctx);
- pdf_lexbuf_fin(&doc->lexbuf.base);
+ pdf_lexbuf_fin(ctx, &doc->lexbuf.base);
fz_free(ctx, doc);
}
void
-pdf_print_xref(pdf_document *doc)
+pdf_print_xref(fz_context *ctx, pdf_document *doc)
{
int i;
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
printf("xref\n0 %d\n", xref_len);
for (i = 0; i < xref_len; i++)
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, i);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, i);
printf("%05d: %010d %05d %c (stm_ofs=%d; stm_buf=%p)\n", i,
entry->ofs,
entry->gen,
@@ -1493,8 +1547,8 @@ pdf_print_xref(pdf_document *doc)
* compressed object streams
*/
-static void
-pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf)
+static pdf_xref_entry *
+pdf_load_obj_stm(fz_context *ctx, pdf_document *doc, int num, int gen, pdf_lexbuf *buf, int target)
{
fz_stream *stm = NULL;
pdf_obj *objstm = NULL;
@@ -1506,7 +1560,7 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf)
int count;
int i;
pdf_token tok;
- fz_context *ctx = doc->ctx;
+ pdf_xref_entry *ret_entry = NULL;
fz_var(numbuf);
fz_var(ofsbuf);
@@ -1515,10 +1569,10 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf)
fz_try(ctx)
{
- objstm = pdf_load_object(doc, num, gen);
+ objstm = pdf_load_object(ctx, doc, num, gen);
- count = pdf_to_int(pdf_dict_gets(objstm, "N"));
- first = pdf_to_int(pdf_dict_gets(objstm, "First"));
+ count = pdf_to_int(ctx, pdf_dict_gets(ctx, objstm, "N"));
+ first = pdf_to_int(ctx, pdf_dict_gets(ctx, objstm, "First"));
if (count < 0)
fz_throw(ctx, FZ_ERROR_GENERIC, "negative number of objects in object stream");
@@ -1528,39 +1582,39 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf)
numbuf = fz_calloc(ctx, count, sizeof(int));
ofsbuf = fz_calloc(ctx, count, sizeof(int));
- stm = pdf_open_stream(doc, num, gen);
+ stm = pdf_open_stream(ctx, doc, num, gen);
for (i = 0; i < count; i++)
{
- tok = pdf_lex(stm, buf);
+ tok = pdf_lex(ctx, stm, buf);
if (tok != PDF_TOK_INT)
fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen);
numbuf[i] = buf->i;
- tok = pdf_lex(stm, buf);
+ tok = pdf_lex(ctx, stm, buf);
if (tok != PDF_TOK_INT)
fz_throw(ctx, FZ_ERROR_GENERIC, "corrupt object stream (%d %d R)", num, gen);
ofsbuf[i] = buf->i;
}
- fz_seek(stm, first, SEEK_SET);
+ fz_seek(ctx, stm, first, SEEK_SET);
for (i = 0; i < count; i++)
{
- int xref_len = pdf_xref_len(doc);
+ int xref_len = pdf_xref_len(ctx, doc);
pdf_xref_entry *entry;
- fz_seek(stm, first + ofsbuf[i], SEEK_SET);
+ fz_seek(ctx, stm, first + ofsbuf[i], SEEK_SET);
- obj = pdf_parse_stm_obj(doc, stm, buf);
+ obj = pdf_parse_stm_obj(ctx, doc, stm, buf);
if (numbuf[i] <= 0 || numbuf[i] >= xref_len)
{
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
fz_throw(ctx, FZ_ERROR_GENERIC, "object id (%d 0 R) out of range (0..%d)", numbuf[i], xref_len - 1);
}
- entry = pdf_get_xref_entry(doc, numbuf[i]);
+ entry = pdf_get_xref_entry(ctx, doc, numbuf[i]);
- pdf_set_obj_parent(obj, numbuf[i]);
+ pdf_set_obj_parent(ctx, obj, numbuf[i]);
if (entry->type == 'o' && entry->ofs == num)
{
@@ -1570,51 +1624,55 @@ pdf_load_obj_stm(pdf_document *doc, int num, int gen, pdf_lexbuf *buf)
* a pointer to the old one will be left with a
* stale pointer. Instead, we drop the new one
* and trust that the old one is correct. */
- if (entry->obj) {
- if (pdf_objcmp(entry->obj, obj))
+ if (entry->obj)
+ {
+ if (pdf_objcmp(ctx, entry->obj, obj))
fz_warn(ctx, "Encountered new definition for object %d - keeping the original one", numbuf[i]);
- pdf_drop_obj(obj);
- } else
+ pdf_drop_obj(ctx, obj);
+ }
+ else
entry->obj = obj;
+ if (numbuf[i] == target)
+ ret_entry = entry;
}
else
{
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
}
}
fz_always(ctx)
{
- fz_close(stm);
+ fz_drop_stream(ctx, stm);
fz_free(ctx, ofsbuf);
fz_free(ctx, numbuf);
- pdf_drop_obj(objstm);
+ pdf_drop_obj(ctx, objstm);
}
fz_catch(ctx)
{
fz_rethrow_message(ctx, "cannot open object stream (%d %d R)", num, gen);
}
+ return ret_entry;
}
/*
* object loading
*/
static int
-pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
+pdf_obj_read(fz_context *ctx, pdf_document *doc, int *offset, int *nump, pdf_obj **page)
{
- int num, numofs, gen, genofs, stmofs, tmpofs, tok;
pdf_lexbuf *buf = &doc->lexbuf.base;
- fz_context *ctx = doc->ctx;
+ int num, numofs, gen, genofs, stmofs, tmpofs, tok;
int xref_len;
pdf_xref_entry *entry;
int newtmpofs;
numofs = *offset;
- fz_seek(doc->file, numofs, SEEK_SET);
+ fz_seek(ctx, doc->file, numofs, SEEK_SET);
/* We expect to read 'num' here */
- tok = pdf_lex(doc->file, buf);
- genofs = fz_tell(doc->file);
+ tok = pdf_lex(ctx, doc->file, buf);
+ genofs = fz_tell(ctx, doc->file);
if (tok != PDF_TOK_INT)
{
/* Failed! */
@@ -1625,8 +1683,8 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
*nump = num = buf->i;
/* We expect to read 'gen' here */
- tok = pdf_lex(doc->file, buf);
- tmpofs = fz_tell(doc->file);
+ tok = pdf_lex(ctx, doc->file, buf);
+ tmpofs = fz_tell(ctx, doc->file);
if (tok != PDF_TOK_INT)
{
/* Failed! */
@@ -1639,14 +1697,14 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
/* We expect to read 'obj' here */
do
{
- tmpofs = fz_tell(doc->file);
- tok = pdf_lex(doc->file, buf);
+ tmpofs = fz_tell(ctx, doc->file);
+ tok = pdf_lex(ctx, doc->file, buf);
if (tok == PDF_TOK_OBJ)
break;
if (tok != PDF_TOK_INT)
{
DEBUGMESS((ctx, "skipping unexpected data (tok=%d) at %d", tok, tmpofs));
- *offset = fz_tell(doc->file);
+ *offset = fz_tell(ctx, doc->file);
return tok == PDF_TOK_EOF;
}
DEBUGMESS((ctx, "skipping unexpected int %d at %d", num, numofs));
@@ -1658,7 +1716,7 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
while (1);
/* Now we read the actual object */
- xref_len = pdf_xref_len(doc);
+ xref_len = pdf_xref_len(ctx, doc);
/* When we are reading a progressive file, we typically see:
* File Header
@@ -1676,7 +1734,7 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
* whenever we read an object it should just go into the
* previous xref.
*/
- tok = pdf_repair_obj(doc, buf, &stmofs, NULL, NULL, NULL, page, &newtmpofs);
+ tok = pdf_repair_obj(ctx, doc, buf, &stmofs, NULL, NULL, NULL, page, &newtmpofs);
do /* So we can break out of it */
{
@@ -1689,7 +1747,7 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
{
fz_warn(ctx, "Unexpected non zero generation number in linearized file");
}
- entry = pdf_get_populating_xref_entry(doc, num);
+ entry = pdf_get_populating_xref_entry(ctx, doc, num);
if (entry->type != 0)
{
DEBUGMESS((ctx, "Duplicate object found (%d %d obj)", num, gen));
@@ -1699,10 +1757,10 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
{
DEBUGMESS((ctx, "Successfully read object %d @ %d - and found page %d!", num, numofs, doc->linear_page_num));
if (!entry->obj)
- entry->obj = pdf_keep_obj(*page);
+ entry->obj = pdf_keep_obj(ctx, *page);
if (doc->linear_page_refs[doc->linear_page_num] == NULL)
- doc->linear_page_refs[doc->linear_page_num] = pdf_new_indirect(doc, num, gen);
+ doc->linear_page_refs[doc->linear_page_num] = pdf_new_indirect(ctx, doc, num, gen);
}
else
{
@@ -1719,7 +1777,7 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
if (tok == PDF_TOK_ENDOBJ)
{
- *offset = fz_tell(doc->file);
+ *offset = fz_tell(ctx, doc->file);
}
else
{
@@ -1729,9 +1787,8 @@ pdf_obj_read(pdf_document *doc, int *offset, int *nump, pdf_obj **page)
}
static void
-pdf_load_hinted_page(pdf_document *doc, int pagenum)
+pdf_load_hinted_page(fz_context *ctx, pdf_document *doc, int pagenum)
{
- fz_context *ctx = doc->ctx;
if (!doc->hints_loaded || !doc->linear_page_refs)
return;
@@ -1742,14 +1799,14 @@ pdf_load_hinted_page(pdf_document *doc, int pagenum)
fz_try(ctx)
{
int num = doc->hint_page[pagenum].number;
- pdf_obj *page = pdf_load_object(doc, num, 0);
- if (!strcmp("Page", pdf_to_name(pdf_dict_gets(page, "Type"))))
+ pdf_obj *page = pdf_load_object(ctx, doc, num, 0);
+ if (!strcmp("Page", pdf_to_name(ctx, pdf_dict_gets(ctx, page, "Type"))))
{
/* We have found the page object! */
DEBUGMESS((ctx, "LoadHintedPage pagenum=%d num=%d", pagenum, num));
- doc->linear_page_refs[pagenum] = pdf_new_indirect(doc, num, 0);
+ doc->linear_page_refs[pagenum] = pdf_new_indirect(ctx, doc, num, 0);
}
- pdf_drop_obj(page);
+ pdf_drop_obj(ctx, page);
}
fz_catch(ctx)
{
@@ -1760,12 +1817,11 @@ pdf_load_hinted_page(pdf_document *doc, int pagenum)
}
static int
-read_hinted_object(pdf_document *doc, int num)
+read_hinted_object(fz_context *ctx, pdf_document *doc, int num)
{
/* Try to find the object using our hint table. Find the closest
* object <= the one we want that has a hint and read forward from
* there. */
- fz_context *ctx = doc->ctx;
int expected = num;
int curr_pos;
int start, offset;
@@ -1777,7 +1833,7 @@ read_hinted_object(pdf_document *doc, int num)
if (expected == 0) /* No hints found, just bale */
return 0;
- curr_pos = fz_tell(doc->file);
+ curr_pos = fz_tell(ctx, doc->file);
offset = doc->hint_obj_offsets[expected];
fz_var(expected);
@@ -1791,7 +1847,7 @@ read_hinted_object(pdf_document *doc, int num)
{
start = offset;
DEBUGMESS((ctx, "Searching for object %d @ %d", expected, offset));
- pdf_obj_read(doc, &offset, &found, 0);
+ pdf_obj_read(ctx, doc, &offset, &found, 0);
DEBUGMESS((ctx, "Found object %d - next will be @ %d", found, offset));
if (found <= expected)
{
@@ -1819,7 +1875,7 @@ read_hinted_object(pdf_document *doc, int num)
}
fz_always(ctx)
{
- fz_seek(doc->file, curr_pos, SEEK_SET);
+ fz_seek(ctx, doc->file, curr_pos, SEEK_SET);
}
fz_catch(ctx)
{
@@ -1832,38 +1888,37 @@ read_hinted_object(pdf_document *doc, int num)
return 1;
}
-void
-pdf_cache_object(pdf_document *doc, int num, int gen)
+pdf_xref_entry *
+pdf_cache_object(fz_context *ctx, pdf_document *doc, int num, int gen)
{
pdf_xref_entry *x;
int rnum, rgen, try_repair;
- fz_context *ctx = doc->ctx;
fz_var(try_repair);
- if (num <= 0 || num >= pdf_xref_len(doc))
- fz_throw(ctx, FZ_ERROR_GENERIC, "object out of range (%d %d R); xref size %d", num, gen, pdf_xref_len(doc));
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object out of range (%d %d R); xref size %d", num, gen, pdf_xref_len(ctx, doc));
object_updated:
try_repair = 0;
rnum = num;
- x = pdf_get_xref_entry(doc, num);
+ x = pdf_get_xref_entry(ctx, doc, num);
- if (x->obj)
- return;
+ if (x->obj != NULL)
+ return x;
if (x->type == 'f')
{
- x->obj = pdf_new_null(doc);
+ x->obj = pdf_new_null(ctx, doc);
}
else if (x->type == 'n')
{
- fz_seek(doc->file, x->ofs, SEEK_SET);
+ fz_seek(ctx, doc->file, x->ofs, SEEK_SET);
fz_try(ctx)
{
- x->obj = pdf_parse_ind_obj(doc, doc->file, &doc->lexbuf.base,
+ x->obj = pdf_parse_ind_obj(ctx, doc, doc->file, &doc->lexbuf.base,
&rnum, &rgen, &x->stm_ofs, &try_repair);
}
fz_catch(ctx)
@@ -1874,7 +1929,7 @@ object_updated:
if (!try_repair && rnum != num)
{
- pdf_drop_obj(x->obj);
+ pdf_drop_obj(ctx, x->obj);
x->obj = NULL;
try_repair = 1;
}
@@ -1883,7 +1938,8 @@ object_updated:
{
fz_try(ctx)
{
- pdf_repair_xref(doc, &doc->lexbuf.base);
+ pdf_repair_xref(ctx, doc);
+ pdf_prime_xref_index(ctx, doc);
}
fz_catch(ctx)
{
@@ -1904,18 +1960,19 @@ object_updated:
{
fz_try(ctx)
{
- pdf_load_obj_stm(doc, x->ofs, 0, &doc->lexbuf.base);
+ x = pdf_load_obj_stm(ctx, doc, x->ofs, 0, &doc->lexbuf.base, num);
}
fz_catch(ctx)
{
fz_rethrow_message(ctx, "cannot load object stream containing object (%d %d R)", num, gen);
}
- x = pdf_get_xref_entry(doc, num);
+ if (x == NULL)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load object stream containing object (%d %d R)", num, gen);
if (!x->obj)
fz_throw(ctx, FZ_ERROR_GENERIC, "object (%d %d R) was not found in its object stream", num, gen);
}
}
- else if (doc->hint_obj_offsets && read_hinted_object(doc, num))
+ else if (doc->hint_obj_offsets && read_hinted_object(ctx, doc, num))
{
goto object_updated;
}
@@ -1928,54 +1985,52 @@ object_updated:
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find object in xref (%d %d R)", num, gen);
}
- pdf_set_obj_parent(x->obj, num);
+ pdf_set_obj_parent(ctx, x->obj, num);
+ return x;
}
pdf_obj *
-pdf_load_object(pdf_document *doc, int num, int gen)
+pdf_load_object(fz_context *ctx, pdf_document *doc, int num, int gen)
{
- fz_context *ctx = doc->ctx;
pdf_xref_entry *entry;
fz_try(ctx)
{
- pdf_cache_object(doc, num, gen);
+ entry = pdf_cache_object(ctx, doc, num, gen);
}
fz_catch(ctx)
{
fz_rethrow_message(ctx, "cannot load object (%d %d R) into cache", num, gen);
}
- entry = pdf_get_xref_entry(doc, num);
+ assert(entry->obj != NULL);
- assert(entry->obj);
-
- return pdf_keep_obj(entry->obj);
+ return pdf_keep_obj(ctx, entry->obj);
}
pdf_obj *
-pdf_resolve_indirect(pdf_obj *ref)
+pdf_resolve_indirect(fz_context *ctx, pdf_obj *ref)
{
int sanity = 10;
int num;
int gen;
- fz_context *ctx = NULL; /* Avoid warning for stupid compilers */
- pdf_document *doc;
pdf_xref_entry *entry;
- while (pdf_is_indirect(ref))
+ while (pdf_is_indirect(ctx, ref))
{
+ pdf_document *doc;
+
if (--sanity == 0)
{
fz_warn(ctx, "too many indirections (possible indirection cycle involving %d %d R)", num, gen);
return NULL;
}
- doc = pdf_get_indirect_document(ref);
+
+ doc = pdf_get_indirect_document(ctx, ref);
if (!doc)
return NULL;
- ctx = doc->ctx;
- num = pdf_to_num(ref);
- gen = pdf_to_gen(ref);
+ num = pdf_to_num(ctx, ref);
+ gen = pdf_to_gen(ctx, ref);
if (num <= 0 || gen < 0)
{
@@ -1985,7 +2040,7 @@ pdf_resolve_indirect(pdf_obj *ref)
fz_try(ctx)
{
- pdf_cache_object(doc, num, gen);
+ entry = pdf_cache_object(ctx, doc, num, gen);
}
fz_catch(ctx)
{
@@ -1993,8 +2048,8 @@ pdf_resolve_indirect(pdf_obj *ref)
fz_warn(ctx, "cannot load object (%d %d R) into cache", num, gen);
return NULL;
}
- entry = pdf_get_xref_entry(doc, num);
- if (!entry->obj)
+
+ if (entry->obj == NULL)
return NULL;
ref = entry->obj;
}
@@ -2003,18 +2058,18 @@ pdf_resolve_indirect(pdf_obj *ref)
}
int
-pdf_count_objects(pdf_document *doc)
+pdf_count_objects(fz_context *ctx, pdf_document *doc)
{
- return pdf_xref_len(doc);
+ return pdf_xref_len(ctx, doc);
}
int
-pdf_create_object(pdf_document *doc)
+pdf_create_object(fz_context *ctx, pdf_document *doc)
{
/* TODO: reuse free object slots by properly linking free object chains in the ofs field */
pdf_xref_entry *entry;
- int num = pdf_xref_len(doc);
- entry = pdf_get_incremental_xref_entry(doc, num);
+ int num = pdf_xref_len(ctx, doc);
+ entry = pdf_get_incremental_xref_entry(ctx, doc, num);
entry->type = 'f';
entry->ofs = -1;
entry->gen = 0;
@@ -2025,20 +2080,20 @@ pdf_create_object(pdf_document *doc)
}
void
-pdf_delete_object(pdf_document *doc, int num)
+pdf_delete_object(fz_context *ctx, pdf_document *doc, int num)
{
pdf_xref_entry *x;
- if (num <= 0 || num >= pdf_xref_len(doc))
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
{
- fz_warn(doc->ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(doc));
+ fz_warn(ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(ctx, doc));
return;
}
- x = pdf_get_incremental_xref_entry(doc, num);
+ x = pdf_get_incremental_xref_entry(ctx, doc, num);
- fz_drop_buffer(doc->ctx, x->stm_buf);
- pdf_drop_obj(x->obj);
+ fz_drop_buffer(ctx, x->stm_buf);
+ pdf_drop_obj(ctx, x->obj);
x->type = 'f';
x->ofs = 0;
@@ -2049,46 +2104,46 @@ pdf_delete_object(pdf_document *doc, int num)
}
void
-pdf_update_object(pdf_document *doc, int num, pdf_obj *newobj)
+pdf_update_object(fz_context *ctx, pdf_document *doc, int num, pdf_obj *newobj)
{
pdf_xref_entry *x;
- if (num <= 0 || num >= pdf_xref_len(doc))
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
{
- fz_warn(doc->ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(doc));
+ fz_warn(ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(ctx, doc));
return;
}
- x = pdf_get_incremental_xref_entry(doc, num);
+ x = pdf_get_incremental_xref_entry(ctx, doc, num);
- pdf_drop_obj(x->obj);
+ pdf_drop_obj(ctx, x->obj);
x->type = 'n';
x->ofs = 0;
- x->obj = pdf_keep_obj(newobj);
+ x->obj = pdf_keep_obj(ctx, newobj);
- pdf_set_obj_parent(newobj, num);
+ pdf_set_obj_parent(ctx, newobj, num);
}
void
-pdf_update_stream(pdf_document *doc, int num, fz_buffer *newbuf)
+pdf_update_stream(fz_context *ctx, pdf_document *doc, int num, fz_buffer *newbuf)
{
pdf_xref_entry *x;
- if (num <= 0 || num >= pdf_xref_len(doc))
+ if (num <= 0 || num >= pdf_xref_len(ctx, doc))
{
- fz_warn(doc->ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(doc));
+ fz_warn(ctx, "object out of range (%d 0 R); xref size %d", num, pdf_xref_len(ctx, doc));
return;
}
- x = pdf_get_xref_entry(doc, num);
+ x = pdf_get_xref_entry(ctx, doc, num);
- fz_drop_buffer(doc->ctx, x->stm_buf);
- x->stm_buf = fz_keep_buffer(doc->ctx, newbuf);
+ fz_drop_buffer(ctx, x->stm_buf);
+ x->stm_buf = fz_keep_buffer(ctx, newbuf);
}
int
-pdf_meta(pdf_document *doc, int key, void *ptr, int size)
+pdf_meta(fz_context *ctx, pdf_document *doc, int key, void *ptr, int size)
{
switch (key)
{
@@ -2103,10 +2158,10 @@ pdf_meta(pdf_document *doc, int key, void *ptr, int size)
case FZ_META_CRYPT_INFO:
if (doc->crypt)
sprintf((char *)ptr, "Standard V%d R%d %d-bit %s",
- pdf_crypt_version(doc),
- pdf_crypt_revision(doc),
- pdf_crypt_length(doc),
- pdf_crypt_method(doc));
+ pdf_crypt_version(ctx, doc),
+ pdf_crypt_revision(ctx, doc),
+ pdf_crypt_length(ctx, doc),
+ pdf_crypt_method(ctx, doc));
else
sprintf((char *)ptr, "None");
return FZ_META_OK;
@@ -2130,18 +2185,18 @@ pdf_meta(pdf_document *doc, int key, void *ptr, int size)
default:
return 0;
}
- return pdf_has_permission(doc, i);
+ return pdf_has_permission(ctx, doc, i);
}
case FZ_META_INFO:
{
- pdf_obj *info = pdf_dict_gets(pdf_trailer(doc), "Info");
+ pdf_obj *info = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info");
if (!info)
{
if (ptr)
*(char *)ptr = 0;
return 0;
}
- info = pdf_dict_gets(info, *(char **)ptr);
+ info = pdf_dict_gets(ctx, info, *(char **)ptr);
if (!info)
{
if (ptr)
@@ -2150,9 +2205,9 @@ pdf_meta(pdf_document *doc, int key, void *ptr, int size)
}
if (info && ptr && size)
{
- char *utf8 = pdf_to_utf8(doc, info);
+ char *utf8 = pdf_to_utf8(ctx, doc, info);
fz_strlcpy(ptr, utf8, size);
- fz_free(doc->ctx, utf8);
+ fz_free(ctx, utf8);
}
return 1;
}
@@ -2162,7 +2217,7 @@ 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_page_presentation(fz_context *ctx, pdf_page *page, float *duration)
{
*duration = page->duration;
if (!page->transition_present)
@@ -2170,13 +2225,6 @@ pdf_page_presentation(pdf_document *doc, pdf_page *page, float *duration)
return &page->transition;
}
-static void
-pdf_rebind(pdf_document *doc, fz_context *ctx)
-{
- doc->ctx = ctx;
- fz_rebind_stream(doc->file, ctx);
-}
-
/*
Initializers for the fz_document interface.
@@ -2192,28 +2240,18 @@ pdf_new_document(fz_context *ctx, fz_stream *file)
{
pdf_document *doc = fz_malloc_struct(ctx, pdf_document);
+ doc->super.refs = 1;
doc->super.close = (fz_document_close_fn *)pdf_close_document;
doc->super.needs_password = (fz_document_needs_password_fn *)pdf_needs_password;
doc->super.authenticate_password = (fz_document_authenticate_password_fn *)pdf_authenticate_password;
doc->super.load_outline = (fz_document_load_outline_fn *)pdf_load_outline;
doc->super.count_pages = (fz_document_count_pages_fn *)pdf_count_pages;
doc->super.load_page = (fz_document_load_page_fn *)pdf_load_page;
- doc->super.load_links = (fz_document_load_links_fn *)pdf_load_links;
- doc->super.bound_page = (fz_document_bound_page_fn *)pdf_bound_page;
- doc->super.first_annot = (fz_document_first_annot_fn *)pdf_first_annot;
- doc->super.next_annot = (fz_document_next_annot_fn *)pdf_next_annot;
- doc->super.bound_annot = (fz_document_bound_annot_fn *)pdf_bound_annot;
- doc->super.run_page_contents = NULL; /* see pdf_xref_aux.c */
- doc->super.run_annot = NULL; /* see pdf_xref_aux.c */
- doc->super.free_page = (fz_document_free_page_fn *)pdf_free_page;
doc->super.meta = (fz_document_meta_fn *)pdf_meta;
- doc->super.page_presentation = (fz_document_page_presentation_fn *)pdf_page_presentation;
doc->super.write = (fz_document_write_fn *)pdf_write_document;
- doc->super.rebind = (fz_document_rebind_fn *)pdf_rebind;
pdf_lexbuf_init(ctx, &doc->lexbuf.base, PDF_LEXBUF_LARGE);
- doc->file = fz_keep_stream(file);
- doc->ctx = ctx;
+ doc->file = fz_keep_stream(ctx, file);
return doc;
}
@@ -2222,16 +2260,13 @@ pdf_document *
pdf_open_document_no_run_with_stream(fz_context *ctx, fz_stream *file)
{
pdf_document *doc = pdf_new_document(ctx, file);
-
- fz_var(doc);
-
fz_try(ctx)
{
- pdf_init_document(doc);
+ pdf_init_document(ctx, doc);
}
fz_catch(ctx)
{
- pdf_close_document(doc);
+ pdf_close_document(ctx, doc);
fz_rethrow_message(ctx, "cannot load document from stream");
}
return doc;
@@ -2250,26 +2285,25 @@ pdf_open_document_no_run(fz_context *ctx, const char *filename)
{
file = fz_open_file(ctx, filename);
doc = pdf_new_document(ctx, file);
- pdf_init_document(doc);
+ pdf_init_document(ctx, doc);
}
fz_always(ctx)
{
- fz_close(file);
+ fz_drop_stream(ctx, file);
}
fz_catch(ctx)
{
- pdf_close_document(doc);
+ pdf_close_document(ctx, doc);
fz_rethrow_message(ctx, "cannot load document '%s'", filename);
}
return doc;
}
static void
-pdf_load_hints(pdf_document *doc, int objnum, int gennum)
+pdf_load_hints(fz_context *ctx, pdf_document *doc, int objnum, int gennum)
{
fz_stream *stream = NULL;
pdf_obj *dict;
- fz_context *ctx = doc->ctx;
fz_var(stream);
fz_var(dict);
@@ -2286,14 +2320,14 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
int shared_obj_num, shared_obj_offset, shared_obj_count_page1;
int shared_obj_count_total;
int least_shared_group_len, shared_group_len_num_bits;
- int max_object_num = pdf_xref_len(doc);
+ int max_object_num = pdf_xref_len(ctx, doc);
- stream = pdf_open_stream(doc, objnum, gennum);
- dict = pdf_get_xref_entry(doc, objnum)->obj;
- if (dict == NULL || !pdf_is_dict(dict))
+ stream = pdf_open_stream(ctx, doc, objnum, gennum);
+ dict = pdf_get_xref_entry(ctx, doc, objnum)->obj;
+ if (dict == NULL || !pdf_is_dict(ctx, dict))
fz_throw(ctx, FZ_ERROR_GENERIC, "malformed hint object");
- shared_hint_offset = pdf_to_int(pdf_dict_gets(dict, "S"));
+ shared_hint_offset = pdf_to_int(ctx, pdf_dict_gets(ctx, dict, "S"));
/* Malloc the structures (use realloc to cope with the fact we
* may try this several times before enough data is loaded) */
@@ -2304,45 +2338,45 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
doc->hint_obj_offsets_max = max_object_num;
/* Read the page object hints table: Header first */
- least_num_page_objs = fz_read_bits(stream, 32);
+ least_num_page_objs = fz_read_bits(ctx, stream, 32);
/* The following is sometimes a lie, but we read this version,
* as other table values are built from it. In
* pdf_reference17.pdf, this points to 2 objects before the
* first pages page object. */
- doc->hint_page[0].offset = fz_read_bits(stream, 32);
+ doc->hint_page[0].offset = fz_read_bits(ctx, stream, 32);
if (doc->hint_page[0].offset > doc->hint_object_offset)
doc->hint_page[0].offset += doc->hint_object_length;
- page_obj_num_bits = fz_read_bits(stream, 16);
- least_page_len = fz_read_bits(stream, 32);
- page_len_num_bits = fz_read_bits(stream, 16);
- /* least_page_offset = */ (void) fz_read_bits(stream, 32);
- /* page_offset_num_bits = */ (void) fz_read_bits(stream, 16);
- /* least_content_stream_len = */ (void) fz_read_bits(stream, 32);
- /* content_stream_len_num_bits = */ (void) fz_read_bits(stream, 16);
- num_shared_obj_num_bits = fz_read_bits(stream, 16);
- shared_obj_num_bits = fz_read_bits(stream, 16);
- /* numerator_bits = */ (void) fz_read_bits(stream, 16);
- /* denominator_bits = */ (void) fz_read_bits(stream, 16);
+ page_obj_num_bits = fz_read_bits(ctx, stream, 16);
+ least_page_len = fz_read_bits(ctx, stream, 32);
+ page_len_num_bits = fz_read_bits(ctx, stream, 16);
+ /* least_page_offset = */ (void) fz_read_bits(ctx, stream, 32);
+ /* page_offset_num_bits = */ (void) fz_read_bits(ctx, stream, 16);
+ /* least_content_stream_len = */ (void) fz_read_bits(ctx, stream, 32);
+ /* content_stream_len_num_bits = */ (void) fz_read_bits(ctx, stream, 16);
+ num_shared_obj_num_bits = fz_read_bits(ctx, stream, 16);
+ shared_obj_num_bits = fz_read_bits(ctx, stream, 16);
+ /* numerator_bits = */ (void) fz_read_bits(ctx, stream, 16);
+ /* denominator_bits = */ (void) fz_read_bits(ctx, stream, 16);
/* Item 1: Page object numbers */
doc->hint_page[0].number = doc->linear_page1_obj_num;
/* We don't care about the number of objects in the first page */
- (void)fz_read_bits(stream, page_obj_num_bits);
+ (void)fz_read_bits(ctx, stream, page_obj_num_bits);
j = 1;
for (i = 1; i < doc->page_count; i++)
{
- int delta_page_objs = fz_read_bits(stream, page_obj_num_bits);
+ int delta_page_objs = fz_read_bits(ctx, stream, page_obj_num_bits);
doc->hint_page[i].number = j;
j += least_num_page_objs + delta_page_objs;
}
doc->hint_page[i].number = j; /* Not a real page object */
- fz_sync_bits(stream);
+ fz_sync_bits(ctx, stream);
/* Item 2: Page lengths */
j = doc->hint_page[0].offset;
for (i = 0; i < doc->page_count; i++)
{
- int delta_page_len = fz_read_bits(stream, page_len_num_bits);
+ int delta_page_len = fz_read_bits(ctx, stream, page_len_num_bits);
int old = j;
doc->hint_page[i].offset = j;
@@ -2351,39 +2385,39 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
j += doc->hint_object_length;
}
doc->hint_page[i].offset = j;
- fz_sync_bits(stream);
+ fz_sync_bits(ctx, stream);
/* Item 3: Shared references */
shared = 0;
for (i = 0; i < doc->page_count; i++)
{
- int num_shared_objs = fz_read_bits(stream, num_shared_obj_num_bits);
+ int num_shared_objs = fz_read_bits(ctx, stream, num_shared_obj_num_bits);
doc->hint_page[i].index = shared;
shared += num_shared_objs;
}
doc->hint_page[i].index = shared;
doc->hint_shared_ref = fz_resize_array(ctx, doc->hint_shared_ref, shared, sizeof(*doc->hint_shared_ref));
memset(doc->hint_shared_ref, 0, sizeof(*doc->hint_shared_ref) * shared);
- fz_sync_bits(stream);
+ fz_sync_bits(ctx, stream);
/* Item 4: Shared references */
for (i = 0; i < shared; i++)
{
- int ref = fz_read_bits(stream, shared_obj_num_bits);
+ int ref = fz_read_bits(ctx, stream, shared_obj_num_bits);
doc->hint_shared_ref[i] = ref;
}
/* Skip items 5,6,7 as we don't use them */
- fz_seek(stream, shared_hint_offset, SEEK_SET);
+ fz_seek(ctx, stream, shared_hint_offset, SEEK_SET);
/* Read the shared object hints table: Header first */
- shared_obj_num = fz_read_bits(stream, 32);
- shared_obj_offset = fz_read_bits(stream, 32);
+ shared_obj_num = fz_read_bits(ctx, stream, 32);
+ shared_obj_offset = fz_read_bits(ctx, stream, 32);
if (shared_obj_offset > doc->hint_object_offset)
shared_obj_offset += doc->hint_object_length;
- shared_obj_count_page1 = fz_read_bits(stream, 32);
- shared_obj_count_total = fz_read_bits(stream, 32);
- shared_obj_num_bits = fz_read_bits(stream, 16);
- least_shared_group_len = fz_read_bits(stream, 32);
- shared_group_len_num_bits = fz_read_bits(stream, 16);
+ shared_obj_count_page1 = fz_read_bits(ctx, stream, 32);
+ shared_obj_count_total = fz_read_bits(ctx, stream, 32);
+ shared_obj_num_bits = fz_read_bits(ctx, stream, 16);
+ least_shared_group_len = fz_read_bits(ctx, stream, 32);
+ shared_group_len_num_bits = fz_read_bits(ctx, stream, 16);
/* Sanity check the references in Item 4 above to ensure we
* don't access out of range with malicious files. */
@@ -2402,7 +2436,7 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
j = doc->hint_page[0].offset;
for (i = 0; i < shared_obj_count_page1; i++)
{
- int off = fz_read_bits(stream, shared_group_len_num_bits);
+ int off = fz_read_bits(ctx, stream, shared_group_len_num_bits);
int old = j;
doc->hint_shared[i].offset = j;
j += off + least_shared_group_len;
@@ -2415,7 +2449,7 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
j = shared_obj_offset;
for (; i < shared_obj_count_total; i++)
{
- int off = fz_read_bits(stream, shared_group_len_num_bits);
+ int off = fz_read_bits(ctx, stream, shared_group_len_num_bits);
int old = j;
doc->hint_shared[i].offset = j;
j += off + least_shared_group_len;
@@ -2423,34 +2457,34 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
j += doc->hint_object_length;
}
doc->hint_shared[i].offset = j;
- fz_sync_bits(stream);
+ fz_sync_bits(ctx, stream);
/* Item 2: Signature flags: read these just so we can skip */
for (i = 0; i < shared_obj_count_total; i++)
{
- doc->hint_shared[i].number = fz_read_bits(stream, 1);
+ doc->hint_shared[i].number = fz_read_bits(ctx, stream, 1);
}
- fz_sync_bits(stream);
+ fz_sync_bits(ctx, stream);
/* Item 3: Signatures: just skip */
for (i = 0; i < shared_obj_count_total; i++)
{
if (doc->hint_shared[i].number)
{
- (void) fz_read_bits(stream, 128);
+ (void) fz_read_bits(ctx, stream, 128);
}
}
- fz_sync_bits(stream);
+ fz_sync_bits(ctx, stream);
/* Item 4: Shared object object numbers */
j = doc->linear_page1_obj_num; /* FIXME: This is a lie! */
for (i = 0; i < shared_obj_count_page1; i++)
{
doc->hint_shared[i].number = j;
- j += fz_read_bits(stream, shared_obj_num_bits) + 1;
+ j += fz_read_bits(ctx, stream, shared_obj_num_bits) + 1;
}
j = shared_obj_num;
for (; i < shared_obj_count_total; i++)
{
doc->hint_shared[i].number = j;
- j += fz_read_bits(stream, shared_obj_num_bits) + 1;
+ j += fz_read_bits(ctx, stream, shared_obj_num_bits) + 1;
}
doc->hint_shared[i].number = j;
@@ -2466,7 +2500,7 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
}
fz_always(ctx)
{
- fz_close(stream);
+ fz_drop_stream(ctx, stream);
}
fz_catch(ctx)
{
@@ -2482,14 +2516,13 @@ pdf_load_hints(pdf_document *doc, int objnum, int gennum)
}
static void
-pdf_load_hint_object(pdf_document *doc)
+pdf_load_hint_object(fz_context *ctx, pdf_document *doc)
{
- fz_context *ctx = doc->ctx;
pdf_lexbuf *buf = &doc->lexbuf.base;
int curr_pos;
- curr_pos = fz_tell(doc->file);
- fz_seek(doc->file, doc->hint_object_offset, SEEK_SET);
+ curr_pos = fz_tell(ctx, doc->file);
+ fz_seek(ctx, doc->file, doc->hint_object_offset, SEEK_SET);
fz_try(ctx)
{
while (1)
@@ -2497,24 +2530,24 @@ pdf_load_hint_object(pdf_document *doc)
pdf_obj *page = NULL;
int tmpofs, num, gen, tok;
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, doc->file, buf);
if (tok != PDF_TOK_INT)
break;
num = buf->i;
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, doc->file, buf);
if (tok != PDF_TOK_INT)
break;
gen = buf->i;
- tok = pdf_lex(doc->file, buf);
+ tok = pdf_lex(ctx, doc->file, buf);
if (tok != PDF_TOK_OBJ)
break;
- (void)pdf_repair_obj(doc, buf, &tmpofs, NULL, NULL, NULL, &page, &tmpofs);
- pdf_load_hints(doc, num, gen);
+ (void)pdf_repair_obj(ctx, doc, buf, &tmpofs, NULL, NULL, NULL, &page, &tmpofs);
+ pdf_load_hints(ctx, doc, num, gen);
}
}
fz_always(ctx)
{
- fz_seek(doc->file, curr_pos, SEEK_SET);
+ fz_seek(ctx, doc->file, curr_pos, SEEK_SET);
}
fz_catch(ctx)
{
@@ -2522,17 +2555,16 @@ pdf_load_hint_object(pdf_document *doc)
}
}
-pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum)
+pdf_obj *pdf_progressive_advance(fz_context *ctx, pdf_document *doc, int pagenum)
{
- fz_context *ctx = doc->ctx;
pdf_lexbuf *buf = &doc->lexbuf.base;
int curr_pos;
pdf_obj *page;
- pdf_load_hinted_page(doc, pagenum);
+ pdf_load_hinted_page(ctx, doc, pagenum);
if (pagenum < 0 || pagenum >= doc->page_count)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "page load out of range (%d of %d)", pagenum, doc->page_count);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "page load out of range (%d of %d)", pagenum, doc->page_count);
if (doc->linear_pos == doc->file_length)
return doc->linear_page_refs[pagenum];
@@ -2541,11 +2573,11 @@ pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum)
if (pagenum > 0 && !doc->hints_loaded && doc->hint_object_offset > 0 && doc->linear_pos >= doc->hint_object_offset)
{
/* Found hint object */
- pdf_load_hint_object(doc);
+ pdf_load_hint_object(ctx, doc);
}
DEBUGMESS((ctx, "continuing to try to advance from %d", doc->linear_pos));
- curr_pos = fz_tell(doc->file);
+ curr_pos = fz_tell(ctx, doc->file);
fz_var(page);
@@ -2556,8 +2588,8 @@ pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum)
{
int num;
page = NULL;
- eof = pdf_obj_read(doc, &doc->linear_pos, &num, &page);
- pdf_drop_obj(page);
+ eof = pdf_obj_read(ctx, doc, &doc->linear_pos, &num, &page);
+ pdf_drop_obj(ctx, page);
page = NULL;
}
while (!eof);
@@ -2566,22 +2598,22 @@ pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum)
pdf_obj *catalog;
pdf_obj *pages;
doc->linear_pos = doc->file_length;
- pdf_load_xref(doc, buf);
- catalog = pdf_dict_gets(pdf_trailer(doc), "Root");
- pages = pdf_dict_gets(catalog, "Pages");
+ pdf_load_xref(ctx, doc, buf);
+ catalog = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pages = pdf_dict_gets(ctx, catalog, "Pages");
- if (!pdf_is_dict(pages))
+ if (!pdf_is_dict(ctx, pages))
fz_throw(ctx, FZ_ERROR_GENERIC, "missing page tree");
break;
}
}
fz_always(ctx)
{
- fz_seek(doc->file, curr_pos, SEEK_SET);
+ fz_seek(ctx, doc->file, curr_pos, SEEK_SET);
}
fz_catch(ctx)
{
- pdf_drop_obj(page);
+ pdf_drop_obj(ctx, page);
if (fz_caught(ctx) == FZ_ERROR_TRYLATER)
{
if (doc->linear_page_refs[pagenum] == NULL)
@@ -2597,7 +2629,7 @@ pdf_obj *pdf_progressive_advance(pdf_document *doc, int pagenum)
return doc->linear_page_refs[pagenum];
}
-pdf_document *pdf_specifics(fz_document *doc)
+pdf_document *pdf_specifics(fz_context *ctx, fz_document *doc)
{
return (pdf_document *)((doc && doc->close == (fz_document_close_fn *)pdf_close_document) ? doc : NULL);
}
@@ -2620,29 +2652,29 @@ pdf_document *pdf_create_document(fz_context *ctx)
doc->file_size = 0;
doc->startxref = 0;
doc->num_xref_sections = 0;
- pdf_get_populating_xref_entry(doc, 0);
+ pdf_get_populating_xref_entry(ctx, doc, 0);
doc->xref_altered = 1;
- trailer = pdf_new_dict(doc, 2);
- pdf_dict_puts_drop(trailer, "Size", pdf_new_int(doc, 3));
- o = root = pdf_new_dict(doc, 2);
- pdf_dict_puts_drop(trailer, "Root", pdf_new_ref(doc, o));
- pdf_drop_obj(o);
+ trailer = pdf_new_dict(ctx, doc, 2);
+ pdf_dict_puts_drop(ctx, trailer, "Size", pdf_new_int(ctx, doc, 3));
+ o = root = pdf_new_dict(ctx, doc, 2);
+ pdf_dict_puts_drop(ctx, trailer, "Root", pdf_new_ref(ctx, doc, o));
+ pdf_drop_obj(ctx, o);
o = NULL;
- pdf_dict_puts_drop(root, "Type", pdf_new_name(doc, "Catalog"));
- o = pages = pdf_new_dict(doc, 3);
- pdf_dict_puts_drop(root, "Pages", pdf_new_ref(doc, o));
- pdf_drop_obj(o);
+ pdf_dict_puts_drop(ctx, root, "Type", pdf_new_name(ctx, doc, "Catalog"));
+ o = pages = pdf_new_dict(ctx, doc, 3);
+ pdf_dict_puts_drop(ctx, root, "Pages", pdf_new_ref(ctx, doc, o));
+ pdf_drop_obj(ctx, o);
o = NULL;
- pdf_dict_puts_drop(pages, "Type", pdf_new_name(doc, "Pages"));
- pdf_dict_puts_drop(pages, "Count", pdf_new_int(doc, 0));
- pdf_dict_puts_drop(pages, "Kids", pdf_new_array(doc, 1));
- pdf_set_populating_xref_trailer(doc, trailer);
- pdf_drop_obj(trailer);
+ pdf_dict_puts_drop(ctx, pages, "Type", pdf_new_name(ctx, doc, "Pages"));
+ pdf_dict_puts_drop(ctx, pages, "Count", pdf_new_int(ctx, doc, 0));
+ pdf_dict_puts_drop(ctx, pages, "Kids", pdf_new_array(ctx, doc, 1));
+ pdf_set_populating_xref_trailer(ctx, doc, trailer);
+ pdf_drop_obj(ctx, trailer);
}
fz_catch(ctx)
{
- pdf_drop_obj(trailer);
- pdf_drop_obj(o);
+ pdf_drop_obj(ctx, trailer);
+ pdf_drop_obj(ctx, o);
fz_rethrow_message(ctx, "Failed to create empty document");
}
return doc;
@@ -2671,7 +2703,7 @@ fz_document_handler pdf_no_run_document_handler =
(fz_document_open_with_stream_fn *)&pdf_open_document_no_run_with_stream
};
-void pdf_mark_xref(pdf_document *doc)
+void pdf_mark_xref(fz_context *ctx, pdf_document *doc)
{
int x, e;
@@ -2694,7 +2726,7 @@ void pdf_mark_xref(pdf_document *doc)
}
}
-void pdf_clear_xref(pdf_document *doc)
+void pdf_clear_xref(fz_context *ctx, pdf_document *doc)
{
int x, e;
@@ -2712,9 +2744,9 @@ void pdf_clear_xref(pdf_document *doc)
* buffer has been updated */
if (entry->obj != NULL && entry->stm_buf == NULL)
{
- if (pdf_obj_refs(entry->obj) == 1)
+ if (pdf_obj_refs(ctx, entry->obj) == 1)
{
- pdf_drop_obj(entry->obj);
+ pdf_drop_obj(ctx, entry->obj);
entry->obj = NULL;
}
}
@@ -2723,7 +2755,7 @@ void pdf_clear_xref(pdf_document *doc)
}
}
-void pdf_clear_xref_to_mark(pdf_document *doc)
+void pdf_clear_xref_to_mark(fz_context *ctx, pdf_document *doc)
{
int x, e;
@@ -2742,9 +2774,9 @@ void pdf_clear_xref_to_mark(pdf_document *doc)
* been updated */
if (entry->obj != NULL && entry->stm_buf == NULL)
{
- if ((entry->flags & PDF_OBJ_FLAG_MARK) == 0 && pdf_obj_refs(entry->obj) == 1)
+ if ((entry->flags & PDF_OBJ_FLAG_MARK) == 0 && pdf_obj_refs(ctx, entry->obj) == 1)
{
- pdf_drop_obj(entry->obj);
+ pdf_drop_obj(ctx, entry->obj);
entry->obj = NULL;
}
}
diff --git a/source/tools/mjsgen.c b/source/tools/mjsgen.c
index 3e11fde3..d1366062 100644
--- a/source/tools/mjsgen.c
+++ b/source/tools/mjsgen.c
@@ -100,14 +100,14 @@ static void processpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_try(ctx)
{
- page = fz_load_page(doc, pagenum - 1);
+ page = fz_load_page(ctx, doc, pagenum - 1);
}
fz_catch(ctx)
{
fz_rethrow_message(ctx, "cannot load page %d in file '%s'", pagenum, filename);
}
- pdf_document *inter = pdf_specifics(doc);
+ pdf_document *inter = pdf_specifics(ctx, doc);
pdf_widget *widget = NULL;
if (inter)
@@ -220,7 +220,7 @@ static void processpage(fz_context *ctx, fz_document *doc, int pagenum)
static void processpages(fz_context *ctx, fz_document *doc)
{
int page, pagecount;
- pagecount = fz_count_pages(doc);
+ pagecount = fz_count_pages(ctx, doc);
for (page = 1; page <= pagecount; ++page)
processpage(ctx, doc, page);
}
@@ -232,7 +232,7 @@ int main(int argc, char **argv)
fz_context *ctx;
int c;
- fz_var(doc);
+ fz_var(ctx, doc);
while ((c = fz_getopt(argc, argv, "p:")) != -1)
{
@@ -269,7 +269,7 @@ int main(int argc, char **argv)
if (fz_needs_password(doc))
{
- if (!fz_authenticate_password(doc, password))
+ if (!fz_authenticate_password(ctx, doc, password))
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot authenticate password: %s", filename);
fprintf(mujstest_file, "PASSWORD %s\n", password);
}
@@ -278,7 +278,7 @@ int main(int argc, char **argv)
processpages(ctx, doc);
- fz_close_document(doc);
+ fz_drop_document(ctx, doc);
}
fz_catch(ctx)
{
@@ -287,7 +287,7 @@ int main(int argc, char **argv)
}
fclose(mujstest_file);
- fz_free_context(ctx);
+ fz_drop_context(ctx);
return 0;
}
diff --git a/source/tools/mudraw.c b/source/tools/mudraw.c
index 420ca1dc..b2feccf6 100644
--- a/source/tools/mudraw.c
+++ b/source/tools/mudraw.c
@@ -212,7 +212,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_try(ctx)
{
- page = fz_load_page(doc, pagenum - 1);
+ page = fz_load_page(ctx, doc, pagenum - 1);
}
fz_catch(ctx)
{
@@ -225,17 +225,17 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
{
list = fz_new_display_list(ctx);
dev = fz_new_list_device(ctx, list);
- fz_run_page(doc, page, dev, &fz_identity, &cookie);
+ fz_run_page(ctx, page, dev, &fz_identity, &cookie);
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
dev = NULL;
}
fz_catch(ctx)
{
fz_drop_display_list(ctx, list);
- fz_free_page(doc, page);
+ fz_drop_page(ctx, page);
fz_rethrow_message(ctx, "cannot draw page %d in file '%s'", pagenum, filename);
}
}
@@ -246,19 +246,19 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
{
dev = fz_new_trace_device(ctx);
if (list)
- fz_run_display_list(list, dev, &fz_identity, &fz_infinite_rect, &cookie);
+ fz_run_display_list(ctx, list, dev, &fz_identity, &fz_infinite_rect, &cookie);
else
- fz_run_page(doc, page, dev, &fz_identity, &cookie);
+ fz_run_page(ctx, page, dev, &fz_identity, &cookie);
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
dev = NULL;
}
fz_catch(ctx)
{
fz_drop_display_list(ctx, list);
- fz_free_page(doc, page);
+ fz_drop_page(ctx, page);
fz_rethrow(ctx);
}
}
@@ -274,12 +274,12 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
text = fz_new_text_page(ctx);
dev = fz_new_text_device(ctx, sheet, text);
if (showtext == TEXT_HTML)
- fz_disable_device_hints(dev, FZ_IGNORE_IMAGE);
+ fz_disable_device_hints(ctx, dev, FZ_IGNORE_IMAGE);
if (list)
- fz_run_display_list(list, dev, &fz_identity, &fz_infinite_rect, &cookie);
+ fz_run_display_list(ctx, list, dev, &fz_identity, &fz_infinite_rect, &cookie);
else
- fz_run_page(doc, page, dev, &fz_identity, &cookie);
- fz_free_device(dev);
+ fz_run_page(ctx, page, dev, &fz_identity, &cookie);
+ fz_drop_device(ctx, dev);
dev = NULL;
if (showtext == TEXT_XML)
{
@@ -293,19 +293,19 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
else if (showtext == TEXT_PLAIN)
{
fz_print_text_page(ctx, out, text);
- fz_printf(out, "\f\n");
+ fz_printf(ctx, out, "\f\n");
}
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
dev = NULL;
- fz_free_text_page(ctx, text);
+ fz_drop_text_page(ctx, text);
}
fz_catch(ctx)
{
fz_drop_display_list(ctx, list);
- fz_free_page(doc, page);
+ fz_drop_page(ctx, page);
fz_rethrow(ctx);
}
}
@@ -320,13 +320,13 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_try(ctx)
{
if (list)
- fz_run_display_list(list, dev, &fz_identity, &fz_infinite_rect, NULL);
+ fz_run_display_list(ctx, list, dev, &fz_identity, &fz_infinite_rect, NULL);
else
- fz_run_page(doc, page, dev, &fz_identity, &cookie);
+ fz_run_page(ctx, page, dev, &fz_identity, &cookie);
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
dev = NULL;
}
fz_catch(ctx)
@@ -342,36 +342,36 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_rect bounds, tbounds;
pdf_page *newpage;
- fz_bound_page(doc, page, &bounds);
+ fz_bound_page(ctx, page, &bounds);
fz_rotate(&ctm, rotation);
tbounds = bounds;
fz_transform_rect(&tbounds, &ctm);
- newpage = pdf_create_page(pdfout, bounds, 72, 0);
+ newpage = pdf_create_page(ctx, pdfout, bounds, 72, 0);
fz_try(ctx)
{
- dev = pdf_page_write(pdfout, newpage);
+ dev = pdf_page_write(ctx, pdfout, newpage);
if (list)
- fz_run_display_list(list, dev, &ctm, &tbounds, &cookie);
+ fz_run_display_list(ctx, list, dev, &ctm, &tbounds, &cookie);
else
- fz_run_page(doc, page, dev, &ctm, &cookie);
- fz_free_device(dev);
+ fz_run_page(ctx, page, dev, &ctm, &cookie);
+ fz_drop_device(ctx, dev);
dev = NULL;
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
dev = NULL;
}
fz_catch(ctx)
{
fz_drop_display_list(ctx, list);
- fz_free_page(doc, page);
+ fz_drop_page(ctx, page);
fz_rethrow(ctx);
}
- pdf_insert_page(pdfout, newpage, INT_MAX);
- pdf_free_page(pdfout, newpage);
+ pdf_insert_page(ctx, pdfout, newpage, INT_MAX);
+ fz_drop_page(ctx, &newpage->super);
}
if (output && output_format == OUT_SVG)
@@ -393,9 +393,9 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot open file '%s': %s", buf, strerror(errno));
}
- out = fz_new_output_with_file(ctx, file);
+ out = fz_new_output_with_file(ctx, file, 0);
- fz_bound_page(doc, page, &bounds);
+ fz_bound_page(ctx, page, &bounds);
zoom = resolution / 72;
fz_pre_rotate(fz_scale(&ctm, zoom, zoom), rotation);
tbounds = bounds;
@@ -405,24 +405,24 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
{
dev = fz_new_svg_device(ctx, out, tbounds.x1-tbounds.x0, tbounds.y1-tbounds.y0);
if (list)
- fz_run_display_list(list, dev, &ctm, &tbounds, &cookie);
+ fz_run_display_list(ctx, list, dev, &ctm, &tbounds, &cookie);
else
- fz_run_page(doc, page, dev, &ctm, &cookie);
- fz_free_device(dev);
+ fz_run_page(ctx, page, dev, &ctm, &cookie);
+ fz_drop_device(ctx, dev);
dev = NULL;
}
fz_always(ctx)
{
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
dev = NULL;
- fz_close_output(out);
+ fz_drop_output(ctx, out);
if (file != stdout)
fclose(file);
}
fz_catch(ctx)
{
fz_drop_display_list(ctx, list);
- fz_free_page(doc, page);
+ fz_drop_page(ctx, page);
fz_rethrow(ctx);
}
}
@@ -441,7 +441,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_var(pix);
fz_var(poc);
- fz_bound_page(doc, page, &bounds);
+ fz_bound_page(ctx, page, &bounds);
zoom = resolution / 72;
fz_pre_scale(fz_rotate(&ctm, rotation), zoom, zoom);
tbounds = bounds;
@@ -527,7 +527,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
if (output)
{
if (!strcmp(output, "-"))
- output_file = fz_new_output_with_file(ctx, stdout);
+ output_file = fz_new_output_with_file(ctx, stdout, 0);
else
{
sprintf(filename_buf, output, pagenum);
@@ -535,11 +535,11 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
}
if (output_format == OUT_PGM || output_format == OUT_PPM || output_format == OUT_PNM)
- fz_output_pnm_header(output_file, pix->w, totalheight, pix->n);
+ fz_output_pnm_header(ctx, output_file, pix->w, totalheight, pix->n);
else if (output_format == OUT_PAM)
- fz_output_pam_header(output_file, pix->w, totalheight, pix->n, savealpha);
+ fz_output_pam_header(ctx, output_file, pix->w, totalheight, pix->n, savealpha);
else if (output_format == OUT_PNG)
- poc = fz_output_png_header(output_file, pix->w, totalheight, pix->n, savealpha);
+ poc = fz_output_png_header(ctx, output_file, pix->w, totalheight, pix->n, savealpha);
}
for (band = 0; band < bands; band++)
@@ -551,12 +551,12 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
dev = fz_new_draw_device(ctx, pix);
if (alphabits == 0)
- fz_enable_device_hints(dev, FZ_DONT_INTERPOLATE_IMAGES);
+ fz_enable_device_hints(ctx, dev, FZ_DONT_INTERPOLATE_IMAGES);
if (list)
- fz_run_display_list(list, dev, &ctm, &tbounds, &cookie);
+ fz_run_display_list(ctx, list, dev, &ctm, &tbounds, &cookie);
else
- fz_run_page(doc, page, dev, &ctm, &cookie);
- fz_free_device(dev);
+ fz_run_page(ctx, page, dev, &ctm, &cookie);
+ fz_drop_device(ctx, dev);
dev = NULL;
if (invert)
@@ -570,11 +570,11 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
if (output)
{
if (output_format == OUT_PGM || output_format == OUT_PPM || output_format == OUT_PNM)
- fz_output_pnm_band(output_file, pix->w, totalheight, pix->n, band, drawheight, pix->samples);
+ fz_output_pnm_band(ctx, output_file, pix->w, totalheight, pix->n, band, drawheight, pix->samples);
else if (output_format == OUT_PAM)
- fz_output_pam_band(output_file, pix->w, totalheight, pix->n, band, drawheight, pix->samples, savealpha);
+ fz_output_pam_band(ctx, output_file, pix->w, totalheight, pix->n, band, drawheight, pix->samples, savealpha);
else if (output_format == OUT_PNG)
- fz_output_png_band(output_file, pix->w, totalheight, pix->n, band, drawheight, pix->samples, savealpha, poc);
+ fz_output_png_band(ctx, output_file, pix->w, totalheight, pix->n, band, drawheight, pix->samples, savealpha, poc);
else if (output_format == OUT_PWG)
{
if (strstr(output, "%d") != NULL)
@@ -625,7 +625,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
unsigned char digest[16];
int i;
- fz_md5_pixmap(pix, digest);
+ fz_md5_pixmap(ctx, pix, digest);
printf(" ");
for (i = 0; i < 16; i++)
printf("%02x", digest[i]);
@@ -636,19 +636,19 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
if (output)
{
if (output_format == OUT_PNG)
- fz_output_png_trailer(output_file, poc);
+ fz_output_png_trailer(ctx, output_file, poc);
}
- fz_free_device(dev);
+ fz_drop_device(ctx, dev);
dev = NULL;
fz_drop_pixmap(ctx, pix);
if (output_file)
- fz_close_output(output_file);
+ fz_drop_output(ctx, output_file);
}
fz_catch(ctx)
{
fz_drop_display_list(ctx, list);
- fz_free_page(doc, page);
+ fz_drop_page(ctx, page);
fz_rethrow(ctx);
}
}
@@ -656,7 +656,7 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
if (list)
fz_drop_display_list(ctx, list);
- fz_free_page(doc, page);
+ fz_drop_page(ctx, page);
if (showtime)
{
@@ -700,7 +700,7 @@ static void drawrange(fz_context *ctx, fz_document *doc, char *range)
int page, spage, epage, pagecount;
char *spec, *dash;
- pagecount = fz_count_pages(doc);
+ pagecount = fz_count_pages(ctx, doc);
spec = fz_strsep(&range, ",");
while (spec)
{
@@ -735,13 +735,13 @@ static void drawrange(fz_context *ctx, fz_document *doc, char *range)
static void drawoutline(fz_context *ctx, fz_document *doc)
{
- fz_outline *outline = fz_load_outline(doc);
+ fz_outline *outline = fz_load_outline(ctx, doc);
fz_output *out = NULL;
fz_var(out);
fz_try(ctx)
{
- out = fz_new_output_with_file(ctx, stdout);
+ out = fz_new_output_with_file(ctx, stdout, 0);
if (showoutline > 1)
fz_print_outline_xml(ctx, out, outline);
else
@@ -749,8 +749,8 @@ static void drawoutline(fz_context *ctx, fz_document *doc)
}
fz_always(ctx)
{
- fz_close_output(out);
- fz_free_outline(ctx, outline);
+ fz_drop_output(ctx, out);
+ fz_drop_outline(ctx, outline);
}
fz_catch(ctx)
{
@@ -1002,26 +1002,26 @@ int main(int argc, char **argv)
timing.maxfilename = "";
if (showxml || showtext)
- out = fz_new_output_with_file(ctx, stdout);
+ out = fz_new_output_with_file(ctx, stdout, 0);
if (showxml || showtext == TEXT_XML)
- fz_printf(out, "<?xml version=\"1.0\"?>\n");
+ fz_printf(ctx, out, "<?xml version=\"1.0\"?>\n");
if (showtext)
sheet = fz_new_text_sheet(ctx);
if (showtext == TEXT_HTML)
{
- fz_printf(out, "<style>\n");
- fz_printf(out, "body{background-color:gray;margin:12pt;}\n");
- fz_printf(out, "div.page{background-color:white;margin:6pt;padding:6pt;}\n");
- fz_printf(out, "div.block{border:1px solid gray;margin:6pt;padding:6pt;}\n");
- fz_printf(out, "div.metaline{display:table;width:100%%}\n");
- fz_printf(out, "div.line{display:table-row;padding:6pt}\n");
- fz_printf(out, "div.cell{display:table-cell;padding-left:6pt;padding-right:6pt}\n");
- fz_printf(out, "p{margin:0pt;padding:0pt;}\n");
- fz_printf(out, "</style>\n");
- fz_printf(out, "<body>\n");
+ fz_printf(ctx, out, "<style>\n");
+ fz_printf(ctx, out, "body{background-color:gray;margin:12pt;}\n");
+ fz_printf(ctx, out, "div.page{background-color:white;margin:6pt;padding:6pt;}\n");
+ fz_printf(ctx, out, "div.block{border:1px solid gray;margin:6pt;padding:6pt;}\n");
+ fz_printf(ctx, out, "div.metaline{display:table;width:100%%}\n");
+ fz_printf(ctx, out, "div.line{display:table-row;padding:6pt}\n");
+ fz_printf(ctx, out, "div.cell{display:table-cell;padding-left:6pt;padding-right:6pt}\n");
+ fz_printf(ctx, out, "p{margin:0pt;padding:0pt;}\n");
+ fz_printf(ctx, out, "</style>\n");
+ fz_printf(ctx, out, "<body>\n");
}
fz_try(ctx)
@@ -1044,14 +1044,14 @@ int main(int argc, char **argv)
fz_rethrow_message(ctx, "cannot open document: %s", filename);
}
- if (fz_needs_password(doc))
+ if (fz_needs_password(ctx, doc))
{
- if (!fz_authenticate_password(doc, password))
+ if (!fz_authenticate_password(ctx, doc, password))
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot authenticate password: %s", filename);
}
if (showxml || showtext == TEXT_XML)
- fz_printf(out, "<document name=\"%s\">\n", filename);
+ fz_printf(ctx, out, "<document name=\"%s\">\n", filename);
if (showoutline)
drawoutline(ctx, doc);
@@ -1065,9 +1065,9 @@ int main(int argc, char **argv)
}
if (showxml || showtext == TEXT_XML)
- fz_printf(out, "</document>\n");
+ fz_printf(ctx, out, "</document>\n");
- fz_close_document(doc);
+ fz_drop_document(ctx, doc);
doc = NULL;
}
fz_catch(ctx)
@@ -1075,7 +1075,7 @@ int main(int argc, char **argv)
if (!ignore_errors)
fz_rethrow(ctx);
- fz_close_document(doc);
+ fz_drop_document(ctx, doc);
doc = NULL;
fz_warn(ctx, "ignoring error in '%s'", filename);
}
@@ -1083,7 +1083,7 @@ int main(int argc, char **argv)
}
fz_catch(ctx)
{
- fz_close_document(doc);
+ fz_drop_document(ctx, doc);
fprintf(stderr, "error: cannot draw '%s'\n", filename);
errored = 1;
}
@@ -1092,24 +1092,24 @@ int main(int argc, char **argv)
{
fz_write_options opts = { 0 };
- pdf_write_document(pdfout, output, &opts);
- pdf_close_document(pdfout);
+ pdf_write_document(ctx, pdfout, output, &opts);
+ pdf_close_document(ctx, pdfout);
}
if (showtext == TEXT_HTML)
{
- fz_printf(out, "</body>\n");
- fz_printf(out, "<style>\n");
+ fz_printf(ctx, out, "</body>\n");
+ fz_printf(ctx, out, "<style>\n");
fz_print_text_sheet(ctx, out, sheet);
- fz_printf(out, "</style>\n");
+ fz_printf(ctx, out, "</style>\n");
}
if (showtext)
- fz_free_text_sheet(ctx, sheet);
+ fz_drop_text_sheet(ctx, sheet);
if (showxml || showtext)
{
- fz_close_output(out);
+ fz_drop_output(ctx, out);
out = NULL;
}
@@ -1131,7 +1131,7 @@ int main(int argc, char **argv)
}
}
- fz_free_context(ctx);
+ fz_drop_context(ctx);
if (showmemory)
{
diff --git a/source/tools/pdfclean.c b/source/tools/pdfclean.c
index d7d5ac97..07ca7e5a 100644
--- a/source/tools/pdfclean.c
+++ b/source/tools/pdfclean.c
@@ -36,15 +36,15 @@ static void usage(void)
}
static int
-string_in_names_list(pdf_obj *p, pdf_obj *names_list)
+string_in_names_list(fz_context *ctx, pdf_obj *p, pdf_obj *names_list)
{
- int n = pdf_array_len(names_list);
+ int n = pdf_array_len(ctx, names_list);
int i;
- char *str = pdf_to_str_buf(p);
+ char *str = pdf_to_str_buf(ctx, p);
for (i = 0; i < n ; i += 2)
{
- if (!strcmp(pdf_to_str_buf(pdf_array_get(names_list, i)), str))
+ if (!strcmp(pdf_to_str_buf(ctx, pdf_array_get(ctx, names_list, i)), str))
return 1;
}
return 0;
@@ -54,18 +54,18 @@ string_in_names_list(pdf_obj *p, pdf_obj *names_list)
* Recreate page tree to only retain specified pages.
*/
-static void retainpage(pdf_document *doc, pdf_obj *parent, pdf_obj *kids, int page)
+static void retainpage(fz_context *ctx, pdf_document *doc, pdf_obj *parent, pdf_obj *kids, int page)
{
- pdf_obj *pageref = pdf_lookup_page_obj(doc, page-1);
- pdf_obj *pageobj = pdf_resolve_indirect(pageref);
+ pdf_obj *pageref = pdf_lookup_page_obj(ctx, doc, page-1);
+ pdf_obj *pageobj = pdf_resolve_indirect(ctx, pageref);
- pdf_dict_puts(pageobj, "Parent", parent);
+ pdf_dict_puts(ctx, pageobj, "Parent", parent);
/* Store page object in new kids array */
- pdf_array_push(kids, pageref);
+ pdf_array_push(ctx, kids, pageref);
}
-static void retainpages(globals *glo, int argc, char **argv)
+static void retainpages(fz_context *ctx, globals *glo, int argc, char **argv)
{
pdf_obj *oldroot, *root, *pages, *kids, *countobj, *parent, *olddests;
pdf_document *doc = glo->doc;
@@ -76,21 +76,21 @@ static void retainpages(globals *glo, int argc, char **argv)
/* Keep only pages/type and (reduced) dest entries to avoid
* references to unretained pages */
- oldroot = pdf_dict_gets(pdf_trailer(doc), "Root");
- pages = pdf_dict_gets(oldroot, "Pages");
- olddests = pdf_load_name_tree(doc, "Dests");
+ oldroot = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pages = pdf_dict_gets(ctx, oldroot, "Pages");
+ olddests = pdf_load_name_tree(ctx, doc, "Dests");
- root = pdf_new_dict(doc, 2);
- pdf_dict_puts(root, "Type", pdf_dict_gets(oldroot, "Type"));
- pdf_dict_puts(root, "Pages", pdf_dict_gets(oldroot, "Pages"));
+ root = pdf_new_dict(ctx, doc, 2);
+ pdf_dict_puts(ctx, root, "Type", pdf_dict_gets(ctx, oldroot, "Type"));
+ pdf_dict_puts(ctx, root, "Pages", pdf_dict_gets(ctx, oldroot, "Pages"));
- pdf_update_object(doc, pdf_to_num(oldroot), root);
+ pdf_update_object(ctx, doc, pdf_to_num(ctx, oldroot), root);
- pdf_drop_obj(root);
+ pdf_drop_obj(ctx, root);
/* Create a new kids array with only the pages we want to keep */
- parent = pdf_new_indirect(doc, pdf_to_num(pages), pdf_to_gen(pages));
- kids = pdf_new_array(doc, 1);
+ parent = pdf_new_indirect(ctx, doc, pdf_to_num(ctx, pages), pdf_to_gen(ctx, pages));
+ kids = pdf_new_array(ctx, doc, 1);
/* Retain pages specified */
while (argc - argidx)
@@ -99,7 +99,7 @@ static void retainpages(globals *glo, int argc, char **argv)
char *spec, *dash;
char *pagelist = argv[argidx];
- pagecount = pdf_count_pages(doc);
+ pagecount = pdf_count_pages(ctx, doc);
spec = fz_strsep(&pagelist, ",");
while (spec)
{
@@ -123,10 +123,10 @@ static void retainpages(globals *glo, int argc, char **argv)
if (spage < epage)
for (page = spage; page <= epage; ++page)
- retainpage(doc, parent, kids, page);
+ retainpage(ctx, doc, parent, kids, page);
else
for (page = spage; page >= epage; --page)
- retainpage(doc, parent, kids, page);
+ retainpage(ctx, doc, parent, kids, page);
spec = fz_strsep(&pagelist, ",");
}
@@ -134,49 +134,49 @@ static void retainpages(globals *glo, int argc, char **argv)
argidx++;
}
- pdf_drop_obj(parent);
+ pdf_drop_obj(ctx, parent);
/* Update page count and kids array */
- countobj = pdf_new_int(doc, pdf_array_len(kids));
- pdf_dict_puts(pages, "Count", countobj);
- pdf_drop_obj(countobj);
- pdf_dict_puts(pages, "Kids", kids);
- pdf_drop_obj(kids);
+ countobj = pdf_new_int(ctx, doc, pdf_array_len(ctx, kids));
+ pdf_dict_puts(ctx, pages, "Count", countobj);
+ pdf_drop_obj(ctx, countobj);
+ pdf_dict_puts(ctx, pages, "Kids", kids);
+ pdf_drop_obj(ctx, kids);
/* Also preserve the (partial) Dests name tree */
if (olddests)
{
- pdf_obj *names = pdf_new_dict(doc, 1);
- pdf_obj *dests = pdf_new_dict(doc, 1);
- int len = pdf_dict_len(olddests);
+ pdf_obj *names = pdf_new_dict(ctx, doc, 1);
+ pdf_obj *dests = pdf_new_dict(ctx, doc, 1);
+ int len = pdf_dict_len(ctx, olddests);
- names_list = pdf_new_array(doc, 32);
+ names_list = pdf_new_array(ctx, doc, 32);
for (i = 0; i < len; i++)
{
- pdf_obj *key = pdf_dict_get_key(olddests, i);
- pdf_obj *val = pdf_dict_get_val(olddests, i);
- pdf_obj *dest = pdf_dict_gets(val, "D");
+ pdf_obj *key = pdf_dict_get_key(ctx, olddests, i);
+ pdf_obj *val = pdf_dict_get_val(ctx, olddests, i);
+ pdf_obj *dest = pdf_dict_gets(ctx, val, "D");
- dest = pdf_array_get(dest ? dest : val, 0);
- if (pdf_array_contains(pdf_dict_gets(pages, "Kids"), dest))
+ dest = pdf_array_get(ctx, dest ? dest : val, 0);
+ if (pdf_array_contains(ctx, pdf_dict_gets(ctx, pages, "Kids"), dest))
{
- pdf_obj *key_str = pdf_new_string(doc, pdf_to_name(key), strlen(pdf_to_name(key)));
- pdf_array_push(names_list, key_str);
- pdf_array_push(names_list, val);
- pdf_drop_obj(key_str);
+ pdf_obj *key_str = pdf_new_string(ctx, doc, pdf_to_name(ctx, key), strlen(pdf_to_name(ctx, key)));
+ pdf_array_push(ctx, names_list, key_str);
+ pdf_array_push(ctx, names_list, val);
+ pdf_drop_obj(ctx, key_str);
}
}
- root = pdf_dict_gets(pdf_trailer(doc), "Root");
- pdf_dict_puts(dests, "Names", names_list);
- pdf_dict_puts(names, "Dests", dests);
- pdf_dict_puts(root, "Names", names);
+ root = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pdf_dict_puts(ctx, dests, "Names", names_list);
+ pdf_dict_puts(ctx, names, "Dests", dests);
+ pdf_dict_puts(ctx, root, "Names", names);
- pdf_drop_obj(names);
- pdf_drop_obj(dests);
- pdf_drop_obj(names_list);
- pdf_drop_obj(olddests);
+ pdf_drop_obj(ctx, names);
+ pdf_drop_obj(ctx, dests);
+ pdf_drop_obj(ctx, names_list);
+ pdf_drop_obj(ctx, olddests);
}
/* Force the next call to pdf_count_pages to recount */
@@ -184,36 +184,36 @@ static void retainpages(globals *glo, int argc, char **argv)
/* Edit each pages /Annot list to remove any links that point to
* nowhere. */
- pagecount = pdf_count_pages(doc);
+ pagecount = pdf_count_pages(ctx, doc);
for (i = 0; i < pagecount; i++)
{
- pdf_obj *pageref = pdf_lookup_page_obj(doc, i);
- pdf_obj *pageobj = pdf_resolve_indirect(pageref);
+ pdf_obj *pageref = pdf_lookup_page_obj(ctx, doc, i);
+ pdf_obj *pageobj = pdf_resolve_indirect(ctx, pageref);
- pdf_obj *annots = pdf_dict_gets(pageobj, "Annots");
+ pdf_obj *annots = pdf_dict_gets(ctx, pageobj, "Annots");
- int len = pdf_array_len(annots);
+ int len = pdf_array_len(ctx, annots);
int j;
for (j = 0; j < len; j++)
{
- pdf_obj *o = pdf_array_get(annots, j);
+ pdf_obj *o = pdf_array_get(ctx, annots, j);
pdf_obj *p;
- if (strcmp(pdf_to_name(pdf_dict_gets(o, "Subtype")), "Link"))
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, o, "Subtype")), "Link"))
continue;
- p = pdf_dict_gets(o, "A");
- if (strcmp(pdf_to_name(pdf_dict_gets(p, "S")), "GoTo"))
+ p = pdf_dict_gets(ctx, o, "A");
+ if (strcmp(pdf_to_name(ctx, pdf_dict_gets(ctx, p, "S")), "GoTo"))
continue;
- if (string_in_names_list(pdf_dict_gets(p, "D"), names_list))
+ if (string_in_names_list(ctx, pdf_dict_gets(ctx, p, "D"), names_list))
continue;
/* FIXME: Should probably look at Next too */
/* Remove this annotation */
- pdf_array_delete(annots, j);
+ pdf_array_delete(ctx, annots, j);
j--;
}
}
@@ -228,19 +228,19 @@ void pdfclean_clean(fz_context *ctx, char *infile, char *outfile, char *password
fz_try(ctx)
{
glo.doc = pdf_open_document_no_run(ctx, infile);
- if (pdf_needs_password(glo.doc))
- if (!pdf_authenticate_password(glo.doc, password))
+ if (pdf_needs_password(ctx, glo.doc))
+ if (!pdf_authenticate_password(ctx, glo.doc, password))
fz_throw(glo.ctx, FZ_ERROR_GENERIC, "cannot authenticate password: %s", infile);
/* Only retain the specified subset of the pages */
if (argc)
- retainpages(&glo, argc, argv);
+ retainpages(ctx, &glo, argc, argv);
- pdf_write_document(glo.doc, outfile, opts);
+ pdf_write_document(ctx, glo.doc, outfile, opts);
}
fz_always(ctx)
{
- pdf_close_document(glo.doc);
+ pdf_close_document(ctx, glo.doc);
}
fz_catch(ctx)
{
@@ -310,7 +310,7 @@ int pdfclean_main(int argc, char **argv)
{
errors++;
}
- fz_free_context(ctx);
+ fz_drop_context(ctx);
return errors == 0;
}
diff --git a/source/tools/pdfextract.c b/source/tools/pdfextract.c
index 0304845f..ce293cfd 100644
--- a/source/tools/pdfextract.c
+++ b/source/tools/pdfextract.c
@@ -18,14 +18,14 @@ static void usage(void)
static int isimage(pdf_obj *obj)
{
- pdf_obj *type = pdf_dict_gets(obj, "Subtype");
- return pdf_is_name(type) && !strcmp(pdf_to_name(type), "Image");
+ pdf_obj *type = pdf_dict_gets(ctx, obj, "Subtype");
+ return pdf_is_name(ctx, type) && !strcmp(pdf_to_name(ctx, type), "Image");
}
static int isfontdesc(pdf_obj *obj)
{
- pdf_obj *type = pdf_dict_gets(obj, "Type");
- return pdf_is_name(type) && !strcmp(pdf_to_name(type), "FontDescriptor");
+ pdf_obj *type = pdf_dict_gets(ctx, obj, "Type");
+ return pdf_is_name(ctx, type) && !strcmp(pdf_to_name(ctx, type), "FontDescriptor");
}
static void writepixmap(fz_context *ctx, fz_pixmap *pix, char *file, int rgb)
@@ -67,11 +67,11 @@ static void saveimage(int num)
pdf_obj *ref;
char buf[32];
- ref = pdf_new_indirect(doc, num, 0);
+ ref = pdf_new_indirect(ctx, doc, num, 0);
/* TODO: detect DCTD and save as jpeg */
- image = pdf_load_image(doc, ref);
+ image = pdf_load_image(ctx, doc, ref);
pix = fz_new_pixmap_from_image(ctx, image, 0, 0);
fz_drop_image(ctx, image);
@@ -79,7 +79,7 @@ static void saveimage(int num)
writepixmap(ctx, pix, buf, dorgb);
fz_drop_pixmap(ctx, pix);
- pdf_drop_obj(ref);
+ pdf_drop_obj(ctx, ref);
}
static void savefont(pdf_obj *dict, int num)
@@ -95,34 +95,34 @@ static void savefont(pdf_obj *dict, int num)
int n, len;
unsigned char *data;
- obj = pdf_dict_gets(dict, "FontName");
+ obj = pdf_dict_gets(ctx, dict, "FontName");
if (obj)
- fontname = pdf_to_name(obj);
+ fontname = pdf_to_name(ctx, obj);
- obj = pdf_dict_gets(dict, "FontFile");
+ obj = pdf_dict_gets(ctx, dict, "FontFile");
if (obj)
{
stream = obj;
ext = "pfa";
}
- obj = pdf_dict_gets(dict, "FontFile2");
+ obj = pdf_dict_gets(ctx, dict, "FontFile2");
if (obj)
{
stream = obj;
ext = "ttf";
}
- obj = pdf_dict_gets(dict, "FontFile3");
+ obj = pdf_dict_gets(ctx, dict, "FontFile3");
if (obj)
{
stream = obj;
- obj = pdf_dict_gets(obj, "Subtype");
- if (obj && !pdf_is_name(obj))
+ obj = pdf_dict_gets(ctx, obj, "Subtype");
+ if (obj && !pdf_is_name(ctx, obj))
fz_throw(ctx, FZ_ERROR_GENERIC, "invalid font descriptor subtype");
- subtype = pdf_to_name(obj);
+ subtype = pdf_to_name(ctx, obj);
if (!strcmp(subtype, "Type1C"))
ext = "cff";
else if (!strcmp(subtype, "CIDFontType0C"))
@@ -139,7 +139,7 @@ static void savefont(pdf_obj *dict, int num)
return;
}
- buf = pdf_load_stream(doc, pdf_to_num(stream), pdf_to_gen(stream));
+ buf = pdf_load_stream(ctx, doc, pdf_to_num(ctx, stream), pdf_to_gen(ctx, stream));
snprintf(namebuf, sizeof(namebuf), "%s-%04d.%s", fontname, num, ext);
printf("extracting font %s\n", namebuf);
@@ -168,14 +168,14 @@ static void showobject(int num)
fz_try(ctx)
{
- obj = pdf_load_object(doc, num, 0);
+ obj = pdf_load_object(ctx, doc, num, 0);
if (isimage(obj))
saveimage(num);
else if (isfontdesc(obj))
savefont(obj, num);
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
fz_catch(ctx)
{
@@ -212,14 +212,14 @@ int pdfextract_main(int argc, char **argv)
}
doc = pdf_open_document_no_run(ctx, infile);
- if (pdf_needs_password(doc))
- if (!pdf_authenticate_password(doc, password))
+ if (pdf_needs_password(ctx, doc))
+ if (!pdf_authenticate_password(ctx, doc, password))
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot authenticate password: %s", infile);
if (fz_optind == argc)
{
- int len = pdf_count_objects(doc);
- for (o = 0; o < len; o++)
+ int len = pdf_count_objects(ctx, doc);
+ for (o = 1; o < len; o++)
showobject(o);
}
else
@@ -231,8 +231,8 @@ int pdfextract_main(int argc, char **argv)
}
}
- pdf_close_document(doc);
+ pdf_close_document(ctx, doc);
fz_flush_warnings(ctx);
- fz_free_context(ctx);
+ fz_drop_context(ctx);
return 0;
}
diff --git a/source/tools/pdfinfo.c b/source/tools/pdfinfo.c
index ff05012f..41989982 100644
--- a/source/tools/pdfinfo.c
+++ b/source/tools/pdfinfo.c
@@ -87,62 +87,62 @@ typedef struct globals_s
int psobjs;
} globals;
-static void closexref(globals *glo)
+static void closexref(fz_context *ctx, globals *glo)
{
int i;
if (glo->doc)
{
- pdf_close_document(glo->doc);
+ pdf_close_document(ctx, glo->doc);
glo->doc = NULL;
}
if (glo->dim)
{
for (i = 0; i < glo->dims; i++)
- fz_free(glo->ctx, glo->dim[i].u.dim.bbox);
- fz_free(glo->ctx, glo->dim);
+ fz_free(ctx, glo->dim[i].u.dim.bbox);
+ fz_free(ctx, glo->dim);
glo->dim = NULL;
glo->dims = 0;
}
if (glo->font)
{
- fz_free(glo->ctx, glo->font);
+ fz_free(ctx, glo->font);
glo->font = NULL;
glo->fonts = 0;
}
if (glo->image)
{
- fz_free(glo->ctx, glo->image);
+ fz_free(ctx, glo->image);
glo->image = NULL;
glo->images = 0;
}
if (glo->shading)
{
- fz_free(glo->ctx, glo->shading);
+ fz_free(ctx, glo->shading);
glo->shading = NULL;
glo->shadings = 0;
}
if (glo->pattern)
{
- fz_free(glo->ctx, glo->pattern);
+ fz_free(ctx, glo->pattern);
glo->pattern = NULL;
glo->patterns = 0;
}
if (glo->form)
{
- fz_free(glo->ctx, glo->form);
+ fz_free(ctx, glo->form);
glo->form = NULL;
glo->forms = 0;
}
if (glo->psobj)
{
- fz_free(glo->ctx, glo->psobj);
+ fz_free(ctx, glo->psobj);
glo->psobj = NULL;
glo->psobjs = 0;
}
@@ -164,48 +164,48 @@ infousage(void)
}
static void
-showglobalinfo(globals *glo)
+showglobalinfo(fz_context *ctx, globals *glo)
{
pdf_obj *obj;
fz_output *out = glo->out;
pdf_document *doc = glo->doc;
- fz_printf(out, "\nPDF-%d.%d\n", doc->version / 10, doc->version % 10);
+ fz_printf(ctx, out, "\nPDF-%d.%d\n", doc->version / 10, doc->version % 10);
- obj = pdf_dict_gets(pdf_trailer(doc), "Info");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Info");
if (obj)
{
- fz_printf(out, "Info object (%d %d R):\n", pdf_to_num(obj), pdf_to_gen(obj));
- pdf_output_obj(out, pdf_resolve_indirect(obj), 1);
+ fz_printf(ctx, out, "Info object (%d %d R):\n", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
+ pdf_output_obj(ctx, out, pdf_resolve_indirect(ctx, obj), 1);
}
- obj = pdf_dict_gets(pdf_trailer(doc), "Encrypt");
+ obj = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Encrypt");
if (obj)
{
- fz_printf(out, "\nEncryption object (%d %d R):\n", pdf_to_num(obj), pdf_to_gen(obj));
- pdf_output_obj(out, pdf_resolve_indirect(obj), 1);
+ fz_printf(ctx, out, "\nEncryption object (%d %d R):\n", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
+ pdf_output_obj(ctx, out, pdf_resolve_indirect(ctx, obj), 1);
}
- fz_printf(out, "\nPages: %d\n\n", glo->pagecount);
+ fz_printf(ctx, out, "\nPages: %d\n\n", glo->pagecount);
}
static void
-gatherdimensions(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj)
+gatherdimensions(fz_context *ctx, globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj)
{
fz_rect bbox;
pdf_obj *obj;
int j;
- obj = pdf_dict_gets(pageobj, "MediaBox");
- if (!pdf_is_array(obj))
+ obj = pdf_dict_gets(ctx, pageobj, "MediaBox");
+ if (!pdf_is_array(ctx, obj))
return;
- pdf_to_rect(glo->ctx, obj, &bbox);
+ pdf_to_rect(ctx, obj, &bbox);
- obj = pdf_dict_gets(pageobj, "UserUnit");
- if (pdf_is_real(obj))
+ obj = pdf_dict_gets(ctx, pageobj, "UserUnit");
+ if (pdf_is_real(ctx, obj))
{
- float unit = pdf_to_real(obj);
+ float unit = pdf_to_real(ctx, obj);
bbox.x0 *= unit;
bbox.y0 *= unit;
bbox.x1 *= unit;
@@ -219,24 +219,24 @@ gatherdimensions(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj)
if (j < glo->dims)
return;
- glo->dim = fz_resize_array(glo->ctx, glo->dim, glo->dims+1, sizeof(struct info));
+ glo->dim = fz_resize_array(ctx, glo->dim, glo->dims+1, sizeof(struct info));
glo->dims++;
glo->dim[glo->dims - 1].page = page;
glo->dim[glo->dims - 1].pageref = pageref;
glo->dim[glo->dims - 1].pageobj = pageobj;
- glo->dim[glo->dims - 1].u.dim.bbox = fz_malloc(glo->ctx, sizeof(fz_rect));
+ glo->dim[glo->dims - 1].u.dim.bbox = fz_malloc(ctx, sizeof(fz_rect));
memcpy(glo->dim[glo->dims - 1].u.dim.bbox, &bbox, sizeof (fz_rect));
return;
}
static void
-gatherfonts(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj *dict)
+gatherfonts(fz_context *ctx, globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj *dict)
{
int i, n;
- n = pdf_dict_len(dict);
+ n = pdf_dict_len(ctx, dict);
for (i = 0; i < n; i++)
{
pdf_obj *fontdict = NULL;
@@ -245,26 +245,26 @@ gatherfonts(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj
pdf_obj *name = NULL;
int k;
- fontdict = pdf_dict_get_val(dict, i);
- if (!pdf_is_dict(fontdict))
+ fontdict = pdf_dict_get_val(ctx, dict, i);
+ if (!pdf_is_dict(ctx, fontdict))
{
- fz_warn(glo->ctx, "not a font dict (%d %d R)", pdf_to_num(fontdict), pdf_to_gen(fontdict));
+ fz_warn(ctx, "not a font dict (%d %d R)", pdf_to_num(ctx, fontdict), pdf_to_gen(ctx, fontdict));
continue;
}
- subtype = pdf_dict_gets(fontdict, "Subtype");
- basefont = pdf_dict_gets(fontdict, "BaseFont");
- if (!basefont || pdf_is_null(basefont))
- name = pdf_dict_gets(fontdict, "Name");
+ subtype = pdf_dict_gets(ctx, fontdict, "Subtype");
+ basefont = pdf_dict_gets(ctx, fontdict, "BaseFont");
+ if (!basefont || pdf_is_null(ctx, basefont))
+ name = pdf_dict_gets(ctx, fontdict, "Name");
for (k = 0; k < glo->fonts; k++)
- if (!pdf_objcmp(glo->font[k].u.font.obj, fontdict))
+ if (!pdf_objcmp(ctx, glo->font[k].u.font.obj, fontdict))
break;
if (k < glo->fonts)
continue;
- glo->font = fz_resize_array(glo->ctx, glo->font, glo->fonts+1, sizeof(struct info));
+ glo->font = fz_resize_array(ctx, glo->font, glo->fonts+1, sizeof(struct info));
glo->fonts++;
glo->font[glo->fonts - 1].page = page;
@@ -277,11 +277,11 @@ gatherfonts(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj
}
static void
-gatherimages(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj *dict)
+gatherimages(fz_context *ctx, globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj *dict)
{
int i, n;
- n = pdf_dict_len(dict);
+ n = pdf_dict_len(ctx, dict);
for (i = 0; i < n; i++)
{
pdf_obj *imagedict;
@@ -294,46 +294,46 @@ gatherimages(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj
pdf_obj *altcs;
int k;
- imagedict = pdf_dict_get_val(dict, i);
- if (!pdf_is_dict(imagedict))
+ imagedict = pdf_dict_get_val(ctx, dict, i);
+ if (!pdf_is_dict(ctx, imagedict))
{
- fz_warn(glo->ctx, "not an image dict (%d %d R)", pdf_to_num(imagedict), pdf_to_gen(imagedict));
+ fz_warn(ctx, "not an image dict (%d %d R)", pdf_to_num(ctx, imagedict), pdf_to_gen(ctx, imagedict));
continue;
}
- type = pdf_dict_gets(imagedict, "Subtype");
- if (strcmp(pdf_to_name(type), "Image"))
+ type = pdf_dict_gets(ctx, imagedict, "Subtype");
+ if (strcmp(pdf_to_name(ctx, type), "Image"))
continue;
- filter = pdf_dict_gets(imagedict, "Filter");
+ filter = pdf_dict_gets(ctx, imagedict, "Filter");
altcs = NULL;
- cs = pdf_dict_gets(imagedict, "ColorSpace");
- if (pdf_is_array(cs))
+ cs = pdf_dict_gets(ctx, imagedict, "ColorSpace");
+ if (pdf_is_array(ctx, cs))
{
pdf_obj *cses = cs;
- cs = pdf_array_get(cses, 0);
- if (pdf_is_name(cs) && (!strcmp(pdf_to_name(cs), "DeviceN") || !strcmp(pdf_to_name(cs), "Separation")))
+ cs = pdf_array_get(ctx, cses, 0);
+ if (pdf_is_name(ctx, cs) && (!strcmp(pdf_to_name(ctx, cs), "DeviceN") || !strcmp(pdf_to_name(ctx, cs), "Separation")))
{
- altcs = pdf_array_get(cses, 2);
- if (pdf_is_array(altcs))
- altcs = pdf_array_get(altcs, 0);
+ altcs = pdf_array_get(ctx, cses, 2);
+ if (pdf_is_array(ctx, altcs))
+ altcs = pdf_array_get(ctx, altcs, 0);
}
}
- width = pdf_dict_gets(imagedict, "Width");
- height = pdf_dict_gets(imagedict, "Height");
- bpc = pdf_dict_gets(imagedict, "BitsPerComponent");
+ width = pdf_dict_gets(ctx, imagedict, "Width");
+ height = pdf_dict_gets(ctx, imagedict, "Height");
+ bpc = pdf_dict_gets(ctx, imagedict, "BitsPerComponent");
for (k = 0; k < glo->images; k++)
- if (!pdf_objcmp(glo->image[k].u.image.obj, imagedict))
+ if (!pdf_objcmp(ctx, glo->image[k].u.image.obj, imagedict))
break;
if (k < glo->images)
continue;
- glo->image = fz_resize_array(glo->ctx, glo->image, glo->images+1, sizeof(struct info));
+ glo->image = fz_resize_array(ctx, glo->image, glo->images+1, sizeof(struct info));
glo->images++;
glo->image[glo->images - 1].page = page;
@@ -350,11 +350,11 @@ gatherimages(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj
}
static void
-gatherforms(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj *dict)
+gatherforms(fz_context *ctx, globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj *dict)
{
int i, n;
- n = pdf_dict_len(dict);
+ n = pdf_dict_len(ctx, dict);
for (i = 0; i < n; i++)
{
pdf_obj *xobjdict;
@@ -365,33 +365,33 @@ gatherforms(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj
pdf_obj *reference;
int k;
- xobjdict = pdf_dict_get_val(dict, i);
- if (!pdf_is_dict(xobjdict))
+ xobjdict = pdf_dict_get_val(ctx, dict, i);
+ if (!pdf_is_dict(ctx, xobjdict))
{
- fz_warn(glo->ctx, "not a xobject dict (%d %d R)", pdf_to_num(xobjdict), pdf_to_gen(xobjdict));
+ fz_warn(ctx, "not a xobject dict (%d %d R)", pdf_to_num(ctx, xobjdict), pdf_to_gen(ctx, xobjdict));
continue;
}
- type = pdf_dict_gets(xobjdict, "Subtype");
- if (strcmp(pdf_to_name(type), "Form"))
+ type = pdf_dict_gets(ctx, xobjdict, "Subtype");
+ if (strcmp(pdf_to_name(ctx, type), "Form"))
continue;
- subtype = pdf_dict_gets(xobjdict, "Subtype2");
- if (!strcmp(pdf_to_name(subtype), "PS"))
+ subtype = pdf_dict_gets(ctx, xobjdict, "Subtype2");
+ if (!strcmp(pdf_to_name(ctx, subtype), "PS"))
continue;
- group = pdf_dict_gets(xobjdict, "Group");
- groupsubtype = pdf_dict_gets(group, "S");
- reference = pdf_dict_gets(xobjdict, "Ref");
+ group = pdf_dict_gets(ctx, xobjdict, "Group");
+ groupsubtype = pdf_dict_gets(ctx, group, "S");
+ reference = pdf_dict_gets(ctx, xobjdict, "Ref");
for (k = 0; k < glo->forms; k++)
- if (!pdf_objcmp(glo->form[k].u.form.obj, xobjdict))
+ if (!pdf_objcmp(ctx, glo->form[k].u.form.obj, xobjdict))
break;
if (k < glo->forms)
continue;
- glo->form = fz_resize_array(glo->ctx, glo->form, glo->forms+1, sizeof(struct info));
+ glo->form = fz_resize_array(ctx, glo->form, glo->forms+1, sizeof(struct info));
glo->forms++;
glo->form[glo->forms - 1].page = page;
@@ -404,11 +404,11 @@ gatherforms(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj
}
static void
-gatherpsobjs(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj *dict)
+gatherpsobjs(fz_context *ctx, globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj *dict)
{
int i, n;
- n = pdf_dict_len(dict);
+ n = pdf_dict_len(ctx, dict);
for (i = 0; i < n; i++)
{
pdf_obj *xobjdict;
@@ -416,27 +416,27 @@ gatherpsobjs(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj
pdf_obj *subtype;
int k;
- xobjdict = pdf_dict_get_val(dict, i);
- if (!pdf_is_dict(xobjdict))
+ xobjdict = pdf_dict_get_val(ctx, dict, i);
+ if (!pdf_is_dict(ctx, xobjdict))
{
- fz_warn(glo->ctx, "not a xobject dict (%d %d R)", pdf_to_num(xobjdict), pdf_to_gen(xobjdict));
+ fz_warn(ctx, "not a xobject dict (%d %d R)", pdf_to_num(ctx, xobjdict), pdf_to_gen(ctx, xobjdict));
continue;
}
- type = pdf_dict_gets(xobjdict, "Subtype");
- subtype = pdf_dict_gets(xobjdict, "Subtype2");
- if (strcmp(pdf_to_name(type), "PS") &&
- (strcmp(pdf_to_name(type), "Form") || strcmp(pdf_to_name(subtype), "PS")))
+ type = pdf_dict_gets(ctx, xobjdict, "Subtype");
+ subtype = pdf_dict_gets(ctx, xobjdict, "Subtype2");
+ if (strcmp(pdf_to_name(ctx, type), "PS") &&
+ (strcmp(pdf_to_name(ctx, type), "Form") || strcmp(pdf_to_name(ctx, subtype), "PS")))
continue;
for (k = 0; k < glo->psobjs; k++)
- if (!pdf_objcmp(glo->psobj[k].u.form.obj, xobjdict))
+ if (!pdf_objcmp(ctx, glo->psobj[k].u.form.obj, xobjdict))
break;
if (k < glo->psobjs)
continue;
- glo->psobj = fz_resize_array(glo->ctx, glo->psobj, glo->psobjs+1, sizeof(struct info));
+ glo->psobj = fz_resize_array(ctx, glo->psobj, glo->psobjs+1, sizeof(struct info));
glo->psobjs++;
glo->psobj[glo->psobjs - 1].page = page;
@@ -447,39 +447,39 @@ gatherpsobjs(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj
}
static void
-gathershadings(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj *dict)
+gathershadings(fz_context *ctx, globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj *dict)
{
int i, n;
- n = pdf_dict_len(dict);
+ n = pdf_dict_len(ctx, dict);
for (i = 0; i < n; i++)
{
pdf_obj *shade;
pdf_obj *type;
int k;
- shade = pdf_dict_get_val(dict, i);
- if (!pdf_is_dict(shade))
+ shade = pdf_dict_get_val(ctx, dict, i);
+ if (!pdf_is_dict(ctx, shade))
{
- fz_warn(glo->ctx, "not a shading dict (%d %d R)", pdf_to_num(shade), pdf_to_gen(shade));
+ fz_warn(ctx, "not a shading dict (%d %d R)", pdf_to_num(ctx, shade), pdf_to_gen(ctx, shade));
continue;
}
- type = pdf_dict_gets(shade, "ShadingType");
- if (!pdf_is_int(type) || pdf_to_int(type) < 1 || pdf_to_int(type) > 7)
+ type = pdf_dict_gets(ctx, shade, "ShadingType");
+ if (!pdf_is_int(ctx, type) || pdf_to_int(ctx, type) < 1 || pdf_to_int(ctx, type) > 7)
{
- fz_warn(glo->ctx, "not a shading type (%d %d R)", pdf_to_num(shade), pdf_to_gen(shade));
+ fz_warn(ctx, "not a shading type (%d %d R)", pdf_to_num(ctx, shade), pdf_to_gen(ctx, shade));
type = NULL;
}
for (k = 0; k < glo->shadings; k++)
- if (!pdf_objcmp(glo->shading[k].u.shading.obj, shade))
+ if (!pdf_objcmp(ctx, glo->shading[k].u.shading.obj, shade))
break;
if (k < glo->shadings)
continue;
- glo->shading = fz_resize_array(glo->ctx, glo->shading, glo->shadings+1, sizeof(struct info));
+ glo->shading = fz_resize_array(ctx, glo->shading, glo->shadings+1, sizeof(struct info));
glo->shadings++;
glo->shading[glo->shadings - 1].page = page;
@@ -491,11 +491,11 @@ gathershadings(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_o
}
static void
-gatherpatterns(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj *dict)
+gatherpatterns(fz_context *ctx, globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_obj *dict)
{
int i, n;
- n = pdf_dict_len(dict);
+ n = pdf_dict_len(ctx, dict);
for (i = 0; i < n; i++)
{
pdf_obj *patterndict;
@@ -505,49 +505,49 @@ gatherpatterns(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_o
pdf_obj *shading = NULL;
int k;
- patterndict = pdf_dict_get_val(dict, i);
- if (!pdf_is_dict(patterndict))
+ patterndict = pdf_dict_get_val(ctx, dict, i);
+ if (!pdf_is_dict(ctx, patterndict))
{
- fz_warn(glo->ctx, "not a pattern dict (%d %d R)", pdf_to_num(patterndict), pdf_to_gen(patterndict));
+ fz_warn(ctx, "not a pattern dict (%d %d R)", pdf_to_num(ctx, patterndict), pdf_to_gen(ctx, patterndict));
continue;
}
- type = pdf_dict_gets(patterndict, "PatternType");
- if (!pdf_is_int(type) || pdf_to_int(type) < 1 || pdf_to_int(type) > 2)
+ type = pdf_dict_gets(ctx, patterndict, "PatternType");
+ if (!pdf_is_int(ctx, type) || pdf_to_int(ctx, type) < 1 || pdf_to_int(ctx, type) > 2)
{
- fz_warn(glo->ctx, "not a pattern type (%d %d R)", pdf_to_num(patterndict), pdf_to_gen(patterndict));
+ fz_warn(ctx, "not a pattern type (%d %d R)", pdf_to_num(ctx, patterndict), pdf_to_gen(ctx, patterndict));
type = NULL;
}
- if (pdf_to_int(type) == 1)
+ if (pdf_to_int(ctx, type) == 1)
{
- paint = pdf_dict_gets(patterndict, "PaintType");
- if (!pdf_is_int(paint) || pdf_to_int(paint) < 1 || pdf_to_int(paint) > 2)
+ paint = pdf_dict_gets(ctx, patterndict, "PaintType");
+ if (!pdf_is_int(ctx, paint) || pdf_to_int(ctx, paint) < 1 || pdf_to_int(ctx, paint) > 2)
{
- fz_warn(glo->ctx, "not a pattern paint type (%d %d R)", pdf_to_num(patterndict), pdf_to_gen(patterndict));
+ fz_warn(ctx, "not a pattern paint type (%d %d R)", pdf_to_num(ctx, patterndict), pdf_to_gen(ctx, patterndict));
paint = NULL;
}
- tiling = pdf_dict_gets(patterndict, "TilingType");
- if (!pdf_is_int(tiling) || pdf_to_int(tiling) < 1 || pdf_to_int(tiling) > 3)
+ tiling = pdf_dict_gets(ctx, patterndict, "TilingType");
+ if (!pdf_is_int(ctx, tiling) || pdf_to_int(ctx, tiling) < 1 || pdf_to_int(ctx, tiling) > 3)
{
- fz_warn(glo->ctx, "not a pattern tiling type (%d %d R)", pdf_to_num(patterndict), pdf_to_gen(patterndict));
+ fz_warn(ctx, "not a pattern tiling type (%d %d R)", pdf_to_num(ctx, patterndict), pdf_to_gen(ctx, patterndict));
tiling = NULL;
}
}
else
{
- shading = pdf_dict_gets(patterndict, "Shading");
+ shading = pdf_dict_gets(ctx, patterndict, "Shading");
}
for (k = 0; k < glo->patterns; k++)
- if (!pdf_objcmp(glo->pattern[k].u.pattern.obj, patterndict))
+ if (!pdf_objcmp(ctx, glo->pattern[k].u.pattern.obj, patterndict))
break;
if (k < glo->patterns)
continue;
- glo->pattern = fz_resize_array(glo->ctx, glo->pattern, glo->patterns+1, sizeof(struct info));
+ glo->pattern = fz_resize_array(ctx, glo->pattern, glo->patterns+1, sizeof(struct info));
glo->patterns++;
glo->pattern[glo->patterns - 1].page = page;
@@ -562,7 +562,7 @@ gatherpatterns(globals *glo, int page, pdf_obj *pageref, pdf_obj *pageobj, pdf_o
}
static void
-gatherresourceinfo(globals *glo, int page, pdf_obj *rsrc, int show)
+gatherresourceinfo(fz_context *ctx, globals *glo, int page, pdf_obj *rsrc, int show)
{
pdf_obj *pageobj;
pdf_obj *pageref;
@@ -573,88 +573,88 @@ gatherresourceinfo(globals *glo, int page, pdf_obj *rsrc, int show)
pdf_obj *subrsrc;
int i;
- pageref = pdf_lookup_page_obj(glo->doc, page-1);
- pageobj = pdf_resolve_indirect(pageref);
+ pageref = pdf_lookup_page_obj(ctx, glo->doc, page-1);
+ pageobj = pdf_resolve_indirect(ctx, pageref);
if (!pageobj)
- fz_throw(glo->ctx, FZ_ERROR_GENERIC, "cannot retrieve info from page %d", page);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot retrieve info from page %d", page);
- font = pdf_dict_gets(rsrc, "Font");
+ font = pdf_dict_gets(ctx, rsrc, "Font");
if (show & FONTS && font)
{
int n;
- gatherfonts(glo, page, pageref, pageobj, font);
- n = pdf_dict_len(font);
+ gatherfonts(ctx, glo, page, pageref, pageobj, font);
+ n = pdf_dict_len(ctx, font);
for (i = 0; i < n; i++)
{
- pdf_obj *obj = pdf_dict_get_val(font, i);
+ pdf_obj *obj = pdf_dict_get_val(ctx, font, i);
- subrsrc = pdf_dict_gets(obj, "Resources");
- if (subrsrc && pdf_objcmp(rsrc, subrsrc))
- gatherresourceinfo(glo, page, subrsrc, show);
+ subrsrc = pdf_dict_gets(ctx, obj, "Resources");
+ if (subrsrc && pdf_objcmp(ctx, rsrc, subrsrc))
+ gatherresourceinfo(ctx, glo, page, subrsrc, show);
}
}
- xobj = pdf_dict_gets(rsrc, "XObject");
+ xobj = pdf_dict_gets(ctx, rsrc, "XObject");
if (show & XOBJS && xobj)
{
int n;
- gatherimages(glo, page, pageref, pageobj, xobj);
- gatherforms(glo, page, pageref, pageobj, xobj);
- gatherpsobjs(glo, page, pageref, pageobj, xobj);
- n = pdf_dict_len(xobj);
+ gatherimages(ctx, glo, page, pageref, pageobj, xobj);
+ gatherforms(ctx, glo, page, pageref, pageobj, xobj);
+ gatherpsobjs(ctx, glo, page, pageref, pageobj, xobj);
+ n = pdf_dict_len(ctx, xobj);
for (i = 0; i < n; i++)
{
- pdf_obj *obj = pdf_dict_get_val(xobj, i);
- subrsrc = pdf_dict_gets(obj, "Resources");
- if (subrsrc && pdf_objcmp(rsrc, subrsrc))
- gatherresourceinfo(glo, page, subrsrc, show);
+ pdf_obj *obj = pdf_dict_get_val(ctx, xobj, i);
+ subrsrc = pdf_dict_gets(ctx, obj, "Resources");
+ if (subrsrc && pdf_objcmp(ctx, rsrc, subrsrc))
+ gatherresourceinfo(ctx, glo, page, subrsrc, show);
}
}
- shade = pdf_dict_gets(rsrc, "Shading");
+ shade = pdf_dict_gets(ctx, rsrc, "Shading");
if (show & SHADINGS && shade)
- gathershadings(glo, page, pageref, pageobj, shade);
+ gathershadings(ctx, glo, page, pageref, pageobj, shade);
- pattern = pdf_dict_gets(rsrc, "Pattern");
+ pattern = pdf_dict_gets(ctx, rsrc, "Pattern");
if (show & PATTERNS && pattern)
{
int n;
- gatherpatterns(glo, page, pageref, pageobj, pattern);
- n = pdf_dict_len(pattern);
+ gatherpatterns(ctx, glo, page, pageref, pageobj, pattern);
+ n = pdf_dict_len(ctx, pattern);
for (i = 0; i < n; i++)
{
- pdf_obj *obj = pdf_dict_get_val(pattern, i);
- subrsrc = pdf_dict_gets(obj, "Resources");
- if (subrsrc && pdf_objcmp(rsrc, subrsrc))
- gatherresourceinfo(glo, page, subrsrc, show);
+ pdf_obj *obj = pdf_dict_get_val(ctx, pattern, i);
+ subrsrc = pdf_dict_gets(ctx, obj, "Resources");
+ if (subrsrc && pdf_objcmp(ctx, rsrc, subrsrc))
+ gatherresourceinfo(ctx, glo, page, subrsrc, show);
}
}
}
static void
-gatherpageinfo(globals *glo, int page, int show)
+gatherpageinfo(fz_context *ctx, globals *glo, int page, int show)
{
pdf_obj *pageobj;
pdf_obj *pageref;
pdf_obj *rsrc;
- pageref = pdf_lookup_page_obj(glo->doc, page-1);
- pageobj = pdf_resolve_indirect(pageref);
+ pageref = pdf_lookup_page_obj(ctx, glo->doc, page-1);
+ pageobj = pdf_resolve_indirect(ctx, pageref);
if (!pageobj)
- fz_throw(glo->ctx, FZ_ERROR_GENERIC, "cannot retrieve info from page %d", page);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot retrieve info from page %d", page);
- gatherdimensions(glo, page, pageref, pageobj);
+ gatherdimensions(ctx, glo, page, pageref, pageobj);
- rsrc = pdf_dict_gets(pageobj, "Resources");
- gatherresourceinfo(glo, page, rsrc, show);
+ rsrc = pdf_dict_gets(ctx, pageobj, "Resources");
+ gatherresourceinfo(ctx, glo, page, rsrc, show);
}
static void
-printinfo(globals *glo, char *filename, int show, int page)
+printinfo(fz_context *ctx, globals *glo, char *filename, int show, int page)
{
int i;
int j;
@@ -664,85 +664,85 @@ printinfo(globals *glo, char *filename, int show, int page)
if (show & DIMENSIONS && glo->dims > 0)
{
- fz_printf(out, "Mediaboxes (%d):\n", glo->dims);
+ fz_printf(ctx, out, "Mediaboxes (%d):\n", glo->dims);
for (i = 0; i < glo->dims; i++)
{
- fz_printf(out, PAGE_FMT "[ %g %g %g %g ]\n",
+ fz_printf(ctx, out, PAGE_FMT "[ %g %g %g %g ]\n",
glo->dim[i].page,
- pdf_to_num(glo->dim[i].pageref),
- pdf_to_gen(glo->dim[i].pageref),
+ pdf_to_num(ctx, glo->dim[i].pageref),
+ pdf_to_gen(ctx, glo->dim[i].pageref),
glo->dim[i].u.dim.bbox->x0,
glo->dim[i].u.dim.bbox->y0,
glo->dim[i].u.dim.bbox->x1,
glo->dim[i].u.dim.bbox->y1);
}
- fz_printf(out, "\n");
+ fz_printf(ctx, out, "\n");
}
if (show & FONTS && glo->fonts > 0)
{
- fz_printf(out, "Fonts (%d):\n", glo->fonts);
+ fz_printf(ctx, out, "Fonts (%d):\n", glo->fonts);
for (i = 0; i < glo->fonts; i++)
{
- fz_printf(out, PAGE_FMT "%s '%s' (%d %d R)\n",
+ fz_printf(ctx, out, PAGE_FMT "%s '%s' (%d %d R)\n",
glo->font[i].page,
- pdf_to_num(glo->font[i].pageref),
- pdf_to_gen(glo->font[i].pageref),
- pdf_to_name(glo->font[i].u.font.subtype),
- pdf_to_name(glo->font[i].u.font.name),
- pdf_to_num(glo->font[i].u.font.obj),
- pdf_to_gen(glo->font[i].u.font.obj));
+ pdf_to_num(ctx, glo->font[i].pageref),
+ pdf_to_gen(ctx, glo->font[i].pageref),
+ pdf_to_name(ctx, glo->font[i].u.font.subtype),
+ pdf_to_name(ctx, glo->font[i].u.font.name),
+ pdf_to_num(ctx, glo->font[i].u.font.obj),
+ pdf_to_gen(ctx, glo->font[i].u.font.obj));
}
- fz_printf(out, "\n");
+ fz_printf(ctx, out, "\n");
}
if (show & IMAGES && glo->images > 0)
{
- fz_printf(out, "Images (%d):\n", glo->images);
+ fz_printf(ctx, out, "Images (%d):\n", glo->images);
for (i = 0; i < glo->images; i++)
{
char *cs = NULL;
char *altcs = NULL;
- fz_printf(out, PAGE_FMT "[ ",
+ fz_printf(ctx, out, PAGE_FMT "[ ",
glo->image[i].page,
- pdf_to_num(glo->image[i].pageref),
- pdf_to_gen(glo->image[i].pageref));
+ pdf_to_num(ctx, glo->image[i].pageref),
+ pdf_to_gen(ctx, glo->image[i].pageref));
- if (pdf_is_array(glo->image[i].u.image.filter))
+ if (pdf_is_array(ctx, glo->image[i].u.image.filter))
{
- int n = pdf_array_len(glo->image[i].u.image.filter);
+ int n = pdf_array_len(ctx, glo->image[i].u.image.filter);
for (j = 0; j < n; j++)
{
- pdf_obj *obj = pdf_array_get(glo->image[i].u.image.filter, j);
- char *filter = fz_strdup(glo->ctx, pdf_to_name(obj));
+ pdf_obj *obj = pdf_array_get(ctx, glo->image[i].u.image.filter, j);
+ char *filter = fz_strdup(ctx, pdf_to_name(ctx, obj));
if (strstr(filter, "Decode"))
*(strstr(filter, "Decode")) = '\0';
- fz_printf(out, "%s%s",
+ fz_printf(ctx, out, "%s%s",
filter,
- j == pdf_array_len(glo->image[i].u.image.filter) - 1 ? "" : " ");
- fz_free(glo->ctx, filter);
+ j == pdf_array_len(ctx, glo->image[i].u.image.filter) - 1 ? "" : " ");
+ fz_free(ctx, filter);
}
}
else if (glo->image[i].u.image.filter)
{
pdf_obj *obj = glo->image[i].u.image.filter;
- char *filter = fz_strdup(glo->ctx, pdf_to_name(obj));
+ char *filter = fz_strdup(ctx, pdf_to_name(ctx, obj));
if (strstr(filter, "Decode"))
*(strstr(filter, "Decode")) = '\0';
- fz_printf(out, "%s", filter);
- fz_free(glo->ctx, filter);
+ fz_printf(ctx, out, "%s", filter);
+ fz_free(ctx, filter);
}
else
- fz_printf(out, "Raw");
+ fz_printf(ctx, out, "Raw");
if (glo->image[i].u.image.cs)
{
- cs = fz_strdup(glo->ctx, pdf_to_name(glo->image[i].u.image.cs));
+ cs = fz_strdup(ctx, pdf_to_name(ctx, glo->image[i].u.image.cs));
if (!strncmp(cs, "Device", 6))
{
@@ -761,7 +761,7 @@ printinfo(globals *glo, char *filename, int show, int page)
}
if (glo->image[i].u.image.altcs)
{
- altcs = fz_strdup(glo->ctx, pdf_to_name(glo->image[i].u.image.altcs));
+ altcs = fz_strdup(ctx, pdf_to_name(ctx, glo->image[i].u.image.altcs));
if (!strncmp(altcs, "Device", 6))
{
@@ -779,25 +779,25 @@ printinfo(globals *glo, char *filename, int show, int page)
fz_strlcpy(altcs, "Sep", 4);
}
- fz_printf(out, " ] %dx%d %dbpc %s%s%s (%d %d R)\n",
- pdf_to_int(glo->image[i].u.image.width),
- pdf_to_int(glo->image[i].u.image.height),
- glo->image[i].u.image.bpc ? pdf_to_int(glo->image[i].u.image.bpc) : 1,
+ fz_printf(ctx, out, " ] %dx%d %dbpc %s%s%s (%d %d R)\n",
+ pdf_to_int(ctx, glo->image[i].u.image.width),
+ pdf_to_int(ctx, glo->image[i].u.image.height),
+ glo->image[i].u.image.bpc ? pdf_to_int(ctx, glo->image[i].u.image.bpc) : 1,
glo->image[i].u.image.cs ? cs : "ImageMask",
glo->image[i].u.image.altcs ? " " : "",
glo->image[i].u.image.altcs ? altcs : "",
- pdf_to_num(glo->image[i].u.image.obj),
- pdf_to_gen(glo->image[i].u.image.obj));
+ pdf_to_num(ctx, glo->image[i].u.image.obj),
+ pdf_to_gen(ctx, glo->image[i].u.image.obj));
- fz_free(glo->ctx, cs);
- fz_free(glo->ctx, altcs);
+ fz_free(ctx, cs);
+ fz_free(ctx, altcs);
}
- fz_printf(out, "\n");
+ fz_printf(ctx, out, "\n");
}
if (show & SHADINGS && glo->shadings > 0)
{
- fz_printf(out, "Shading patterns (%d):\n", glo->shadings);
+ fz_printf(ctx, out, "Shading patterns (%d):\n", glo->shadings);
for (i = 0; i < glo->shadings; i++)
{
char *shadingtype[] =
@@ -812,23 +812,23 @@ printinfo(globals *glo, char *filename, int show, int page)
"Tensor patch",
};
- fz_printf(out, PAGE_FMT "%s (%d %d R)\n",
+ fz_printf(ctx, out, PAGE_FMT "%s (%d %d R)\n",
glo->shading[i].page,
- pdf_to_num(glo->shading[i].pageref),
- pdf_to_gen(glo->shading[i].pageref),
- shadingtype[pdf_to_int(glo->shading[i].u.shading.type)],
- pdf_to_num(glo->shading[i].u.shading.obj),
- pdf_to_gen(glo->shading[i].u.shading.obj));
+ pdf_to_num(ctx, glo->shading[i].pageref),
+ pdf_to_gen(ctx, glo->shading[i].pageref),
+ shadingtype[pdf_to_int(ctx, glo->shading[i].u.shading.type)],
+ pdf_to_num(ctx, glo->shading[i].u.shading.obj),
+ pdf_to_gen(ctx, glo->shading[i].u.shading.obj));
}
- fz_printf(out, "\n");
+ fz_printf(ctx, out, "\n");
}
if (show & PATTERNS && glo->patterns > 0)
{
- fz_printf(out, "Patterns (%d):\n", glo->patterns);
+ fz_printf(ctx, out, "Patterns (%d):\n", glo->patterns);
for (i = 0; i < glo->patterns; i++)
{
- if (pdf_to_int(glo->pattern[i].u.pattern.type) == 1)
+ if (pdf_to_int(ctx, glo->pattern[i].u.pattern.type) == 1)
{
char *painttype[] =
{
@@ -844,67 +844,67 @@ printinfo(globals *glo, char *filename, int show, int page)
"Constant/fast tiling",
};
- fz_printf(out, PAGE_FMT "Tiling %s %s (%d %d R)\n",
+ fz_printf(ctx, out, PAGE_FMT "Tiling %s %s (%d %d R)\n",
glo->pattern[i].page,
- pdf_to_num(glo->pattern[i].pageref),
- pdf_to_gen(glo->pattern[i].pageref),
- painttype[pdf_to_int(glo->pattern[i].u.pattern.paint)],
- tilingtype[pdf_to_int(glo->pattern[i].u.pattern.tiling)],
- pdf_to_num(glo->pattern[i].u.pattern.obj),
- pdf_to_gen(glo->pattern[i].u.pattern.obj));
+ pdf_to_num(ctx, glo->pattern[i].pageref),
+ pdf_to_gen(ctx, glo->pattern[i].pageref),
+ painttype[pdf_to_int(ctx, glo->pattern[i].u.pattern.paint)],
+ tilingtype[pdf_to_int(ctx, glo->pattern[i].u.pattern.tiling)],
+ pdf_to_num(ctx, glo->pattern[i].u.pattern.obj),
+ pdf_to_gen(ctx, glo->pattern[i].u.pattern.obj));
}
else
{
- fz_printf(out, PAGE_FMT "Shading %d %d R (%d %d R)\n",
+ fz_printf(ctx, out, PAGE_FMT "Shading %d %d R (%d %d R)\n",
glo->pattern[i].page,
- pdf_to_num(glo->pattern[i].pageref),
- pdf_to_gen(glo->pattern[i].pageref),
- pdf_to_num(glo->pattern[i].u.pattern.shading),
- pdf_to_gen(glo->pattern[i].u.pattern.shading),
- pdf_to_num(glo->pattern[i].u.pattern.obj),
- pdf_to_gen(glo->pattern[i].u.pattern.obj));
+ pdf_to_num(ctx, glo->pattern[i].pageref),
+ pdf_to_gen(ctx, glo->pattern[i].pageref),
+ pdf_to_num(ctx, glo->pattern[i].u.pattern.shading),
+ pdf_to_gen(ctx, glo->pattern[i].u.pattern.shading),
+ pdf_to_num(ctx, glo->pattern[i].u.pattern.obj),
+ pdf_to_gen(ctx, glo->pattern[i].u.pattern.obj));
}
}
- fz_printf(out, "\n");
+ fz_printf(ctx, out, "\n");
}
if (show & XOBJS && glo->forms > 0)
{
- fz_printf(out, "Form xobjects (%d):\n", glo->forms);
+ fz_printf(ctx, out, "Form xobjects (%d):\n", glo->forms);
for (i = 0; i < glo->forms; i++)
{
- fz_printf(out, PAGE_FMT "Form%s%s%s%s (%d %d R)\n",
+ fz_printf(ctx, out, PAGE_FMT "Form%s%s%s%s (%d %d R)\n",
glo->form[i].page,
- pdf_to_num(glo->form[i].pageref),
- pdf_to_gen(glo->form[i].pageref),
+ pdf_to_num(ctx, glo->form[i].pageref),
+ pdf_to_gen(ctx, glo->form[i].pageref),
glo->form[i].u.form.groupsubtype ? " " : "",
- glo->form[i].u.form.groupsubtype ? pdf_to_name(glo->form[i].u.form.groupsubtype) : "",
+ glo->form[i].u.form.groupsubtype ? pdf_to_name(ctx, glo->form[i].u.form.groupsubtype) : "",
glo->form[i].u.form.groupsubtype ? " Group" : "",
glo->form[i].u.form.reference ? " Reference" : "",
- pdf_to_num(glo->form[i].u.form.obj),
- pdf_to_gen(glo->form[i].u.form.obj));
+ pdf_to_num(ctx, glo->form[i].u.form.obj),
+ pdf_to_gen(ctx, glo->form[i].u.form.obj));
}
- fz_printf(out, "\n");
+ fz_printf(ctx, out, "\n");
}
if (show & XOBJS && glo->psobjs > 0)
{
- fz_printf(out, "Postscript xobjects (%d):\n", glo->psobjs);
+ fz_printf(ctx, out, "Postscript xobjects (%d):\n", glo->psobjs);
for (i = 0; i < glo->psobjs; i++)
{
- fz_printf(out, PAGE_FMT "(%d %d R)\n",
+ fz_printf(ctx, out, PAGE_FMT "(%d %d R)\n",
glo->psobj[i].page,
- pdf_to_num(glo->psobj[i].pageref),
- pdf_to_gen(glo->psobj[i].pageref),
- pdf_to_num(glo->psobj[i].u.form.obj),
- pdf_to_gen(glo->psobj[i].u.form.obj));
+ pdf_to_num(ctx, glo->psobj[i].pageref),
+ pdf_to_gen(ctx, glo->psobj[i].pageref),
+ pdf_to_num(ctx, glo->psobj[i].u.form.obj),
+ pdf_to_gen(ctx, glo->psobj[i].u.form.obj));
}
- fz_printf(out, "\n");
+ fz_printf(ctx, out, "\n");
}
}
static void
-showinfo(globals *glo, char *filename, int show, char *pagelist)
+showinfo(fz_context *ctx, globals *glo, char *filename, int show, char *pagelist)
{
int page, spage, epage;
char *spec, *dash;
@@ -917,7 +917,7 @@ showinfo(globals *glo, char *filename, int show, char *pagelist)
allpages = !strcmp(pagelist, "1-");
- pagecount = pdf_count_pages(glo->doc);
+ pagecount = pdf_count_pages(ctx, glo->doc);
spec = fz_strsep(&pagelist, ",");
while (spec && pagecount)
{
@@ -943,15 +943,15 @@ showinfo(globals *glo, char *filename, int show, char *pagelist)
epage = fz_clampi(epage, 1, pagecount);
if (allpages)
- fz_printf(out, "Retrieving info from pages %d-%d...\n", spage, epage);
+ fz_printf(ctx, out, "Retrieving info from pages %d-%d...\n", spage, epage);
for (page = spage; page <= epage; page++)
{
- gatherpageinfo(glo, page, show);
+ gatherpageinfo(ctx, glo, page, show);
if (!allpages)
{
- fz_printf(out, "Page %d:\n", page);
- printinfo(glo, filename, show, page);
- fz_printf(out, "\n");
+ fz_printf(ctx, out, "Page %d:\n", page);
+ printinfo(ctx, glo, filename, show, page);
+ fz_printf(ctx, out, "\n");
}
}
@@ -959,7 +959,7 @@ showinfo(globals *glo, char *filename, int show, char *pagelist)
}
if (allpages)
- printinfo(glo, filename, show, -1);
+ printinfo(ctx, glo, filename, show, -1);
}
static int arg_is_page_range(const char *arg)
@@ -981,7 +981,6 @@ pdfinfo_info(fz_context *ctx, fz_output *out, char *filename, char *password, in
int argidx = 0;
globals glo = { 0 };
- glo.ctx = ctx;
glo.out = out;
state = NO_FILE_OPENED;
@@ -991,25 +990,25 @@ pdfinfo_info(fz_context *ctx, fz_output *out, char *filename, char *password, in
{
if (state == NO_INFO_GATHERED)
{
- showinfo(&glo, filename, show, "1-");
+ showinfo(ctx, &glo, filename, show, "1-");
}
- closexref(&glo);
+ closexref(ctx, &glo);
filename = argv[argidx];
- fz_printf(out, "%s:\n", filename);
+ fz_printf(ctx, out, "%s:\n", filename);
glo.doc = pdf_open_document_no_run(glo.ctx, filename);
- if (pdf_needs_password(glo.doc))
- if (!pdf_authenticate_password(glo.doc, password))
+ if (pdf_needs_password(ctx, glo.doc))
+ if (!pdf_authenticate_password(ctx, glo.doc, password))
fz_throw(glo.ctx, FZ_ERROR_GENERIC, "cannot authenticate password: %s", filename);
- glo.pagecount = pdf_count_pages(glo.doc);
+ glo.pagecount = pdf_count_pages(ctx, glo.doc);
- showglobalinfo(&glo);
+ showglobalinfo(ctx, &glo);
state = NO_INFO_GATHERED;
}
else
{
- showinfo(&glo, filename, show, argv[argidx]);
+ showinfo(ctx, &glo, filename, show, argv[argidx]);
state = INFO_SHOWN;
}
@@ -1017,9 +1016,9 @@ pdfinfo_info(fz_context *ctx, fz_output *out, char *filename, char *password, in
}
if (state == NO_INFO_GATHERED)
- showinfo(&glo, filename, show, "1-");
+ showinfo(ctx, &glo, filename, show, "1-");
- closexref(&glo);
+ closexref(ctx, &glo);
}
int pdfinfo_main(int argc, char **argv)
@@ -1064,14 +1063,14 @@ int pdfinfo_main(int argc, char **argv)
ret = 0;
fz_try(ctx)
{
- out = fz_new_output_with_file(ctx, stdout);
+ out = fz_new_output_with_file(ctx, stdout, 0);
pdfinfo_info(ctx, out, filename, password, show, &argv[fz_optind], argc-fz_optind);
}
fz_catch(ctx)
{
ret = 1;
}
- fz_close_output(out);
- fz_free_context(ctx);
+ fz_drop_output(ctx, out);
+ fz_drop_context(ctx);
return ret;
}
diff --git a/source/tools/pdfposter.c b/source/tools/pdfposter.c
index aedeccb4..f949a005 100644
--- a/source/tools/pdfposter.c
+++ b/source/tools/pdfposter.c
@@ -21,31 +21,31 @@ static void usage(void)
* Recreate page tree with our posterised pages in.
*/
-static void decimatepages(pdf_document *doc)
+static void decimatepages(fz_context *ctx, pdf_document *doc)
{
pdf_obj *oldroot, *root, *pages, *kids, *parent;
- int num_pages = pdf_count_pages(doc);
+ int num_pages = pdf_count_pages(ctx, doc);
int page, kidcount;
- oldroot = pdf_dict_gets(pdf_trailer(doc), "Root");
- pages = pdf_dict_gets(oldroot, "Pages");
+ oldroot = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Root");
+ pages = pdf_dict_gets(ctx, oldroot, "Pages");
- root = pdf_new_dict(doc, 2);
- pdf_dict_puts(root, "Type", pdf_dict_gets(oldroot, "Type"));
- pdf_dict_puts(root, "Pages", pdf_dict_gets(oldroot, "Pages"));
+ root = pdf_new_dict(ctx, doc, 2);
+ pdf_dict_puts(ctx, root, "Type", pdf_dict_gets(ctx, oldroot, "Type"));
+ pdf_dict_puts(ctx, root, "Pages", pdf_dict_gets(ctx, oldroot, "Pages"));
- pdf_update_object(doc, pdf_to_num(oldroot), root);
+ pdf_update_object(ctx, doc, pdf_to_num(ctx, oldroot), root);
- pdf_drop_obj(root);
+ pdf_drop_obj(ctx, root);
/* Create a new kids array with our new pages in */
- parent = pdf_new_indirect(doc, pdf_to_num(pages), pdf_to_gen(pages));
- kids = pdf_new_array(doc, 1);
+ parent = pdf_new_indirect(ctx, doc, pdf_to_num(ctx, pages), pdf_to_gen(ctx, pages));
+ kids = pdf_new_array(ctx, doc, 1);
kidcount = 0;
for (page=0; page < num_pages; page++)
{
- pdf_page *page_details = pdf_load_page(doc, page);
+ pdf_page *page_details = pdf_load_page(ctx, doc, page);
int xf = x_factor, yf = y_factor;
int x, y;
float w = page_details->mediabox.x1 - page_details->mediabox.x0;
@@ -72,12 +72,12 @@ static void decimatepages(pdf_document *doc)
fz_rect mb;
int num;
- newpageobj = pdf_copy_dict(pdf_lookup_page_obj(doc, page));
- num = pdf_create_object(doc);
- pdf_update_object(doc, num, newpageobj);
- newpageref = pdf_new_indirect(doc, num, 0);
+ newpageobj = pdf_copy_dict(ctx, pdf_lookup_page_obj(ctx, doc, page));
+ num = pdf_create_object(ctx, doc);
+ pdf_update_object(ctx, doc, num, newpageobj);
+ newpageref = pdf_new_indirect(ctx, doc, num, 0);
- newmediabox = pdf_new_array(doc, 4);
+ newmediabox = pdf_new_array(ctx, doc, 4);
mb.x0 = page_details->mediabox.x0 + (w/xf)*x;
if (x == xf-1)
@@ -90,28 +90,28 @@ static void decimatepages(pdf_document *doc)
else
mb.y1 = page_details->mediabox.y0 + (h/yf)*(y+1);
- pdf_array_push(newmediabox, pdf_new_real(doc, mb.x0));
- pdf_array_push(newmediabox, pdf_new_real(doc, mb.y0));
- pdf_array_push(newmediabox, pdf_new_real(doc, mb.x1));
- pdf_array_push(newmediabox, pdf_new_real(doc, mb.y1));
+ pdf_array_push(ctx, newmediabox, pdf_new_real(ctx, doc, mb.x0));
+ pdf_array_push(ctx, newmediabox, pdf_new_real(ctx, doc, mb.y0));
+ pdf_array_push(ctx, newmediabox, pdf_new_real(ctx, doc, mb.x1));
+ pdf_array_push(ctx, newmediabox, pdf_new_real(ctx, doc, mb.y1));
- pdf_dict_puts(newpageobj, "Parent", parent);
- pdf_dict_puts(newpageobj, "MediaBox", newmediabox);
+ pdf_dict_puts(ctx, newpageobj, "Parent", parent);
+ pdf_dict_puts(ctx, newpageobj, "MediaBox", newmediabox);
/* Store page object in new kids array */
- pdf_array_push(kids, newpageref);
+ pdf_array_push(ctx, kids, newpageref);
kidcount++;
}
}
}
- pdf_drop_obj(parent);
+ pdf_drop_obj(ctx, parent);
/* Update page count and kids array */
- pdf_dict_puts(pages, "Count", pdf_new_int(doc, kidcount));
- pdf_dict_puts(pages, "Kids", kids);
- pdf_drop_obj(kids);
+ pdf_dict_puts(ctx, pages, "Count", pdf_new_int(ctx, doc, kidcount));
+ pdf_dict_puts(ctx, pages, "Kids", kids);
+ pdf_drop_obj(ctx, kids);
}
int pdfposter_main(int argc, char **argv)
@@ -160,15 +160,15 @@ int pdfposter_main(int argc, char **argv)
}
doc = pdf_open_document_no_run(ctx, infile);
- if (pdf_needs_password(doc))
- if (!pdf_authenticate_password(doc, password))
+ if (pdf_needs_password(ctx, doc))
+ if (!pdf_authenticate_password(ctx, doc, password))
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot authenticate password: %s", infile);
- decimatepages(doc);
+ decimatepages(ctx, doc);
- pdf_write_document(doc, outfile, &opts);
+ pdf_write_document(ctx, doc, outfile, &opts);
- pdf_close_document(doc);
- fz_free_context(ctx);
+ pdf_close_document(ctx, doc);
+ fz_drop_context(ctx);
return 0;
}
diff --git a/source/tools/pdfshow.c b/source/tools/pdfshow.c
index c5d021ad..d084c080 100644
--- a/source/tools/pdfshow.c
+++ b/source/tools/pdfshow.c
@@ -27,7 +27,7 @@ static void showtrailer(void)
if (!doc)
fz_throw(ctx, FZ_ERROR_GENERIC, "no file specified");
fprintf(out, "trailer\n");
- pdf_fprint_obj(out, pdf_trailer(doc), 0);
+ pdf_fprint_obj(ctx, out, pdf_trailer(ctx, doc), 0);
fprintf(out, "\n");
}
@@ -37,11 +37,11 @@ static void showencrypt(void)
if (!doc)
fz_throw(ctx, FZ_ERROR_GENERIC, "no file specified");
- encrypt = pdf_dict_gets(pdf_trailer(doc), "Encrypt");
+ encrypt = pdf_dict_gets(ctx, pdf_trailer(ctx, doc), "Encrypt");
if (!encrypt)
fz_throw(ctx, FZ_ERROR_GENERIC, "document not encrypted");
fprintf(out, "encryption dictionary\n");
- pdf_fprint_obj(out, pdf_resolve_indirect(encrypt), 0);
+ pdf_fprint_obj(ctx, out, pdf_resolve_indirect(ctx, encrypt), 0);
fprintf(out, "\n");
}
@@ -49,7 +49,7 @@ static void showxref(void)
{
if (!doc)
fz_throw(ctx, FZ_ERROR_GENERIC, "no file specified");
- pdf_print_xref(doc);
+ pdf_print_xref(ctx, doc);
fprintf(out, "\n");
}
@@ -62,11 +62,11 @@ static void showpagetree(void)
if (!doc)
fz_throw(ctx, FZ_ERROR_GENERIC, "no file specified");
- count = pdf_count_pages(doc);
+ count = pdf_count_pages(ctx, doc);
for (i = 0; i < count; i++)
{
- ref = pdf_lookup_page_obj(doc, i);
- fprintf(out, "page %d = %d %d R\n", i + 1, pdf_to_num(ref), pdf_to_gen(ref));
+ ref = pdf_lookup_page_obj(ctx, doc, i);
+ fprintf(out, "page %d = %d %d R\n", i + 1, pdf_to_num(ctx, ref), pdf_to_gen(ctx, ref));
}
fprintf(out, "\n");
}
@@ -103,13 +103,13 @@ static void showstream(int num, int gen)
showcolumn = 0;
if (showdecode)
- stm = pdf_open_stream(doc, num, gen);
+ stm = pdf_open_stream(ctx, doc, num, gen);
else
- stm = pdf_open_raw_stream(doc, num, gen);
+ stm = pdf_open_raw_stream(ctx, doc, num, gen);
while (1)
{
- n = fz_read(stm, buf, sizeof buf);
+ n = fz_read(ctx, stm, buf, sizeof buf);
if (n == 0)
break;
if (showbinary)
@@ -118,7 +118,7 @@ static void showstream(int num, int gen)
showsafe(buf, n);
}
- fz_close(stm);
+ fz_drop_stream(ctx, stm);
}
static void showobject(int num, int gen)
@@ -128,9 +128,9 @@ static void showobject(int num, int gen)
if (!doc)
fz_throw(ctx, FZ_ERROR_GENERIC, "no file specified");
- obj = pdf_load_object(doc, num, gen);
+ obj = pdf_load_object(ctx, doc, num, gen);
- if (pdf_is_stream(doc, num, gen))
+ if (pdf_is_stream(ctx, doc, num, gen))
{
if (showbinary)
{
@@ -139,7 +139,7 @@ static void showobject(int num, int gen)
else
{
fprintf(out, "%d %d obj\n", num, gen);
- pdf_fprint_obj(out, obj, 0);
+ pdf_fprint_obj(ctx, out, obj, 0);
fprintf(out, "stream\n");
showstream(num, gen);
fprintf(out, "endstream\n");
@@ -149,11 +149,11 @@ static void showobject(int num, int gen)
else
{
fprintf(out, "%d %d obj\n", num, gen);
- pdf_fprint_obj(out, obj, 0);
+ pdf_fprint_obj(ctx, out, obj, 0);
fprintf(out, "endobj\n\n");
}
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
static void showgrep(char *filename)
@@ -161,15 +161,15 @@ static void showgrep(char *filename)
pdf_obj *obj;
int i, len;
- len = pdf_count_objects(doc);
+ len = pdf_count_objects(ctx, doc);
for (i = 0; i < len; i++)
{
- pdf_xref_entry *entry = pdf_get_xref_entry(doc, i);
+ pdf_xref_entry *entry = pdf_get_xref_entry(ctx, doc, i);
if (entry->type == 'n' || entry->type == 'o')
{
fz_try(ctx)
{
- obj = pdf_load_object(doc, i, 0);
+ obj = pdf_load_object(ctx, doc, i, 0);
}
fz_catch(ctx)
{
@@ -177,17 +177,17 @@ static void showgrep(char *filename)
continue;
}
- pdf_sort_dict(obj);
+ pdf_sort_dict(ctx, obj);
fprintf(out, "%s:%d: ", filename, i);
- pdf_fprint_obj(out, obj, 1);
+ pdf_fprint_obj(ctx, out, obj, 1);
- pdf_drop_obj(obj);
+ pdf_drop_obj(ctx, obj);
}
}
fprintf(out, "%s:trailer: ", filename);
- pdf_fprint_obj(out, pdf_trailer(doc), 1);
+ pdf_fprint_obj(ctx, out, pdf_trailer(ctx, doc), 1);
}
int pdfshow_main(int argc, char **argv)
@@ -236,8 +236,8 @@ int pdfshow_main(int argc, char **argv)
fz_try(ctx)
{
doc = pdf_open_document_no_run(ctx, filename);
- if (pdf_needs_password(doc))
- if (!pdf_authenticate_password(doc, password))
+ if (pdf_needs_password(ctx, doc))
+ if (!pdf_authenticate_password(ctx, doc, password))
fz_warn(ctx, "cannot authenticate password: %s", filename);
if (fz_optind == argc)
@@ -264,7 +264,7 @@ int pdfshow_main(int argc, char **argv)
if (out != stdout)
fclose(out);
- pdf_close_document(doc);
- fz_free_context(ctx);
+ pdf_close_document(ctx, doc);
+ fz_drop_context(ctx);
return 0;
}
diff --git a/source/xps/xps-common.c b/source/xps/xps-common.c
index 04b78d2b..667b0631 100644
--- a/source/xps/xps-common.c
+++ b/source/xps/xps-common.c
@@ -9,7 +9,7 @@ static inline int unhex(int a)
}
fz_xml *
-xps_lookup_alternate_content(fz_xml *node)
+xps_lookup_alternate_content(fz_context *ctx, xps_document *doc, fz_xml *node)
{
for (node = fz_xml_down(node); node; node = fz_xml_next(node))
{
@@ -29,48 +29,49 @@ xps_lookup_alternate_content(fz_xml *node)
}
void
-xps_parse_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node)
+xps_parse_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node)
{
if (doc->cookie && doc->cookie->abort)
return;
/* SolidColorBrushes are handled in a special case and will never show up here */
if (fz_xml_is_tag(node, "ImageBrush"))
- xps_parse_image_brush(doc, ctm, area, base_uri, dict, node);
+ xps_parse_image_brush(ctx, doc, ctm, area, base_uri, dict, node);
else if (fz_xml_is_tag(node, "VisualBrush"))
- xps_parse_visual_brush(doc, ctm, area, base_uri, dict, node);
+ xps_parse_visual_brush(ctx, doc, ctm, area, base_uri, dict, node);
else if (fz_xml_is_tag(node, "LinearGradientBrush"))
- xps_parse_linear_gradient_brush(doc, ctm, area, base_uri, dict, node);
+ xps_parse_linear_gradient_brush(ctx, doc, ctm, area, base_uri, dict, node);
else if (fz_xml_is_tag(node, "RadialGradientBrush"))
- xps_parse_radial_gradient_brush(doc, ctm, area, base_uri, dict, node);
+ xps_parse_radial_gradient_brush(ctx, doc, ctm, area, base_uri, dict, node);
else
- fz_warn(doc->ctx, "unknown brush tag: %s", fz_xml_tag(node));
+ fz_warn(ctx, "unknown brush tag: %s", fz_xml_tag(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)
+xps_parse_element(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *node)
{
if (doc->cookie && doc->cookie->abort)
return;
if (fz_xml_is_tag(node, "Path"))
- xps_parse_path(doc, ctm, base_uri, dict, node);
+ xps_parse_path(ctx, doc, ctm, base_uri, dict, node);
if (fz_xml_is_tag(node, "Glyphs"))
- xps_parse_glyphs(doc, ctm, base_uri, dict, node);
+ xps_parse_glyphs(ctx, doc, ctm, base_uri, dict, node);
if (fz_xml_is_tag(node, "Canvas"))
- xps_parse_canvas(doc, ctm, area, base_uri, dict, node);
+ xps_parse_canvas(ctx, doc, ctm, area, base_uri, dict, node);
if (fz_xml_is_tag(node, "AlternateContent"))
{
- node = xps_lookup_alternate_content(node);
+ node = xps_lookup_alternate_content(ctx, doc, node);
if (node)
- xps_parse_element(doc, ctm, area, base_uri, dict, node);
+ xps_parse_element(ctx, doc, ctm, area, base_uri, dict, node);
}
/* skip unknown tags (like Foo.Resources and similar) */
}
void
-xps_begin_opacity(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_begin_opacity(fz_context *ctx, 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)
{
+ fz_device *dev = doc->dev;
float opacity;
if (!opacity_att && !opacity_mask_tag)
@@ -90,7 +91,7 @@ xps_begin_opacity(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
{
fz_colorspace *colorspace;
float samples[FZ_MAX_COLORS];
- xps_parse_color(doc, base_uri, scb_color_att, &colorspace, samples);
+ xps_parse_color(ctx, doc, base_uri, scb_color_att, &colorspace, samples);
opacity = opacity * samples[0];
}
opacity_mask_tag = NULL;
@@ -104,16 +105,18 @@ xps_begin_opacity(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
if (opacity_mask_tag)
{
- fz_begin_mask(doc->dev, area, 0, NULL, NULL);
- xps_parse_brush(doc, ctm, area, base_uri, dict, opacity_mask_tag);
- fz_end_mask(doc->dev);
+ fz_begin_mask(ctx, dev, area, 0, NULL, NULL);
+ xps_parse_brush(ctx, doc, ctm, area, base_uri, dict, opacity_mask_tag);
+ fz_end_mask(ctx, dev);
}
}
void
-xps_end_opacity(xps_document *doc, char *base_uri, xps_resource *dict,
+xps_end_opacity(fz_context *ctx, xps_document *doc, char *base_uri, xps_resource *dict,
char *opacity_att, fz_xml *opacity_mask_tag)
{
+ fz_device *dev = doc->dev;
+
if (!opacity_att && !opacity_mask_tag)
return;
@@ -123,12 +126,12 @@ xps_end_opacity(xps_document *doc, char *base_uri, xps_resource *dict,
if (opacity_mask_tag)
{
if (strcmp(fz_xml_tag(opacity_mask_tag), "SolidColorBrush"))
- fz_pop_clip(doc->dev);
+ fz_pop_clip(ctx, dev);
}
}
void
-xps_parse_render_transform(xps_document *doc, char *transform, fz_matrix *matrix)
+xps_parse_render_transform(fz_context *ctx, xps_document *doc, char *transform, fz_matrix *matrix)
{
float args[6];
char *s = transform;
@@ -153,7 +156,7 @@ xps_parse_render_transform(xps_document *doc, char *transform, fz_matrix *matrix
}
void
-xps_parse_matrix_transform(xps_document *doc, fz_xml *root, fz_matrix *matrix)
+xps_parse_matrix_transform(fz_context *ctx, xps_document *doc, fz_xml *root, fz_matrix *matrix)
{
char *transform;
@@ -163,12 +166,12 @@ xps_parse_matrix_transform(xps_document *doc, fz_xml *root, fz_matrix *matrix)
{
transform = fz_xml_att(root, "Matrix");
if (transform)
- xps_parse_render_transform(doc, transform, matrix);
+ xps_parse_render_transform(ctx, doc, transform, matrix);
}
}
void
-xps_parse_rectangle(xps_document *doc, char *text, fz_rect *rect)
+xps_parse_rectangle(fz_context *ctx, xps_document *doc, char *text, fz_rect *rect)
{
float args[4];
char *s = text;
@@ -205,10 +208,9 @@ static int count_commas(char *s)
}
void
-xps_parse_color(xps_document *doc, char *base_uri, char *string,
+xps_parse_color(fz_context *ctx, xps_document *doc, char *base_uri, char *string,
fz_colorspace **csp, float *samples)
{
- fz_context *ctx = doc->ctx;
char *p;
int i, n;
char buf[1024];
@@ -307,7 +309,7 @@ xps_parse_color(xps_document *doc, char *base_uri, char *string,
}
void
-xps_set_color(xps_document *doc, fz_colorspace *colorspace, float *samples)
+xps_set_color(fz_context *ctx, xps_document *doc, fz_colorspace *colorspace, float *samples)
{
int i;
doc->colorspace = colorspace;
diff --git a/source/xps/xps-doc.c b/source/xps/xps-doc.c
index 4bcf92cb..41823d56 100644
--- a/source/xps/xps-doc.c
+++ b/source/xps/xps-doc.c
@@ -15,7 +15,7 @@
"http://schemas.openxps.org/oxps/v1.0/documentstructure"
static void
-xps_rels_for_part(char *buf, char *name, int buflen)
+xps_rels_for_part(fz_context *ctx, xps_document *doc, char *buf, char *name, int buflen)
{
char *p, *basename;
p = strrchr(name, '/');
@@ -34,10 +34,10 @@ xps_rels_for_part(char *buf, char *name, int buflen)
*/
void
-xps_print_page_list(xps_document *doc)
+xps_print_page_list(fz_context *ctx, xps_document *doc)
{
xps_fixdoc *fixdoc = doc->first_fixdoc;
- xps_page *page = doc->first_page;
+ xps_fixpage *page = doc->first_page;
if (doc->start_part)
printf("start part %s\n", doc->start_part);
@@ -56,7 +56,7 @@ xps_print_page_list(xps_document *doc)
}
static void
-xps_add_fixed_document(xps_document *doc, char *name)
+xps_add_fixed_document(fz_context *ctx, xps_document *doc, char *name)
{
xps_fixdoc *fixdoc;
@@ -65,8 +65,8 @@ xps_add_fixed_document(xps_document *doc, char *name)
if (!strcmp(fixdoc->name, name))
return;
- fixdoc = fz_malloc_struct(doc->ctx, xps_fixdoc);
- fixdoc->name = fz_strdup(doc->ctx, name);
+ fixdoc = fz_malloc_struct(ctx, xps_fixdoc);
+ fixdoc->name = fz_strdup(ctx, name);
fixdoc->outline = NULL;
fixdoc->next = NULL;
@@ -83,7 +83,7 @@ xps_add_fixed_document(xps_document *doc, char *name)
}
void
-xps_add_link(xps_document *doc, const fz_rect *area, char *base_uri, char *target_uri)
+xps_add_link(fz_context *ctx, xps_document *doc, const fz_rect *area, char *base_uri, char *target_uri)
{
int len;
char *buffer = NULL;
@@ -91,7 +91,6 @@ xps_add_link(xps_document *doc, const fz_rect *area, char *base_uri, char *targe
xps_target *target;
fz_link_dest dest;
fz_link *link;
- fz_context *ctx = doc->ctx;
fz_var(buffer);
@@ -102,9 +101,9 @@ xps_add_link(xps_document *doc, const fz_rect *area, char *base_uri, char *targe
{
len = 2 + (base_uri ? strlen(base_uri) : 0) +
(target_uri ? strlen(target_uri) : 0);
- buffer = fz_malloc(doc->ctx, len);
- xps_resolve_url(buffer, base_uri, target_uri, len);
- if (xps_url_is_remote(buffer))
+ buffer = fz_malloc(ctx, len);
+ xps_resolve_url(ctx, doc, buffer, base_uri, target_uri, len);
+ if (xps_url_is_remote(ctx, doc, buffer))
{
dest.kind = FZ_LINK_URI;
dest.ld.uri.is_map = 0;
@@ -140,13 +139,13 @@ xps_add_link(xps_document *doc, const fz_rect *area, char *base_uri, char *targe
dest.ld.gotor.new_window = 0;
}
- link = fz_new_link(doc->ctx, area, dest);
+ link = fz_new_link(ctx, area, dest);
link->next = doc->current_page->links;
doc->current_page->links = link;
}
fz_always(ctx)
{
- fz_free(doc->ctx, buffer);
+ fz_free(ctx, buffer);
}
fz_catch(ctx)
{
@@ -154,32 +153,23 @@ xps_add_link(xps_document *doc, const fz_rect *area, char *base_uri, char *targe
}
}
-fz_link *
-xps_load_links(xps_document *doc, xps_page *page)
-{
- if (!page->links_resolved)
- fz_warn(doc->ctx, "xps_load_links before page has been executed!");
- return fz_keep_link(doc->ctx, page->links);
-}
-
static void
-xps_add_fixed_page(xps_document *doc, char *name, int width, int height)
+xps_add_fixed_page(fz_context *ctx, xps_document *doc, char *name, int width, int height)
{
- xps_page *page;
+ xps_fixpage *page;
/* Check for duplicates first */
for (page = doc->first_page; page; page = page->next)
if (!strcmp(page->name, name))
return;
- page = fz_malloc_struct(doc->ctx, xps_page);
- page->name = fz_strdup(doc->ctx, name);
+ page = fz_malloc_struct(ctx, xps_fixpage);
+ page->name = fz_strdup(ctx, name);
page->number = doc->page_count++;
page->width = width;
page->height = height;
page->links = NULL;
page->links_resolved = 0;
- page->root = NULL;
page->next = NULL;
if (!doc->first_page)
@@ -195,18 +185,18 @@ xps_add_fixed_page(xps_document *doc, char *name, int width, int height)
}
static void
-xps_add_link_target(xps_document *doc, char *name)
+xps_add_link_target(fz_context *ctx, xps_document *doc, char *name)
{
- xps_page *page = doc->last_page;
- xps_target *target = fz_malloc_struct(doc->ctx, xps_target);
- target->name = fz_strdup(doc->ctx, name);
+ xps_fixpage *page = doc->last_page;
+ xps_target *target = fz_malloc_struct(ctx, xps_target);
+ target->name = fz_strdup(ctx, name);
target->page = page->number;
target->next = doc->target;
doc->target = target;
}
int
-xps_lookup_link_target(xps_document *doc, char *target_uri)
+xps_lookup_link_target(fz_context *ctx, xps_document *doc, char *target_uri)
{
xps_target *target;
char *needle = strrchr(target_uri, '#');
@@ -218,29 +208,28 @@ xps_lookup_link_target(xps_document *doc, char *target_uri)
}
static void
-xps_free_link_targets(xps_document *doc)
+xps_drop_link_targets(fz_context *ctx, xps_document *doc)
{
xps_target *target = doc->target, *next;
while (target)
{
next = target->next;
- fz_free(doc->ctx, target->name);
- fz_free(doc->ctx, target);
+ fz_free(ctx, target->name);
+ fz_free(ctx, target);
target = next;
}
}
static void
-xps_free_fixed_pages(xps_document *doc)
+xps_drop_fixed_pages(fz_context *ctx, xps_document *doc)
{
- xps_page *page = doc->first_page;
+ xps_fixpage *page = doc->first_page;
while (page)
{
- xps_page *next = page->next;
- xps_free_page(doc, page);
- fz_drop_link(doc->ctx, page->links);
- fz_free(doc->ctx, page->name);
- fz_free(doc->ctx, page);
+ xps_fixpage *next = page->next;
+ fz_drop_link(ctx, page->links);
+ fz_free(ctx, page->name);
+ fz_free(ctx, page);
page = next;
}
doc->first_page = NULL;
@@ -248,15 +237,15 @@ xps_free_fixed_pages(xps_document *doc)
}
static void
-xps_free_fixed_documents(xps_document *doc)
+xps_drop_fixed_documents(fz_context *ctx, xps_document *doc)
{
xps_fixdoc *fixdoc = doc->first_fixdoc;
while (fixdoc)
{
xps_fixdoc *next = fixdoc->next;
- fz_free(doc->ctx, fixdoc->name);
- fz_free(doc->ctx, fixdoc->outline);
- fz_free(doc->ctx, fixdoc);
+ fz_free(ctx, fixdoc->name);
+ fz_free(ctx, fixdoc->outline);
+ fz_free(ctx, fixdoc);
fixdoc = next;
}
doc->first_fixdoc = NULL;
@@ -264,11 +253,11 @@ xps_free_fixed_documents(xps_document *doc)
}
void
-xps_free_page_list(xps_document *doc)
+xps_drop_page_list(fz_context *ctx, xps_document *doc)
{
- xps_free_fixed_documents(doc);
- xps_free_fixed_pages(doc);
- xps_free_link_targets(doc);
+ xps_drop_fixed_documents(ctx, doc);
+ xps_drop_fixed_pages(ctx, doc);
+ xps_drop_link_targets(ctx, doc);
}
/*
@@ -276,7 +265,7 @@ xps_free_page_list(xps_document *doc)
*/
static void
-xps_parse_metadata_imp(xps_document *doc, fz_xml *item, xps_fixdoc *fixdoc)
+xps_parse_metadata_imp(fz_context *ctx, xps_document *doc, fz_xml *item, xps_fixdoc *fixdoc)
{
while (item)
{
@@ -287,13 +276,13 @@ xps_parse_metadata_imp(xps_document *doc, fz_xml *item, xps_fixdoc *fixdoc)
if (target && type)
{
char tgtbuf[1024];
- xps_resolve_url(tgtbuf, doc->base_uri, target, sizeof tgtbuf);
+ xps_resolve_url(ctx, doc, tgtbuf, doc->base_uri, target, sizeof tgtbuf);
if (!strcmp(type, REL_START_PART) || !strcmp(type, REL_START_PART_OXPS))
- doc->start_part = fz_strdup(doc->ctx, tgtbuf);
+ doc->start_part = fz_strdup(ctx, tgtbuf);
if ((!strcmp(type, REL_DOC_STRUCTURE) || !strcmp(type, REL_DOC_STRUCTURE_OXPS)) && fixdoc)
- fixdoc->outline = fz_strdup(doc->ctx, tgtbuf);
+ fixdoc->outline = fz_strdup(ctx, tgtbuf);
if (!fz_xml_att(item, "Id"))
- fz_warn(doc->ctx, "missing relationship id for %s", target);
+ fz_warn(ctx, "missing relationship id for %s", target);
}
}
@@ -303,8 +292,8 @@ xps_parse_metadata_imp(xps_document *doc, fz_xml *item, xps_fixdoc *fixdoc)
if (source)
{
char srcbuf[1024];
- xps_resolve_url(srcbuf, doc->base_uri, source, sizeof srcbuf);
- xps_add_fixed_document(doc, srcbuf);
+ xps_resolve_url(ctx, doc, srcbuf, doc->base_uri, source, sizeof srcbuf);
+ xps_add_fixed_document(ctx, doc, srcbuf);
}
}
@@ -318,8 +307,8 @@ xps_parse_metadata_imp(xps_document *doc, fz_xml *item, xps_fixdoc *fixdoc)
if (source)
{
char srcbuf[1024];
- xps_resolve_url(srcbuf, doc->base_uri, source, sizeof srcbuf);
- xps_add_fixed_page(doc, srcbuf, width, height);
+ xps_resolve_url(ctx, doc, srcbuf, doc->base_uri, source, sizeof srcbuf);
+ xps_add_fixed_page(ctx, doc, srcbuf, width, height);
}
}
@@ -327,17 +316,17 @@ xps_parse_metadata_imp(xps_document *doc, fz_xml *item, xps_fixdoc *fixdoc)
{
char *name = fz_xml_att(item, "Name");
if (name)
- xps_add_link_target(doc, name);
+ xps_add_link_target(ctx, doc, name);
}
- xps_parse_metadata_imp(doc, fz_xml_down(item), fixdoc);
+ xps_parse_metadata_imp(ctx, doc, fz_xml_down(item), fixdoc);
item = fz_xml_next(item);
}
}
static void
-xps_parse_metadata(xps_document *doc, xps_part *part, xps_fixdoc *fixdoc)
+xps_parse_metadata(fz_context *ctx, xps_document *doc, xps_part *part, xps_fixdoc *fixdoc)
{
fz_xml *root;
char buf[1024];
@@ -360,31 +349,30 @@ xps_parse_metadata(xps_document *doc, xps_part *part, xps_fixdoc *fixdoc)
doc->base_uri = buf;
doc->part_uri = part->name;
- root = fz_parse_xml(doc->ctx, part->data, part->size, 0);
- xps_parse_metadata_imp(doc, root, fixdoc);
- fz_free_xml(doc->ctx, root);
+ root = fz_parse_xml(ctx, part->data, part->size, 0);
+ xps_parse_metadata_imp(ctx, doc, root, fixdoc);
+ fz_drop_xml(ctx, root);
doc->base_uri = NULL;
doc->part_uri = NULL;
}
static void
-xps_read_and_process_metadata_part(xps_document *doc, char *name, xps_fixdoc *fixdoc)
+xps_read_and_process_metadata_part(fz_context *ctx, xps_document *doc, char *name, xps_fixdoc *fixdoc)
{
- fz_context *ctx = doc->ctx;
xps_part *part;
- if (!xps_has_part(doc, name))
+ if (!xps_has_part(ctx, doc, name))
return;
- part = xps_read_part(doc, name);
+ part = xps_read_part(ctx, doc, name);
fz_try(ctx)
{
- xps_parse_metadata(doc, part, fixdoc);
+ xps_parse_metadata(ctx, doc, part, fixdoc);
}
fz_always(ctx)
{
- xps_free_part(doc, part);
+ xps_drop_part(ctx, doc, part);
}
fz_catch(ctx)
{
@@ -393,57 +381,56 @@ xps_read_and_process_metadata_part(xps_document *doc, char *name, xps_fixdoc *fi
}
void
-xps_read_page_list(xps_document *doc)
+xps_read_page_list(fz_context *ctx, xps_document *doc)
{
xps_fixdoc *fixdoc;
- xps_read_and_process_metadata_part(doc, "/_rels/.rels", NULL);
+ xps_read_and_process_metadata_part(ctx, doc, "/_rels/.rels", NULL);
if (!doc->start_part)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find fixed document sequence start part");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find fixed document sequence start part");
- xps_read_and_process_metadata_part(doc, doc->start_part, NULL);
+ xps_read_and_process_metadata_part(ctx, doc, doc->start_part, NULL);
for (fixdoc = doc->first_fixdoc; fixdoc; fixdoc = fixdoc->next)
{
char relbuf[1024];
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- xps_rels_for_part(relbuf, fixdoc->name, sizeof relbuf);
- xps_read_and_process_metadata_part(doc, relbuf, fixdoc);
+ xps_rels_for_part(ctx, doc, relbuf, fixdoc->name, sizeof relbuf);
+ xps_read_and_process_metadata_part(ctx, doc, relbuf, fixdoc);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
- fz_warn(doc->ctx, "cannot process FixedDocument rels part");
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "cannot process FixedDocument rels part");
}
- xps_read_and_process_metadata_part(doc, fixdoc->name, fixdoc);
+ xps_read_and_process_metadata_part(ctx, doc, fixdoc->name, fixdoc);
}
}
int
-xps_count_pages(xps_document *doc)
+xps_count_pages(fz_context *ctx, xps_document *doc)
{
return doc->page_count;
}
-static void
-xps_load_fixed_page(xps_document *doc, xps_page *page)
+static fz_xml *
+xps_load_fixed_page(fz_context *ctx, xps_document *doc, xps_fixpage *page)
{
xps_part *part;
fz_xml *root;
char *width_att;
char *height_att;
- fz_context *ctx = doc->ctx;
- part = xps_read_part(doc, page->name);
+ part = xps_read_part(ctx, doc, page->name);
fz_try(ctx)
{
- root = fz_parse_xml(doc->ctx, part->data, part->size, 0);
+ root = fz_parse_xml(ctx, part->data, part->size, 0);
}
fz_always(ctx)
{
- xps_free_part(doc, part);
+ xps_drop_part(ctx, doc, part);
}
fz_catch(ctx)
{
@@ -451,89 +438,117 @@ xps_load_fixed_page(xps_document *doc, xps_page *page)
root = NULL;
}
if (!root)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "FixedPage missing root element");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing root element");
if (fz_xml_is_tag(root, "AlternateContent"))
{
- fz_xml *node = xps_lookup_alternate_content(root);
+ fz_xml *node = xps_lookup_alternate_content(ctx, doc, root);
if (!node)
{
- fz_free_xml(doc->ctx, root);
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "FixedPage missing alternate root element");
+ fz_drop_xml(ctx, root);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing alternate root element");
}
fz_detach_xml(node);
- fz_free_xml(doc->ctx, root);
+ fz_drop_xml(ctx, root);
root = node;
}
if (strcmp(fz_xml_tag(root), "FixedPage"))
{
- fz_free_xml(doc->ctx, root);
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected FixedPage element");
+ fz_drop_xml(ctx, root);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "expected FixedPage element");
}
width_att = fz_xml_att(root, "Width");
if (!width_att)
{
- fz_free_xml(doc->ctx, root);
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Width");
+ fz_drop_xml(ctx, root);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Width");
}
height_att = fz_xml_att(root, "Height");
if (!height_att)
{
- fz_free_xml(doc->ctx, root);
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Height");
+ fz_drop_xml(ctx, root);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Height");
}
page->width = atoi(width_att);
page->height = atoi(height_att);
- page->root = root;
+
+ return root;
}
-xps_page *
-xps_load_page(xps_document *doc, int number)
+fz_link *
+xps_load_links(fz_context *ctx, xps_page *page)
{
- xps_page *page;
- int n = 0;
-
- for (page = doc->first_page; page; page = page->next)
- {
- if (n == number)
- {
- doc->current_page = page;
- if (!page->root)
- xps_load_fixed_page(doc, page);
- return page;
- }
- n ++;
- }
-
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find page %d", number + 1);
+ if (!page->fix->links_resolved)
+ fz_warn(ctx, "xps_load_links before page has been executed!");
+ return fz_keep_link(ctx, page->fix->links);
}
fz_rect *
-xps_bound_page(xps_document *doc, xps_page *page, fz_rect *bounds)
+xps_bound_page(fz_context *ctx, xps_page *page, fz_rect *bounds)
{
bounds->x0 = bounds->y0 = 0;
- bounds->x1 = page->width * 72.0f / 96.0f;
- bounds->y1 = page->height * 72.0f / 96.0f;
+ bounds->x1 = page->fix->width * 72.0f / 96.0f;
+ bounds->y1 = page->fix->height * 72.0f / 96.0f;
return bounds;
}
void
-xps_free_page(xps_document *doc, xps_page *page)
+xps_drop_page_imp(fz_context *ctx, xps_page *page)
{
if (page == NULL)
return;
- /* only free the XML contents */
- if (page->root)
- fz_free_xml(doc->ctx, page->root);
- page->root = NULL;
+ fz_drop_document(ctx, &page->doc->super);
+ fz_drop_xml(ctx, page->root);
+}
+
+xps_page *
+xps_load_page(fz_context *ctx, xps_document *doc, int number)
+{
+ xps_page *page = NULL;
+ xps_fixpage *fix;
+ fz_xml *root;
+ int n = 0;
+
+ fz_var(page);
+
+ for (fix = doc->first_page; fix; fix = fix->next)
+ {
+ if (n == number)
+ {
+ doc->current_page = fix;
+
+ root = xps_load_fixed_page(ctx, doc, fix);
+ fz_try(ctx)
+ {
+ page = fz_new_page(ctx, sizeof *page);
+ page->super.load_links = (fz_page_load_links_fn *)xps_load_links;
+ page->super.bound_page = (fz_page_bound_page_fn *)xps_bound_page;
+ page->super.run_page_contents = (fz_page_run_page_contents_fn *)xps_run_page;
+ page->super.drop_page_imp = (fz_page_drop_page_imp_fn *)xps_drop_page_imp;
+
+ page->doc = (xps_document*) fz_keep_document(ctx, &doc->super);
+ page->fix = fix;
+ page->root = root;
+ }
+ fz_catch(ctx)
+ {
+ fz_drop_xml(ctx, root);
+ fz_rethrow(ctx);
+ }
+ return page;
+ }
+ n ++;
+ }
+
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find page %d", number + 1);
}
static int
-xps_recognize(fz_context *doc, const char *magic)
+xps_recognize(fz_context *ctx, const char *magic)
{
char *ext = strrchr(magic, '.');
diff --git a/source/xps/xps-glyphs.c b/source/xps/xps-glyphs.c
index ee16fb6f..e15eb726 100644
--- a/source/xps/xps-glyphs.c
+++ b/source/xps/xps-glyphs.c
@@ -52,12 +52,11 @@ xps_encode_font_char(fz_font *font, int code)
}
void
-xps_measure_font_glyph(xps_document *doc, fz_font *font, int gid, xps_glyph_metrics *mtx)
+xps_measure_font_glyph(fz_context *ctx, xps_document *doc, fz_font *font, int gid, xps_glyph_metrics *mtx)
{
int mask = FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM;
FT_Face face = font->ft_face;
FT_Fixed hadv = 0, vadv = 0;
- fz_context *ctx = doc->ctx;
fz_lock(ctx, FZ_LOCK_FREETYPE);
FT_Get_Advance(face, gid, mask, &hadv);
@@ -70,21 +69,21 @@ xps_measure_font_glyph(xps_document *doc, fz_font *font, int gid, xps_glyph_metr
}
static fz_font *
-xps_lookup_font(xps_document *doc, char *name)
+xps_lookup_font(fz_context *ctx, xps_document *doc, char *name)
{
xps_font_cache *cache;
for (cache = doc->font_table; cache; cache = cache->next)
if (!xps_strcasecmp(cache->name, name))
- return fz_keep_font(doc->ctx, cache->font);
+ return fz_keep_font(ctx, cache->font);
return NULL;
}
static void
-xps_insert_font(xps_document *doc, char *name, fz_font *font)
+xps_insert_font(fz_context *ctx, xps_document *doc, char *name, fz_font *font)
{
- xps_font_cache *cache = fz_malloc_struct(doc->ctx, xps_font_cache);
- cache->name = fz_strdup(doc->ctx, name);
- cache->font = fz_keep_font(doc->ctx, font);
+ xps_font_cache *cache = fz_malloc_struct(ctx, xps_font_cache);
+ cache->name = fz_strdup(ctx, name);
+ cache->font = fz_keep_font(ctx, font);
cache->next = doc->font_table;
doc->font_table = cache;
}
@@ -94,7 +93,7 @@ xps_insert_font(xps_document *doc, char *name, fz_font *font)
* data with the GUID in the fontname.
*/
static void
-xps_deobfuscate_font_resource(xps_document *doc, xps_part *part)
+xps_deobfuscate_font_resource(fz_context *ctx, xps_document *doc, xps_part *part)
{
unsigned char buf[33];
unsigned char key[16];
@@ -103,7 +102,7 @@ xps_deobfuscate_font_resource(xps_document *doc, xps_part *part)
if (part->size < 32)
{
- fz_warn(doc->ctx, "insufficient data for font deobfuscation");
+ fz_warn(ctx, "insufficient data for font deobfuscation");
return;
}
@@ -120,7 +119,7 @@ xps_deobfuscate_font_resource(xps_document *doc, xps_part *part)
if (i != 32)
{
- fz_warn(doc->ctx, "cannot extract GUID from obfuscated font part name");
+ fz_warn(ctx, "cannot extract GUID from obfuscated font part name");
return;
}
@@ -135,7 +134,7 @@ xps_deobfuscate_font_resource(xps_document *doc, xps_part *part)
}
static void
-xps_select_best_font_encoding(xps_document *doc, fz_font *font)
+xps_select_best_font_encoding(fz_context *ctx, xps_document *doc, fz_font *font)
{
static struct { int pid, eid; } xps_cmap_list[] =
{
@@ -166,7 +165,7 @@ xps_select_best_font_encoding(xps_document *doc, fz_font *font)
}
}
- fz_warn(doc->ctx, "cannot find a suitable cmap");
+ fz_warn(ctx, "cannot find a suitable cmap");
}
/*
@@ -257,7 +256,7 @@ xps_parse_glyph_metrics(char *s, float *advance, float *uofs, float *vofs)
* Calculate metrics for positioning.
*/
static fz_text *
-xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm,
+xps_parse_glyphs_imp(fz_context *ctx, xps_document *doc, const fz_matrix *ctm,
fz_font *font, float size, float originx, float originy,
int is_sideways, int bidi_level,
char *indices, char *unicode)
@@ -273,7 +272,7 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm,
int un = 0;
if (!unicode && !indices)
- fz_warn(doc->ctx, "glyphs element with neither characters nor indices");
+ fz_warn(ctx, "glyphs element with neither characters nor indices");
if (us)
{
@@ -289,7 +288,7 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm,
else
fz_scale(&tm, size, -size);
- text = fz_new_text(doc->ctx, font, &tm, is_sideways);
+ text = fz_new_text(ctx, font, &tm, is_sideways);
while ((us && un > 0) || (is && *is))
{
@@ -331,7 +330,7 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm,
if (glyph_index == -1)
glyph_index = xps_encode_font_char(font, char_code);
- xps_measure_font_glyph(doc, font, glyph_index, &mtx);
+ xps_measure_font_glyph(ctx, doc, font, glyph_index, &mtx);
if (is_sideways)
advance = mtx.vadv * 100;
else if (bidi_level & 1)
@@ -366,7 +365,7 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm,
f = y - v_offset;
}
- fz_add_text(doc->ctx, text, glyph_index, char_code, e, f);
+ fz_add_text(ctx, text, glyph_index, char_code, e, f);
x += advance * 0.01f * size;
}
@@ -376,9 +375,11 @@ xps_parse_glyphs_imp(xps_document *doc, const fz_matrix *ctm,
}
void
-xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
+xps_parse_glyphs(fz_context *ctx, xps_document *doc, const fz_matrix *ctm,
char *base_uri, xps_resource *dict, fz_xml *root)
{
+ fz_device *dev = doc->dev;
+
fz_xml *node;
char *fill_uri;
@@ -459,17 +460,17 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
fill_uri = base_uri;
opacity_mask_uri = base_uri;
- xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &clip_att, &clip_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &fill_att, &fill_tag, &fill_uri);
- xps_resolve_resource_reference(doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &clip_att, &clip_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &fill_att, &fill_tag, &fill_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri);
/*
* Check that we have all the necessary information.
*/
if (!font_size_att || !font_uri_att || !origin_x_att || !origin_y_att) {
- fz_warn(doc->ctx, "missing attributes in glyphs element");
+ fz_warn(ctx, "missing attributes in glyphs element");
return;
}
@@ -486,7 +487,7 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
* Find and load the font resource
*/
- xps_resolve_url(partname, base_uri, font_uri_att, sizeof partname);
+ xps_resolve_url(ctx, doc, partname, base_uri, font_uri_att, sizeof partname);
subfont = strrchr(partname, '#');
if (subfont)
{
@@ -506,45 +507,45 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
fz_strlcat(fakename, "#BoldItalic", sizeof fakename);
}
- font = xps_lookup_font(doc, fakename);
+ font = xps_lookup_font(ctx, doc, fakename);
if (!font)
{
fz_buffer *buf = NULL;
fz_var(buf);
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- part = xps_read_part(doc, partname);
+ part = xps_read_part(ctx, doc, partname);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
- fz_warn(doc->ctx, "cannot find font resource part '%s'", partname);
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "cannot find font resource part '%s'", partname);
return;
}
/* deobfuscate if necessary */
if (strstr(part->name, ".odttf"))
- xps_deobfuscate_font_resource(doc, part);
+ xps_deobfuscate_font_resource(ctx, doc, part);
if (strstr(part->name, ".ODTTF"))
- xps_deobfuscate_font_resource(doc, part);
+ xps_deobfuscate_font_resource(ctx, doc, part);
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- buf = fz_new_buffer_from_data(doc->ctx, part->data, part->size);
+ buf = fz_new_buffer_from_data(ctx, part->data, part->size);
/* part->data is now owned by buf */
part->data = NULL;
- font = fz_new_font_from_buffer(doc->ctx, NULL, buf, subfontid, 1);
+ font = fz_new_font_from_buffer(ctx, NULL, buf, subfontid, 1);
}
- fz_always(doc->ctx)
+ fz_always(ctx)
{
- fz_drop_buffer(doc->ctx, buf);
- xps_free_part(doc, part);
+ fz_drop_buffer(ctx, buf);
+ xps_drop_part(ctx, doc, part);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
- fz_warn(doc->ctx, "cannot load font resource '%s'", partname);
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "cannot load font resource '%s'", partname);
return;
}
@@ -554,8 +555,8 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
font->ft_italic = !!strstr(style_att, "Italic");
}
- xps_select_best_font_encoding(doc, font);
- xps_insert_font(doc, fakename, font);
+ xps_select_best_font_encoding(ctx, doc, font);
+ xps_insert_font(ctx, doc, fakename, font);
}
/*
@@ -566,27 +567,27 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
{
fz_matrix transform;
if (transform_att)
- xps_parse_render_transform(doc, transform_att, &transform);
+ xps_parse_render_transform(ctx, doc, transform_att, &transform);
if (transform_tag)
- xps_parse_matrix_transform(doc, transform_tag, &transform);
+ xps_parse_matrix_transform(ctx, doc, transform_tag, &transform);
fz_concat(&local_ctm, &transform, &local_ctm);
}
if (clip_att || clip_tag)
- xps_clip(doc, &local_ctm, dict, clip_att, clip_tag);
+ xps_clip(ctx, doc, &local_ctm, dict, clip_att, clip_tag);
font_size = fz_atof(font_size_att);
- text = xps_parse_glyphs_imp(doc, &local_ctm, font, font_size,
+ text = xps_parse_glyphs_imp(ctx, doc, &local_ctm, font, font_size,
fz_atof(origin_x_att), fz_atof(origin_y_att),
is_sideways, bidi_level, indices_att, unicode_att);
- fz_bound_text(doc->ctx, text, NULL, &local_ctm, &area);
+ fz_bound_text(ctx, text, NULL, &local_ctm, &area);
if (navigate_uri_att)
- xps_add_link(doc, &area, base_uri, navigate_uri_att);
+ xps_add_link(ctx, doc, &area, base_uri, navigate_uri_att);
- xps_begin_opacity(doc, &local_ctm, &area, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
+ xps_begin_opacity(ctx, doc, &local_ctm, &area, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
/* If it's a solid color brush fill/stroke do a simple fill */
@@ -602,12 +603,12 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
float samples[FZ_MAX_COLORS];
fz_colorspace *colorspace;
- xps_parse_color(doc, base_uri, fill_att, &colorspace, samples);
+ xps_parse_color(ctx, doc, base_uri, fill_att, &colorspace, samples);
if (fill_opacity_att)
samples[0] *= fz_atof(fill_opacity_att);
- xps_set_color(doc, colorspace, samples);
+ xps_set_color(ctx, doc, colorspace, samples);
- fz_fill_text(doc->dev, text, &local_ctm,
+ fz_fill_text(ctx, dev, text, &local_ctm,
doc->colorspace, doc->color, doc->alpha);
}
@@ -615,17 +616,17 @@ xps_parse_glyphs(xps_document *doc, const fz_matrix *ctm,
if (fill_tag)
{
- fz_clip_text(doc->dev, text, &local_ctm, 0);
- xps_parse_brush(doc, &local_ctm, &area, fill_uri, dict, fill_tag);
- fz_pop_clip(doc->dev);
+ fz_clip_text(ctx, dev, text, &local_ctm, 0);
+ xps_parse_brush(ctx, doc, &local_ctm, &area, fill_uri, dict, fill_tag);
+ fz_pop_clip(ctx, dev);
}
- xps_end_opacity(doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
+ xps_end_opacity(ctx, doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
- fz_free_text(doc->ctx, text);
+ fz_drop_text(ctx, text);
if (clip_att || clip_tag)
- fz_pop_clip(doc->dev);
+ fz_pop_clip(ctx, dev);
- fz_drop_font(doc->ctx, font);
+ fz_drop_font(ctx, font);
}
diff --git a/source/xps/xps-gradient.c b/source/xps/xps-gradient.c
index 4c1d0851..f3a9f8e8 100644
--- a/source/xps/xps-gradient.c
+++ b/source/xps/xps-gradient.c
@@ -35,7 +35,7 @@ static inline float lerp(float a, float b, float x)
}
static int
-xps_parse_gradient_stops(xps_document *doc, char *base_uri, fz_xml *node,
+xps_parse_gradient_stops(fz_context *ctx, xps_document *doc, char *base_uri, fz_xml *node,
struct stop *stops, int maxcount)
{
fz_colorspace *colorspace;
@@ -60,9 +60,9 @@ xps_parse_gradient_stops(xps_document *doc, char *base_uri, fz_xml *node,
stops[count].offset = fz_atof(offset);
stops[count].index = count;
- xps_parse_color(doc, base_uri, color, &colorspace, sample);
+ xps_parse_color(ctx, doc, base_uri, color, &colorspace, sample);
- fz_convert_color(doc->ctx, fz_device_rgb(doc->ctx), rgb, colorspace, sample + 1);
+ fz_convert_color(ctx, fz_device_rgb(ctx), rgb, colorspace, sample + 1);
stops[count].r = rgb[0];
stops[count].g = rgb[1];
@@ -77,7 +77,7 @@ xps_parse_gradient_stops(xps_document *doc, char *base_uri, fz_xml *node,
if (count == 0)
{
- fz_warn(doc->ctx, "gradient brush has no gradient stops");
+ fz_warn(ctx, "gradient brush has no gradient stops");
stops[0].offset = 0;
stops[0].r = 0;
stops[0].g = 0;
@@ -92,7 +92,7 @@ xps_parse_gradient_stops(xps_document *doc, char *base_uri, fz_xml *node,
}
if (count == maxcount)
- fz_warn(doc->ctx, "gradient brush exceeded maximum number of gradient stops");
+ fz_warn(ctx, "gradient brush exceeded maximum number of gradient stops");
/* Postprocess to make sure the range of offsets is 0.0 to 1.0 */
@@ -175,7 +175,7 @@ xps_parse_gradient_stops(xps_document *doc, char *base_uri, fz_xml *node,
}
static void
-xps_sample_gradient_stops(fz_shade *shade, struct stop *stops, int count)
+xps_sample_gradient_stops(fz_context *ctx, xps_document *doc, fz_shade *shade, struct stop *stops, int count)
{
float offset, d;
int i, k;
@@ -204,18 +204,19 @@ xps_sample_gradient_stops(fz_shade *shade, struct stop *stops, int count)
*/
static void
-xps_draw_one_radial_gradient(xps_document *doc, const fz_matrix *ctm,
+xps_draw_one_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ctm,
struct stop *stops, int count,
int extend,
float x0, float y0, float r0,
float x1, float y1, float r1)
{
+ fz_device *dev = doc->dev;
fz_shade *shade;
/* TODO: this (and the stuff in pdf_shade) should move to res_shade.c */
- shade = fz_malloc_struct(doc->ctx, fz_shade);
- FZ_INIT_STORABLE(shade, 1, fz_free_shade_imp);
- shade->colorspace = fz_device_rgb(doc->ctx);
+ shade = fz_malloc_struct(ctx, fz_shade);
+ FZ_INIT_STORABLE(shade, 1, fz_drop_shade_imp);
+ shade->colorspace = fz_device_rgb(ctx);
shade->bbox = fz_infinite_rect;
shade->matrix = fz_identity;
shade->use_background = 0;
@@ -224,7 +225,7 @@ xps_draw_one_radial_gradient(xps_document *doc, const fz_matrix *ctm,
shade->u.l_or_r.extend[0] = extend;
shade->u.l_or_r.extend[1] = extend;
- xps_sample_gradient_stops(shade, stops, count);
+ xps_sample_gradient_stops(ctx, doc, shade, stops, count);
shade->u.l_or_r.coords[0][0] = x0;
shade->u.l_or_r.coords[0][1] = y0;
@@ -233,9 +234,9 @@ xps_draw_one_radial_gradient(xps_document *doc, const fz_matrix *ctm,
shade->u.l_or_r.coords[1][1] = y1;
shade->u.l_or_r.coords[1][2] = r1;
- fz_fill_shade(doc->dev, shade, ctm, 1);
+ fz_fill_shade(ctx, dev, shade, ctm, 1);
- fz_drop_shade(doc->ctx, shade);
+ fz_drop_shade(ctx, shade);
}
/*
@@ -243,17 +244,18 @@ xps_draw_one_radial_gradient(xps_document *doc, const fz_matrix *ctm,
*/
static void
-xps_draw_one_linear_gradient(xps_document *doc, const fz_matrix *ctm,
+xps_draw_one_linear_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ctm,
struct stop *stops, int count,
int extend,
float x0, float y0, float x1, float y1)
{
+ fz_device *dev = doc->dev;
fz_shade *shade;
/* TODO: this (and the stuff in pdf_shade) should move to res_shade.c */
- shade = fz_malloc_struct(doc->ctx, fz_shade);
- FZ_INIT_STORABLE(shade, 1, fz_free_shade_imp);
- shade->colorspace = fz_device_rgb(doc->ctx);
+ shade = fz_malloc_struct(ctx, fz_shade);
+ FZ_INIT_STORABLE(shade, 1, fz_drop_shade_imp);
+ shade->colorspace = fz_device_rgb(ctx);
shade->bbox = fz_infinite_rect;
shade->matrix = fz_identity;
shade->use_background = 0;
@@ -262,7 +264,7 @@ xps_draw_one_linear_gradient(xps_document *doc, const fz_matrix *ctm,
shade->u.l_or_r.extend[0] = extend;
shade->u.l_or_r.extend[1] = extend;
- xps_sample_gradient_stops(shade, stops, count);
+ xps_sample_gradient_stops(ctx, doc, shade, stops, count);
shade->u.l_or_r.coords[0][0] = x0;
shade->u.l_or_r.coords[0][1] = y0;
@@ -271,9 +273,9 @@ xps_draw_one_linear_gradient(xps_document *doc, const fz_matrix *ctm,
shade->u.l_or_r.coords[1][1] = y1;
shade->u.l_or_r.coords[1][2] = 0;
- fz_fill_shade(doc->dev, shade, ctm, doc->opacity[doc->opacity_top]);
+ fz_fill_shade(ctx, dev, shade, ctm, doc->opacity[doc->opacity_top]);
- fz_drop_shade(doc->ctx, shade);
+ fz_drop_shade(ctx, shade);
}
/*
@@ -292,7 +294,7 @@ static inline float point_inside_circle(float px, float py, float x, float y, fl
}
static void
-xps_draw_radial_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_draw_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
struct stop *stops, int count,
fz_xml *root, int spread)
{
@@ -317,9 +319,9 @@ xps_draw_radial_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
yrad = 1.0;
if (origin_att)
- xps_parse_point(origin_att, &x0, &y0);
+ xps_parse_point(ctx, doc, origin_att, &x0, &y0);
if (center_att)
- xps_parse_point(center_att, &x1, &y1);
+ xps_parse_point(ctx, doc, center_att, &x1, &y1);
if (radius_x_att)
xrad = fz_atof(radius_x_att);
if (radius_y_att)
@@ -353,7 +355,7 @@ xps_draw_radial_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
if (spread == SPREAD_REPEAT)
{
for (i = ma - 1; i >= 0; i--)
- xps_draw_one_radial_gradient(doc, &local_ctm, stops, count, 0, x0, y0, r0 + i * xrad, x1, y1, r1 + i * xrad);
+ xps_draw_one_radial_gradient(ctx, doc, &local_ctm, stops, count, 0, x0, y0, r0 + i * xrad, x1, y1, r1 + i * xrad);
}
else if (spread == SPREAD_REFLECT)
{
@@ -361,13 +363,13 @@ xps_draw_radial_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
ma++;
for (i = ma - 2; i >= 0; i -= 2)
{
- xps_draw_one_radial_gradient(doc, &local_ctm, stops, count, 0, x0, y0, r0 + i * xrad, x1, y1, r1 + i * xrad);
- xps_draw_one_radial_gradient(doc, &local_ctm, stops, count, 0, x0, y0, r0 + (i + 2) * xrad, x1, y1, r1 + i * xrad);
+ xps_draw_one_radial_gradient(ctx, doc, &local_ctm, stops, count, 0, x0, y0, r0 + i * xrad, x1, y1, r1 + i * xrad);
+ xps_draw_one_radial_gradient(ctx, doc, &local_ctm, stops, count, 0, x0, y0, r0 + (i + 2) * xrad, x1, y1, r1 + i * xrad);
}
}
else
{
- xps_draw_one_radial_gradient(doc, &local_ctm, stops, count, 1, x0, y0, r0, x1, y1, r1);
+ xps_draw_one_radial_gradient(ctx, doc, &local_ctm, stops, count, 1, x0, y0, r0, x1, y1, r1);
}
}
@@ -377,7 +379,7 @@ xps_draw_radial_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
*/
static void
-xps_draw_linear_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_draw_linear_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
struct stop *stops, int count,
fz_xml *root, int spread)
{
@@ -395,9 +397,9 @@ xps_draw_linear_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
x1 = y1 = 1;
if (start_point_att)
- xps_parse_point(start_point_att, &x0, &y0);
+ xps_parse_point(ctx, doc, start_point_att, &x0, &y0);
if (end_point_att)
- xps_parse_point(end_point_att, &x1, &y1);
+ xps_parse_point(ctx, doc, end_point_att, &x1, &y1);
p1.x = x0; p1.y = y0; p2.x = x1; p2.y = y1;
fz_transform_rect(&local_area, fz_invert_matrix(&inv, ctm));
@@ -415,7 +417,7 @@ xps_draw_linear_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
if (spread == SPREAD_REPEAT)
{
for (i = mi; i < ma; i++)
- xps_draw_one_linear_gradient(doc, ctm, stops, count, 0, x0 + i * dx, y0 + i * dy, x1 + i * dx, y1 + i * dy);
+ xps_draw_one_linear_gradient(ctx, doc, ctm, stops, count, 0, x0 + i * dx, y0 + i * dy, x1 + i * dx, y1 + i * dy);
}
else if (spread == SPREAD_REFLECT)
{
@@ -423,13 +425,13 @@ xps_draw_linear_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
mi--;
for (i = mi; i < ma; i += 2)
{
- xps_draw_one_linear_gradient(doc, ctm, stops, count, 0, x0 + i * dx, y0 + i * dy, x1 + i * dx, y1 + i * dy);
- xps_draw_one_linear_gradient(doc, ctm, stops, count, 0, x0 + (i + 2) * dx, y0 + (i + 2) * dy, x1 + i * dx, y1 + i * dy);
+ xps_draw_one_linear_gradient(ctx, doc, ctm, stops, count, 0, x0 + i * dx, y0 + i * dy, x1 + i * dx, y1 + i * dy);
+ xps_draw_one_linear_gradient(ctx, doc, ctm, stops, count, 0, x0 + (i + 2) * dx, y0 + (i + 2) * dy, x1 + i * dx, y1 + i * dy);
}
}
else
{
- xps_draw_one_linear_gradient(doc, ctm, stops, count, 1, x0, y0, x1, y1);
+ xps_draw_one_linear_gradient(ctx, doc, ctm, stops, count, 1, x0, y0, x1, y1);
}
}
@@ -439,9 +441,9 @@ xps_draw_linear_gradient(xps_document *doc, const fz_matrix *ctm, const fz_rect
*/
static void
-xps_parse_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_parse_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root,
- void (*draw)(xps_document *, const fz_matrix*, const fz_rect *, struct stop *, int, fz_xml *, int))
+ void (*draw)(fz_context *ctx, xps_document *, const fz_matrix*, const fz_rect *, struct stop *, int, fz_xml *, int))
{
fz_xml *node;
@@ -473,7 +475,7 @@ xps_parse_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect
stop_tag = fz_xml_down(node);
}
- xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL);
spread_method = SPREAD_PAD;
if (spread_att)
@@ -488,40 +490,40 @@ xps_parse_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect
transform = fz_identity;
if (transform_att)
- xps_parse_render_transform(doc, transform_att, &transform);
+ xps_parse_render_transform(ctx, doc, transform_att, &transform);
if (transform_tag)
- xps_parse_matrix_transform(doc, transform_tag, &transform);
+ xps_parse_matrix_transform(ctx, doc, transform_tag, &transform);
fz_concat(&transform, &transform, ctm);
if (!stop_tag) {
- fz_warn(doc->ctx, "missing gradient stops tag");
+ fz_warn(ctx, "missing gradient stops tag");
return;
}
- stop_count = xps_parse_gradient_stops(doc, base_uri, stop_tag, stop_list, MAX_STOPS);
+ stop_count = xps_parse_gradient_stops(ctx, doc, base_uri, stop_tag, stop_list, MAX_STOPS);
if (stop_count == 0)
{
- fz_warn(doc->ctx, "no gradient stops found");
+ fz_warn(ctx, "no gradient stops found");
return;
}
- xps_begin_opacity(doc, &transform, area, base_uri, dict, opacity_att, NULL);
+ xps_begin_opacity(ctx, doc, &transform, area, base_uri, dict, opacity_att, NULL);
- draw(doc, &transform, area, stop_list, stop_count, root, spread_method);
+ draw(ctx, doc, &transform, area, stop_list, stop_count, root, spread_method);
- xps_end_opacity(doc, base_uri, dict, opacity_att, NULL);
+ xps_end_opacity(ctx, doc, base_uri, dict, opacity_att, NULL);
}
void
-xps_parse_linear_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_parse_linear_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root)
{
- xps_parse_gradient_brush(doc, ctm, area, base_uri, dict, root, xps_draw_linear_gradient);
+ xps_parse_gradient_brush(ctx, doc, ctm, area, base_uri, dict, root, xps_draw_linear_gradient);
}
void
-xps_parse_radial_gradient_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_parse_radial_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root)
{
- xps_parse_gradient_brush(doc, ctm, area, base_uri, dict, root, xps_draw_radial_gradient);
+ xps_parse_gradient_brush(ctx, doc, ctm, area, base_uri, dict, root, xps_draw_radial_gradient);
}
diff --git a/source/xps/xps-image.c b/source/xps/xps-image.c
index 9b2aefcb..b0d00a2f 100644
--- a/source/xps/xps-image.c
+++ b/source/xps/xps-image.c
@@ -1,7 +1,7 @@
#include "mupdf/xps.h"
static fz_image *
-xps_load_image(fz_context *ctx, xps_part *part)
+xps_load_image(fz_context *ctx, xps_document *doc, xps_part *part)
{
/* Ownership of data always passes in here */
unsigned char *data = part->data;
@@ -11,7 +11,7 @@ xps_load_image(fz_context *ctx, xps_part *part)
/* FIXME: area unused! */
static void
-xps_paint_image_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict,
+xps_paint_image_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict,
fz_xml *root, void *vimage)
{
fz_image *image = vimage;
@@ -23,11 +23,11 @@ xps_paint_image_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *ar
xs = image->w * 96 / image->xres;
ys = image->h * 96 / image->yres;
fz_pre_scale(&local_ctm, xs, ys);
- fz_fill_image(doc->dev, image, &local_ctm, doc->opacity[doc->opacity_top]);
+ fz_fill_image(ctx, doc->dev, image, &local_ctm, doc->opacity[doc->opacity_top]);
}
static void
-xps_find_image_brush_source_part(xps_document *doc, char *base_uri, fz_xml *root, xps_part **image_part, xps_part **profile_part)
+xps_find_image_brush_source_part(fz_context *ctx, xps_document *doc, char *base_uri, fz_xml *root, xps_part **image_part, xps_part **profile_part)
{
char *image_source_att;
char buf[1024];
@@ -38,7 +38,7 @@ xps_find_image_brush_source_part(xps_document *doc, char *base_uri, fz_xml *root
image_source_att = fz_xml_att(root, "ImageSource");
if (!image_source_att)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find image source attribute");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find image source attribute");
/* "{ColorConvertedBitmap /Resources/Image.tiff /Resources/Profile.icc}" */
if (strstr(image_source_att, "{ColorConvertedBitmap") == image_source_att)
@@ -69,20 +69,20 @@ xps_find_image_brush_source_part(xps_document *doc, char *base_uri, fz_xml *root
}
if (!image_name)
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "cannot find image source");
+ fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find image source");
if (image_part)
{
- xps_resolve_url(partname, base_uri, image_name, sizeof partname);
- *image_part = xps_read_part(doc, partname);
+ xps_resolve_url(ctx, doc, partname, base_uri, image_name, sizeof partname);
+ *image_part = xps_read_part(ctx, doc, partname);
}
if (profile_part)
{
if (profile_name)
{
- xps_resolve_url(partname, base_uri, profile_name, sizeof partname);
- *profile_part = xps_read_part(doc, partname);
+ xps_resolve_url(ctx, doc, partname, base_uri, profile_name, sizeof partname);
+ *profile_part = xps_read_part(ctx, doc, partname);
}
else
*profile_part = NULL;
@@ -90,40 +90,40 @@ xps_find_image_brush_source_part(xps_document *doc, char *base_uri, fz_xml *root
}
void
-xps_parse_image_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_parse_image_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root)
{
xps_part *part;
fz_image *image;
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- xps_find_image_brush_source_part(doc, base_uri, root, &part, NULL);
+ xps_find_image_brush_source_part(ctx, doc, base_uri, root, &part, NULL);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
- fz_warn(doc->ctx, "cannot find image source");
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "cannot find image source");
return;
}
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- image = xps_load_image(doc->ctx, part);
+ image = xps_load_image(ctx, doc, part);
image->invert_cmyk_jpeg = 1;
}
- fz_always(doc->ctx)
+ fz_always(ctx)
{
- xps_free_part(doc, part);
+ xps_drop_part(ctx, doc, part);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
- fz_warn(doc->ctx, "cannot decode image resource");
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
+ fz_warn(ctx, "cannot decode image resource");
return;
}
- xps_parse_tiling_brush(doc, ctm, area, base_uri, dict, root, xps_paint_image_brush, image);
+ xps_parse_tiling_brush(ctx, doc, ctm, area, base_uri, dict, root, xps_paint_image_brush, image);
- fz_drop_image(doc->ctx, image);
+ fz_drop_image(ctx, image);
}
diff --git a/source/xps/xps-outline.c b/source/xps/xps-outline.c
index e314e83e..b6e68c29 100644
--- a/source/xps/xps-outline.c
+++ b/source/xps/xps-outline.c
@@ -5,17 +5,17 @@
*/
static fz_outline *
-xps_lookup_last_outline_at_level(fz_outline *node, int level, int target_level)
+xps_lookup_last_outline_at_level(fz_context *ctx, xps_document *doc, fz_outline *node, int level, int target_level)
{
while (node->next)
node = node->next;
if (level == target_level || !node->down)
return node;
- return xps_lookup_last_outline_at_level(node->down, level + 1, target_level);
+ return xps_lookup_last_outline_at_level(ctx, doc, node->down, level + 1, target_level);
}
static fz_outline *
-xps_parse_document_outline(xps_document *doc, fz_xml *root)
+xps_parse_document_outline(fz_context *ctx, xps_document *doc, fz_xml *root)
{
fz_xml *node;
fz_outline *head = NULL, *entry, *tail;
@@ -30,11 +30,11 @@ xps_parse_document_outline(xps_document *doc, fz_xml *root)
if (!target || !description)
continue;
- entry = fz_malloc_struct(doc->ctx, fz_outline);
- entry->title = fz_strdup(doc->ctx, description);
+ entry = fz_malloc_struct(ctx, fz_outline);
+ entry->title = fz_strdup(ctx, description);
entry->dest.kind = FZ_LINK_GOTO;
entry->dest.ld.gotor.flags = 0;
- entry->dest.ld.gotor.page = xps_lookup_link_target(doc, target);
+ entry->dest.ld.gotor.page = xps_lookup_link_target(ctx, doc, target);
entry->down = NULL;
entry->next = NULL;
@@ -46,7 +46,7 @@ xps_parse_document_outline(xps_document *doc, fz_xml *root)
}
else
{
- tail = xps_lookup_last_outline_at_level(head, 1, this_level);
+ tail = xps_lookup_last_outline_at_level(ctx, doc, head, 1, this_level);
if (this_level > last_level)
tail->down = entry;
else
@@ -60,7 +60,7 @@ xps_parse_document_outline(xps_document *doc, fz_xml *root)
}
static fz_outline *
-xps_parse_document_structure(xps_document *doc, fz_xml *root)
+xps_parse_document_structure(fz_context *ctx, xps_document *doc, fz_xml *root)
{
fz_xml *node;
if (fz_xml_is_tag(root, "DocumentStructure"))
@@ -70,53 +70,53 @@ xps_parse_document_structure(xps_document *doc, fz_xml *root)
{
node = fz_xml_down(node);
if (node && fz_xml_is_tag(node, "DocumentOutline"))
- return xps_parse_document_outline(doc, node);
+ return xps_parse_document_outline(ctx, doc, node);
}
}
return NULL;
}
static fz_outline *
-xps_load_document_structure(xps_document *doc, xps_fixdoc *fixdoc)
+xps_load_document_structure(fz_context *ctx, xps_document *doc, xps_fixdoc *fixdoc)
{
xps_part *part;
fz_xml *root;
fz_outline *outline;
- part = xps_read_part(doc, fixdoc->outline);
- fz_try(doc->ctx)
+ part = xps_read_part(ctx, doc, fixdoc->outline);
+ fz_try(ctx)
{
- root = fz_parse_xml(doc->ctx, part->data, part->size, 0);
+ root = fz_parse_xml(ctx, part->data, part->size, 0);
}
- fz_always(doc->ctx)
+ fz_always(ctx)
{
- xps_free_part(doc, part);
+ xps_drop_part(ctx, doc, part);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow(doc->ctx);
+ fz_rethrow(ctx);
}
if (!root)
return NULL;
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- outline = xps_parse_document_structure(doc, root);
+ outline = xps_parse_document_structure(ctx, doc, root);
}
- fz_always(doc->ctx)
+ fz_always(ctx)
{
- fz_free_xml(doc->ctx, root);
+ fz_drop_xml(ctx, root);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow(doc->ctx);
+ fz_rethrow(ctx);
}
return outline;
}
fz_outline *
-xps_load_outline(xps_document *doc)
+xps_load_outline(fz_context *ctx, xps_document *doc)
{
xps_fixdoc *fixdoc;
fz_outline *head = NULL, *tail, *outline;
@@ -125,13 +125,13 @@ xps_load_outline(xps_document *doc)
{
if (fixdoc->outline)
{
- fz_try(doc->ctx)
+ fz_try(ctx)
{
- outline = xps_load_document_structure(doc, fixdoc);
+ outline = xps_load_document_structure(ctx, doc, fixdoc);
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_rethrow_if(doc->ctx, FZ_ERROR_TRYLATER);
+ fz_rethrow_if(ctx, FZ_ERROR_TRYLATER);
outline = NULL;
}
if (!outline)
diff --git a/source/xps/xps-path.c b/source/xps/xps-path.c
index 49240ee4..e1245a9a 100644
--- a/source/xps/xps-path.c
+++ b/source/xps/xps-path.c
@@ -1,7 +1,7 @@
#include "mupdf/xps.h"
static char *
-xps_parse_float_array(char *s, int num, float *x)
+xps_parse_float_array(fz_context *ctx, xps_document *doc, char *s, int num, float *x)
{
int k = 0;
@@ -24,12 +24,12 @@ xps_parse_float_array(char *s, int num, float *x)
}
char *
-xps_parse_point(char *s_in, float *x, float *y)
+xps_parse_point(fz_context *ctx, xps_document *doc, char *s_in, float *x, float *y)
{
char *s_out = s_in;
float xy[2];
- s_out = xps_parse_float_array(s_out, 2, &xy[0]);
+ s_out = xps_parse_float_array(ctx, doc, s_out, 2, &xy[0]);
*x = xy[0];
*y = xy[1];
return s_out;
@@ -44,7 +44,7 @@ xps_parse_point(char *s_in, float *x, float *y)
* calculated by th0, and on exit, a point is generated for us at th0.
*/
static void
-xps_draw_arc_segment(fz_context *doc, fz_path *path, const fz_matrix *mtx, float th0, float th1, int iscw)
+xps_draw_arc_segment(fz_context *ctx, xps_document *doc, fz_path *path, const fz_matrix *mtx, float th0, float th1, int iscw)
{
float t, d;
fz_point p;
@@ -59,7 +59,7 @@ xps_draw_arc_segment(fz_context *doc, fz_path *path, const fz_matrix *mtx, float
for (t = th0 + d; t < th1 - d/2; t += d)
{
fz_transform_point_xy(&p, mtx, cosf(t), sinf(t));
- fz_lineto(doc, path, p.x, p.y);
+ fz_lineto(ctx, path, p.x, p.y);
}
}
else
@@ -68,7 +68,7 @@ xps_draw_arc_segment(fz_context *doc, fz_path *path, const fz_matrix *mtx, float
for (t = th0 - d; t > th1 + d/2; t -= d)
{
fz_transform_point_xy(&p, mtx, cosf(t), sinf(t));
- fz_lineto(doc, path, p.x, p.y);
+ fz_lineto(ctx, path, p.x, p.y);
}
}
}
@@ -106,7 +106,7 @@ angle_between(const fz_point u, const fz_point v)
If is_clockwise, then the arc sweeps clockwise.
*/
static void
-xps_draw_arc(fz_context *doc, fz_path *path,
+xps_draw_arc(fz_context *ctx, xps_document *doc, fz_path *path,
float size_x, float size_y, float rotation_angle,
int is_large_arc, int is_clockwise,
float point_x, float point_y)
@@ -122,7 +122,7 @@ xps_draw_arc(fz_context *doc, fz_path *path,
float sign;
float th1, dth;
- pt = fz_currentpoint(doc, path);
+ pt = fz_currentpoint(ctx, path);
x1 = pt.x;
y1 = pt.y;
x2 = point_x;
@@ -146,7 +146,7 @@ xps_draw_arc(fz_context *doc, fz_path *path,
ry = fabsf(ry);
if (rx < 0.001f || ry < 0.001f || (x1 == x2 && y1 == y2))
{
- fz_lineto(doc, path, x2, y2);
+ fz_lineto(ctx, path, x2, y2);
return;
}
@@ -203,9 +203,9 @@ xps_draw_arc(fz_context *doc, fz_path *path,
}
fz_pre_scale(fz_pre_rotate(fz_translate(&mtx, cx, cy), rotation_angle), rx, ry);
- xps_draw_arc_segment(doc, path, &mtx, th1, th1 + dth, is_clockwise);
+ xps_draw_arc_segment(ctx, doc, path, &mtx, th1, th1 + dth, is_clockwise);
- fz_lineto(doc, path, point_x, point_y);
+ fz_lineto(ctx, path, point_x, point_y);
}
/*
@@ -215,7 +215,7 @@ xps_draw_arc(fz_context *doc, fz_path *path,
*/
static fz_path *
-xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
+xps_parse_abbreviated_geometry(fz_context *ctx, xps_document *doc, char *geom, int *fill_rule)
{
fz_path *path;
char **args;
@@ -228,9 +228,9 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
float smooth_x, smooth_y; /* saved cubic bezier control point for smooth curves */
int reset_smooth;
- path = fz_new_path(doc->ctx);
+ path = fz_new_path(ctx);
- args = fz_malloc_array(doc->ctx, strlen(geom) + 1, sizeof(char*));
+ args = fz_malloc_array(ctx, strlen(geom) + 1, sizeof(char*));
pargs = args;
while (*s)
@@ -288,51 +288,51 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 'M':
if (i + 1 >= n) break;
- fz_moveto(doc->ctx, path, fz_atof(args[i]), fz_atof(args[i+1]));
+ fz_moveto(ctx, path, fz_atof(args[i]), fz_atof(args[i+1]));
i += 2;
break;
case 'm':
if (i + 1 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- fz_moveto(doc->ctx, path, pt.x + fz_atof(args[i]), pt.y + fz_atof(args[i+1]));
+ pt = fz_currentpoint(ctx, path);
+ fz_moveto(ctx, path, pt.x + fz_atof(args[i]), pt.y + fz_atof(args[i+1]));
i += 2;
break;
case 'L':
if (i + 1 >= n) break;
- fz_lineto(doc->ctx, path, fz_atof(args[i]), fz_atof(args[i+1]));
+ fz_lineto(ctx, path, fz_atof(args[i]), fz_atof(args[i+1]));
i += 2;
break;
case 'l':
if (i + 1 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- fz_lineto(doc->ctx, path, pt.x + fz_atof(args[i]), pt.y + fz_atof(args[i+1]));
+ pt = fz_currentpoint(ctx, path);
+ fz_lineto(ctx, path, pt.x + fz_atof(args[i]), pt.y + fz_atof(args[i+1]));
i += 2;
break;
case 'H':
if (i >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- fz_lineto(doc->ctx, path, fz_atof(args[i]), pt.y);
+ pt = fz_currentpoint(ctx, path);
+ fz_lineto(ctx, path, fz_atof(args[i]), pt.y);
i += 1;
break;
case 'h':
if (i >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- fz_lineto(doc->ctx, path, pt.x + fz_atof(args[i]), pt.y);
+ pt = fz_currentpoint(ctx, path);
+ fz_lineto(ctx, path, pt.x + fz_atof(args[i]), pt.y);
i += 1;
break;
case 'V':
if (i >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- fz_lineto(doc->ctx, path, pt.x, fz_atof(args[i]));
+ pt = fz_currentpoint(ctx, path);
+ fz_lineto(ctx, path, pt.x, fz_atof(args[i]));
i += 1;
break;
case 'v':
if (i >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- fz_lineto(doc->ctx, path, pt.x, pt.y + fz_atof(args[i]));
+ pt = fz_currentpoint(ctx, path);
+ fz_lineto(ctx, path, pt.x, pt.y + fz_atof(args[i]));
i += 1;
break;
@@ -344,7 +344,7 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
y2 = fz_atof(args[i+3]);
x3 = fz_atof(args[i+4]);
y3 = fz_atof(args[i+5]);
- fz_curveto(doc->ctx, path, x1, y1, x2, y2, x3, y3);
+ fz_curveto(ctx, path, x1, y1, x2, y2, x3, y3);
i += 6;
reset_smooth = 0;
smooth_x = x3 - x2;
@@ -353,14 +353,14 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 'c':
if (i + 5 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
+ pt = fz_currentpoint(ctx, path);
x1 = fz_atof(args[i+0]) + pt.x;
y1 = fz_atof(args[i+1]) + pt.y;
x2 = fz_atof(args[i+2]) + pt.x;
y2 = fz_atof(args[i+3]) + pt.y;
x3 = fz_atof(args[i+4]) + pt.x;
y3 = fz_atof(args[i+5]) + pt.y;
- fz_curveto(doc->ctx, path, x1, y1, x2, y2, x3, y3);
+ fz_curveto(ctx, path, x1, y1, x2, y2, x3, y3);
i += 6;
reset_smooth = 0;
smooth_x = x3 - x2;
@@ -369,12 +369,12 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 'S':
if (i + 3 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
+ pt = fz_currentpoint(ctx, path);
x1 = fz_atof(args[i+0]);
y1 = fz_atof(args[i+1]);
x2 = fz_atof(args[i+2]);
y2 = fz_atof(args[i+3]);
- fz_curveto(doc->ctx, path, pt.x + smooth_x, pt.y + smooth_y, x1, y1, x2, y2);
+ fz_curveto(ctx, path, pt.x + smooth_x, pt.y + smooth_y, x1, y1, x2, y2);
i += 4;
reset_smooth = 0;
smooth_x = x2 - x1;
@@ -383,12 +383,12 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 's':
if (i + 3 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
+ pt = fz_currentpoint(ctx, path);
x1 = fz_atof(args[i+0]) + pt.x;
y1 = fz_atof(args[i+1]) + pt.y;
x2 = fz_atof(args[i+2]) + pt.x;
y2 = fz_atof(args[i+3]) + pt.y;
- fz_curveto(doc->ctx, path, pt.x + smooth_x, pt.y + smooth_y, x1, y1, x2, y2);
+ fz_curveto(ctx, path, pt.x + smooth_x, pt.y + smooth_y, x1, y1, x2, y2);
i += 4;
reset_smooth = 0;
smooth_x = x2 - x1;
@@ -397,12 +397,12 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 'Q':
if (i + 3 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
+ pt = fz_currentpoint(ctx, path);
x1 = fz_atof(args[i+0]);
y1 = fz_atof(args[i+1]);
x2 = fz_atof(args[i+2]);
y2 = fz_atof(args[i+3]);
- fz_curveto(doc->ctx, path,
+ fz_curveto(ctx, path,
(pt.x + 2 * x1) / 3, (pt.y + 2 * y1) / 3,
(x2 + 2 * x1) / 3, (y2 + 2 * y1) / 3,
x2, y2);
@@ -410,12 +410,12 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
break;
case 'q':
if (i + 3 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
+ pt = fz_currentpoint(ctx, path);
x1 = fz_atof(args[i+0]) + pt.x;
y1 = fz_atof(args[i+1]) + pt.y;
x2 = fz_atof(args[i+2]) + pt.x;
y2 = fz_atof(args[i+3]) + pt.y;
- fz_curveto(doc->ctx, path,
+ fz_curveto(ctx, path,
(pt.x + 2 * x1) / 3, (pt.y + 2 * y1) / 3,
(x2 + 2 * x1) / 3, (y2 + 2 * y1) / 3,
x2, y2);
@@ -424,7 +424,7 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 'A':
if (i + 6 >= n) break;
- xps_draw_arc(doc->ctx, path,
+ xps_draw_arc(ctx, doc, path,
fz_atof(args[i+0]), fz_atof(args[i+1]), fz_atof(args[i+2]),
atoi(args[i+3]), atoi(args[i+4]),
fz_atof(args[i+5]), fz_atof(args[i+6]));
@@ -432,8 +432,8 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
break;
case 'a':
if (i + 6 >= n) break;
- pt = fz_currentpoint(doc->ctx, path);
- xps_draw_arc(doc->ctx, path,
+ pt = fz_currentpoint(ctx, path);
+ xps_draw_arc(ctx, doc, path,
fz_atof(args[i+0]), fz_atof(args[i+1]), fz_atof(args[i+2]),
atoi(args[i+3]), atoi(args[i+4]),
fz_atof(args[i+5]) + pt.x, fz_atof(args[i+6]) + pt.y);
@@ -442,12 +442,12 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
case 'Z':
case 'z':
- fz_closepath(doc->ctx, path);
+ fz_closepath(ctx, path);
break;
default:
/* eek */
- fz_warn(doc->ctx, "ignoring invalid command '%c'", cmd);
+ fz_warn(ctx, "ignoring invalid command '%c'", cmd);
/* Skip any trailing numbers to avoid an infinite loop */
while (i < n && (args[i][0] == '+' || args[i][0] == '.' || args[i][0] == '-' || (args[i][0] >= '0' && args[i][0] <= '9')))
i ++;
@@ -457,12 +457,12 @@ xps_parse_abbreviated_geometry(xps_document *doc, char *geom, int *fill_rule)
old = cmd;
}
- fz_free(doc->ctx, args);
+ fz_free(ctx, args);
return path;
}
static void
-xps_parse_arc_segment(fz_context *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
+xps_parse_arc_segment(fz_context *ctx, xps_document *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
{
/* ArcSegment pretty much follows the SVG algorithm for converting an
* arc in endpoint representation to an arc in centerpoint
@@ -484,7 +484,7 @@ xps_parse_arc_segment(fz_context *doc, fz_path *path, fz_xml *root, int stroking
if (!point_att || !size_att || !rotation_angle_att || !is_large_arc_att || !sweep_direction_att)
{
- fz_warn(doc, "ArcSegment element is missing attributes");
+ fz_warn(ctx, "ArcSegment element is missing attributes");
return;
}
@@ -497,23 +497,23 @@ xps_parse_arc_segment(fz_context *doc, fz_path *path, fz_xml *root, int stroking
point_x = point_y = 0;
size_x = size_y = 0;
- xps_parse_point(point_att, &point_x, &point_y);
- xps_parse_point(size_att, &size_x, &size_y);
+ xps_parse_point(ctx, doc, point_att, &point_x, &point_y);
+ xps_parse_point(ctx, doc, size_att, &size_x, &size_y);
rotation_angle = fz_atof(rotation_angle_att);
is_large_arc = !strcmp(is_large_arc_att, "true");
is_clockwise = !strcmp(sweep_direction_att, "Clockwise");
if (stroking && !is_stroked)
{
- fz_moveto(doc, path, point_x, point_y);
+ fz_moveto(ctx, path, point_x, point_y);
return;
}
- xps_draw_arc(doc, path, size_x, size_y, rotation_angle, is_large_arc, is_clockwise, point_x, point_y);
+ xps_draw_arc(ctx, doc, path, size_x, size_y, rotation_angle, is_large_arc, is_clockwise, point_x, point_y);
}
static void
-xps_parse_poly_quadratic_bezier_segment(fz_context *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
+xps_parse_poly_quadratic_bezier_segment(fz_context *ctx, xps_document *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
{
char *points_att = fz_xml_att(root, "Points");
char *is_stroked_att = fz_xml_att(root, "IsStroked");
@@ -525,7 +525,7 @@ xps_parse_poly_quadratic_bezier_segment(fz_context *doc, fz_path *path, fz_xml *
if (!points_att)
{
- fz_warn(doc, "PolyQuadraticBezierSegment element has no points");
+ fz_warn(ctx, "PolyQuadraticBezierSegment element has no points");
return;
}
@@ -540,18 +540,18 @@ xps_parse_poly_quadratic_bezier_segment(fz_context *doc, fz_path *path, fz_xml *
while (*s != 0)
{
while (*s == ' ') s++;
- s = xps_parse_point(s, &x[n], &y[n]);
+ s = xps_parse_point(ctx, doc, s, &x[n], &y[n]);
n ++;
if (n == 2)
{
if (stroking && !is_stroked)
{
- fz_moveto(doc, path, x[1], y[1]);
+ fz_moveto(ctx, path, x[1], y[1]);
}
else
{
- pt = fz_currentpoint(doc, path);
- fz_curveto(doc, path,
+ pt = fz_currentpoint(ctx, path);
+ fz_curveto(ctx, path,
(pt.x + 2 * x[0]) / 3, (pt.y + 2 * y[0]) / 3,
(x[1] + 2 * x[0]) / 3, (y[1] + 2 * y[0]) / 3,
x[1], y[1]);
@@ -562,7 +562,7 @@ xps_parse_poly_quadratic_bezier_segment(fz_context *doc, fz_path *path, fz_xml *
}
static void
-xps_parse_poly_bezier_segment(fz_context *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
+xps_parse_poly_bezier_segment(fz_context *ctx, xps_document *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
{
char *points_att = fz_xml_att(root, "Points");
char *is_stroked_att = fz_xml_att(root, "IsStroked");
@@ -573,7 +573,7 @@ xps_parse_poly_bezier_segment(fz_context *doc, fz_path *path, fz_xml *root, int
if (!points_att)
{
- fz_warn(doc, "PolyBezierSegment element has no points");
+ fz_warn(ctx, "PolyBezierSegment element has no points");
return;
}
@@ -588,21 +588,21 @@ xps_parse_poly_bezier_segment(fz_context *doc, fz_path *path, fz_xml *root, int
while (*s != 0)
{
while (*s == ' ') s++;
- s = xps_parse_point(s, &x[n], &y[n]);
+ s = xps_parse_point(ctx, doc, s, &x[n], &y[n]);
n ++;
if (n == 3)
{
if (stroking && !is_stroked)
- fz_moveto(doc, path, x[2], y[2]);
+ fz_moveto(ctx, path, x[2], y[2]);
else
- fz_curveto(doc, path, x[0], y[0], x[1], y[1], x[2], y[2]);
+ fz_curveto(ctx, path, x[0], y[0], x[1], y[1], x[2], y[2]);
n = 0;
}
}
}
static void
-xps_parse_poly_line_segment(fz_context *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
+xps_parse_poly_line_segment(fz_context *ctx, xps_document *doc, fz_path *path, fz_xml *root, int stroking, int *skipped_stroke)
{
char *points_att = fz_xml_att(root, "Points");
char *is_stroked_att = fz_xml_att(root, "IsStroked");
@@ -612,7 +612,7 @@ xps_parse_poly_line_segment(fz_context *doc, fz_path *path, fz_xml *root, int st
if (!points_att)
{
- fz_warn(doc, "PolyLineSegment element has no points");
+ fz_warn(ctx, "PolyLineSegment element has no points");
return;
}
@@ -626,16 +626,16 @@ xps_parse_poly_line_segment(fz_context *doc, fz_path *path, fz_xml *root, int st
while (*s != 0)
{
while (*s == ' ') s++;
- s = xps_parse_point(s, &x, &y);
+ s = xps_parse_point(ctx, doc, s, &x, &y);
if (stroking && !is_stroked)
- fz_moveto(doc, path, x, y);
+ fz_moveto(ctx, path, x, y);
else
- fz_lineto(doc, path, x, y);
+ fz_lineto(ctx, path, x, y);
}
}
static void
-xps_parse_path_figure(fz_context *doc, fz_path *path, fz_xml *root, int stroking)
+xps_parse_path_figure(fz_context *ctx, xps_document *doc, fz_path *path, fz_xml *root, int stroking)
{
fz_xml *node;
@@ -659,36 +659,36 @@ xps_parse_path_figure(fz_context *doc, fz_path *path, fz_xml *root, int stroking
if (is_filled_att)
is_filled = !strcmp(is_filled_att, "true");
if (start_point_att)
- xps_parse_point(start_point_att, &start_x, &start_y);
+ xps_parse_point(ctx, doc, start_point_att, &start_x, &start_y);
if (!stroking && !is_filled) /* not filled, when filling */
return;
- fz_moveto(doc, path, start_x, start_y);
+ fz_moveto(ctx, path, start_x, start_y);
for (node = fz_xml_down(root); node; node = fz_xml_next(node))
{
if (fz_xml_is_tag(node, "ArcSegment"))
- xps_parse_arc_segment(doc, path, node, stroking, &skipped_stroke);
+ xps_parse_arc_segment(ctx, doc, path, node, stroking, &skipped_stroke);
if (fz_xml_is_tag(node, "PolyBezierSegment"))
- xps_parse_poly_bezier_segment(doc, path, node, stroking, &skipped_stroke);
+ xps_parse_poly_bezier_segment(ctx, doc, path, node, stroking, &skipped_stroke);
if (fz_xml_is_tag(node, "PolyLineSegment"))
- xps_parse_poly_line_segment(doc, path, node, stroking, &skipped_stroke);
+ xps_parse_poly_line_segment(ctx, doc, path, node, stroking, &skipped_stroke);
if (fz_xml_is_tag(node, "PolyQuadraticBezierSegment"))
- xps_parse_poly_quadratic_bezier_segment(doc, path, node, stroking, &skipped_stroke);
+ xps_parse_poly_quadratic_bezier_segment(ctx, doc, path, node, stroking, &skipped_stroke);
}
if (is_closed)
{
if (stroking && skipped_stroke)
- fz_lineto(doc, path, start_x, start_y); /* we've skipped using fz_moveto... */
+ fz_lineto(ctx, path, start_x, start_y); /* we've skipped using fz_moveto... */
else
- fz_closepath(doc, path); /* no skipped segments, safe to closepath properly */
+ fz_closepath(ctx, path); /* no skipped segments, safe to closepath properly */
}
}
fz_path *
-xps_parse_path_geometry(xps_document *doc, xps_resource *dict, fz_xml *root, int stroking, int *fill_rule)
+xps_parse_path_geometry(fz_context *ctx, xps_document *doc, xps_resource *dict, fz_xml *root, int stroking, int *fill_rule)
{
fz_xml *node;
@@ -712,8 +712,8 @@ xps_parse_path_geometry(xps_document *doc, xps_resource *dict, fz_xml *root, int
transform_tag = fz_xml_down(node);
}
- xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &figures_att, &figures_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &figures_att, &figures_tag, NULL);
if (fill_rule_att)
{
@@ -725,26 +725,26 @@ xps_parse_path_geometry(xps_document *doc, xps_resource *dict, fz_xml *root, int
transform = fz_identity;
if (transform_att)
- xps_parse_render_transform(doc, transform_att, &transform);
+ xps_parse_render_transform(ctx, doc, transform_att, &transform);
if (transform_tag)
- xps_parse_matrix_transform(doc, transform_tag, &transform);
+ xps_parse_matrix_transform(ctx, doc, transform_tag, &transform);
if (figures_att)
- path = xps_parse_abbreviated_geometry(doc, figures_att, fill_rule);
+ path = xps_parse_abbreviated_geometry(ctx, doc, figures_att, fill_rule);
else
- path = fz_new_path(doc->ctx);
+ path = fz_new_path(ctx);
if (figures_tag)
- xps_parse_path_figure(doc->ctx, path, figures_tag, stroking);
+ xps_parse_path_figure(ctx, doc, path, figures_tag, stroking);
for (node = fz_xml_down(root); node; node = fz_xml_next(node))
{
if (fz_xml_is_tag(node, "PathFigure"))
- xps_parse_path_figure(doc->ctx, path, node, stroking);
+ xps_parse_path_figure(ctx, doc, path, node, stroking);
}
if (transform_att || transform_tag)
- fz_transform_path(doc->ctx, path, &transform);
+ fz_transform_path(ctx, path, &transform);
return path;
}
@@ -763,19 +763,20 @@ xps_parse_line_cap(char *attr)
}
void
-xps_clip(xps_document *doc, const fz_matrix *ctm, xps_resource *dict, char *clip_att, fz_xml *clip_tag)
+xps_clip(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, xps_resource *dict, char *clip_att, fz_xml *clip_tag)
{
+ fz_device *dev = doc->dev;
fz_path *path;
int fill_rule = 0;
if (clip_att)
- path = xps_parse_abbreviated_geometry(doc, clip_att, &fill_rule);
+ path = xps_parse_abbreviated_geometry(ctx, doc, clip_att, &fill_rule);
else if (clip_tag)
- path = xps_parse_path_geometry(doc, dict, clip_tag, 0, &fill_rule);
+ path = xps_parse_path_geometry(ctx, doc, dict, clip_tag, 0, &fill_rule);
else
- path = fz_new_path(doc->ctx);
- fz_clip_path(doc->dev, path, NULL, fill_rule == 0, ctm);
- fz_free_path(doc->ctx, path);
+ path = fz_new_path(ctx);
+ fz_clip_path(ctx, dev, path, NULL, fill_rule == 0, ctm);
+ fz_drop_path(ctx, path);
}
/*
@@ -784,8 +785,10 @@ xps_clip(xps_document *doc, const fz_matrix *ctm, xps_resource *dict, char *clip
*/
void
-xps_parse_path(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *root)
+xps_parse_path(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_resource *dict, fz_xml *root)
{
+ fz_device *dev = doc->dev;
+
fz_xml *node;
char *fill_uri;
@@ -873,12 +876,12 @@ xps_parse_path(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_reso
stroke_uri = base_uri;
opacity_mask_uri = base_uri;
- xps_resolve_resource_reference(doc, dict, &data_att, &data_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &clip_att, &clip_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &fill_att, &fill_tag, &fill_uri);
- xps_resolve_resource_reference(doc, dict, &stroke_att, &stroke_tag, &stroke_uri);
- xps_resolve_resource_reference(doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &data_att, &data_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &clip_att, &clip_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &fill_att, &fill_tag, &fill_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &stroke_att, &stroke_tag, &stroke_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri);
/*
* Act on the information we have gathered:
@@ -918,7 +921,7 @@ xps_parse_path(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_reso
s++;
}
}
- stroke = fz_new_stroke_state_with_dash_len(doc->ctx, dash_len);
+ stroke = fz_new_stroke_state_with_dash_len(ctx, dash_len);
stroke->start_cap = xps_parse_line_cap(stroke_start_line_cap_att);
stroke->dash_cap = xps_parse_line_cap(stroke_dash_cap_att);
stroke->end_cap = xps_parse_line_cap(stroke_end_line_cap_att);
@@ -973,87 +976,87 @@ xps_parse_path(xps_document *doc, const fz_matrix *ctm, char *base_uri, xps_reso
transform = fz_identity;
if (transform_att)
- xps_parse_render_transform(doc, transform_att, &transform);
+ xps_parse_render_transform(ctx, doc, transform_att, &transform);
if (transform_tag)
- xps_parse_matrix_transform(doc, transform_tag, &transform);
+ xps_parse_matrix_transform(ctx, doc, transform_tag, &transform);
fz_concat(&local_ctm, &transform, ctm);
if (clip_att || clip_tag)
- xps_clip(doc, &local_ctm, dict, clip_att, clip_tag);
+ xps_clip(ctx, doc, &local_ctm, dict, clip_att, clip_tag);
fill_rule = 0;
if (data_att)
- path = xps_parse_abbreviated_geometry(doc, data_att, &fill_rule);
+ path = xps_parse_abbreviated_geometry(ctx, doc, data_att, &fill_rule);
else if (data_tag)
{
- path = xps_parse_path_geometry(doc, dict, data_tag, 0, &fill_rule);
+ path = xps_parse_path_geometry(ctx, doc, dict, data_tag, 0, &fill_rule);
if (stroke_att || stroke_tag)
- stroke_path = xps_parse_path_geometry(doc, dict, data_tag, 1, &fill_rule);
+ stroke_path = xps_parse_path_geometry(ctx, doc, dict, data_tag, 1, &fill_rule);
}
if (!stroke_path)
stroke_path = path;
if (stroke_att || stroke_tag)
{
- fz_bound_path(doc->ctx, stroke_path, stroke, &local_ctm, &area);
+ fz_bound_path(ctx, stroke_path, stroke, &local_ctm, &area);
if (stroke_path != path && (fill_att || fill_tag)) {
fz_rect bounds;
- fz_bound_path(doc->ctx, path, NULL, &local_ctm, &bounds);
+ fz_bound_path(ctx, path, NULL, &local_ctm, &bounds);
fz_union_rect(&area, &bounds);
}
}
else
- fz_bound_path(doc->ctx, path, NULL, &local_ctm, &area);
+ fz_bound_path(ctx, path, NULL, &local_ctm, &area);
if (navigate_uri_att)
- xps_add_link(doc, &area, base_uri, navigate_uri_att);
+ xps_add_link(ctx, doc, &area, base_uri, navigate_uri_att);
- xps_begin_opacity(doc, &local_ctm, &area, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
+ xps_begin_opacity(ctx, doc, &local_ctm, &area, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
if (fill_att)
{
- xps_parse_color(doc, base_uri, fill_att, &colorspace, samples);
+ xps_parse_color(ctx, doc, base_uri, fill_att, &colorspace, samples);
if (fill_opacity_att)
samples[0] *= fz_atof(fill_opacity_att);
- xps_set_color(doc, colorspace, samples);
+ xps_set_color(ctx, doc, colorspace, samples);
- fz_fill_path(doc->dev, path, fill_rule == 0, &local_ctm,
+ fz_fill_path(ctx, dev, path, fill_rule == 0, &local_ctm,
doc->colorspace, doc->color, doc->alpha);
}
if (fill_tag)
{
- fz_clip_path(doc->dev, path, &area, fill_rule == 0, &local_ctm);
- xps_parse_brush(doc, &local_ctm, &area, fill_uri, dict, fill_tag);
- fz_pop_clip(doc->dev);
+ fz_clip_path(ctx, dev, path, &area, fill_rule == 0, &local_ctm);
+ xps_parse_brush(ctx, doc, &local_ctm, &area, fill_uri, dict, fill_tag);
+ fz_pop_clip(ctx, dev);
}
if (stroke_att)
{
- xps_parse_color(doc, base_uri, stroke_att, &colorspace, samples);
+ xps_parse_color(ctx, doc, base_uri, stroke_att, &colorspace, samples);
if (stroke_opacity_att)
samples[0] *= fz_atof(stroke_opacity_att);
- xps_set_color(doc, colorspace, samples);
+ xps_set_color(ctx, doc, colorspace, samples);
- fz_stroke_path(doc->dev, stroke_path, stroke, &local_ctm,
+ fz_stroke_path(ctx, dev, stroke_path, stroke, &local_ctm,
doc->colorspace, doc->color, doc->alpha);
}
if (stroke_tag)
{
- fz_clip_stroke_path(doc->dev, stroke_path, &area, stroke, &local_ctm);
- xps_parse_brush(doc, &local_ctm, &area, stroke_uri, dict, stroke_tag);
- fz_pop_clip(doc->dev);
+ fz_clip_stroke_path(ctx, dev, stroke_path, &area, stroke, &local_ctm);
+ xps_parse_brush(ctx, doc, &local_ctm, &area, stroke_uri, dict, stroke_tag);
+ fz_pop_clip(ctx, dev);
}
- xps_end_opacity(doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
+ xps_end_opacity(ctx, doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
if (stroke_path != path)
- fz_free_path(doc->ctx, stroke_path);
- fz_free_path(doc->ctx, path);
+ fz_drop_path(ctx, stroke_path);
+ fz_drop_path(ctx, path);
path = NULL;
- fz_drop_stroke_state(doc->ctx, stroke);
+ fz_drop_stroke_state(ctx, stroke);
if (clip_att || clip_tag)
- fz_pop_clip(doc->dev);
+ fz_pop_clip(ctx, dev);
}
diff --git a/source/xps/xps-resource.c b/source/xps/xps-resource.c
index 85fd7c49..712ed1cc 100644
--- a/source/xps/xps-resource.c
+++ b/source/xps/xps-resource.c
@@ -1,7 +1,7 @@
#include "mupdf/xps.h"
static fz_xml *
-xps_lookup_resource(xps_document *doc, xps_resource *dict, char *name, char **urip)
+xps_lookup_resource(fz_context *ctx, xps_document *doc, xps_resource *dict, char *name, char **urip)
{
xps_resource *head, *node;
for (head = dict; head; head = head->parent)
@@ -20,7 +20,7 @@ xps_lookup_resource(xps_document *doc, xps_resource *dict, char *name, char **ur
}
static fz_xml *
-xps_parse_resource_reference(xps_document *doc, xps_resource *dict, char *att, char **urip)
+xps_parse_resource_reference(fz_context *ctx, xps_document *doc, xps_resource *dict, char *att, char **urip)
{
char name[1024];
char *s;
@@ -33,16 +33,16 @@ xps_parse_resource_reference(xps_document *doc, xps_resource *dict, char *att, c
if (s)
*s = 0;
- return xps_lookup_resource(doc, dict, name, urip);
+ return xps_lookup_resource(ctx, doc, dict, name, urip);
}
void
-xps_resolve_resource_reference(xps_document *doc, xps_resource *dict,
+xps_resolve_resource_reference(fz_context *ctx, xps_document *doc, xps_resource *dict,
char **attp, fz_xml **tagp, char **urip)
{
if (*attp)
{
- fz_xml *rsrc = xps_parse_resource_reference(doc, dict, *attp, urip);
+ fz_xml *rsrc = xps_parse_resource_reference(ctx, doc, dict, *attp, urip);
if (rsrc)
{
*attp = NULL;
@@ -52,7 +52,7 @@ xps_resolve_resource_reference(xps_document *doc, xps_resource *dict,
}
static xps_resource *
-xps_parse_remote_resource_dictionary(xps_document *doc, char *base_uri, char *source_att)
+xps_parse_remote_resource_dictionary(fz_context *ctx, xps_document *doc, char *base_uri, char *source_att)
{
char part_name[1024];
char part_uri[1024];
@@ -60,18 +60,17 @@ xps_parse_remote_resource_dictionary(xps_document *doc, char *base_uri, char *so
xps_part *part;
fz_xml *xml;
char *s;
- fz_context *ctx = doc->ctx;
/* External resource dictionaries MUST NOT reference other resource dictionaries */
- xps_resolve_url(part_name, base_uri, source_att, sizeof part_name);
- part = xps_read_part(doc, part_name);
+ xps_resolve_url(ctx, doc, part_name, base_uri, source_att, sizeof part_name);
+ part = xps_read_part(ctx, doc, part_name);
fz_try(ctx)
{
- xml = fz_parse_xml(doc->ctx, part->data, part->size, 0);
+ xml = fz_parse_xml(ctx, part->data, part->size, 0);
}
fz_always(ctx)
{
- xps_free_part(doc, part);
+ xps_drop_part(ctx, doc, part);
}
fz_catch(ctx)
{
@@ -84,8 +83,8 @@ xps_parse_remote_resource_dictionary(xps_document *doc, char *base_uri, char *so
if (strcmp(fz_xml_tag(xml), "ResourceDictionary"))
{
- fz_free_xml(doc->ctx, xml);
- fz_throw(doc->ctx, FZ_ERROR_GENERIC, "expected ResourceDictionary element");
+ fz_drop_xml(ctx, xml);
+ fz_throw(ctx, FZ_ERROR_GENERIC, "expected ResourceDictionary element");
}
fz_strlcpy(part_uri, part_name, sizeof part_uri);
@@ -93,7 +92,7 @@ xps_parse_remote_resource_dictionary(xps_document *doc, char *base_uri, char *so
if (s)
s[1] = 0;
- dict = xps_parse_resource_dictionary(doc, part_uri, xml);
+ dict = xps_parse_resource_dictionary(ctx, doc, part_uri, xml);
if (dict)
dict->base_xml = xml; /* pass on ownership */
@@ -101,7 +100,7 @@ xps_parse_remote_resource_dictionary(xps_document *doc, char *base_uri, char *so
}
xps_resource *
-xps_parse_resource_dictionary(xps_document *doc, char *base_uri, fz_xml *root)
+xps_parse_resource_dictionary(fz_context *ctx, xps_document *doc, char *base_uri, fz_xml *root)
{
xps_resource *head;
xps_resource *entry;
@@ -111,7 +110,7 @@ xps_parse_resource_dictionary(xps_document *doc, char *base_uri, fz_xml *root)
source = fz_xml_att(root, "Source");
if (source)
- return xps_parse_remote_resource_dictionary(doc, base_uri, source);
+ return xps_parse_remote_resource_dictionary(ctx, doc, base_uri, source);
head = NULL;
@@ -120,7 +119,7 @@ xps_parse_resource_dictionary(xps_document *doc, char *base_uri, fz_xml *root)
key = fz_xml_att(node, "x:Key");
if (key)
{
- entry = fz_malloc_struct(doc->ctx, xps_resource);
+ entry = fz_malloc_struct(ctx, xps_resource);
entry->name = key;
entry->base_uri = NULL;
entry->base_xml = NULL;
@@ -132,29 +131,29 @@ xps_parse_resource_dictionary(xps_document *doc, char *base_uri, fz_xml *root)
}
if (head)
- head->base_uri = fz_strdup(doc->ctx, base_uri);
+ head->base_uri = fz_strdup(ctx, base_uri);
return head;
}
void
-xps_free_resource_dictionary(xps_document *doc, xps_resource *dict)
+xps_drop_resource_dictionary(fz_context *ctx, xps_document *doc, xps_resource *dict)
{
xps_resource *next;
while (dict)
{
next = dict->next;
if (dict->base_xml)
- fz_free_xml(doc->ctx, dict->base_xml);
+ fz_drop_xml(ctx, dict->base_xml);
if (dict->base_uri)
- fz_free(doc->ctx, dict->base_uri);
- fz_free(doc->ctx, dict);
+ fz_free(ctx, dict->base_uri);
+ fz_free(ctx, dict);
dict = next;
}
}
void
-xps_print_resource_dictionary(xps_resource *dict)
+xps_print_resource_dictionary(fz_context *ctx, xps_document *doc, xps_resource *dict)
{
while (dict)
{
@@ -164,7 +163,7 @@ xps_print_resource_dictionary(xps_resource *dict)
if (dict->parent)
{
printf("PARENT = {\n");
- xps_print_resource_dictionary(dict->parent);
+ xps_print_resource_dictionary(ctx, doc, dict->parent);
printf("}\n");
}
dict = dict->next;
diff --git a/source/xps/xps-tile.c b/source/xps/xps-tile.c
index b65981a2..a74ef562 100644
--- a/source/xps/xps-tile.c
+++ b/source/xps/xps-tile.c
@@ -15,58 +15,61 @@ struct closure
xps_resource *dict;
fz_xml *root;
void *user;
- void (*func)(xps_document*, const fz_matrix *, const fz_rect *, char*, xps_resource*, fz_xml*, void*);
+ void (*func)(fz_context *ctx, xps_document*, const fz_matrix *, const fz_rect *, char*, xps_resource*, fz_xml*, void*);
};
static void
-xps_paint_tiling_brush_clipped(xps_document *doc, const fz_matrix *ctm, const fz_rect *viewbox, struct closure *c)
+xps_paint_tiling_brush_clipped(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *viewbox, struct closure *c)
{
- fz_path *path = fz_new_path(doc->ctx);
- fz_moveto(doc->ctx, path, viewbox->x0, viewbox->y0);
- fz_lineto(doc->ctx, path, viewbox->x0, viewbox->y1);
- fz_lineto(doc->ctx, path, viewbox->x1, viewbox->y1);
- fz_lineto(doc->ctx, path, viewbox->x1, viewbox->y0);
- fz_closepath(doc->ctx, path);
- fz_clip_path(doc->dev, path, NULL, 0, ctm);
- fz_free_path(doc->ctx, path);
- c->func(doc, ctm, viewbox, c->base_uri, c->dict, c->root, c->user);
- fz_pop_clip(doc->dev);
+ fz_device *dev = doc->dev;
+
+ fz_path *path = fz_new_path(ctx);
+ fz_moveto(ctx, path, viewbox->x0, viewbox->y0);
+ fz_lineto(ctx, path, viewbox->x0, viewbox->y1);
+ fz_lineto(ctx, path, viewbox->x1, viewbox->y1);
+ fz_lineto(ctx, path, viewbox->x1, viewbox->y0);
+ fz_closepath(ctx, path);
+ fz_clip_path(ctx, dev, path, NULL, 0, ctm);
+ fz_drop_path(ctx, path);
+ c->func(ctx, doc, ctm, viewbox, c->base_uri, c->dict, c->root, c->user);
+ fz_pop_clip(ctx, dev);
}
static void
-xps_paint_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *viewbox, int tile_mode, struct closure *c)
+xps_paint_tiling_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *viewbox, int tile_mode, struct closure *c)
{
fz_matrix ttm;
- xps_paint_tiling_brush_clipped(doc, ctm, viewbox, c);
+ xps_paint_tiling_brush_clipped(ctx, doc, ctm, viewbox, c);
if (tile_mode == TILE_FLIP_X || tile_mode == TILE_FLIP_X_Y)
{
ttm = *ctm;
fz_pre_scale(fz_pre_translate(&ttm, viewbox->x1 * 2, 0), -1, 1);
- xps_paint_tiling_brush_clipped(doc, &ttm, viewbox, c);
+ xps_paint_tiling_brush_clipped(ctx, doc, &ttm, viewbox, c);
}
if (tile_mode == TILE_FLIP_Y || tile_mode == TILE_FLIP_X_Y)
{
ttm = *ctm;
fz_pre_scale(fz_pre_translate(&ttm, 0, viewbox->y1 * 2), 1, -1);
- xps_paint_tiling_brush_clipped(doc, &ttm, viewbox, c);
+ xps_paint_tiling_brush_clipped(ctx, doc, &ttm, viewbox, c);
}
if (tile_mode == TILE_FLIP_X_Y)
{
ttm = *ctm;
fz_pre_scale(fz_pre_translate(&ttm, viewbox->x1 * 2, viewbox->y1 * 2), -1, -1);
- xps_paint_tiling_brush_clipped(doc, &ttm, viewbox, c);
+ xps_paint_tiling_brush_clipped(ctx, doc, &ttm, viewbox, c);
}
}
void
-xps_parse_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_parse_tiling_brush(fz_context *ctx, 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 (*func)(fz_context *ctx, xps_document*, const fz_matrix*, const fz_rect*, char*, xps_resource*, fz_xml*, void*), void *user)
{
+ fz_device *dev = doc->dev;
fz_xml *node;
struct closure c;
@@ -105,27 +108,27 @@ xps_parse_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *a
transform_tag = fz_xml_down(node);
}
- xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL);
transform = fz_identity;
if (transform_att)
- xps_parse_render_transform(doc, transform_att, &transform);
+ xps_parse_render_transform(ctx, doc, transform_att, &transform);
if (transform_tag)
- xps_parse_matrix_transform(doc, transform_tag, &transform);
+ xps_parse_matrix_transform(ctx, doc, transform_tag, &transform);
fz_concat(&transform, &transform, ctm);
viewbox = fz_unit_rect;
if (viewbox_att)
- xps_parse_rectangle(doc, viewbox_att, &viewbox);
+ xps_parse_rectangle(ctx, doc, viewbox_att, &viewbox);
viewport = fz_unit_rect;
if (viewport_att)
- xps_parse_rectangle(doc, viewport_att, &viewport);
+ xps_parse_rectangle(ctx, doc, viewport_att, &viewport);
if (fabsf(viewport.x1 - viewport.x0) < 0.01f || fabsf(viewport.y1 - viewport.y0) < 0.01f)
- fz_warn(doc->ctx, "not drawing tile for viewport size %.4f x %.4f", viewport.x1 - viewport.x0, viewport.y1 - viewport.y0);
+ fz_warn(ctx, "not drawing tile for viewport size %.4f x %.4f", viewport.x1 - viewport.x0, viewport.y1 - viewport.y0);
else if (fabsf(viewbox.x1 - viewbox.x0) < 0.01f || fabsf(viewbox.y1 - viewbox.y0) < 0.01f)
- fz_warn(doc->ctx, "not drawing tile for viewbox size %.4f x %.4f", viewbox.x1 - viewbox.x0, viewbox.y1 - viewbox.y0);
+ fz_warn(ctx, "not drawing tile for viewbox size %.4f x %.4f", viewbox.x1 - viewbox.x0, viewbox.y1 - viewbox.y0);
/* some sanity checks on the viewport/viewbox size */
if (fabsf(viewport.x1 - viewport.x0) < 0.01f) return;
@@ -159,7 +162,7 @@ xps_parse_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *a
if (tile_mode == TILE_FLIP_Y || tile_mode == TILE_FLIP_X_Y)
ystep *= 2;
- xps_begin_opacity(doc, &transform, area, base_uri, dict, opacity_att, NULL);
+ xps_begin_opacity(ctx, doc, &transform, area, base_uri, dict, opacity_att, NULL);
fz_pre_translate(&transform, viewport.x0, viewport.y0);
fz_pre_scale(&transform, xscale, yscale);
@@ -185,9 +188,9 @@ xps_parse_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *a
fz_rect bigview = viewbox;
bigview.x1 = bigview.x0 + xstep;
bigview.y1 = bigview.y0 + ystep;
- fz_begin_tile(doc->dev, &local_area, &bigview, xstep, ystep, &transform);
- xps_paint_tiling_brush(doc, &transform, &viewbox, tile_mode, &c);
- fz_end_tile(doc->dev);
+ fz_begin_tile(ctx, dev, &local_area, &bigview, xstep, ystep, &transform);
+ xps_paint_tiling_brush(ctx, doc, &transform, &viewbox, tile_mode, &c);
+ fz_end_tile(ctx, dev);
}
else
{
@@ -198,28 +201,28 @@ xps_parse_tiling_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *a
{
fz_matrix ttm = transform;
fz_pre_translate(&ttm, xstep * x, ystep * y);
- xps_paint_tiling_brush(doc, &ttm, &viewbox, tile_mode, &c);
+ xps_paint_tiling_brush(ctx, doc, &ttm, &viewbox, tile_mode, &c);
}
}
}
}
else
{
- xps_paint_tiling_brush(doc, &transform, &viewbox, tile_mode, &c);
+ xps_paint_tiling_brush(ctx, doc, &transform, &viewbox, tile_mode, &c);
}
- xps_end_opacity(doc, base_uri, dict, opacity_att, NULL);
+ xps_end_opacity(ctx, doc, base_uri, dict, opacity_att, NULL);
}
static void
-xps_paint_visual_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_paint_visual_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root, void *visual_tag)
{
- xps_parse_element(doc, ctm, area, base_uri, dict, (fz_xml *)visual_tag);
+ xps_parse_element(ctx, doc, ctm, area, base_uri, dict, (fz_xml *)visual_tag);
}
void
-xps_parse_visual_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
+xps_parse_visual_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area,
char *base_uri, xps_resource *dict, fz_xml *root)
{
fz_xml *node;
@@ -237,18 +240,19 @@ xps_parse_visual_brush(xps_document *doc, const fz_matrix *ctm, const fz_rect *a
}
visual_uri = base_uri;
- xps_resolve_resource_reference(doc, dict, &visual_att, &visual_tag, &visual_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &visual_att, &visual_tag, &visual_uri);
if (visual_tag)
{
- xps_parse_tiling_brush(doc, ctm, area,
+ xps_parse_tiling_brush(ctx, doc, ctm, area,
visual_uri, dict, root, xps_paint_visual_brush, visual_tag);
}
}
void
-xps_parse_canvas(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *root)
+xps_parse_canvas(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, char *base_uri, xps_resource *dict, fz_xml *root)
{
+ fz_device *dev = doc->dev;
xps_resource *new_dict = NULL;
fz_xml *node;
char *opacity_mask_uri;
@@ -277,11 +281,11 @@ xps_parse_canvas(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, c
{
if (new_dict)
{
- fz_warn(doc->ctx, "ignoring follow-up resource dictionaries");
+ fz_warn(ctx, "ignoring follow-up resource dictionaries");
}
else
{
- new_dict = xps_parse_resource_dictionary(doc, base_uri, fz_xml_down(node));
+ new_dict = xps_parse_resource_dictionary(ctx, doc, base_uri, fz_xml_down(node));
if (new_dict)
{
new_dict->parent = dict;
@@ -299,41 +303,41 @@ xps_parse_canvas(xps_document *doc, const fz_matrix *ctm, const fz_rect *area, c
}
opacity_mask_uri = base_uri;
- xps_resolve_resource_reference(doc, dict, &transform_att, &transform_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &clip_att, &clip_tag, NULL);
- xps_resolve_resource_reference(doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri);
+ xps_resolve_resource_reference(ctx, doc, dict, &transform_att, &transform_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &clip_att, &clip_tag, NULL);
+ xps_resolve_resource_reference(ctx, doc, dict, &opacity_mask_att, &opacity_mask_tag, &opacity_mask_uri);
transform = fz_identity;
if (transform_att)
- xps_parse_render_transform(doc, transform_att, &transform);
+ xps_parse_render_transform(ctx, doc, transform_att, &transform);
if (transform_tag)
- xps_parse_matrix_transform(doc, transform_tag, &transform);
+ xps_parse_matrix_transform(ctx, doc, transform_tag, &transform);
fz_concat(&transform, &transform, ctm);
if (navigate_uri_att)
- xps_add_link(doc, area, base_uri, navigate_uri_att);
+ xps_add_link(ctx, doc, area, base_uri, navigate_uri_att);
if (clip_att || clip_tag)
- xps_clip(doc, &transform, dict, clip_att, clip_tag);
+ xps_clip(ctx, doc, &transform, dict, clip_att, clip_tag);
- xps_begin_opacity(doc, &transform, area, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
+ xps_begin_opacity(ctx, doc, &transform, area, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
for (node = fz_xml_down(root); node; node = fz_xml_next(node))
{
- xps_parse_element(doc, &transform, area, base_uri, dict, node);
+ xps_parse_element(ctx, doc, &transform, area, base_uri, dict, node);
}
- xps_end_opacity(doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
+ xps_end_opacity(ctx, doc, opacity_mask_uri, dict, opacity_att, opacity_mask_tag);
if (clip_att || clip_tag)
- fz_pop_clip(doc->dev);
+ fz_pop_clip(ctx, dev);
if (new_dict)
- xps_free_resource_dictionary(doc, new_dict);
+ xps_drop_resource_dictionary(ctx, doc, new_dict);
}
void
-xps_parse_fixed_page(xps_document *doc, const fz_matrix *ctm, xps_page *page)
+xps_parse_fixed_page(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, xps_page *page)
{
fz_xml *node;
xps_resource *dict;
@@ -342,7 +346,7 @@ xps_parse_fixed_page(xps_document *doc, const fz_matrix *ctm, xps_page *page)
char *s;
fz_matrix scm;
- fz_strlcpy(base_uri, page->name, sizeof base_uri);
+ fz_strlcpy(base_uri, page->fix->name, sizeof base_uri);
s = strrchr(base_uri, '/');
if (s)
s[1] = 0;
@@ -356,35 +360,36 @@ xps_parse_fixed_page(xps_document *doc, const fz_matrix *ctm, xps_page *page)
return;
area = fz_unit_rect;
- fz_transform_rect(&area, fz_scale(&scm, page->width, page->height));
+ fz_transform_rect(&area, fz_scale(&scm, page->fix->width, page->fix->height));
for (node = fz_xml_down(page->root); node; node = fz_xml_next(node))
{
if (fz_xml_is_tag(node, "FixedPage.Resources") && fz_xml_down(node))
{
if (dict)
- fz_warn(doc->ctx, "ignoring follow-up resource dictionaries");
+ fz_warn(ctx, "ignoring follow-up resource dictionaries");
else
- dict = xps_parse_resource_dictionary(doc, base_uri, fz_xml_down(node));
+ dict = xps_parse_resource_dictionary(ctx, doc, base_uri, fz_xml_down(node));
}
- xps_parse_element(doc, ctm, &area, base_uri, dict, node);
+ xps_parse_element(ctx, doc, ctm, &area, base_uri, dict, node);
}
if (dict)
- xps_free_resource_dictionary(doc, dict);
+ xps_drop_resource_dictionary(ctx, doc, dict);
}
void
-xps_run_page(xps_document *doc, xps_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
+xps_run_page(fz_context *ctx, xps_page *page, fz_device *dev, const fz_matrix *ctm, fz_cookie *cookie)
{
+ xps_document *doc = page->doc;
fz_matrix page_ctm = *ctm;
fz_pre_scale(&page_ctm, 72.0f / 96.0f, 72.0f / 96.0f);
doc->cookie = cookie;
doc->dev = dev;
- xps_parse_fixed_page(doc, &page_ctm, page);
+ xps_parse_fixed_page(ctx, doc, &page_ctm, page);
doc->cookie = NULL;
doc->dev = NULL;
- page->links_resolved = 1;
+ page->fix->links_resolved = 1;
}
diff --git a/source/xps/xps-util.c b/source/xps/xps-util.c
index a74dc30f..5d708eaa 100644
--- a/source/xps/xps-util.c
+++ b/source/xps/xps-util.c
@@ -81,7 +81,7 @@ skip_authority(char *path)
#define SEP(x) ((x)=='/' || (x) == 0)
static char *
-xps_clean_path(char *name)
+clean_path(char *name)
{
char *p, *q, *dotdot, *start;
int rooted;
@@ -138,7 +138,7 @@ xps_clean_path(char *name)
}
void
-xps_resolve_url(char *output, char *base_uri, char *path, int output_size)
+xps_resolve_url(fz_context *ctx, xps_document *doc, char *output, char *base_uri, char *path, int output_size)
{
char *p = skip_authority(skip_scheme(path));
@@ -153,13 +153,11 @@ xps_resolve_url(char *output, char *base_uri, char *path, int output_size)
fz_strlcat(output, "/", output_size);
fz_strlcat(output, path, output_size);
}
- xps_clean_path(output);
+ clean_path(output);
}
int
-xps_url_is_remote(char *path)
+xps_url_is_remote(fz_context *ctx, xps_document *doc, char *path)
{
- char *p = skip_authority(skip_scheme(path));
-
- return p != path;
+ return path != skip_authority(skip_scheme(path));
}
diff --git a/source/xps/xps-zip.c b/source/xps/xps-zip.c
index e3d006ba..3759c4b6 100644
--- a/source/xps/xps-zip.c
+++ b/source/xps/xps-zip.c
@@ -1,45 +1,44 @@
#include "mupdf/xps.h"
-static void xps_init_document(xps_document *doc);
+static void xps_init_document(fz_context *ctx, xps_document *doc);
xps_part *
-xps_new_part(xps_document *doc, char *name, unsigned char *data, int size)
+xps_new_part(fz_context *ctx, xps_document *doc, char *name, unsigned char *data, int size)
{
xps_part *part;
- part = fz_malloc_struct(doc->ctx, xps_part);
- fz_try(doc->ctx)
+ part = fz_malloc_struct(ctx, xps_part);
+ fz_try(ctx)
{
- part->name = fz_strdup(doc->ctx, name);
+ part->name = fz_strdup(ctx, name);
part->data = data;
part->size = size;
}
- fz_catch(doc->ctx)
+ fz_catch(ctx)
{
- fz_free(doc->ctx, part->name);
- fz_free(doc->ctx, part->data);
- fz_free(doc->ctx, part);
- fz_rethrow(doc->ctx);
+ fz_free(ctx, part->name);
+ fz_free(ctx, part->data);
+ fz_free(ctx, part);
+ fz_rethrow(ctx);
}
return part;
}
void
-xps_free_part(xps_document *doc, xps_part *part)
+xps_drop_part(fz_context *ctx, xps_document *doc, xps_part *part)
{
- fz_free(doc->ctx, part->name);
- fz_free(doc->ctx, part->data);
- fz_free(doc->ctx, part);
+ fz_free(ctx, part->name);
+ fz_free(ctx, part->data);
+ fz_free(ctx, part);
}
/*
* Read and interleave split parts from a ZIP file.
*/
xps_part *
-xps_read_part(xps_document *doc, char *partname)
+xps_read_part(fz_context *ctx, xps_document *doc, char *partname)
{
- fz_context *ctx = doc->ctx;
fz_archive *zip = doc->zip;
fz_buffer *buf, *tmp;
char path[2048];
@@ -85,6 +84,7 @@ xps_read_part(xps_document *doc, char *partname)
}
else
{
+ fz_drop_buffer(ctx, buf);
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find all pieces for part '%s'", partname);
}
}
@@ -95,25 +95,26 @@ xps_read_part(xps_document *doc, char *partname)
/* take over the data */
data = buf->data;
- size = buf->len;
+ /* size doesn't include the added zero-terminator */
+ size = buf->len - 1;
fz_free(ctx, buf);
- return xps_new_part(doc, partname, data, size);
+ return xps_new_part(ctx, doc, partname, data, size);
}
int
-xps_has_part(xps_document *doc, char *name)
+xps_has_part(fz_context *ctx, xps_document *doc, char *name)
{
char buf[2048];
if (name[0] == '/')
name++;
- if (fz_has_archive_entry(doc->ctx, doc->zip, name))
+ if (fz_has_archive_entry(ctx, doc->zip, name))
return 1;
sprintf(buf, "%s/[0].piece", name);
- if (fz_has_archive_entry(doc->ctx, doc->zip, buf))
+ if (fz_has_archive_entry(ctx, doc->zip, buf))
return 1;
sprintf(buf, "%s/[0].last.piece", name);
- if (fz_has_archive_entry(doc->ctx, doc->zip, buf))
+ if (fz_has_archive_entry(ctx, doc->zip, buf))
return 1;
return 0;
}
@@ -124,17 +125,16 @@ xps_open_document_with_directory(fz_context *ctx, const char *directory)
xps_document *doc;
doc = fz_malloc_struct(ctx, xps_document);
- xps_init_document(doc);
- doc->ctx = ctx;
+ xps_init_document(ctx, doc);
doc->zip = fz_open_directory(ctx, directory);
fz_try(ctx)
{
- xps_read_page_list(doc);
+ xps_read_page_list(ctx, doc);
}
fz_catch(ctx)
{
- xps_close_document(doc);
+ xps_close_document(ctx, doc);
fz_rethrow(ctx);
}
@@ -147,17 +147,16 @@ xps_open_document_with_stream(fz_context *ctx, fz_stream *file)
xps_document *doc;
doc = fz_malloc_struct(ctx, xps_document);
- xps_init_document(doc);
- doc->ctx = ctx;
- doc->zip = fz_open_archive_with_stream(ctx, file);
+ xps_init_document(ctx, doc);
fz_try(ctx)
{
- xps_read_page_list(doc);
+ doc->zip = fz_open_archive_with_stream(ctx, file);
+ xps_read_page_list(ctx, doc);
}
fz_catch(ctx)
{
- xps_close_document(doc);
+ xps_close_document(ctx, doc);
fz_rethrow(ctx);
}
@@ -183,26 +182,19 @@ xps_open_document(fz_context *ctx, const char *filename)
}
file = fz_open_file(ctx, filename);
- if (!file)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot open file '%s': %s", filename, strerror(errno));
fz_try(ctx)
- {
doc = xps_open_document_with_stream(ctx, file);
- }
fz_always(ctx)
- {
- fz_close(file);
- }
+ fz_drop_stream(ctx, file);
fz_catch(ctx)
- {
fz_rethrow_message(ctx, "cannot load document '%s'", filename);
- }
+
return doc;
}
void
-xps_close_document(xps_document *doc)
+xps_close_document(fz_context *ctx, xps_document *doc)
{
xps_font_cache *font, *next;
@@ -210,26 +202,26 @@ xps_close_document(xps_document *doc)
return;
if (doc->zip)
- fz_close_archive(doc->ctx, doc->zip);
+ fz_drop_archive(ctx, doc->zip);
font = doc->font_table;
while (font)
{
next = font->next;
- fz_drop_font(doc->ctx, font->font);
- fz_free(doc->ctx, font->name);
- fz_free(doc->ctx, font);
+ fz_drop_font(ctx, font->font);
+ fz_free(ctx, font->name);
+ fz_free(ctx, font);
font = next;
}
- xps_free_page_list(doc);
+ xps_drop_page_list(ctx, doc);
- fz_free(doc->ctx, doc->start_part);
- fz_free(doc->ctx, doc);
+ fz_free(ctx, doc->start_part);
+ fz_free(ctx, doc);
}
static int
-xps_meta(xps_document *doc, int key, void *ptr, int size)
+xps_meta(fz_context *ctx, xps_document *doc, int key, void *ptr, int size)
{
switch (key)
{
@@ -242,24 +234,12 @@ xps_meta(xps_document *doc, int key, void *ptr, int size)
}
static void
-xps_rebind(xps_document *doc, fz_context *ctx)
-{
- doc->ctx = ctx;
- fz_rebind_archive(doc->zip, ctx);
- fz_rebind_device(doc->dev, ctx);
-}
-
-static void
-xps_init_document(xps_document *doc)
+xps_init_document(fz_context *ctx, xps_document *doc)
{
+ doc->super.refs = 1;
doc->super.close = (fz_document_close_fn *)xps_close_document;
doc->super.load_outline = (fz_document_load_outline_fn *)xps_load_outline;
doc->super.count_pages = (fz_document_count_pages_fn *)xps_count_pages;
doc->super.load_page = (fz_document_load_page_fn *)xps_load_page;
- doc->super.load_links = (fz_document_load_links_fn *)xps_load_links;
- doc->super.bound_page = (fz_document_bound_page_fn *)xps_bound_page;
- doc->super.run_page_contents = (fz_document_run_page_contents_fn *)xps_run_page;
- doc->super.free_page = (fz_document_free_page_fn *)xps_free_page;
doc->super.meta = (fz_document_meta_fn *)xps_meta;
- doc->super.rebind = (fz_document_rebind_fn *)xps_rebind;
}
diff --git a/thirdparty/mujs b/thirdparty/mujs
-Subproject 031513b25b73ce5e5fc7d6bafd512a822d8ded7
+Subproject c1ad1ba1e482e7d01743e3f4f9517572bebf99a