object.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. // Copyright (C) 2004-2025 Artifex Software, Inc.
  2. //
  3. // This file is part of MuPDF.
  4. //
  5. // MuPDF is free software: you can redistribute it and/or modify it under the
  6. // terms of the GNU Affero General Public License as published by the Free
  7. // Software Foundation, either version 3 of the License, or (at your option)
  8. // any later version.
  9. //
  10. // MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
  11. // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  12. // FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
  13. // details.
  14. //
  15. // You should have received a copy of the GNU Affero General Public License
  16. // along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>
  17. //
  18. // Alternative licensing terms are available from the licensor.
  19. // For commercial licensing, see <https://www.artifex.com/> or contact
  20. // Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
  21. // CA 94129, USA, for further information.
  22. #ifndef MUPDF_PDF_OBJECT_H
  23. #define MUPDF_PDF_OBJECT_H
  24. #include "mupdf/fitz/stream.h"
  25. typedef struct pdf_document pdf_document;
  26. typedef struct pdf_crypt pdf_crypt;
  27. typedef struct pdf_journal pdf_journal;
  28. typedef struct pdf_resource_stack pdf_resource_stack;
  29. /* Defined in PDF 1.7 according to Acrobat limit. */
  30. #define PDF_MAX_OBJECT_NUMBER 8388607
  31. #define PDF_MAX_GEN_NUMBER 65535
  32. /*
  33. * Dynamic objects.
  34. * The same type of objects as found in PDF and PostScript.
  35. * Used by the filters and the mupdf parser.
  36. */
  37. typedef struct pdf_obj pdf_obj;
  38. pdf_obj *pdf_new_int(fz_context *ctx, int64_t i);
  39. pdf_obj *pdf_new_real(fz_context *ctx, float f);
  40. pdf_obj *pdf_new_name(fz_context *ctx, const char *str);
  41. pdf_obj *pdf_new_string(fz_context *ctx, const char *str, size_t len);
  42. /*
  43. Create a PDF 'text string' by encoding input string as either ASCII or UTF-16BE.
  44. In theory, we could also use PDFDocEncoding.
  45. */
  46. pdf_obj *pdf_new_text_string(fz_context *ctx, const char *s);
  47. pdf_obj *pdf_new_indirect(fz_context *ctx, pdf_document *doc, int num, int gen);
  48. pdf_obj *pdf_new_array(fz_context *ctx, pdf_document *doc, int initialcap);
  49. pdf_obj *pdf_new_dict(fz_context *ctx, pdf_document *doc, int initialcap);
  50. pdf_obj *pdf_new_point(fz_context *ctx, pdf_document *doc, fz_point point);
  51. pdf_obj *pdf_new_rect(fz_context *ctx, pdf_document *doc, fz_rect rect);
  52. pdf_obj *pdf_new_matrix(fz_context *ctx, pdf_document *doc, fz_matrix mtx);
  53. pdf_obj *pdf_new_date(fz_context *ctx, pdf_document *doc, int64_t time);
  54. pdf_obj *pdf_copy_array(fz_context *ctx, pdf_obj *array);
  55. pdf_obj *pdf_copy_dict(fz_context *ctx, pdf_obj *dict);
  56. pdf_obj *pdf_deep_copy_obj(fz_context *ctx, pdf_obj *obj);
  57. pdf_obj *pdf_keep_obj(fz_context *ctx, pdf_obj *obj);
  58. void pdf_drop_obj(fz_context *ctx, pdf_obj *obj);
  59. pdf_obj *pdf_drop_singleton_obj(fz_context *ctx, pdf_obj *obj);
  60. int pdf_is_null(fz_context *ctx, pdf_obj *obj);
  61. int pdf_is_bool(fz_context *ctx, pdf_obj *obj);
  62. int pdf_is_int(fz_context *ctx, pdf_obj *obj);
  63. int pdf_is_real(fz_context *ctx, pdf_obj *obj);
  64. int pdf_is_number(fz_context *ctx, pdf_obj *obj);
  65. int pdf_is_name(fz_context *ctx, pdf_obj *obj);
  66. int pdf_is_string(fz_context *ctx, pdf_obj *obj);
  67. int pdf_is_array(fz_context *ctx, pdf_obj *obj);
  68. int pdf_is_dict(fz_context *ctx, pdf_obj *obj);
  69. int pdf_is_indirect(fz_context *ctx, pdf_obj *obj);
  70. /*
  71. Check if an object is a stream or not.
  72. */
  73. int pdf_obj_num_is_stream(fz_context *ctx, pdf_document *doc, int num);
  74. int pdf_is_stream(fz_context *ctx, pdf_obj *obj);
  75. /* Compare 2 objects. Returns 0 on match, non-zero on mismatch.
  76. * Streams always mismatch.
  77. */
  78. int pdf_objcmp(fz_context *ctx, pdf_obj *a, pdf_obj *b);
  79. int pdf_objcmp_resolve(fz_context *ctx, pdf_obj *a, pdf_obj *b);
  80. /* Compare 2 objects. Returns 0 on match, non-zero on mismatch.
  81. * Stream contents are explicitly checked.
  82. */
  83. int pdf_objcmp_deep(fz_context *ctx, pdf_obj *a, pdf_obj *b);
  84. int pdf_name_eq(fz_context *ctx, pdf_obj *a, pdf_obj *b);
  85. int pdf_obj_marked(fz_context *ctx, pdf_obj *obj);
  86. int pdf_mark_obj(fz_context *ctx, pdf_obj *obj);
  87. void pdf_unmark_obj(fz_context *ctx, pdf_obj *obj);
  88. typedef struct pdf_cycle_list pdf_cycle_list;
  89. struct pdf_cycle_list {
  90. pdf_cycle_list *up;
  91. int num;
  92. };
  93. int pdf_cycle(fz_context *ctx, pdf_cycle_list *here, pdf_cycle_list *prev, pdf_obj *obj);
  94. typedef struct
  95. {
  96. int len;
  97. unsigned char bits[FZ_FLEXIBLE_ARRAY];
  98. } pdf_mark_bits;
  99. pdf_mark_bits *pdf_new_mark_bits(fz_context *ctx, pdf_document *doc);
  100. void pdf_drop_mark_bits(fz_context *ctx, pdf_mark_bits *marks);
  101. void pdf_mark_bits_reset(fz_context *ctx, pdf_mark_bits *marks);
  102. int pdf_mark_bits_set(fz_context *ctx, pdf_mark_bits *marks, pdf_obj *obj);
  103. typedef struct
  104. {
  105. int len;
  106. int max;
  107. int *list;
  108. int local_list[8];
  109. } pdf_mark_list;
  110. int pdf_mark_list_push(fz_context *ctx, pdf_mark_list *list, pdf_obj *obj);
  111. void pdf_mark_list_pop(fz_context *ctx, pdf_mark_list *list);
  112. int pdf_mark_list_check(fz_context *ctx, pdf_mark_list *list, pdf_obj *obj);
  113. void pdf_mark_list_init(fz_context *ctx, pdf_mark_list *list);
  114. void pdf_mark_list_free(fz_context *ctx, pdf_mark_list *list);
  115. void pdf_set_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int memo);
  116. int pdf_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int *memo);
  117. int pdf_obj_is_dirty(fz_context *ctx, pdf_obj *obj);
  118. void pdf_dirty_obj(fz_context *ctx, pdf_obj *obj);
  119. void pdf_clean_obj(fz_context *ctx, pdf_obj *obj);
  120. int pdf_to_bool(fz_context *ctx, pdf_obj *obj);
  121. int pdf_to_int(fz_context *ctx, pdf_obj *obj);
  122. int64_t pdf_to_int64(fz_context *ctx, pdf_obj *obj);
  123. float pdf_to_real(fz_context *ctx, pdf_obj *obj);
  124. const char *pdf_to_name(fz_context *ctx, pdf_obj *obj);
  125. const char *pdf_to_text_string(fz_context *ctx, pdf_obj *obj);
  126. const char *pdf_to_string(fz_context *ctx, pdf_obj *obj, size_t *sizep);
  127. char *pdf_to_str_buf(fz_context *ctx, pdf_obj *obj);
  128. size_t pdf_to_str_len(fz_context *ctx, pdf_obj *obj);
  129. int pdf_to_num(fz_context *ctx, pdf_obj *obj);
  130. int pdf_to_gen(fz_context *ctx, pdf_obj *obj);
  131. int pdf_to_bool_default(fz_context *ctx, pdf_obj *obj, int def);
  132. int pdf_to_int_default(fz_context *ctx, pdf_obj *obj, int def);
  133. float pdf_to_real_default(fz_context *ctx, pdf_obj *obj, float def);
  134. int pdf_array_len(fz_context *ctx, pdf_obj *array);
  135. pdf_obj *pdf_array_get(fz_context *ctx, pdf_obj *array, int i);
  136. void pdf_array_put(fz_context *ctx, pdf_obj *array, int i, pdf_obj *obj);
  137. void pdf_array_put_drop(fz_context *ctx, pdf_obj *array, int i, pdf_obj *obj);
  138. void pdf_array_push(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
  139. void pdf_array_push_drop(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
  140. void pdf_array_insert(fz_context *ctx, pdf_obj *array, pdf_obj *obj, int index);
  141. void pdf_array_insert_drop(fz_context *ctx, pdf_obj *array, pdf_obj *obj, int index);
  142. void pdf_array_delete(fz_context *ctx, pdf_obj *array, int index);
  143. int pdf_array_find(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
  144. int pdf_array_contains(fz_context *ctx, pdf_obj *array, pdf_obj *obj);
  145. int pdf_dict_len(fz_context *ctx, pdf_obj *dict);
  146. pdf_obj *pdf_dict_get_key(fz_context *ctx, pdf_obj *dict, int idx);
  147. pdf_obj *pdf_dict_get_val(fz_context *ctx, pdf_obj *dict, int idx);
  148. void pdf_dict_put_val_null(fz_context *ctx, pdf_obj *obj, int idx);
  149. pdf_obj *pdf_dict_get(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  150. pdf_obj *pdf_dict_getp(fz_context *ctx, pdf_obj *dict, const char *path);
  151. pdf_obj *pdf_dict_getl(fz_context *ctx, pdf_obj *dict, ...);
  152. pdf_obj *pdf_dict_geta(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *abbrev);
  153. pdf_obj *pdf_dict_gets(fz_context *ctx, pdf_obj *dict, const char *key);
  154. pdf_obj *pdf_dict_getsa(fz_context *ctx, pdf_obj *dict, const char *key, const char *abbrev);
  155. pdf_obj *pdf_dict_get_inheritable(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  156. pdf_obj *pdf_dict_getp_inheritable(fz_context *ctx, pdf_obj *dict, const char *path);
  157. pdf_obj *pdf_dict_gets_inheritable(fz_context *ctx, pdf_obj *dict, const char *key);
  158. void pdf_dict_put(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val);
  159. void pdf_dict_put_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val);
  160. void pdf_dict_get_put_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *key, pdf_obj *val, pdf_obj **old_val);
  161. void pdf_dict_puts(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val);
  162. void pdf_dict_puts_drop(fz_context *ctx, pdf_obj *dict, const char *key, pdf_obj *val);
  163. void pdf_dict_putp(fz_context *ctx, pdf_obj *dict, const char *path, pdf_obj *val);
  164. void pdf_dict_putp_drop(fz_context *ctx, pdf_obj *dict, const char *path, pdf_obj *val);
  165. void pdf_dict_putl(fz_context *ctx, pdf_obj *dict, pdf_obj *val, ...);
  166. void pdf_dict_putl_drop(fz_context *ctx, pdf_obj *dict, pdf_obj *val, ...);
  167. void pdf_dict_del(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  168. void pdf_dict_dels(fz_context *ctx, pdf_obj *dict, const char *key);
  169. void pdf_sort_dict(fz_context *ctx, pdf_obj *dict);
  170. void pdf_dict_put_bool(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int x);
  171. void pdf_dict_put_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int64_t x);
  172. void pdf_dict_put_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key, double x);
  173. void pdf_dict_put_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key, const char *x);
  174. void pdf_dict_put_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, const char *x, size_t n);
  175. void pdf_dict_put_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, const char *x);
  176. void pdf_dict_put_indirect(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int num);
  177. void pdf_dict_put_point(fz_context *ctx, pdf_obj *dict, pdf_obj *key, fz_point x);
  178. void pdf_dict_put_rect(fz_context *ctx, pdf_obj *dict, pdf_obj *key, fz_rect x);
  179. void pdf_dict_put_matrix(fz_context *ctx, pdf_obj *dict, pdf_obj *key, fz_matrix x);
  180. void pdf_dict_put_date(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int64_t time);
  181. pdf_obj *pdf_dict_put_array(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int initial);
  182. pdf_obj *pdf_dict_put_dict(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int initial);
  183. pdf_obj *pdf_dict_puts_dict(fz_context *ctx, pdf_obj *dict, const char *key, int initial);
  184. int pdf_dict_get_bool(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  185. int pdf_dict_get_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  186. int64_t pdf_dict_get_int64(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  187. float pdf_dict_get_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  188. const char *pdf_dict_get_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  189. const char *pdf_dict_get_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, size_t *sizep);
  190. const char *pdf_dict_get_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  191. const char *pdf_dict_get_text_string_opt(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  192. fz_point pdf_dict_get_point(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  193. fz_rect pdf_dict_get_rect(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  194. fz_matrix pdf_dict_get_matrix(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  195. int64_t pdf_dict_get_date(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  196. int pdf_dict_get_bool_default(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int def);
  197. int pdf_dict_get_int_default(fz_context *ctx, pdf_obj *dict, pdf_obj *key, int def);
  198. float pdf_dict_get_real_default(fz_context *ctx, pdf_obj *dict, pdf_obj *key, float def);
  199. int pdf_dict_get_inheritable_bool(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  200. int pdf_dict_get_inheritable_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  201. int64_t pdf_dict_get_inheritable_int64(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  202. float pdf_dict_get_inheritable_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  203. const char *pdf_dict_get_inheritable_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  204. const char *pdf_dict_get_inheritable_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, size_t *sizep);
  205. const char *pdf_dict_get_inheritable_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  206. fz_rect pdf_dict_get_inheritable_rect(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  207. fz_matrix pdf_dict_get_inheritable_matrix(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  208. int64_t pdf_dict_get_inheritable_date(fz_context *ctx, pdf_obj *dict, pdf_obj *key);
  209. void pdf_array_push_bool(fz_context *ctx, pdf_obj *array, int x);
  210. void pdf_array_push_int(fz_context *ctx, pdf_obj *array, int64_t x);
  211. void pdf_array_push_real(fz_context *ctx, pdf_obj *array, double x);
  212. void pdf_array_push_name(fz_context *ctx, pdf_obj *array, const char *x);
  213. void pdf_array_push_string(fz_context *ctx, pdf_obj *array, const char *x, size_t n);
  214. void pdf_array_push_text_string(fz_context *ctx, pdf_obj *array, const char *x);
  215. pdf_obj *pdf_array_push_array(fz_context *ctx, pdf_obj *array, int initial);
  216. pdf_obj *pdf_array_push_dict(fz_context *ctx, pdf_obj *array, int initial);
  217. void pdf_array_put_bool(fz_context *ctx, pdf_obj *array, int i, int x);
  218. void pdf_array_put_int(fz_context *ctx, pdf_obj *array, int i, int64_t x);
  219. void pdf_array_put_real(fz_context *ctx, pdf_obj *array, int i, double x);
  220. void pdf_array_put_name(fz_context *ctx, pdf_obj *array, int i, const char *x);
  221. void pdf_array_put_string(fz_context *ctx, pdf_obj *array, int i, const char *x, size_t n);
  222. void pdf_array_put_text_string(fz_context *ctx, pdf_obj *array, int i, const char *x);
  223. pdf_obj *pdf_array_put_array(fz_context *ctx, pdf_obj *array, int i, int initial);
  224. pdf_obj *pdf_array_put_dict(fz_context *ctx, pdf_obj *array, int i, int initial);
  225. int pdf_array_get_bool(fz_context *ctx, pdf_obj *array, int index);
  226. int pdf_array_get_int(fz_context *ctx, pdf_obj *array, int index);
  227. float pdf_array_get_real(fz_context *ctx, pdf_obj *array, int index);
  228. const char *pdf_array_get_name(fz_context *ctx, pdf_obj *array, int index);
  229. const char *pdf_array_get_string(fz_context *ctx, pdf_obj *array, int index, size_t *sizep);
  230. const char *pdf_array_get_text_string(fz_context *ctx, pdf_obj *array, int index);
  231. fz_rect pdf_array_get_rect(fz_context *ctx, pdf_obj *array, int index);
  232. fz_matrix pdf_array_get_matrix(fz_context *ctx, pdf_obj *array, int index);
  233. void pdf_set_obj_parent(fz_context *ctx, pdf_obj *obj, int num);
  234. int pdf_obj_refs(fz_context *ctx, pdf_obj *ref);
  235. int pdf_obj_parent_num(fz_context *ctx, pdf_obj *obj);
  236. char *pdf_sprint_obj(fz_context *ctx, char *buf, size_t cap, size_t *len, pdf_obj *obj, int tight, int ascii);
  237. void pdf_print_obj(fz_context *ctx, fz_output *out, pdf_obj *obj, int tight, int ascii);
  238. void pdf_print_encrypted_obj(fz_context *ctx, fz_output *out, pdf_obj *obj, int tight, int ascii, pdf_crypt *crypt, int num, int gen, int *sep);
  239. void pdf_debug_obj(fz_context *ctx, pdf_obj *obj);
  240. void pdf_debug_ref(fz_context *ctx, pdf_obj *obj);
  241. /*
  242. Convert Unicode/PdfDocEncoding string into utf-8.
  243. The returned string must be freed by the caller.
  244. */
  245. char *pdf_new_utf8_from_pdf_string(fz_context *ctx, const char *srcptr, size_t srclen);
  246. /*
  247. Convert text string object to UTF-8.
  248. The returned string must be freed by the caller.
  249. */
  250. char *pdf_new_utf8_from_pdf_string_obj(fz_context *ctx, pdf_obj *src);
  251. /*
  252. Load text stream and convert to UTF-8.
  253. The returned string must be freed by the caller.
  254. */
  255. char *pdf_new_utf8_from_pdf_stream_obj(fz_context *ctx, pdf_obj *src);
  256. /*
  257. Load text stream or text string and convert to UTF-8.
  258. The returned string must be freed by the caller.
  259. */
  260. char *pdf_load_stream_or_string_as_utf8(fz_context *ctx, pdf_obj *src);
  261. fz_quad pdf_to_quad(fz_context *ctx, pdf_obj *array, int offset);
  262. fz_point pdf_to_point(fz_context *ctx, pdf_obj *array, int offset);
  263. fz_rect pdf_to_rect(fz_context *ctx, pdf_obj *array);
  264. fz_matrix pdf_to_matrix(fz_context *ctx, pdf_obj *array);
  265. int64_t pdf_to_date(fz_context *ctx, pdf_obj *time);
  266. /*
  267. pdf_get_indirect_document and pdf_get_bound_document are
  268. now deprecated. Please do not use them in future. They will
  269. be removed.
  270. Please use pdf_pin_document instead.
  271. */
  272. pdf_document *pdf_get_indirect_document(fz_context *ctx, pdf_obj *obj);
  273. pdf_document *pdf_get_bound_document(fz_context *ctx, pdf_obj *obj);
  274. /*
  275. pdf_pin_document returns a new reference to the document
  276. to which obj is bound. The caller is responsible for
  277. dropping this reference once they have finished with it.
  278. This is a replacement for pdf_get_indirect_document
  279. and pdf_get_bound_document that are now deprecated. Those
  280. returned a borrowed reference that did not need to be
  281. dropped.
  282. Note that this can validly return NULL in various cases:
  283. 1) When the object is of a simple type (such as a number
  284. or a string), it contains no reference to the enclosing
  285. document. 2) When the object has yet to be inserted into
  286. a PDF document (such as during parsing). 3) And (in
  287. future versions) when the document has been destroyed
  288. but the object reference remains.
  289. It is the caller's responsibility to deal with a NULL
  290. return here.
  291. */
  292. pdf_document *pdf_pin_document(fz_context *ctx, pdf_obj *obj);
  293. void pdf_set_int(fz_context *ctx, pdf_obj *obj, int64_t i);
  294. /* Voodoo to create PDF_NAME(Foo) macros from name-table.h */
  295. #define PDF_NAME(X) ((pdf_obj*)(intptr_t)PDF_ENUM_NAME_##X)
  296. #define PDF_MAKE_NAME(STRING,NAME) PDF_ENUM_NAME_##NAME,
  297. enum {
  298. PDF_ENUM_NULL,
  299. PDF_ENUM_TRUE,
  300. PDF_ENUM_FALSE,
  301. #include "mupdf/pdf/name-table.h"
  302. PDF_ENUM_LIMIT,
  303. };
  304. #undef PDF_MAKE_NAME
  305. #define PDF_NULL ((pdf_obj*)(intptr_t)PDF_ENUM_NULL)
  306. #define PDF_TRUE ((pdf_obj*)(intptr_t)PDF_ENUM_TRUE)
  307. #define PDF_FALSE ((pdf_obj*)(intptr_t)PDF_ENUM_FALSE)
  308. #define PDF_LIMIT ((pdf_obj*)(intptr_t)PDF_ENUM_LIMIT)
  309. /* Implementation details: subject to change. */
  310. /*
  311. for use by pdf_crypt_obj_imp to decrypt AES string in place
  312. */
  313. void pdf_set_str_len(fz_context *ctx, pdf_obj *obj, size_t newlen);
  314. /* Journalling */
  315. /* Call this to enable journalling on a given document. */
  316. void pdf_enable_journal(fz_context *ctx, pdf_document *doc);
  317. /* Call this to start an operation. Undo/redo works at 'operation'
  318. * granularity. Nested operations are all counted within the outermost
  319. * operation. Any modification performed on a journalled PDF without an
  320. * operation having been started will throw an error. */
  321. void pdf_begin_operation(fz_context *ctx, pdf_document *doc, const char *operation);
  322. /* Call this to start an implicit operation. Implicit operations are
  323. * operations that happen as a consequence of things like updating
  324. * an annotation. They get rolled into the previous operation, because
  325. * they generally happen as a result of them. */
  326. void pdf_begin_implicit_operation(fz_context *ctx, pdf_document *doc);
  327. /* Call this to end an operation. */
  328. void pdf_end_operation(fz_context *ctx, pdf_document *doc);
  329. /* Call this to abandon an operation. Revert to the state
  330. * when you began. */
  331. void pdf_abandon_operation(fz_context *ctx, pdf_document *doc);
  332. /* Call this to find out how many undo/redo steps there are, and the
  333. * current position we are within those. 0 = original document,
  334. * *steps = final edited version. */
  335. int pdf_undoredo_state(fz_context *ctx, pdf_document *doc, int *steps);
  336. /* Call this to find the title of the operation within the undo state. */
  337. const char *pdf_undoredo_step(fz_context *ctx, pdf_document *doc, int step);
  338. /* Helper functions to identify if we are in a state to be able to undo
  339. * or redo. */
  340. int pdf_can_undo(fz_context *ctx, pdf_document *doc);
  341. int pdf_can_redo(fz_context *ctx, pdf_document *doc);
  342. /* Move backwards in the undo history. Throws an error if we are at the
  343. * start. Any edits to the document at this point will discard all
  344. * subsequent history. */
  345. void pdf_undo(fz_context *ctx, pdf_document *doc);
  346. /* Move forwards in the undo history. Throws an error if we are at the
  347. * end. */
  348. void pdf_redo(fz_context *ctx, pdf_document *doc);
  349. /* Called to reset the entire history. This is called implicitly when
  350. * a non-undoable change occurs (such as a pdf repair). */
  351. void pdf_discard_journal(fz_context *ctx, pdf_journal *journal);
  352. /* Internal destructor. */
  353. void pdf_drop_journal(fz_context *ctx, pdf_journal *journal);
  354. /* Internal call as part of saving a snapshot of a PDF document. */
  355. void pdf_serialise_journal(fz_context *ctx, pdf_document *doc, fz_output *out);
  356. /* Internal call as part of loading a snapshot of a PDF document. */
  357. void pdf_deserialise_journal(fz_context *ctx, pdf_document *doc, fz_stream *stm);
  358. /* Internal call as part of creating objects. */
  359. void pdf_add_journal_fragment(fz_context *ctx, pdf_document *doc, int parent, pdf_obj *copy, fz_buffer *copy_stream, int newobj);
  360. char *pdf_format_date(fz_context *ctx, int64_t time, char *s, size_t n);
  361. int64_t pdf_parse_date(fz_context *ctx, const char *s);
  362. int pdf_is_image_stream(fz_context *ctx, pdf_obj *obj);
  363. #endif