1 | /* |
2 | * << Haru Free PDF Library >> -- hpdf_destination.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 | |
18 | #include "hpdf_conf.h" |
19 | #include "hpdf_utils.h" |
20 | #include "hpdf.h" |
21 | |
22 | const char * const HPDF_DESTINATION_TYPE_NAMES[] = { |
23 | "XYZ" , |
24 | "Fit" , |
25 | "FitH" , |
26 | "FitV" , |
27 | "FitR" , |
28 | "FitB" , |
29 | "FitBH" , |
30 | "FitBV" , |
31 | NULL |
32 | }; |
33 | |
34 | /*----------------------------------------------------------------------------*/ |
35 | /*----- HPDF_Destination -----------------------------------------------------*/ |
36 | |
37 | HPDF_Destination |
38 | HPDF_Destination_New (HPDF_MMgr mmgr, |
39 | HPDF_Page target, |
40 | HPDF_Xref xref) |
41 | { |
42 | HPDF_Destination dst; |
43 | |
44 | HPDF_PTRACE((" HPDF_Destination_New\n" )); |
45 | |
46 | if (!HPDF_Page_Validate (target)) { |
47 | HPDF_SetError (mmgr->error, HPDF_INVALID_PAGE, 0); |
48 | return NULL; |
49 | } |
50 | |
51 | dst = HPDF_Array_New (mmgr); |
52 | if (!dst) |
53 | return NULL; |
54 | |
55 | dst->header.obj_class |= HPDF_OSUBCLASS_DESTINATION; |
56 | |
57 | if (HPDF_Xref_Add (xref, dst) != HPDF_OK) |
58 | return NULL; |
59 | |
60 | /* first item of array must be target page */ |
61 | if (HPDF_Array_Add (dst, target) != HPDF_OK) |
62 | return NULL; |
63 | |
64 | /* default type is HPDF_FIT */ |
65 | if (HPDF_Array_AddName (dst, |
66 | HPDF_DESTINATION_TYPE_NAMES[(HPDF_INT)HPDF_FIT]) != HPDF_OK) |
67 | return NULL; |
68 | |
69 | return dst; |
70 | } |
71 | |
72 | |
73 | HPDF_BOOL |
74 | HPDF_Destination_Validate (HPDF_Destination dst) |
75 | { |
76 | HPDF_Obj_Header * = (HPDF_Obj_Header *)dst; |
77 | HPDF_Page target; |
78 | |
79 | if (!dst || header->obj_class != |
80 | (HPDF_OCLASS_ARRAY | HPDF_OSUBCLASS_DESTINATION)) |
81 | return HPDF_FALSE; |
82 | |
83 | /* destination-types not defined. */ |
84 | if (dst->list->count < 2) |
85 | return HPDF_FALSE; |
86 | |
87 | target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); |
88 | if (!HPDF_Page_Validate (target)) { |
89 | HPDF_SetError (dst->error, HPDF_INVALID_PAGE, 0); |
90 | return HPDF_FALSE; |
91 | } |
92 | |
93 | return HPDF_TRUE; |
94 | } |
95 | |
96 | |
97 | HPDF_EXPORT(HPDF_STATUS) |
98 | HPDF_Destination_SetXYZ (HPDF_Destination dst, |
99 | HPDF_REAL left, |
100 | HPDF_REAL top, |
101 | HPDF_REAL zoom) |
102 | { |
103 | HPDF_STATUS ret = HPDF_OK; |
104 | HPDF_Page target; |
105 | |
106 | HPDF_PTRACE((" HPDF_Destination_SetXYZ\n" )); |
107 | |
108 | if (!HPDF_Destination_Validate (dst)) |
109 | return HPDF_INVALID_DESTINATION; |
110 | |
111 | if (left < 0 || top < 0 || zoom < 0.08 || zoom > 32) |
112 | return HPDF_RaiseError (dst->error, HPDF_INVALID_PARAMETER, 0); |
113 | |
114 | |
115 | target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); |
116 | |
117 | if (dst->list->count > 1) { |
118 | HPDF_Array_Clear (dst); |
119 | ret += HPDF_Array_Add (dst, target); |
120 | } |
121 | |
122 | ret += HPDF_Array_AddName (dst, |
123 | HPDF_DESTINATION_TYPE_NAMES[(HPDF_INT)HPDF_XYZ]); |
124 | ret += HPDF_Array_AddReal (dst, left); |
125 | ret += HPDF_Array_AddReal (dst, top); |
126 | ret += HPDF_Array_AddReal (dst, zoom); |
127 | |
128 | if (ret != HPDF_OK) |
129 | return HPDF_CheckError (dst->error); |
130 | |
131 | return HPDF_OK; |
132 | } |
133 | |
134 | |
135 | HPDF_EXPORT(HPDF_STATUS) |
136 | HPDF_Destination_SetFit (HPDF_Destination dst) |
137 | { |
138 | HPDF_STATUS ret = HPDF_OK; |
139 | HPDF_Page target; |
140 | |
141 | HPDF_PTRACE((" HPDF_Destination_SetFit\n" )); |
142 | |
143 | if (!HPDF_Destination_Validate (dst)) |
144 | return HPDF_INVALID_DESTINATION; |
145 | |
146 | target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); |
147 | |
148 | if (dst->list->count > 1) { |
149 | HPDF_Array_Clear (dst); |
150 | ret += HPDF_Array_Add (dst, target); |
151 | } |
152 | |
153 | ret += HPDF_Array_AddName (dst, |
154 | HPDF_DESTINATION_TYPE_NAMES[(HPDF_INT)HPDF_FIT]); |
155 | |
156 | if (ret != HPDF_OK) |
157 | return HPDF_CheckError (dst->error); |
158 | |
159 | return HPDF_OK; |
160 | } |
161 | |
162 | |
163 | HPDF_EXPORT(HPDF_STATUS) |
164 | HPDF_Destination_SetFitH (HPDF_Destination dst, |
165 | HPDF_REAL top) |
166 | { |
167 | HPDF_STATUS ret = HPDF_OK; |
168 | HPDF_Page target; |
169 | |
170 | HPDF_PTRACE((" HPDF_Destination_SetFitH\n" )); |
171 | |
172 | if (!HPDF_Destination_Validate (dst)) |
173 | return HPDF_INVALID_DESTINATION; |
174 | |
175 | target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); |
176 | |
177 | if (dst->list->count > 1) { |
178 | HPDF_Array_Clear (dst); |
179 | ret += HPDF_Array_Add (dst, target); |
180 | } |
181 | |
182 | ret += HPDF_Array_AddName (dst, |
183 | HPDF_DESTINATION_TYPE_NAMES[(HPDF_INT)HPDF_FIT_H]); |
184 | ret += HPDF_Array_AddReal (dst, top); |
185 | |
186 | if (ret != HPDF_OK) |
187 | return HPDF_CheckError (dst->error); |
188 | |
189 | return HPDF_OK; |
190 | } |
191 | |
192 | HPDF_EXPORT(HPDF_STATUS) |
193 | HPDF_Destination_SetFitV (HPDF_Destination dst, |
194 | HPDF_REAL left) |
195 | { |
196 | HPDF_STATUS ret = HPDF_OK; |
197 | HPDF_Page target; |
198 | |
199 | HPDF_PTRACE((" HPDF_Destination_SetFitV\n" )); |
200 | |
201 | if (!HPDF_Destination_Validate (dst)) |
202 | return HPDF_INVALID_DESTINATION; |
203 | |
204 | target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); |
205 | |
206 | if (dst->list->count > 1) { |
207 | HPDF_Array_Clear (dst); |
208 | ret += HPDF_Array_Add (dst, target); |
209 | } |
210 | |
211 | ret += HPDF_Array_AddName (dst, |
212 | HPDF_DESTINATION_TYPE_NAMES[(HPDF_INT)HPDF_FIT_V]); |
213 | ret += HPDF_Array_AddReal (dst, left); |
214 | |
215 | if (ret != HPDF_OK) |
216 | return HPDF_CheckError (dst->error); |
217 | |
218 | return HPDF_OK; |
219 | } |
220 | |
221 | |
222 | HPDF_EXPORT(HPDF_STATUS) |
223 | HPDF_Destination_SetFitR (HPDF_Destination dst, |
224 | HPDF_REAL left, |
225 | HPDF_REAL bottom, |
226 | HPDF_REAL right, |
227 | HPDF_REAL top) |
228 | { |
229 | HPDF_STATUS ret = HPDF_OK; |
230 | HPDF_Page target; |
231 | |
232 | HPDF_PTRACE((" HPDF_Destination_SetFitR\n" )); |
233 | |
234 | if (!HPDF_Destination_Validate (dst)) |
235 | return HPDF_INVALID_DESTINATION; |
236 | |
237 | target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); |
238 | |
239 | if (dst->list->count > 1) { |
240 | HPDF_Array_Clear (dst); |
241 | ret += HPDF_Array_Add (dst, target); |
242 | } |
243 | |
244 | ret += HPDF_Array_AddName (dst, |
245 | HPDF_DESTINATION_TYPE_NAMES[(HPDF_INT)HPDF_FIT_R]); |
246 | ret += HPDF_Array_AddReal (dst, left); |
247 | ret += HPDF_Array_AddReal (dst, bottom); |
248 | ret += HPDF_Array_AddReal (dst, right); |
249 | ret += HPDF_Array_AddReal (dst, top); |
250 | |
251 | if (ret != HPDF_OK) |
252 | return HPDF_CheckError (dst->error); |
253 | |
254 | return HPDF_OK; |
255 | } |
256 | |
257 | |
258 | HPDF_EXPORT(HPDF_STATUS) |
259 | HPDF_Destination_SetFitB (HPDF_Destination dst) |
260 | { |
261 | HPDF_STATUS ret = HPDF_OK; |
262 | HPDF_Page target; |
263 | |
264 | HPDF_PTRACE((" HPDF_Destination_SetFitB\n" )); |
265 | |
266 | if (!HPDF_Destination_Validate (dst)) |
267 | return HPDF_INVALID_DESTINATION; |
268 | |
269 | target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); |
270 | |
271 | if (dst->list->count > 1) { |
272 | HPDF_Array_Clear (dst); |
273 | ret += HPDF_Array_Add (dst, target); |
274 | } |
275 | |
276 | ret += HPDF_Array_AddName (dst, |
277 | HPDF_DESTINATION_TYPE_NAMES[(HPDF_INT)HPDF_FIT_B]); |
278 | |
279 | if (ret != HPDF_OK) |
280 | return HPDF_CheckError (dst->error); |
281 | |
282 | return HPDF_OK; |
283 | } |
284 | |
285 | |
286 | HPDF_EXPORT(HPDF_STATUS) |
287 | HPDF_Destination_SetFitBH (HPDF_Destination dst, |
288 | HPDF_REAL top) |
289 | { |
290 | HPDF_STATUS ret = HPDF_OK; |
291 | HPDF_Page target; |
292 | |
293 | HPDF_PTRACE((" HPDF_Destination_SetFitBH\n" )); |
294 | |
295 | if (!HPDF_Destination_Validate (dst)) |
296 | return HPDF_INVALID_DESTINATION; |
297 | |
298 | target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); |
299 | |
300 | if (dst->list->count > 1) { |
301 | HPDF_Array_Clear (dst); |
302 | ret += HPDF_Array_Add (dst, target); |
303 | } |
304 | |
305 | ret += HPDF_Array_AddName (dst, |
306 | HPDF_DESTINATION_TYPE_NAMES[(HPDF_INT)HPDF_FIT_BH]); |
307 | ret += HPDF_Array_AddReal (dst, top); |
308 | |
309 | if (ret != HPDF_OK) |
310 | return HPDF_CheckError (dst->error); |
311 | |
312 | return HPDF_OK; |
313 | } |
314 | |
315 | HPDF_EXPORT(HPDF_STATUS) |
316 | HPDF_Destination_SetFitBV (HPDF_Destination dst, |
317 | HPDF_REAL left) |
318 | { |
319 | HPDF_STATUS ret = HPDF_OK; |
320 | HPDF_Page target; |
321 | |
322 | HPDF_PTRACE((" HPDF_Destination_SetFitBV\n" )); |
323 | |
324 | if (!HPDF_Destination_Validate (dst)) |
325 | return HPDF_INVALID_DESTINATION; |
326 | |
327 | target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); |
328 | |
329 | if (dst->list->count > 1) { |
330 | HPDF_Array_Clear (dst); |
331 | ret += HPDF_Array_Add (dst, target); |
332 | } |
333 | |
334 | ret += HPDF_Array_AddName (dst, |
335 | HPDF_DESTINATION_TYPE_NAMES[(HPDF_INT)HPDF_FIT_BV]); |
336 | ret += HPDF_Array_AddReal (dst, left); |
337 | |
338 | if (ret != HPDF_OK) |
339 | return HPDF_CheckError (dst->error); |
340 | |
341 | return HPDF_OK; |
342 | |
343 | } |
344 | |
345 | |