/branches/harbour-3.0/contrib/hbhpdf/3rd/libhpdf/hpdfcata.c

# · C · 383 lines · 283 code · 82 blank · 18 comment · 91 complexity · 4f1a624a1bc6c8afabade332800091d9 MD5 · raw file

  1. /*
  2. * << Haru Free PDF Library >> -- hpdf_catalog.c
  3. *
  4. * URL: http://libharu.org
  5. *
  6. * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
  7. * Copyright (c) 2007-2009 Antony Dovgal <tony@daylessday.org>
  8. *
  9. * Permission to use, copy, modify, distribute and sell this software
  10. * and its documentation for any purpose is hereby granted without fee,
  11. * provided that the above copyright notice appear in all copies and
  12. * that both that copyright notice and this permission notice appear
  13. * in supporting documentation.
  14. * It is provided "as is" without express or implied warranty.
  15. *
  16. */
  17. #include "hpdfconf.h"
  18. #include "hpdfutil.h"
  19. #include "hpdfcata.h"
  20. #include "hpdfpags.h"
  21. static const char *HPDF_PAGE_LAYOUT_NAMES[] = {
  22. "SinglePage",
  23. "OneColumn",
  24. "TwoColumnLeft",
  25. "TwoColumnRight",
  26. NULL
  27. };
  28. static const char *HPDF_PAGE_MODE_NAMES[] = {
  29. "UseNone",
  30. "UseOutlines",
  31. "UseThumbs",
  32. "FullScreen",
  33. "UseOC",
  34. "UseAttachments",
  35. NULL
  36. };
  37. HPDF_Catalog
  38. HPDF_Catalog_New (HPDF_MMgr mmgr,
  39. HPDF_Xref xref)
  40. {
  41. HPDF_Catalog catalog;
  42. HPDF_STATUS ret = 0;
  43. catalog = HPDF_Dict_New (mmgr);
  44. if (!catalog)
  45. return NULL;
  46. catalog->header.obj_class |= HPDF_OSUBCLASS_CATALOG;
  47. if (HPDF_Xref_Add (xref, catalog) != HPDF_OK)
  48. return NULL;
  49. /* add requiered elements */
  50. ret += HPDF_Dict_AddName (catalog, "Type", "Catalog");
  51. ret += HPDF_Dict_Add (catalog, "Pages", HPDF_Pages_New (mmgr, NULL, xref));
  52. if (ret != HPDF_OK)
  53. return NULL;
  54. return catalog;
  55. }
  56. HPDF_Pages
  57. HPDF_Catalog_GetRoot (HPDF_Catalog catalog)
  58. {
  59. HPDF_Dict pages;
  60. if (!catalog)
  61. return NULL;
  62. pages = HPDF_Dict_GetItem (catalog, "Pages", HPDF_OCLASS_DICT);
  63. if (!pages || pages->header.obj_class != (HPDF_OSUBCLASS_PAGES |
  64. HPDF_OCLASS_DICT))
  65. HPDF_SetError (catalog->error, HPDF_PAGE_CANNOT_GET_ROOT_PAGES, 0);
  66. return pages;
  67. }
  68. HPDF_NameDict
  69. HPDF_Catalog_GetNames (HPDF_Catalog catalog)
  70. {
  71. if (!catalog)
  72. return NULL;
  73. return HPDF_Dict_GetItem (catalog, "Names", HPDF_OCLASS_DICT);
  74. }
  75. HPDF_STATUS
  76. HPDF_Catalog_SetNames (HPDF_Catalog catalog,
  77. HPDF_NameDict dict)
  78. {
  79. return HPDF_Dict_Add (catalog, "Names", dict);
  80. }
  81. HPDF_PageLayout
  82. HPDF_Catalog_GetPageLayout (HPDF_Catalog catalog)
  83. {
  84. HPDF_Name layout;
  85. HPDF_UINT i = 0;
  86. layout = (HPDF_Name)HPDF_Dict_GetItem (catalog, "PageLayout",
  87. HPDF_OCLASS_NAME);
  88. if (!layout)
  89. return HPDF_PAGE_LAYOUT_EOF;
  90. while (HPDF_PAGE_LAYOUT_NAMES[i]) {
  91. if (HPDF_StrCmp (layout->value, HPDF_PAGE_LAYOUT_NAMES[i]) == 0)
  92. return (HPDF_PageLayout)i;
  93. i++;
  94. }
  95. return HPDF_PAGE_LAYOUT_EOF;
  96. }
  97. HPDF_STATUS
  98. HPDF_Catalog_SetPageLayout (HPDF_Catalog catalog,
  99. HPDF_PageLayout layout)
  100. {
  101. return HPDF_Dict_AddName (catalog, "PageLayout",
  102. HPDF_PAGE_LAYOUT_NAMES[(HPDF_INT)layout]);
  103. }
  104. HPDF_PageMode
  105. HPDF_Catalog_GetPageMode (HPDF_Catalog catalog)
  106. {
  107. HPDF_Name mode;
  108. HPDF_UINT i = 0;
  109. mode = (HPDF_Name)HPDF_Dict_GetItem (catalog, "PageMode", HPDF_OCLASS_NAME);
  110. if (!mode)
  111. return HPDF_PAGE_MODE_USE_NONE;
  112. while (HPDF_PAGE_MODE_NAMES[i]) {
  113. if (HPDF_StrCmp (mode->value, HPDF_PAGE_MODE_NAMES[i]) == 0)
  114. return (HPDF_PageMode)i;
  115. i++;
  116. }
  117. return HPDF_PAGE_MODE_USE_NONE;
  118. }
  119. HPDF_STATUS
  120. HPDF_Catalog_SetPageMode (HPDF_Catalog catalog,
  121. HPDF_PageMode mode)
  122. {
  123. return HPDF_Dict_AddName (catalog, "PageMode",
  124. HPDF_PAGE_MODE_NAMES[(HPDF_INT)mode]);
  125. }
  126. HPDF_STATUS
  127. HPDF_Catalog_SetOpenAction (HPDF_Catalog catalog,
  128. HPDF_Destination open_action)
  129. {
  130. if (!open_action) {
  131. HPDF_Dict_RemoveElement (catalog, "OpenAction");
  132. return HPDF_OK;
  133. }
  134. return HPDF_Dict_Add (catalog, "OpenAction", open_action);
  135. }
  136. HPDF_BOOL
  137. HPDF_Catalog_Validate (HPDF_Catalog catalog)
  138. {
  139. if (!catalog)
  140. return HPDF_FALSE;
  141. if (catalog->header.obj_class != (HPDF_OSUBCLASS_CATALOG |
  142. HPDF_OCLASS_DICT)) {
  143. HPDF_SetError (catalog->error, HPDF_INVALID_OBJECT, 0);
  144. return HPDF_FALSE;
  145. }
  146. return HPDF_TRUE;
  147. }
  148. HPDF_STATUS
  149. HPDF_Catalog_AddPageLabel (HPDF_Catalog catalog,
  150. HPDF_UINT page_num,
  151. HPDF_Dict page_label)
  152. {
  153. HPDF_STATUS ret;
  154. HPDF_Array nums;
  155. HPDF_Dict labels = HPDF_Dict_GetItem (catalog, "PageLabels",
  156. HPDF_OCLASS_DICT);
  157. HPDF_PTRACE ((" HPDF_Catalog_AddPageLabel\n"));
  158. if (!labels) {
  159. labels = HPDF_Dict_New (catalog->mmgr);
  160. if (!labels)
  161. return catalog->error->error_no;
  162. if ((ret = HPDF_Dict_Add (catalog, "PageLabels", labels)) != HPDF_OK)
  163. return ret;
  164. }
  165. nums = HPDF_Dict_GetItem (labels, "Nums", HPDF_OCLASS_ARRAY);
  166. if (!nums) {
  167. nums = HPDF_Array_New (catalog->mmgr);
  168. if (!nums)
  169. return catalog->error->error_no;
  170. if ((ret = HPDF_Dict_Add (labels, "Nums", nums)) != HPDF_OK)
  171. return ret;
  172. }
  173. if ((ret = HPDF_Array_AddNumber (nums, page_num)) != HPDF_OK)
  174. return ret;
  175. return HPDF_Array_Add (nums, page_label);
  176. }
  177. HPDF_STATUS
  178. HPDF_Catalog_SetViewerPreference (HPDF_Catalog catalog,
  179. HPDF_UINT value)
  180. {
  181. HPDF_STATUS ret;
  182. HPDF_Dict preferences;
  183. HPDF_PTRACE ((" HPDF_Catalog_SetViewerPreference\n"));
  184. if (!value) {
  185. ret = HPDF_Dict_RemoveElement (catalog, "ViewerPreferences");
  186. if (ret == HPDF_DICT_ITEM_NOT_FOUND)
  187. ret = HPDF_OK;
  188. return ret;
  189. }
  190. preferences = HPDF_Dict_New (catalog->mmgr);
  191. if (!preferences)
  192. return catalog->error->error_no;
  193. if ((ret = HPDF_Dict_Add (catalog, "ViewerPreferences", preferences))
  194. != HPDF_OK)
  195. return ret;
  196. /* */
  197. if (value & HPDF_HIDE_TOOLBAR) {
  198. if ((ret = HPDF_Dict_AddBoolean (preferences, "HideToolbar",
  199. HPDF_TRUE)) != HPDF_OK)
  200. return ret;
  201. } else {
  202. if ((ret = HPDF_Dict_RemoveElement (preferences, "HideToolbar")) !=
  203. HPDF_OK)
  204. if (ret != HPDF_DICT_ITEM_NOT_FOUND)
  205. return ret;
  206. }
  207. if (value & HPDF_HIDE_MENUBAR) {
  208. if ((ret = HPDF_Dict_AddBoolean (preferences, "HideMenubar",
  209. HPDF_TRUE)) != HPDF_OK)
  210. return ret;
  211. } else {
  212. if ((ret = HPDF_Dict_RemoveElement (preferences, "HideMenubar")) !=
  213. HPDF_OK)
  214. if (ret != HPDF_DICT_ITEM_NOT_FOUND)
  215. return ret;
  216. }
  217. if (value & HPDF_HIDE_WINDOW_UI) {
  218. if ((ret = HPDF_Dict_AddBoolean (preferences, "HideWindowUI",
  219. HPDF_TRUE)) != HPDF_OK)
  220. return ret;
  221. } else {
  222. if ((ret = HPDF_Dict_RemoveElement (preferences, "HideWindowUI")) !=
  223. HPDF_OK)
  224. if (ret != HPDF_DICT_ITEM_NOT_FOUND)
  225. return ret;
  226. }
  227. if (value & HPDF_FIT_WINDOW) {
  228. if ((ret = HPDF_Dict_AddBoolean (preferences, "FitWindow",
  229. HPDF_TRUE)) != HPDF_OK)
  230. return ret;
  231. } else {
  232. if ((ret = HPDF_Dict_RemoveElement (preferences, "FitWindow")) !=
  233. HPDF_OK)
  234. if (ret != HPDF_DICT_ITEM_NOT_FOUND)
  235. return ret;
  236. }
  237. if (value & HPDF_CENTER_WINDOW) {
  238. if ((ret = HPDF_Dict_AddBoolean (preferences, "CenterWindow",
  239. HPDF_TRUE)) != HPDF_OK)
  240. return ret;
  241. } else {
  242. if ((ret = HPDF_Dict_RemoveElement (preferences, "CenterWindow")) !=
  243. HPDF_OK)
  244. if (ret != HPDF_DICT_ITEM_NOT_FOUND)
  245. return ret;
  246. }
  247. if (value & HPDF_PRINT_SCALING_NONE) {
  248. if ((ret = HPDF_Dict_AddName (preferences, "PrintScaling",
  249. "None")) != HPDF_OK)
  250. return ret;
  251. } else {
  252. if ((ret = HPDF_Dict_RemoveElement (preferences, "PrintScaling")) !=
  253. HPDF_OK)
  254. if (ret != HPDF_DICT_ITEM_NOT_FOUND)
  255. return ret;
  256. }
  257. return HPDF_OK;
  258. }
  259. HPDF_UINT
  260. HPDF_Catalog_GetViewerPreference (HPDF_Catalog catalog)
  261. {
  262. HPDF_Dict preferences;
  263. HPDF_UINT value = 0;
  264. HPDF_Boolean obj;
  265. HPDF_PTRACE ((" HPDF_Catalog_GetViewerPreference\n"));
  266. preferences = (HPDF_Dict)HPDF_Dict_GetItem (catalog, "ViewerPreferences",
  267. HPDF_OCLASS_DICT);
  268. if (!preferences)
  269. return 0;
  270. obj = (HPDF_Boolean)HPDF_Dict_GetItem (preferences, "HideToolbar",
  271. HPDF_OCLASS_BOOLEAN);
  272. if (obj) {
  273. if (obj->value)
  274. value += HPDF_HIDE_TOOLBAR;
  275. }
  276. obj = (HPDF_Boolean)HPDF_Dict_GetItem (preferences, "HideMenubar",
  277. HPDF_OCLASS_BOOLEAN);
  278. if (obj) {
  279. if (obj->value)
  280. value += HPDF_HIDE_MENUBAR;
  281. }
  282. obj = (HPDF_Boolean)HPDF_Dict_GetItem (preferences, "HideWindowUI",
  283. HPDF_OCLASS_BOOLEAN);
  284. if (obj) {
  285. if (obj->value)
  286. value += HPDF_HIDE_WINDOW_UI;
  287. }
  288. obj = (HPDF_Boolean)HPDF_Dict_GetItem (preferences, "FitWindow",
  289. HPDF_OCLASS_BOOLEAN);
  290. if (obj) {
  291. if (obj->value)
  292. value += HPDF_FIT_WINDOW;
  293. }
  294. obj = (HPDF_Boolean)HPDF_Dict_GetItem (preferences, "CenterWindow",
  295. HPDF_OCLASS_BOOLEAN);
  296. if (obj) {
  297. if (obj->value)
  298. value += HPDF_CENTER_WINDOW;
  299. }
  300. return value;
  301. }