hpdf 2.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. data/History +57 -0
  2. data/License +25 -0
  3. data/README +165 -0
  4. data/examples/arc_demo.rb +82 -0
  5. data/examples/demo.rb +92 -0
  6. data/examples/encryption.rb +41 -0
  7. data/examples/ext_gstater_demo.rb +171 -0
  8. data/examples/font_demo.rb +67 -0
  9. data/examples/jpfont_demo.rb +122 -0
  10. data/examples/line_demo.rb +301 -0
  11. data/examples/slide_show_demo.rb +139 -0
  12. data/examples/text_demo2.rb +189 -0
  13. data/examples/ttfont_demo.rb +106 -0
  14. data/ext/extconf.rb +6 -0
  15. data/ext/hpdf.c +3779 -0
  16. data/ext/hpdf_annotation.c +415 -0
  17. data/ext/hpdf_array.c +344 -0
  18. data/ext/hpdf_binary.c +117 -0
  19. data/ext/hpdf_boolean.c +47 -0
  20. data/ext/hpdf_catalog.c +354 -0
  21. data/ext/hpdf_destination.c +339 -0
  22. data/ext/hpdf_dict.c +488 -0
  23. data/ext/hpdf_doc.c +2020 -0
  24. data/ext/hpdf_doc_png.c +137 -0
  25. data/ext/hpdf_encoder.c +2991 -0
  26. data/ext/hpdf_encoder_cns.c +36359 -0
  27. data/ext/hpdf_encoder_cnt.c +15307 -0
  28. data/ext/hpdf_encoder_jp.c +16125 -0
  29. data/ext/hpdf_encoder_kr.c +27978 -0
  30. data/ext/hpdf_encrypt.c +632 -0
  31. data/ext/hpdf_encryptdict.c +240 -0
  32. data/ext/hpdf_error.c +114 -0
  33. data/ext/hpdf_ext_gstate.c +150 -0
  34. data/ext/hpdf_font.c +229 -0
  35. data/ext/hpdf_font_cid.c +1030 -0
  36. data/ext/hpdf_font_tt.c +406 -0
  37. data/ext/hpdf_font_type1.c +391 -0
  38. data/ext/hpdf_fontdef.c +56 -0
  39. data/ext/hpdf_fontdef_base14.c +4506 -0
  40. data/ext/hpdf_fontdef_cid.c +194 -0
  41. data/ext/hpdf_fontdef_cns.c +471 -0
  42. data/ext/hpdf_fontdef_cnt.c +250 -0
  43. data/ext/hpdf_fontdef_jp.c +1904 -0
  44. data/ext/hpdf_fontdef_kr.c +1572 -0
  45. data/ext/hpdf_fontdef_tt.c +2230 -0
  46. data/ext/hpdf_fontdef_type1.c +524 -0
  47. data/ext/hpdf_gstate.c +119 -0
  48. data/ext/hpdf_image.c +568 -0
  49. data/ext/hpdf_image_png.c +424 -0
  50. data/ext/hpdf_info.c +164 -0
  51. data/ext/hpdf_list.c +333 -0
  52. data/ext/hpdf_mmgr.c +243 -0
  53. data/ext/hpdf_name.c +71 -0
  54. data/ext/hpdf_null.c +31 -0
  55. data/ext/hpdf_number.c +49 -0
  56. data/ext/hpdf_objects.c +172 -0
  57. data/ext/hpdf_outline.c +329 -0
  58. data/ext/hpdf_page_label.c +74 -0
  59. data/ext/hpdf_page_operator.c +2764 -0
  60. data/ext/hpdf_pages.c +1508 -0
  61. data/ext/hpdf_real.c +61 -0
  62. data/ext/hpdf_streams.c +1435 -0
  63. data/ext/hpdf_string.c +189 -0
  64. data/ext/hpdf_utils.c +438 -0
  65. data/ext/hpdf_xref.c +348 -0
  66. data/ext/include/hpdf.h +1227 -0
  67. data/ext/include/hpdf_annotation.h +74 -0
  68. data/ext/include/hpdf_catalog.h +81 -0
  69. data/ext/include/hpdf_conf.h +76 -0
  70. data/ext/include/hpdf_consts.h +549 -0
  71. data/ext/include/hpdf_destination.h +41 -0
  72. data/ext/include/hpdf_doc.h +159 -0
  73. data/ext/include/hpdf_encoder.h +311 -0
  74. data/ext/include/hpdf_encrypt.h +156 -0
  75. data/ext/include/hpdf_encryptdict.h +66 -0
  76. data/ext/include/hpdf_error.h +201 -0
  77. data/ext/include/hpdf_ext_gstate.h +38 -0
  78. data/ext/include/hpdf_font.h +112 -0
  79. data/ext/include/hpdf_fontdef.h +403 -0
  80. data/ext/include/hpdf_gstate.h +80 -0
  81. data/ext/include/hpdf_image.h +72 -0
  82. data/ext/include/hpdf_info.h +48 -0
  83. data/ext/include/hpdf_list.h +85 -0
  84. data/ext/include/hpdf_mmgr.h +82 -0
  85. data/ext/include/hpdf_objects.h +587 -0
  86. data/ext/include/hpdf_outline.h +74 -0
  87. data/ext/include/hpdf_page_label.h +35 -0
  88. data/ext/include/hpdf_pages.h +128 -0
  89. data/ext/include/hpdf_streams.h +276 -0
  90. data/ext/include/hpdf_types.h +488 -0
  91. data/ext/include/hpdf_utils.h +161 -0
  92. data/tests/arc_demo.rb +82 -0
  93. data/tests/demo.rb +91 -0
  94. data/tests/encryption.rb +41 -0
  95. data/tests/ext_gstater_demo.rb +171 -0
  96. data/tests/font_demo.rb +67 -0
  97. data/tests/line_demo.rb +301 -0
  98. data/tests/slide_show_demo.rb +139 -0
  99. data/tests/test_all_examples.rb +31 -0
  100. data/tests/text_demo2.rb +189 -0
  101. metadata +147 -0
@@ -0,0 +1,74 @@
1
+ /*
2
+ * << Haru Free PDF Library 2.0.0 >> -- hpdf_page_label.c
3
+ *
4
+ * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
5
+ *
6
+ * Permission to use, copy, modify, distribute and sell this software
7
+ * and its documentation for any purpose is hereby granted without fee,
8
+ * provided that the above copyright notice appear in all copies and
9
+ * that both that copyright notice and this permission notice appear
10
+ * in supporting documentation.
11
+ * It is provided "as is" without express or implied warranty.
12
+ *
13
+ */
14
+
15
+ #include "hpdf_conf.h"
16
+ #include "hpdf_utils.h"
17
+ #include "hpdf_page_label.h"
18
+
19
+ HPDF_Dict
20
+ HPDF_PageLabel_New (HPDF_Doc pdf,
21
+ HPDF_PageNumStyle style,
22
+ HPDF_INT first_page,
23
+ const char *prefix)
24
+ {
25
+ HPDF_Dict obj = HPDF_Dict_New (pdf->mmgr);
26
+
27
+ HPDF_PTRACE ((" HPDF_PageLabel_New\n"));
28
+
29
+ if (!obj)
30
+ return NULL;
31
+
32
+ switch (style) {
33
+ case HPDF_PAGE_NUM_STYLE_DECIMAL:
34
+ if (HPDF_Dict_AddName (obj, "S", "D") != HPDF_OK)
35
+ goto Fail;
36
+ break;
37
+ case HPDF_PAGE_NUM_STYLE_UPPER_ROMAN:
38
+ if (HPDF_Dict_AddName (obj, "S", "R") != HPDF_OK)
39
+ goto Fail;
40
+ break;
41
+ case HPDF_PAGE_NUM_STYLE_LOWER_ROMAN:
42
+ if (HPDF_Dict_AddName (obj, "S", "r") != HPDF_OK)
43
+ goto Fail;
44
+ break;
45
+ case HPDF_PAGE_NUM_STYLE_UPPER_LETTERS:
46
+ if (HPDF_Dict_AddName (obj, "S", "A") != HPDF_OK)
47
+ goto Fail;
48
+ break;
49
+ case HPDF_PAGE_NUM_STYLE_LOWER_LETTERS:
50
+ if (HPDF_Dict_AddName (obj, "S", "a") != HPDF_OK)
51
+ goto Fail;
52
+ break;
53
+ default:
54
+ HPDF_SetError (&pdf->error, HPDF_PAGE_NUM_STYLE_OUT_OF_RANGE,
55
+ (HPDF_STATUS)style);
56
+ goto Fail;
57
+ }
58
+
59
+ if (prefix && prefix[0] != 0)
60
+ if (HPDF_Dict_Add (obj, "P", HPDF_String_New (pdf->mmgr, prefix,
61
+ pdf->def_encoder)) != HPDF_OK)
62
+ goto Fail;
63
+
64
+ if (first_page != 0)
65
+ if (HPDF_Dict_AddNumber (obj, "St", first_page) != HPDF_OK)
66
+ goto Fail;
67
+
68
+ return obj;
69
+
70
+ Fail:
71
+ HPDF_Dict_Free (obj);
72
+ return NULL;
73
+ }
74
+
@@ -0,0 +1,2764 @@
1
+ /*
2
+ * << Haru Free PDF Library 2.0.3 >> -- hpdf_page_operator.c
3
+ *
4
+ * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
5
+ *
6
+ * Permission to use, copy, modify, distribute and sell this software
7
+ * and its documentation for any purpose is hereby granted without fee,
8
+ * provided that the above copyright notice appear in all copies and
9
+ * that both that copyright notice and this permission notice appear
10
+ * in supporting documentation.
11
+ * It is provided "as is" without express or implied warranty.
12
+ *
13
+ * 2006.07.29 modified
14
+ */
15
+
16
+ #include "hpdf_conf.h"
17
+ #include "hpdf_utils.h"
18
+ #include "hpdf_pages.h"
19
+ #include "hpdf.h"
20
+
21
+ static const HPDF_Point INIT_POS = {0, 0};
22
+ static const HPDF_DashMode INIT_MODE = {{0, 0, 0, 0, 0, 0, 0, 0}, 0, 0};
23
+
24
+
25
+ static HPDF_STATUS
26
+ InternalWriteText (HPDF_PageAttr attr,
27
+ const char *text);
28
+
29
+
30
+ static HPDF_STATUS
31
+ InternalArc (HPDF_Page page,
32
+ HPDF_REAL x,
33
+ HPDF_REAL y,
34
+ HPDF_REAL ray,
35
+ HPDF_REAL ang1,
36
+ HPDF_REAL ang2,
37
+ HPDF_BOOL cont_flg);
38
+
39
+
40
+ static HPDF_STATUS
41
+ InternalShowTextNextLine (HPDF_Page page,
42
+ const char *text,
43
+ HPDF_UINT len);
44
+
45
+
46
+
47
+ /*--- General graphics state ---------------------------------------------*/
48
+
49
+ /* w */
50
+ HPDF_EXPORT(HPDF_STATUS)
51
+ HPDF_Page_SetLineWidth (HPDF_Page page,
52
+ HPDF_REAL line_width)
53
+ {
54
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
55
+ HPDF_GMODE_TEXT_OBJECT);
56
+ HPDF_PageAttr attr;
57
+
58
+ HPDF_PTRACE ((" HPDF_Page_SetLineWidth\n"));
59
+
60
+ if (ret != HPDF_OK)
61
+ return ret;
62
+
63
+ attr = (HPDF_PageAttr)page->attr;
64
+
65
+ if (line_width < 0)
66
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
67
+
68
+ if ((ret = HPDF_Stream_WriteReal (attr->stream,
69
+ line_width)) != HPDF_OK)
70
+ return HPDF_CheckError (page->error);
71
+
72
+ if ((ret = HPDF_Stream_WriteStr (attr->stream,
73
+ " w\012")) != HPDF_OK)
74
+ return HPDF_CheckError (page->error);
75
+
76
+ attr->gstate->line_width = line_width;
77
+
78
+ return ret;
79
+ }
80
+
81
+ /* J */
82
+ HPDF_EXPORT(HPDF_STATUS)
83
+ HPDF_Page_SetLineCap (HPDF_Page page,
84
+ HPDF_LineCap line_cap)
85
+ {
86
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
87
+ HPDF_GMODE_TEXT_OBJECT);
88
+ HPDF_PageAttr attr;
89
+
90
+ HPDF_PTRACE ((" HPDF_Page_SetLineCap\n"));
91
+
92
+ if (ret != HPDF_OK)
93
+ return ret;
94
+
95
+ if (line_cap < 0 || line_cap >= HPDF_LINECAP_EOF)
96
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE,
97
+ (HPDF_STATUS)line_cap);
98
+
99
+ attr = (HPDF_PageAttr)page->attr;
100
+
101
+ if ((ret = HPDF_Stream_WriteInt (attr->stream,
102
+ (HPDF_UINT)line_cap)) != HPDF_OK)
103
+ return ret;
104
+
105
+ if ((ret = HPDF_Stream_WriteStr (attr->stream,
106
+ " J\012")) != HPDF_OK)
107
+ return HPDF_CheckError (page->error);
108
+
109
+ attr->gstate->line_cap = line_cap;
110
+
111
+ return ret;
112
+ }
113
+
114
+ /* j */
115
+ HPDF_EXPORT(HPDF_STATUS)
116
+ HPDF_Page_SetLineJoin (HPDF_Page page,
117
+ HPDF_LineJoin line_join)
118
+ {
119
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
120
+ HPDF_GMODE_TEXT_OBJECT);
121
+ HPDF_PageAttr attr;
122
+
123
+ HPDF_PTRACE ((" HPDF_Page_SetLineJoin\n"));
124
+
125
+ if (ret != HPDF_OK)
126
+ return ret;
127
+
128
+ if (line_join < 0 || line_join >= HPDF_LINEJOIN_EOF)
129
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE,
130
+ (HPDF_STATUS)line_join);
131
+
132
+ attr = (HPDF_PageAttr)page->attr;
133
+
134
+ if ((ret = HPDF_Stream_WriteInt (attr->stream,
135
+ (HPDF_UINT)line_join)) != HPDF_OK)
136
+ return HPDF_CheckError (page->error);
137
+
138
+ if ((ret = HPDF_Stream_WriteStr (attr->stream,
139
+ " j\012")) != HPDF_OK)
140
+ return HPDF_CheckError (page->error);
141
+
142
+ attr->gstate->line_join = line_join;
143
+
144
+ return ret;
145
+ }
146
+
147
+ /* M */
148
+ HPDF_EXPORT(HPDF_STATUS)
149
+ HPDF_Page_SetMiterLimit (HPDF_Page page,
150
+ HPDF_REAL miter_limit)
151
+ {
152
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
153
+ HPDF_GMODE_TEXT_OBJECT);
154
+ HPDF_PageAttr attr;
155
+
156
+ HPDF_PTRACE ((" HPDF_Page_SetMitterLimit\n"));
157
+
158
+ if (ret != HPDF_OK)
159
+ return ret;
160
+
161
+ attr = (HPDF_PageAttr)page->attr;
162
+
163
+ if (miter_limit < 1)
164
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
165
+
166
+ if ((ret = HPDF_Stream_WriteReal (attr->stream, miter_limit)) != HPDF_OK)
167
+ return HPDF_CheckError (page->error);
168
+
169
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " M\012")) != HPDF_OK)
170
+ return HPDF_CheckError (page->error);
171
+
172
+ attr->gstate->miter_limit = miter_limit;
173
+
174
+ return ret;
175
+ }
176
+
177
+ /* d */
178
+ HPDF_EXPORT(HPDF_STATUS)
179
+ HPDF_Page_SetDash (HPDF_Page page,
180
+ const HPDF_UINT16 *dash_ptn,
181
+ HPDF_UINT num_param,
182
+ HPDF_UINT phase)
183
+ {
184
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
185
+ HPDF_GMODE_TEXT_OBJECT);
186
+ char buf[HPDF_TMP_BUF_SIZ];
187
+ char *pbuf = buf;
188
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
189
+ const HPDF_UINT16 *pdash_ptn = dash_ptn;
190
+ HPDF_PageAttr attr;
191
+ HPDF_UINT i;
192
+
193
+ HPDF_PTRACE ((" HPDF_Page_SetDash\n"));
194
+
195
+ if (ret != HPDF_OK)
196
+ return ret;
197
+
198
+ if (num_param != 1 && (num_param / 2) * 2 != num_param)
199
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_PARAM_COUNT,
200
+ num_param);
201
+
202
+ if (num_param == 0 && phase > 0)
203
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE,
204
+ phase);
205
+
206
+ if (!dash_ptn && num_param > 0)
207
+ return HPDF_RaiseError (page->error, HPDF_INVALID_PARAMETER,
208
+ phase);
209
+
210
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
211
+ *pbuf++ = '[';
212
+
213
+ for (i = 0; i < num_param; i++) {
214
+ if (*pdash_ptn == 0 || *pdash_ptn > HPDF_MAX_DASH_PATTERN)
215
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
216
+
217
+ pbuf = HPDF_IToA (pbuf, *pdash_ptn, eptr);
218
+ *pbuf++ = ' ';
219
+ pdash_ptn++;
220
+ }
221
+
222
+ *pbuf++ = ']';
223
+ *pbuf++ = ' ';
224
+
225
+ pbuf = HPDF_IToA (pbuf, phase, eptr);
226
+ HPDF_StrCpy (pbuf, " d\012", eptr);
227
+
228
+ attr = (HPDF_PageAttr)page->attr;
229
+
230
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
231
+ return HPDF_CheckError (page->error);
232
+
233
+ attr->gstate->dash_mode = INIT_MODE;
234
+ attr->gstate->dash_mode.num_ptn = num_param;
235
+ attr->gstate->dash_mode.phase = phase;
236
+
237
+ pdash_ptn = dash_ptn;
238
+ for (i = 0; i < num_param; i++) {
239
+ attr->gstate->dash_mode.ptn[i] = *pdash_ptn;
240
+ pdash_ptn++;
241
+ }
242
+
243
+ return ret;
244
+ }
245
+
246
+
247
+ /* ri --not implemented yet */
248
+
249
+ /* i */
250
+ HPDF_EXPORT(HPDF_STATUS)
251
+ HPDF_Page_SetFlat (HPDF_Page page,
252
+ HPDF_REAL flatness)
253
+ {
254
+ HPDF_PageAttr attr;
255
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
256
+ HPDF_GMODE_TEXT_OBJECT);
257
+
258
+ HPDF_PTRACE ((" HPDF_Page_SetFlat\n"));
259
+
260
+ if (ret != HPDF_OK)
261
+ return ret;
262
+
263
+ attr = (HPDF_PageAttr)page->attr;
264
+
265
+ if (flatness > 100 || flatness < 0)
266
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
267
+
268
+ if ((ret = HPDF_Stream_WriteReal (attr->stream,
269
+ flatness)) != HPDF_OK)
270
+ return HPDF_CheckError (page->error);
271
+
272
+ if ((ret = HPDF_Stream_WriteStr (attr->stream,
273
+ " i\012")) != HPDF_OK)
274
+ return HPDF_CheckError (page->error);
275
+
276
+ attr->gstate->flatness = flatness;
277
+
278
+ return ret;
279
+ }
280
+
281
+ /* gs */
282
+ HPDF_EXPORT(HPDF_STATUS)
283
+ HPDF_Page_SetExtGState (HPDF_Page page,
284
+ HPDF_ExtGState ext_gstate)
285
+ {
286
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION);
287
+ HPDF_PageAttr attr;
288
+ const char *local_name;
289
+
290
+ HPDF_PTRACE ((" HPDF_Page_SetExtGState\n"));
291
+
292
+ if (ret != HPDF_OK)
293
+ return ret;
294
+
295
+ if (!HPDF_ExtGState_Validate (ext_gstate))
296
+ return HPDF_RaiseError (page->error, HPDF_INVALID_OBJECT, 0);
297
+
298
+ if (page->mmgr != ext_gstate->mmgr)
299
+ return HPDF_RaiseError (page->error, HPDF_INVALID_EXT_GSTATE, 0);
300
+
301
+ attr = (HPDF_PageAttr)page->attr;
302
+ local_name = HPDF_Page_GetExtGStateName (page, ext_gstate);
303
+
304
+ if (!local_name)
305
+ return HPDF_CheckError (page->error);
306
+
307
+ if ((ret = HPDF_Stream_WriteEscapeName (attr->stream, local_name)) !=
308
+ HPDF_OK)
309
+ return HPDF_CheckError (page->error);
310
+
311
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " gs\012")) != HPDF_OK)
312
+ return HPDF_CheckError (page->error);
313
+
314
+ /* change objct class to read only. */
315
+ ext_gstate->header.obj_class = (HPDF_OSUBCLASS_EXT_GSTATE_R | HPDF_OCLASS_DICT);
316
+
317
+ return ret;
318
+ }
319
+
320
+
321
+ /*--- Special graphic state operator --------------------------------------*/
322
+
323
+ /* q */
324
+ HPDF_EXPORT(HPDF_STATUS)
325
+ HPDF_Page_GSave (HPDF_Page page)
326
+ {
327
+ HPDF_GState new_gstate;
328
+ HPDF_PageAttr attr;
329
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION);
330
+
331
+ HPDF_PTRACE ((" HPDF_Page_GSave\n"));
332
+
333
+ if (ret != HPDF_OK)
334
+ return ret;
335
+
336
+ attr = (HPDF_PageAttr)page->attr;
337
+
338
+ new_gstate = HPDF_GState_New (page->mmgr, attr->gstate);
339
+ if (!new_gstate)
340
+ return HPDF_CheckError (page->error);
341
+
342
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "q\012")) != HPDF_OK)
343
+ return HPDF_CheckError (page->error);
344
+
345
+ attr->gstate = new_gstate;
346
+
347
+ return ret;
348
+ }
349
+
350
+ /* Q */
351
+ HPDF_EXPORT(HPDF_STATUS)
352
+ HPDF_Page_GRestore (HPDF_Page page)
353
+ {
354
+ HPDF_GState new_gstate;
355
+ HPDF_PageAttr attr;
356
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION);
357
+
358
+ HPDF_PTRACE ((" HPDF_Page_GRestore\n"));
359
+
360
+ if (ret != HPDF_OK)
361
+ return ret;
362
+
363
+ attr = (HPDF_PageAttr)page->attr;
364
+
365
+ if (!attr->gstate->prev)
366
+ return HPDF_RaiseError (page->error, HPDF_PAGE_CANNOT_RESTORE_GSTATE,
367
+ 0);
368
+
369
+ new_gstate = HPDF_GState_Free (page->mmgr, attr->gstate);
370
+
371
+ attr->gstate = new_gstate;
372
+
373
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "Q\012")) != HPDF_OK)
374
+ return HPDF_CheckError (page->error);
375
+
376
+ return ret;
377
+ }
378
+
379
+ /* cm */
380
+ HPDF_EXPORT(HPDF_STATUS)
381
+ HPDF_Page_Concat (HPDF_Page page,
382
+ HPDF_REAL a,
383
+ HPDF_REAL b,
384
+ HPDF_REAL c,
385
+ HPDF_REAL d,
386
+ HPDF_REAL x,
387
+ HPDF_REAL y)
388
+ {
389
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION);
390
+ char buf[HPDF_TMP_BUF_SIZ];
391
+ char *pbuf = buf;
392
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
393
+ HPDF_PageAttr attr;
394
+ HPDF_TransMatrix tm;
395
+
396
+ HPDF_PTRACE ((" HPDF_Page_Concat\n"));
397
+
398
+ if (ret != HPDF_OK)
399
+ return ret;
400
+
401
+ attr = (HPDF_PageAttr)page->attr;
402
+
403
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
404
+
405
+ pbuf = HPDF_FToA (pbuf, a, eptr);
406
+ *pbuf++ = ' ';
407
+ pbuf = HPDF_FToA (pbuf, b, eptr);
408
+ *pbuf++ = ' ';
409
+ pbuf = HPDF_FToA (pbuf, c, eptr);
410
+ *pbuf++ = ' ';
411
+ pbuf = HPDF_FToA (pbuf, d, eptr);
412
+ *pbuf++ = ' ';
413
+ pbuf = HPDF_FToA (pbuf, x, eptr);
414
+ *pbuf++ = ' ';
415
+ pbuf = HPDF_FToA (pbuf, y, eptr);
416
+ HPDF_StrCpy (pbuf, " cm\012", eptr);
417
+
418
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
419
+ return HPDF_CheckError (page->error);
420
+
421
+ tm = attr->gstate->trans_matrix;
422
+
423
+ attr->gstate->trans_matrix.a = tm.a * a + tm.b * c;
424
+ attr->gstate->trans_matrix.b = tm.a * b + tm.b * d;
425
+ attr->gstate->trans_matrix.c = tm.c * a + tm.d * c;
426
+ attr->gstate->trans_matrix.d = tm.c * b + tm.d * d;
427
+ attr->gstate->trans_matrix.x = tm.x + x * tm.a + y * tm.c;
428
+ attr->gstate->trans_matrix.y = tm.y + x * tm.b + y * tm.d;
429
+
430
+ return ret;
431
+ }
432
+
433
+ /*--- Path construction operator ------------------------------------------*/
434
+
435
+ /* m */
436
+ HPDF_EXPORT(HPDF_STATUS)
437
+ HPDF_Page_MoveTo (HPDF_Page page,
438
+ HPDF_REAL x,
439
+ HPDF_REAL y)
440
+ {
441
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
442
+ HPDF_GMODE_PATH_OBJECT);
443
+ char buf[HPDF_TMP_BUF_SIZ];
444
+ char *pbuf = buf;
445
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
446
+ HPDF_PageAttr attr;
447
+
448
+ HPDF_PTRACE ((" HPDF_Page_MoveTo\n"));
449
+
450
+ if (ret != HPDF_OK)
451
+ return ret;
452
+
453
+ attr = (HPDF_PageAttr)page->attr;
454
+
455
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
456
+
457
+ pbuf = HPDF_FToA (pbuf, x, eptr);
458
+ *pbuf++ = ' ';
459
+ pbuf = HPDF_FToA (pbuf, y, eptr);
460
+ HPDF_StrCpy (pbuf, " m\012", eptr);
461
+
462
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
463
+ return HPDF_CheckError (page->error);
464
+
465
+ attr->cur_pos.x = x;
466
+ attr->cur_pos.y = y;
467
+ attr->str_pos = attr->cur_pos;
468
+ attr->gmode = HPDF_GMODE_PATH_OBJECT;
469
+
470
+ return ret;
471
+ }
472
+
473
+ /* l */
474
+ HPDF_EXPORT(HPDF_STATUS)
475
+ HPDF_Page_LineTo (HPDF_Page page,
476
+ HPDF_REAL x,
477
+ HPDF_REAL y)
478
+ {
479
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT);
480
+ char buf[HPDF_TMP_BUF_SIZ];
481
+ char *pbuf = buf;
482
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
483
+ HPDF_PageAttr attr;
484
+
485
+ HPDF_PTRACE ((" HPDF_Page_LineTo\n"));
486
+
487
+ if (ret != HPDF_OK)
488
+ return ret;
489
+
490
+ attr = (HPDF_PageAttr)page->attr;
491
+
492
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
493
+
494
+ pbuf = HPDF_FToA (pbuf, x, eptr);
495
+ *pbuf++ = ' ';
496
+ pbuf = HPDF_FToA (pbuf, y, eptr);
497
+ HPDF_StrCpy (pbuf, " l\012", eptr);
498
+
499
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
500
+ return HPDF_CheckError (page->error);
501
+
502
+ attr->cur_pos.x = x;
503
+ attr->cur_pos.y = y;
504
+
505
+ return ret;
506
+ }
507
+
508
+ /* c */
509
+ HPDF_EXPORT(HPDF_STATUS)
510
+ HPDF_Page_CurveTo (HPDF_Page page,
511
+ HPDF_REAL x1,
512
+ HPDF_REAL y1,
513
+ HPDF_REAL x2,
514
+ HPDF_REAL y2,
515
+ HPDF_REAL x3,
516
+ HPDF_REAL y3)
517
+ {
518
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT);
519
+ char buf[HPDF_TMP_BUF_SIZ];
520
+ char *pbuf = buf;
521
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
522
+ HPDF_PageAttr attr;
523
+
524
+ HPDF_PTRACE ((" HPDF_Page_CurveTo\n"));
525
+
526
+ if (ret != HPDF_OK)
527
+ return ret;
528
+
529
+ attr = (HPDF_PageAttr)page->attr;
530
+
531
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
532
+
533
+ pbuf = HPDF_FToA (pbuf, x1, eptr);
534
+ *pbuf++ = ' ';
535
+ pbuf = HPDF_FToA (pbuf, y1, eptr);
536
+ *pbuf++ = ' ';
537
+ pbuf = HPDF_FToA (pbuf, x2, eptr);
538
+ *pbuf++ = ' ';
539
+ pbuf = HPDF_FToA (pbuf, y2, eptr);
540
+ *pbuf++ = ' ';
541
+ pbuf = HPDF_FToA (pbuf, x3, eptr);
542
+ *pbuf++ = ' ';
543
+ pbuf = HPDF_FToA (pbuf, y3, eptr);
544
+ HPDF_StrCpy (pbuf, " c\012", eptr);
545
+
546
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
547
+ return HPDF_CheckError (page->error);
548
+
549
+ attr->cur_pos.x = x3;
550
+ attr->cur_pos.y = y3;
551
+
552
+ return ret;
553
+ }
554
+
555
+ /* v */
556
+ HPDF_EXPORT(HPDF_STATUS)
557
+ HPDF_Page_CurveTo2 (HPDF_Page page,
558
+ HPDF_REAL x2,
559
+ HPDF_REAL y2,
560
+ HPDF_REAL x3,
561
+ HPDF_REAL y3)
562
+ {
563
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT);
564
+ char buf[HPDF_TMP_BUF_SIZ];
565
+ char *pbuf = buf;
566
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
567
+ HPDF_PageAttr attr;
568
+
569
+ HPDF_PTRACE ((" HPDF_Page_CurveTo2\n"));
570
+
571
+ if (ret != HPDF_OK)
572
+ return ret;
573
+
574
+ attr = (HPDF_PageAttr)page->attr;
575
+
576
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
577
+
578
+ pbuf = HPDF_FToA (pbuf, x2, eptr);
579
+ *pbuf++ = ' ';
580
+ pbuf = HPDF_FToA (pbuf, y2, eptr);
581
+ *pbuf++ = ' ';
582
+ pbuf = HPDF_FToA (pbuf, x3, eptr);
583
+ *pbuf++ = ' ';
584
+ pbuf = HPDF_FToA (pbuf, y3, eptr);
585
+ HPDF_StrCpy (pbuf, " v\012", eptr);
586
+
587
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
588
+ return HPDF_CheckError (page->error);
589
+
590
+ attr->cur_pos.x = x3;
591
+ attr->cur_pos.y = y3;
592
+
593
+ return ret;
594
+ }
595
+
596
+ /* y */
597
+ HPDF_EXPORT(HPDF_STATUS)
598
+ HPDF_Page_CurveTo3 (HPDF_Page page,
599
+ HPDF_REAL x1,
600
+ HPDF_REAL y1,
601
+ HPDF_REAL x3,
602
+ HPDF_REAL y3)
603
+ {
604
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT);
605
+ char buf[HPDF_TMP_BUF_SIZ];
606
+ char *pbuf = buf;
607
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
608
+ HPDF_PageAttr attr;
609
+
610
+ HPDF_PTRACE ((" HPDF_Page_CurveTo3\n"));
611
+
612
+ if (ret != HPDF_OK)
613
+ return ret;
614
+
615
+ attr = (HPDF_PageAttr)page->attr;
616
+
617
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
618
+
619
+ pbuf = HPDF_FToA (pbuf, x1, eptr);
620
+ *pbuf++ = ' ';
621
+ pbuf = HPDF_FToA (pbuf, y1, eptr);
622
+ *pbuf++ = ' ';
623
+ pbuf = HPDF_FToA (pbuf, x3, eptr);
624
+ *pbuf++ = ' ';
625
+ pbuf = HPDF_FToA (pbuf, y3, eptr);
626
+ HPDF_StrCpy (pbuf, " y\012", eptr);
627
+
628
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
629
+ return HPDF_CheckError (page->error);
630
+
631
+ attr->cur_pos.x = x3;
632
+ attr->cur_pos.y = y3;
633
+
634
+ return ret;
635
+ }
636
+
637
+ /* h */
638
+ HPDF_EXPORT(HPDF_STATUS)
639
+ HPDF_Page_ClosePath (HPDF_Page page)
640
+ {
641
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT);
642
+ HPDF_PageAttr attr;
643
+
644
+ HPDF_PTRACE ((" HPDF_Page_ClosePath\n"));
645
+
646
+ if (ret != HPDF_OK)
647
+ return ret;
648
+
649
+ attr = (HPDF_PageAttr)page->attr;
650
+
651
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "h\012")) != HPDF_OK)
652
+ return HPDF_CheckError (page->error);
653
+
654
+ attr->cur_pos = attr->str_pos;
655
+
656
+ return ret;
657
+ }
658
+
659
+ /* re */
660
+ HPDF_EXPORT(HPDF_STATUS)
661
+ HPDF_Page_Rectangle (HPDF_Page page,
662
+ HPDF_REAL x,
663
+ HPDF_REAL y,
664
+ HPDF_REAL width,
665
+ HPDF_REAL height)
666
+ {
667
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
668
+ HPDF_GMODE_PATH_OBJECT);
669
+ char buf[HPDF_TMP_BUF_SIZ];
670
+ char *pbuf = buf;
671
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
672
+ HPDF_PageAttr attr;
673
+
674
+ HPDF_PTRACE ((" HPDF_Page_Rectangle\n"));
675
+
676
+ if (ret != HPDF_OK)
677
+ return ret;
678
+
679
+ attr = (HPDF_PageAttr)page->attr;
680
+
681
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
682
+
683
+ pbuf = HPDF_FToA (pbuf, x, eptr);
684
+ *pbuf++ = ' ';
685
+ pbuf = HPDF_FToA (pbuf, y, eptr);
686
+ *pbuf++ = ' ';
687
+ pbuf = HPDF_FToA (pbuf, width, eptr);
688
+ *pbuf++ = ' ';
689
+ pbuf = HPDF_FToA (pbuf, height, eptr);
690
+ HPDF_StrCpy (pbuf, " re\012", eptr);
691
+
692
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
693
+ return HPDF_CheckError (page->error);
694
+
695
+ attr->cur_pos.x = x;
696
+ attr->cur_pos.y = y;
697
+ attr->str_pos = attr->cur_pos;
698
+ attr->gmode = HPDF_GMODE_PATH_OBJECT;
699
+
700
+ return ret;
701
+ }
702
+
703
+
704
+ /*--- Path painting operator ---------------------------------------------*/
705
+
706
+ /* S */
707
+ HPDF_EXPORT(HPDF_STATUS)
708
+ HPDF_Page_Stroke (HPDF_Page page)
709
+ {
710
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT |
711
+ HPDF_GMODE_CLIPPING_PATH);
712
+ HPDF_PageAttr attr;
713
+
714
+ HPDF_PTRACE ((" HPDF_Page_Stroke\n"));
715
+
716
+ if (ret != HPDF_OK)
717
+ return ret;
718
+
719
+ attr = (HPDF_PageAttr)page->attr;
720
+
721
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "S\012")) != HPDF_OK)
722
+ return HPDF_CheckError (page->error);
723
+
724
+ attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION;
725
+ attr->cur_pos = INIT_POS;
726
+
727
+ return ret;
728
+ }
729
+
730
+ /* s */
731
+ HPDF_EXPORT(HPDF_STATUS)
732
+ HPDF_Page_ClosePathStroke (HPDF_Page page)
733
+ {
734
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT |
735
+ HPDF_GMODE_CLIPPING_PATH);
736
+ HPDF_PageAttr attr;
737
+
738
+ HPDF_PTRACE ((" HPDF_Page_ClosePathStroke\n"));
739
+
740
+ if (ret != HPDF_OK)
741
+ return ret;
742
+
743
+ attr = (HPDF_PageAttr)page->attr;
744
+
745
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "s\012")) != HPDF_OK)
746
+ return HPDF_CheckError (page->error);
747
+
748
+ attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION;
749
+ attr->cur_pos = INIT_POS;
750
+
751
+ return ret;
752
+ }
753
+
754
+ /* f */
755
+ HPDF_EXPORT(HPDF_STATUS)
756
+ HPDF_Page_Fill (HPDF_Page page)
757
+ {
758
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT |
759
+ HPDF_GMODE_CLIPPING_PATH);
760
+ HPDF_PageAttr attr;
761
+
762
+ HPDF_PTRACE ((" HPDF_Page_Fill\n"));
763
+
764
+ if (ret != HPDF_OK)
765
+ return ret;
766
+
767
+ attr = (HPDF_PageAttr)page->attr;
768
+
769
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "f\012")) != HPDF_OK)
770
+ return HPDF_CheckError (page->error);
771
+
772
+ attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION;
773
+ attr->cur_pos = INIT_POS;
774
+
775
+ return ret;
776
+ }
777
+
778
+ /* f* */
779
+ HPDF_EXPORT(HPDF_STATUS)
780
+ HPDF_Page_Eofill (HPDF_Page page)
781
+ {
782
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT |
783
+ HPDF_GMODE_CLIPPING_PATH);
784
+ HPDF_PageAttr attr;
785
+
786
+ HPDF_PTRACE ((" HPDF_Page_Eofill\n"));
787
+
788
+ if (ret != HPDF_OK)
789
+ return ret;
790
+
791
+ attr = (HPDF_PageAttr)page->attr;
792
+
793
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "f*\012")) != HPDF_OK)
794
+ return HPDF_CheckError (page->error);
795
+
796
+ attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION;
797
+ attr->cur_pos = INIT_POS;
798
+
799
+ return ret;
800
+ }
801
+
802
+ /* B */
803
+ HPDF_EXPORT(HPDF_STATUS)
804
+ HPDF_Page_FillStroke (HPDF_Page page)
805
+ {
806
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT |
807
+ HPDF_GMODE_CLIPPING_PATH);
808
+ HPDF_PageAttr attr;
809
+
810
+ HPDF_PTRACE ((" HPDF_Page_FillStroke\n"));
811
+
812
+ if (ret != HPDF_OK)
813
+ return ret;
814
+
815
+ attr = (HPDF_PageAttr)page->attr;
816
+
817
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "B\012")) != HPDF_OK)
818
+ return HPDF_CheckError (page->error);
819
+
820
+ attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION;
821
+ attr->cur_pos = INIT_POS;
822
+
823
+ return ret;
824
+ }
825
+
826
+ /* B* */
827
+ HPDF_EXPORT(HPDF_STATUS)
828
+ HPDF_Page_EofillStroke (HPDF_Page page)
829
+ {
830
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT |
831
+ HPDF_GMODE_CLIPPING_PATH);
832
+ HPDF_PageAttr attr;
833
+
834
+ HPDF_PTRACE ((" HPDF_Page_EofillStroke\n"));
835
+
836
+ if (ret != HPDF_OK)
837
+ return ret;
838
+
839
+ attr = (HPDF_PageAttr)page->attr;
840
+
841
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "B*\012")) != HPDF_OK)
842
+ return HPDF_CheckError (page->error);
843
+
844
+ attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION;
845
+
846
+ return ret;
847
+ }
848
+
849
+ /* b */
850
+ HPDF_EXPORT(HPDF_STATUS)
851
+ HPDF_Page_ClosePathFillStroke (HPDF_Page page)
852
+ {
853
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT |
854
+ HPDF_GMODE_CLIPPING_PATH);
855
+ HPDF_PageAttr attr;
856
+
857
+ HPDF_PTRACE ((" HPDF_Page_ClosePathFillStroke\n"));
858
+
859
+ if (ret != HPDF_OK)
860
+ return ret;
861
+
862
+ attr = (HPDF_PageAttr)page->attr;
863
+
864
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "b\012")) != HPDF_OK)
865
+ return HPDF_CheckError (page->error);
866
+
867
+ attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION;
868
+ attr->cur_pos = INIT_POS;
869
+
870
+ return ret;
871
+ }
872
+
873
+ /* b* */
874
+ HPDF_EXPORT(HPDF_STATUS)
875
+ HPDF_Page_ClosePathEofillStroke (HPDF_Page page)
876
+ {
877
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT |
878
+ HPDF_GMODE_CLIPPING_PATH);
879
+ HPDF_PageAttr attr;
880
+
881
+ HPDF_PTRACE ((" HPDF_Page_ClosePathEofillStroke\n"));
882
+
883
+ if (ret != HPDF_OK)
884
+ return ret;
885
+
886
+ attr = (HPDF_PageAttr)page->attr;
887
+
888
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "b*\012")) != HPDF_OK)
889
+ return HPDF_CheckError (page->error);
890
+
891
+ attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION;
892
+ attr->cur_pos = INIT_POS;
893
+
894
+ return ret;
895
+ }
896
+
897
+ /* n */
898
+ HPDF_EXPORT(HPDF_STATUS)
899
+ HPDF_Page_EndPath (HPDF_Page page)
900
+ {
901
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT |
902
+ HPDF_GMODE_CLIPPING_PATH);
903
+ HPDF_PageAttr attr;
904
+
905
+ HPDF_PTRACE ((" HPDF_PageEndPath\n"));
906
+
907
+ if (ret != HPDF_OK)
908
+ return ret;
909
+
910
+ attr = (HPDF_PageAttr)page->attr;
911
+
912
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "n\012")) != HPDF_OK)
913
+ return HPDF_CheckError (page->error);
914
+
915
+ attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION;
916
+ attr->cur_pos = INIT_POS;
917
+
918
+ return ret;
919
+ }
920
+
921
+
922
+ /*--- Clipping paths operator --------------------------------------------*/
923
+
924
+ /* W */
925
+ HPDF_EXPORT(HPDF_STATUS)
926
+ HPDF_Page_Clip (HPDF_Page page)
927
+ {
928
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT);
929
+ HPDF_PageAttr attr;
930
+
931
+ HPDF_PTRACE ((" HPDF_Page_Clip\n"));
932
+
933
+ if (ret != HPDF_OK)
934
+ return ret;
935
+
936
+ attr = (HPDF_PageAttr)page->attr;
937
+
938
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "W\012")) != HPDF_OK)
939
+ return HPDF_CheckError (page->error);
940
+
941
+ attr->gmode = HPDF_GMODE_CLIPPING_PATH;
942
+
943
+ return ret;
944
+ }
945
+
946
+ /* W* */
947
+ HPDF_EXPORT(HPDF_STATUS)
948
+ HPDF_Page_Eoclip (HPDF_Page page)
949
+ {
950
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PATH_OBJECT);
951
+ HPDF_PageAttr attr;
952
+
953
+ HPDF_PTRACE ((" HPDF_Page_Eoclip\n"));
954
+
955
+ if (ret != HPDF_OK)
956
+ return ret;
957
+
958
+ attr = (HPDF_PageAttr)page->attr;
959
+
960
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "W*\012")) != HPDF_OK)
961
+ return HPDF_CheckError (page->error);
962
+
963
+ attr->gmode = HPDF_GMODE_CLIPPING_PATH;
964
+
965
+ return ret;
966
+ }
967
+
968
+
969
+ /*--- Text object operator -----------------------------------------------*/
970
+
971
+ /* BT */
972
+ HPDF_EXPORT(HPDF_STATUS)
973
+ HPDF_Page_BeginText (HPDF_Page page)
974
+ {
975
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION);
976
+ HPDF_PageAttr attr;
977
+ const HPDF_TransMatrix INIT_MATRIX = {1, 0, 0, 1, 0, 0};
978
+
979
+ HPDF_PTRACE ((" HPDF_Page_BeginText\n"));
980
+
981
+ if (ret != HPDF_OK)
982
+ return ret;
983
+
984
+ attr = (HPDF_PageAttr)page->attr;
985
+
986
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "BT\012")) != HPDF_OK)
987
+ return HPDF_CheckError (page->error);
988
+
989
+ attr->gmode = HPDF_GMODE_TEXT_OBJECT;
990
+ attr->text_pos = INIT_POS;
991
+ attr->text_matrix = INIT_MATRIX;
992
+
993
+ return ret;
994
+ }
995
+
996
+ /* ET */
997
+ HPDF_EXPORT(HPDF_STATUS)
998
+ HPDF_Page_EndText (HPDF_Page page)
999
+ {
1000
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT);
1001
+ HPDF_PageAttr attr;
1002
+
1003
+ HPDF_PTRACE ((" HPDF_Page_EndText\n"));
1004
+
1005
+ if (ret != HPDF_OK)
1006
+ return ret;
1007
+
1008
+ attr = (HPDF_PageAttr)page->attr;
1009
+
1010
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "ET\012")) != HPDF_OK)
1011
+ return HPDF_CheckError (page->error);
1012
+
1013
+ attr->text_pos = INIT_POS;
1014
+ attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION;
1015
+
1016
+ return ret;
1017
+ }
1018
+
1019
+ /*--- Text state ---------------------------------------------------------*/
1020
+
1021
+ /* Tc */
1022
+ HPDF_EXPORT(HPDF_STATUS)
1023
+ HPDF_Page_SetCharSpace (HPDF_Page page,
1024
+ HPDF_REAL value)
1025
+ {
1026
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
1027
+ HPDF_GMODE_TEXT_OBJECT);
1028
+ HPDF_PageAttr attr;
1029
+
1030
+ HPDF_PTRACE ((" HPDF_Page_SetCharSpace\n"));
1031
+
1032
+ if (ret != HPDF_OK)
1033
+ return ret;
1034
+
1035
+ attr = (HPDF_PageAttr)page->attr;
1036
+
1037
+ if (value < HPDF_MIN_CHARSPACE || value > HPDF_MAX_CHARSPACE)
1038
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
1039
+
1040
+ if ((ret = HPDF_Stream_WriteReal (attr->stream, value)) != HPDF_OK)
1041
+ return HPDF_CheckError (page->error);
1042
+
1043
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " Tc\012")) != HPDF_OK)
1044
+ return HPDF_CheckError (page->error);
1045
+
1046
+ attr->gstate->char_space = value;
1047
+
1048
+ return ret;
1049
+ }
1050
+
1051
+ /* Tw */
1052
+ HPDF_EXPORT(HPDF_STATUS)
1053
+ HPDF_Page_SetWordSpace (HPDF_Page page,
1054
+ HPDF_REAL value)
1055
+ {
1056
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
1057
+ HPDF_GMODE_TEXT_OBJECT);
1058
+ HPDF_PageAttr attr;
1059
+
1060
+ HPDF_PTRACE ((" HPDF_Page_SetWordSpace\n"));
1061
+
1062
+ if (ret != HPDF_OK)
1063
+ return ret;
1064
+
1065
+ attr = (HPDF_PageAttr)page->attr;
1066
+
1067
+ if (value < HPDF_MIN_WORDSPACE || value > HPDF_MAX_WORDSPACE)
1068
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
1069
+
1070
+ if ((ret = HPDF_Stream_WriteReal (attr->stream, value)) != HPDF_OK)
1071
+ return HPDF_CheckError (page->error);
1072
+
1073
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " Tw\012")) != HPDF_OK)
1074
+ return HPDF_CheckError (page->error);
1075
+
1076
+ attr->gstate->word_space = value;
1077
+
1078
+ return ret;
1079
+ }
1080
+
1081
+ /* Tz */
1082
+ HPDF_EXPORT(HPDF_STATUS)
1083
+ HPDF_Page_SetHorizontalScalling (HPDF_Page page,
1084
+ HPDF_REAL value)
1085
+ {
1086
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
1087
+ HPDF_GMODE_TEXT_OBJECT);
1088
+ HPDF_PageAttr attr;
1089
+
1090
+ HPDF_PTRACE ((" HPDF_Page_SetHorizontalScalling\n"));
1091
+
1092
+ if (ret != HPDF_OK)
1093
+ return ret;
1094
+
1095
+ attr = (HPDF_PageAttr)page->attr;
1096
+
1097
+ if (value < HPDF_MIN_HORIZONTALSCALING ||
1098
+ value > HPDF_MAX_HORIZONTALSCALING)
1099
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
1100
+
1101
+ if ((ret = HPDF_Stream_WriteReal (attr->stream, value)) != HPDF_OK)
1102
+ return HPDF_CheckError (page->error);
1103
+
1104
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " Tz\012")) != HPDF_OK)
1105
+ return HPDF_CheckError (page->error);
1106
+
1107
+ attr->gstate->h_scalling = value;
1108
+
1109
+ return ret;
1110
+ }
1111
+
1112
+ /* TL */
1113
+ HPDF_EXPORT(HPDF_STATUS)
1114
+ HPDF_Page_SetTextLeading (HPDF_Page page,
1115
+ HPDF_REAL value)
1116
+ {
1117
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
1118
+ HPDF_GMODE_TEXT_OBJECT);
1119
+ HPDF_PageAttr attr;
1120
+
1121
+ HPDF_PTRACE ((" HPDF_Page_SetTextLeading\n"));
1122
+
1123
+ if (ret != HPDF_OK)
1124
+ return ret;
1125
+
1126
+ attr = (HPDF_PageAttr)page->attr;
1127
+
1128
+ if ((ret = HPDF_Stream_WriteReal (attr->stream, value)) != HPDF_OK)
1129
+ return HPDF_CheckError (page->error);
1130
+
1131
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " TL\012")) != HPDF_OK)
1132
+ return HPDF_CheckError (page->error);
1133
+
1134
+ attr->gstate->text_leading = value;
1135
+
1136
+ return ret;
1137
+ }
1138
+
1139
+ /* Tf */
1140
+
1141
+ HPDF_EXPORT(HPDF_STATUS)
1142
+ HPDF_Page_SetFontAndSize (HPDF_Page page,
1143
+ HPDF_Font font,
1144
+ HPDF_REAL size)
1145
+ {
1146
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
1147
+ HPDF_GMODE_TEXT_OBJECT);
1148
+ char buf[HPDF_TMP_BUF_SIZ];
1149
+ char *pbuf = buf;
1150
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
1151
+ const char *local_name;
1152
+ HPDF_PageAttr attr;
1153
+
1154
+ HPDF_PTRACE ((" HPDF_Page_SetFontAndSize\n"));
1155
+
1156
+ if (ret != HPDF_OK)
1157
+ return ret;
1158
+
1159
+ if (!HPDF_Font_Validate (font))
1160
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_FONT, 0);
1161
+
1162
+ if (size <= 0 || size > HPDF_MAX_FONTSIZE)
1163
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_FONT_SIZE, 0);
1164
+
1165
+ if (page->mmgr != font->mmgr)
1166
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_FONT, 0);
1167
+
1168
+ attr = (HPDF_PageAttr)page->attr;
1169
+ local_name = HPDF_Page_GetLocalFontName (page, font);
1170
+
1171
+ if (!local_name)
1172
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_FONT, 0);
1173
+
1174
+ if ((ret = HPDF_Stream_WriteEscapeName (attr->stream, local_name)) !=
1175
+ HPDF_OK)
1176
+ return HPDF_CheckError (page->error);
1177
+
1178
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
1179
+ *pbuf++ = ' ';
1180
+ pbuf = HPDF_FToA (pbuf, size, eptr);
1181
+ HPDF_StrCpy (pbuf, " Tf\012", eptr);
1182
+
1183
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
1184
+ return HPDF_CheckError (page->error);
1185
+
1186
+ attr->gstate->font = font;
1187
+ attr->gstate->font_size = size;
1188
+ attr->gstate->writing_mode = ((HPDF_FontAttr)font->attr)->writing_mode;
1189
+
1190
+ return ret;
1191
+ }
1192
+
1193
+ /* Tr */
1194
+ HPDF_EXPORT(HPDF_STATUS)
1195
+ HPDF_Page_SetTextRenderingMode (HPDF_Page page,
1196
+ HPDF_TextRenderingMode mode)
1197
+ {
1198
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
1199
+ HPDF_GMODE_TEXT_OBJECT);
1200
+ HPDF_PageAttr attr;
1201
+
1202
+ HPDF_PTRACE ((" HPDF_Page_SetTextRenderingMode\n"));
1203
+
1204
+ if (ret != HPDF_OK)
1205
+ return ret;
1206
+
1207
+ if (mode < 0 || mode >= HPDF_RENDERING_MODE_EOF)
1208
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE,
1209
+ (HPDF_STATUS)mode);
1210
+
1211
+ attr = (HPDF_PageAttr)page->attr;
1212
+
1213
+ if ((ret = HPDF_Stream_WriteInt (attr->stream, (HPDF_INT)mode)) != HPDF_OK)
1214
+ return HPDF_CheckError (page->error);
1215
+
1216
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " Tr\012")) != HPDF_OK)
1217
+ return HPDF_CheckError (page->error);
1218
+
1219
+ attr->gstate->rendering_mode = mode;
1220
+
1221
+ return ret;
1222
+ }
1223
+
1224
+ /* Ts */
1225
+ HPDF_EXPORT(HPDF_STATUS)
1226
+ HPDF_Page_SetTextRaise (HPDF_Page page,
1227
+ HPDF_REAL value)
1228
+ {
1229
+ return HPDF_Page_SetTextRise (page, value);
1230
+ }
1231
+
1232
+
1233
+ HPDF_EXPORT(HPDF_STATUS)
1234
+ HPDF_Page_SetTextRise (HPDF_Page page,
1235
+ HPDF_REAL value)
1236
+ {
1237
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
1238
+ HPDF_GMODE_TEXT_OBJECT);
1239
+ HPDF_PageAttr attr;
1240
+
1241
+ HPDF_PTRACE ((" HPDF_Page_SetTextRaise\n"));
1242
+
1243
+ if (ret != HPDF_OK)
1244
+ return ret;
1245
+
1246
+ attr = (HPDF_PageAttr)page->attr;
1247
+
1248
+ if ((ret = HPDF_Stream_WriteReal (attr->stream, value)) != HPDF_OK)
1249
+ return HPDF_CheckError (page->error);
1250
+
1251
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " Ts\012")) != HPDF_OK)
1252
+ return HPDF_CheckError (page->error);
1253
+
1254
+ attr->gstate->text_rise = value;
1255
+
1256
+ return ret;
1257
+ }
1258
+
1259
+ /*--- Text positioning ---------------------------------------------------*/
1260
+
1261
+ /* Td */
1262
+
1263
+ HPDF_EXPORT(HPDF_STATUS)
1264
+ HPDF_Page_MoveTextPos (HPDF_Page page,
1265
+ HPDF_REAL x,
1266
+ HPDF_REAL y)
1267
+ {
1268
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT);
1269
+ char buf[HPDF_TMP_BUF_SIZ];
1270
+ char *pbuf = buf;
1271
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
1272
+ HPDF_PageAttr attr;
1273
+
1274
+ HPDF_PTRACE ((" HPDF_Page_MoveTextPos\n"));
1275
+
1276
+ if (ret != HPDF_OK)
1277
+ return ret;
1278
+
1279
+ attr = (HPDF_PageAttr)page->attr;
1280
+
1281
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
1282
+
1283
+ pbuf = HPDF_FToA (pbuf, x, eptr);
1284
+ *pbuf++ = ' ';
1285
+ pbuf = HPDF_FToA (pbuf, y, eptr);
1286
+ HPDF_StrCpy (pbuf, " Td\012", eptr);
1287
+
1288
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
1289
+ return HPDF_CheckError (page->error);
1290
+
1291
+ attr->text_matrix.x += x * attr->text_matrix.a + y * attr->text_matrix.c;
1292
+ attr->text_matrix.y += y * attr->text_matrix.d + x * attr->text_matrix.b;
1293
+ attr->text_pos.x = attr->text_matrix.x;
1294
+ attr->text_pos.y = attr->text_matrix.y;
1295
+
1296
+ return ret;
1297
+ }
1298
+
1299
+ /* TD */
1300
+ HPDF_EXPORT(HPDF_STATUS)
1301
+ HPDF_Page_MoveTextPos2 (HPDF_Page page,
1302
+ HPDF_REAL x,
1303
+ HPDF_REAL y)
1304
+ {
1305
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT);
1306
+ char buf[HPDF_TMP_BUF_SIZ];
1307
+ char *pbuf = buf;
1308
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
1309
+ HPDF_PageAttr attr;
1310
+
1311
+ HPDF_PTRACE ((" HPDF_Page_MoveTextPos2\n"));
1312
+
1313
+ if (ret != HPDF_OK)
1314
+ return ret;
1315
+
1316
+ attr = (HPDF_PageAttr)page->attr;
1317
+
1318
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
1319
+
1320
+ pbuf = HPDF_FToA (pbuf, x, eptr);
1321
+ *pbuf++ = ' ';
1322
+ pbuf = HPDF_FToA (pbuf, y, eptr);
1323
+ HPDF_StrCpy (pbuf, " TD\012", eptr);
1324
+
1325
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
1326
+ return HPDF_CheckError (page->error);
1327
+
1328
+ attr->text_matrix.x += x * attr->text_matrix.a + y * attr->text_matrix.c;
1329
+ attr->text_matrix.y += y * attr->text_matrix.d + x * attr->text_matrix.b;
1330
+ attr->text_pos.x = attr->text_matrix.x;
1331
+ attr->text_pos.y = attr->text_matrix.y;
1332
+ attr->gstate->text_leading = -y;
1333
+
1334
+ return ret;
1335
+ }
1336
+
1337
+ /* Tm */
1338
+ HPDF_EXPORT(HPDF_STATUS)
1339
+ HPDF_Page_SetTextMatrix (HPDF_Page page,
1340
+ HPDF_REAL a,
1341
+ HPDF_REAL b,
1342
+ HPDF_REAL c,
1343
+ HPDF_REAL d,
1344
+ HPDF_REAL x,
1345
+ HPDF_REAL y)
1346
+ {
1347
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT);
1348
+ char buf[HPDF_TMP_BUF_SIZ];
1349
+ char *pbuf = buf;
1350
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
1351
+ HPDF_PageAttr attr;
1352
+
1353
+ HPDF_PTRACE ((" HPDF_Page_SetTextMatrix\n"));
1354
+
1355
+ if (ret != HPDF_OK)
1356
+ return ret;
1357
+
1358
+ attr = (HPDF_PageAttr)page->attr;
1359
+
1360
+ if ((a == 0 || d == 0) && (b == 0 || c == 0))
1361
+ return HPDF_RaiseError (page->error, HPDF_INVALID_PARAMETER, 0);
1362
+
1363
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
1364
+
1365
+ pbuf = HPDF_FToA (pbuf, a, eptr);
1366
+ *pbuf++ = ' ';
1367
+ pbuf = HPDF_FToA (pbuf, b, eptr);
1368
+ *pbuf++ = ' ';
1369
+ pbuf = HPDF_FToA (pbuf, c, eptr);
1370
+ *pbuf++ = ' ';
1371
+ pbuf = HPDF_FToA (pbuf, d, eptr);
1372
+ *pbuf++ = ' ';
1373
+ pbuf = HPDF_FToA (pbuf, x, eptr);
1374
+ *pbuf++ = ' ';
1375
+ pbuf = HPDF_FToA (pbuf, y, eptr);
1376
+ HPDF_StrCpy (pbuf, " Tm\012", eptr);
1377
+
1378
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
1379
+ return HPDF_CheckError (page->error);
1380
+
1381
+ attr->text_matrix.a = a;
1382
+ attr->text_matrix.b = b;
1383
+ attr->text_matrix.c = c;
1384
+ attr->text_matrix.d = d;
1385
+ attr->text_matrix.x = x;
1386
+ attr->text_matrix.y = y;
1387
+ attr->text_pos.x = attr->text_matrix.x;
1388
+ attr->text_pos.y = attr->text_matrix.y;
1389
+
1390
+ return ret;
1391
+ }
1392
+
1393
+
1394
+ /* T* */
1395
+ HPDF_EXPORT(HPDF_STATUS)
1396
+ HPDF_Page_MoveToNextLine (HPDF_Page page)
1397
+ {
1398
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT);
1399
+ HPDF_PageAttr attr;
1400
+
1401
+ HPDF_PTRACE ((" HPDF_Page_MoveToNextLine\n"));
1402
+
1403
+ if (ret != HPDF_OK)
1404
+ return ret;
1405
+
1406
+ attr = (HPDF_PageAttr)page->attr;
1407
+
1408
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "T*\012")) != HPDF_OK)
1409
+ return HPDF_CheckError (page->error);
1410
+
1411
+ /* calculate the reference point of text */
1412
+ attr->text_matrix.x -= attr->gstate->text_leading * attr->text_matrix.c;
1413
+ attr->text_matrix.y -= attr->gstate->text_leading * attr->text_matrix.d;
1414
+
1415
+ attr->text_pos.x = attr->text_matrix.x;
1416
+ attr->text_pos.y = attr->text_matrix.y;
1417
+
1418
+ return ret;
1419
+ }
1420
+
1421
+ /*--- Text showing -------------------------------------------------------*/
1422
+
1423
+ /* Tj */
1424
+ HPDF_EXPORT(HPDF_STATUS)
1425
+ HPDF_Page_ShowText (HPDF_Page page,
1426
+ const char *text)
1427
+ {
1428
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT);
1429
+ HPDF_PageAttr attr;
1430
+ HPDF_REAL tw;
1431
+
1432
+ HPDF_PTRACE ((" HPDF_Page_ShowText\n"));
1433
+
1434
+ if (ret != HPDF_OK || text == NULL || text[0] == 0)
1435
+ return ret;
1436
+
1437
+ attr = (HPDF_PageAttr)page->attr;
1438
+
1439
+ /* no font exists */
1440
+ if (!attr->gstate->font)
1441
+ return HPDF_RaiseError (page->error, HPDF_PAGE_FONT_NOT_FOUND, 0);
1442
+
1443
+ tw = HPDF_Page_TextWidth (page, text);
1444
+ if (!tw)
1445
+ return ret;
1446
+
1447
+ if ((ret = InternalWriteText (attr, text)) != HPDF_OK)
1448
+ return HPDF_CheckError (page->error);
1449
+
1450
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " Tj\012")) != HPDF_OK)
1451
+ return HPDF_CheckError (page->error);
1452
+
1453
+ /* calculate the reference point of text */
1454
+ if (attr->gstate->writing_mode == HPDF_WMODE_HORIZONTAL) {
1455
+ attr->text_pos.x += tw * attr->text_matrix.a;
1456
+ attr->text_pos.y += tw * attr->text_matrix.b;
1457
+ } else {
1458
+ attr->text_pos.x -= tw * attr->text_matrix.b;
1459
+ attr->text_pos.y -= tw * attr->text_matrix.a;
1460
+ }
1461
+
1462
+ return ret;
1463
+ }
1464
+
1465
+ /* TJ */
1466
+ /* ' */
1467
+ HPDF_EXPORT(HPDF_STATUS)
1468
+ HPDF_Page_ShowTextNextLine (HPDF_Page page,
1469
+ const char *text)
1470
+ {
1471
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT);
1472
+ HPDF_PageAttr attr;
1473
+ HPDF_REAL tw;
1474
+
1475
+ HPDF_PTRACE ((" HPDF_Page_ShowTextNextLine\n"));
1476
+
1477
+ if (ret != HPDF_OK)
1478
+ return ret;
1479
+
1480
+ attr = (HPDF_PageAttr)page->attr;
1481
+
1482
+ /* no font exists */
1483
+ if (!attr->gstate->font)
1484
+ return HPDF_RaiseError (page->error, HPDF_PAGE_FONT_NOT_FOUND, 0);
1485
+
1486
+ if (text == NULL || text[0] == 0)
1487
+ return HPDF_Page_MoveToNextLine(page);
1488
+
1489
+ if ((ret = InternalWriteText (attr, text)) != HPDF_OK)
1490
+ return HPDF_CheckError (page->error);
1491
+
1492
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " \'\012")) != HPDF_OK)
1493
+ return HPDF_CheckError (page->error);
1494
+
1495
+ tw = HPDF_Page_TextWidth (page, text);
1496
+
1497
+ /* calculate the reference point of text */
1498
+ attr->text_matrix.x -= attr->gstate->text_leading * attr->text_matrix.c;
1499
+ attr->text_matrix.y -= attr->gstate->text_leading * attr->text_matrix.d;
1500
+
1501
+ attr->text_pos.x = attr->text_matrix.x;
1502
+ attr->text_pos.y = attr->text_matrix.y;
1503
+
1504
+ if (attr->gstate->writing_mode == HPDF_WMODE_HORIZONTAL) {
1505
+ attr->text_pos.x += tw * attr->text_matrix.a;
1506
+ attr->text_pos.y += tw * attr->text_matrix.b;
1507
+ } else {
1508
+ attr->text_pos.x -= tw * attr->text_matrix.b;
1509
+ attr->text_pos.y -= tw * attr->text_matrix.a;
1510
+ }
1511
+
1512
+ return ret;
1513
+ }
1514
+
1515
+ /* " */
1516
+ HPDF_EXPORT(HPDF_STATUS)
1517
+ HPDF_Page_ShowTextNextLineEx (HPDF_Page page,
1518
+ HPDF_REAL word_space,
1519
+ HPDF_REAL char_space,
1520
+ const char *text)
1521
+ {
1522
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT);
1523
+ HPDF_PageAttr attr;
1524
+ HPDF_REAL tw;
1525
+ char buf[HPDF_TMP_BUF_SIZ];
1526
+ char *pbuf = buf;
1527
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
1528
+
1529
+ HPDF_PTRACE ((" HPDF_Page_ShowTextNextLineEX\n"));
1530
+
1531
+ if (ret != HPDF_OK)
1532
+ return ret;
1533
+
1534
+ if (word_space < HPDF_MIN_WORDSPACE || word_space > HPDF_MAX_WORDSPACE)
1535
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
1536
+
1537
+ if (char_space < HPDF_MIN_CHARSPACE || char_space > HPDF_MAX_CHARSPACE)
1538
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
1539
+
1540
+ attr = (HPDF_PageAttr)page->attr;
1541
+
1542
+ /* no font exists */
1543
+ if (!attr->gstate->font)
1544
+ return HPDF_RaiseError (page->error, HPDF_PAGE_FONT_NOT_FOUND, 0);
1545
+
1546
+ if (text == NULL || text[0] == 0)
1547
+ return HPDF_Page_MoveToNextLine(page);
1548
+
1549
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
1550
+ pbuf = HPDF_FToA (pbuf, word_space, eptr);
1551
+ *pbuf++ = ' ';
1552
+ pbuf = HPDF_FToA (pbuf, char_space, eptr);
1553
+ *pbuf = ' ';
1554
+
1555
+ if ((ret = InternalWriteText (attr, buf)) != HPDF_OK)
1556
+ return HPDF_CheckError (page->error);
1557
+
1558
+ if ((ret = InternalWriteText (attr, text)) != HPDF_OK)
1559
+ return HPDF_CheckError (page->error);
1560
+
1561
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " \"\012")) != HPDF_OK)
1562
+ return HPDF_CheckError (page->error);
1563
+
1564
+ attr->gstate->word_space = word_space;
1565
+ attr->gstate->char_space = char_space;
1566
+
1567
+ tw = HPDF_Page_TextWidth (page, text);
1568
+
1569
+ /* calculate the reference point of text */
1570
+ attr->text_matrix.x += attr->gstate->text_leading * attr->text_matrix.b;
1571
+ attr->text_matrix.y -= attr->gstate->text_leading * attr->text_matrix.a;
1572
+
1573
+ attr->text_pos.x = attr->text_matrix.x;
1574
+ attr->text_pos.y = attr->text_matrix.y;
1575
+
1576
+ if (attr->gstate->writing_mode == HPDF_WMODE_HORIZONTAL) {
1577
+ attr->text_pos.x += tw * attr->text_matrix.a;
1578
+ attr->text_pos.y += tw * attr->text_matrix.b;
1579
+ } else {
1580
+ attr->text_pos.x -= tw * attr->text_matrix.b;
1581
+ attr->text_pos.y -= tw * attr->text_matrix.a;
1582
+ }
1583
+
1584
+ return ret;
1585
+ }
1586
+
1587
+
1588
+ /*--- Color showing ------------------------------------------------------*/
1589
+
1590
+ /* cs --not implemented yet */
1591
+ /* CS --not implemented yet */
1592
+ /* sc --not implemented yet */
1593
+ /* scn --not implemented yet */
1594
+ /* SC --not implemented yet */
1595
+ /* SCN --not implemented yet */
1596
+
1597
+ /* g */
1598
+
1599
+ HPDF_EXPORT(HPDF_STATUS)
1600
+ HPDF_Page_SetGrayFill (HPDF_Page page,
1601
+ HPDF_REAL gray)
1602
+ {
1603
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
1604
+ HPDF_GMODE_TEXT_OBJECT);
1605
+ HPDF_PageAttr attr;
1606
+
1607
+ HPDF_PTRACE ((" HPDF_Page_SetGrayFill\n"));
1608
+
1609
+ if (ret != HPDF_OK)
1610
+ return ret;
1611
+
1612
+ attr = (HPDF_PageAttr)page->attr;
1613
+
1614
+ if (gray < 0 || gray > 1)
1615
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
1616
+
1617
+ if ((ret = HPDF_Stream_WriteReal (attr->stream, gray)) != HPDF_OK)
1618
+ return HPDF_CheckError (page->error);
1619
+
1620
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " g\012")) != HPDF_OK)
1621
+ return HPDF_CheckError (page->error);
1622
+
1623
+ attr->gstate->gray_fill = gray;
1624
+ attr->gstate->cs_fill = HPDF_CS_DEVICE_GRAY;
1625
+
1626
+ return ret;
1627
+ }
1628
+
1629
+ /* G */
1630
+ HPDF_EXPORT(HPDF_STATUS)
1631
+ HPDF_Page_SetGrayStroke (HPDF_Page page,
1632
+ HPDF_REAL gray)
1633
+ {
1634
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
1635
+ HPDF_GMODE_TEXT_OBJECT);
1636
+ HPDF_PageAttr attr;
1637
+
1638
+ HPDF_PTRACE ((" HPDF_Page_SetGrayStroke\n"));
1639
+
1640
+ if (ret != HPDF_OK)
1641
+ return ret;
1642
+
1643
+ attr = (HPDF_PageAttr)page->attr;
1644
+
1645
+ if (gray < 0 || gray > 1)
1646
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
1647
+
1648
+ if ((ret = HPDF_Stream_WriteReal (attr->stream, gray)) != HPDF_OK)
1649
+ return HPDF_CheckError (page->error);
1650
+
1651
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " G\012")) != HPDF_OK)
1652
+ return HPDF_CheckError (page->error);
1653
+
1654
+ attr->gstate->gray_stroke = gray;
1655
+ attr->gstate->cs_stroke = HPDF_CS_DEVICE_GRAY;
1656
+
1657
+ return ret;
1658
+ }
1659
+
1660
+ /* rg */
1661
+ HPDF_EXPORT(HPDF_STATUS)
1662
+ HPDF_Page_SetRGBFill (HPDF_Page page,
1663
+ HPDF_REAL r,
1664
+ HPDF_REAL g,
1665
+ HPDF_REAL b)
1666
+ {
1667
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT |
1668
+ HPDF_GMODE_PAGE_DESCRIPTION);
1669
+ char buf[HPDF_TMP_BUF_SIZ];
1670
+ char *pbuf = buf;
1671
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
1672
+ HPDF_PageAttr attr;
1673
+
1674
+ HPDF_PTRACE ((" HPDF_Page_SetRGBFill\n"));
1675
+
1676
+ if (ret != HPDF_OK)
1677
+ return ret;
1678
+
1679
+ if (r < 0 || r > 1 || g < 0 || g > 1 || b < 0 || b > 1)
1680
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
1681
+
1682
+ attr = (HPDF_PageAttr)page->attr;
1683
+
1684
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
1685
+
1686
+ pbuf = HPDF_FToA (pbuf, r, eptr);
1687
+ *pbuf++ = ' ';
1688
+ pbuf = HPDF_FToA (pbuf, g, eptr);
1689
+ *pbuf++ = ' ';
1690
+ pbuf = HPDF_FToA (pbuf, b, eptr);
1691
+ HPDF_StrCpy (pbuf, " rg\012", eptr);
1692
+
1693
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
1694
+ return HPDF_CheckError (page->error);
1695
+
1696
+ attr->gstate->rgb_fill.r = r;
1697
+ attr->gstate->rgb_fill.g = g;
1698
+ attr->gstate->rgb_fill.b = b;
1699
+ attr->gstate->cs_fill = HPDF_CS_DEVICE_RGB;
1700
+
1701
+ return ret;
1702
+ }
1703
+
1704
+ /* RG */
1705
+ HPDF_EXPORT(HPDF_STATUS)
1706
+ HPDF_Page_SetRGBStroke (HPDF_Page page,
1707
+ HPDF_REAL r,
1708
+ HPDF_REAL g,
1709
+ HPDF_REAL b)
1710
+ {
1711
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT |
1712
+ HPDF_GMODE_PAGE_DESCRIPTION);
1713
+ char buf[HPDF_TMP_BUF_SIZ];
1714
+ char *pbuf = buf;
1715
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
1716
+ HPDF_PageAttr attr;
1717
+
1718
+ HPDF_PTRACE ((" HPDF_Page_SetRGBStroke\n"));
1719
+
1720
+ if (ret != HPDF_OK)
1721
+ return ret;
1722
+
1723
+ if (r < 0 || r > 1 || g < 0 || g > 1 || b < 0 || b > 1)
1724
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
1725
+
1726
+ attr = (HPDF_PageAttr)page->attr;
1727
+
1728
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
1729
+
1730
+ pbuf = HPDF_FToA (pbuf, r, eptr);
1731
+ *pbuf++ = ' ';
1732
+ pbuf = HPDF_FToA (pbuf, g, eptr);
1733
+ *pbuf++ = ' ';
1734
+ pbuf = HPDF_FToA (pbuf, b, eptr);
1735
+ HPDF_StrCpy (pbuf, " RG\012", eptr);
1736
+
1737
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
1738
+ return HPDF_CheckError (page->error);
1739
+
1740
+ attr->gstate->rgb_stroke.r = r;
1741
+ attr->gstate->rgb_stroke.g = g;
1742
+ attr->gstate->rgb_stroke.b = b;
1743
+ attr->gstate->cs_stroke = HPDF_CS_DEVICE_RGB;
1744
+
1745
+ return ret;
1746
+ }
1747
+
1748
+ /* k */
1749
+ HPDF_EXPORT(HPDF_STATUS)
1750
+ HPDF_Page_SetCMYKFill (HPDF_Page page,
1751
+ HPDF_REAL c,
1752
+ HPDF_REAL m,
1753
+ HPDF_REAL y,
1754
+ HPDF_REAL k)
1755
+ {
1756
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT |
1757
+ HPDF_GMODE_PAGE_DESCRIPTION);
1758
+ char buf[HPDF_TMP_BUF_SIZ];
1759
+ char *pbuf = buf;
1760
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
1761
+ HPDF_PageAttr attr;
1762
+
1763
+ HPDF_PTRACE ((" HPDF_Page_SetCMYKFill\n"));
1764
+
1765
+ if (ret != HPDF_OK)
1766
+ return ret;
1767
+
1768
+ if (c < 0 || c > 1 || m < 0 || m > 1 || y < 0 || y > 1 || k < 0 || k > 1)
1769
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
1770
+
1771
+ attr = (HPDF_PageAttr)page->attr;
1772
+
1773
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
1774
+
1775
+ pbuf = HPDF_FToA (pbuf, c, eptr);
1776
+ *pbuf++ = ' ';
1777
+ pbuf = HPDF_FToA (pbuf, m, eptr);
1778
+ *pbuf++ = ' ';
1779
+ pbuf = HPDF_FToA (pbuf, y, eptr);
1780
+ *pbuf++ = ' ';
1781
+ pbuf = HPDF_FToA (pbuf, k, eptr);
1782
+ HPDF_StrCpy (pbuf, " k\012", eptr);
1783
+
1784
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
1785
+ return HPDF_CheckError (page->error);
1786
+
1787
+ attr->gstate->cmyk_fill.c = c;
1788
+ attr->gstate->cmyk_fill.m = m;
1789
+ attr->gstate->cmyk_fill.y = y;
1790
+ attr->gstate->cmyk_fill.k = k;
1791
+ attr->gstate->cs_fill = HPDF_CS_DEVICE_CMYK;
1792
+
1793
+ return ret;
1794
+ }
1795
+
1796
+ /* K */
1797
+ HPDF_EXPORT(HPDF_STATUS)
1798
+ HPDF_Page_SetCMYKStroke (HPDF_Page page,
1799
+ HPDF_REAL c,
1800
+ HPDF_REAL m,
1801
+ HPDF_REAL y,
1802
+ HPDF_REAL k)
1803
+ {
1804
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT |
1805
+ HPDF_GMODE_PAGE_DESCRIPTION);
1806
+ char buf[HPDF_TMP_BUF_SIZ];
1807
+ char *pbuf = buf;
1808
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
1809
+ HPDF_PageAttr attr;
1810
+
1811
+ HPDF_PTRACE ((" HPDF_Page_SetCMYKStroke\n"));
1812
+
1813
+ if (ret != HPDF_OK)
1814
+ return ret;
1815
+
1816
+ if (c < 0 || c > 1 || m < 0 || m > 1 || y < 0 || y > 1 || k < 0 || k > 1)
1817
+ return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
1818
+
1819
+ attr = (HPDF_PageAttr)page->attr;
1820
+
1821
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
1822
+
1823
+ pbuf = HPDF_FToA (pbuf, c, eptr);
1824
+ *pbuf++ = ' ';
1825
+ pbuf = HPDF_FToA (pbuf, m, eptr);
1826
+ *pbuf++ = ' ';
1827
+ pbuf = HPDF_FToA (pbuf, y, eptr);
1828
+ *pbuf++ = ' ';
1829
+ pbuf = HPDF_FToA (pbuf, k, eptr);
1830
+ HPDF_StrCpy (pbuf, " K\012", eptr);
1831
+
1832
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
1833
+ return HPDF_CheckError (page->error);
1834
+
1835
+ attr->gstate->cmyk_stroke.c = c;
1836
+ attr->gstate->cmyk_stroke.m = m;
1837
+ attr->gstate->cmyk_stroke.y = y;
1838
+ attr->gstate->cmyk_stroke.k = k;
1839
+ attr->gstate->cs_stroke = HPDF_CS_DEVICE_CMYK;
1840
+
1841
+ return ret;
1842
+ }
1843
+
1844
+ /*--- Shading patterns ---------------------------------------------------*/
1845
+
1846
+ /* sh --not implemented yet */
1847
+
1848
+ /*--- In-line images -----------------------------------------------------*/
1849
+
1850
+ /* BI --not implemented yet */
1851
+ /* ID --not implemented yet */
1852
+ /* EI --not implemented yet */
1853
+
1854
+ /*--- XObjects -----------------------------------------------------------*/
1855
+
1856
+ /* Do */
1857
+ HPDF_EXPORT(HPDF_STATUS)
1858
+ HPDF_Page_ExecuteXObject (HPDF_Page page,
1859
+ HPDF_XObject obj)
1860
+ {
1861
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION);
1862
+ HPDF_PageAttr attr;
1863
+ const char *local_name;
1864
+
1865
+ HPDF_PTRACE ((" HPDF_Page_ExecuteXObject\n"));
1866
+
1867
+ if (ret != HPDF_OK)
1868
+ return ret;
1869
+
1870
+ if (!obj || obj->header.obj_class != (HPDF_OSUBCLASS_XOBJECT |
1871
+ HPDF_OCLASS_DICT))
1872
+ return HPDF_RaiseError (page->error, HPDF_INVALID_OBJECT, 0);
1873
+
1874
+ if (page->mmgr != obj->mmgr)
1875
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_XOBJECT, 0);
1876
+
1877
+ attr = (HPDF_PageAttr)page->attr;
1878
+ local_name = HPDF_Page_GetXObjectName (page, obj);
1879
+
1880
+ if (!local_name)
1881
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_XOBJECT, 0);
1882
+
1883
+ if ((ret = HPDF_Stream_WriteEscapeName (attr->stream, local_name)) !=
1884
+ HPDF_OK)
1885
+ return HPDF_CheckError (page->error);
1886
+
1887
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " Do\012")) != HPDF_OK)
1888
+ return HPDF_CheckError (page->error);
1889
+
1890
+ return ret;
1891
+ }
1892
+
1893
+ /*--- Marked content -----------------------------------------------------*/
1894
+
1895
+ /* BMC --not implemented yet */
1896
+ /* BDC --not implemented yet */
1897
+ /* EMC --not implemented yet */
1898
+ /* MP --not implemented yet */
1899
+ /* DP --not implemented yet */
1900
+
1901
+ /*--- Compatibility ------------------------------------------------------*/
1902
+
1903
+ /* BX --not implemented yet */
1904
+ /* EX --not implemented yet */
1905
+
1906
+
1907
+ /*--- combined function --------------------------------------------------*/
1908
+
1909
+ static const HPDF_REAL KAPPA = 0.552F;
1910
+
1911
+ static char*
1912
+ QuarterCircleA (char *pbuf,
1913
+ char *eptr,
1914
+ HPDF_REAL x,
1915
+ HPDF_REAL y,
1916
+ HPDF_REAL ray)
1917
+ {
1918
+ pbuf = HPDF_FToA (pbuf, x -ray, eptr);
1919
+ *pbuf++ = ' ';
1920
+ pbuf = HPDF_FToA (pbuf, y + ray * KAPPA, eptr);
1921
+ *pbuf++ = ' ';
1922
+ pbuf = HPDF_FToA (pbuf, x -ray * KAPPA, eptr);
1923
+ *pbuf++ = ' ';
1924
+ pbuf = HPDF_FToA (pbuf, y + ray, eptr);
1925
+ *pbuf++ = ' ';
1926
+ pbuf = HPDF_FToA (pbuf, x, eptr);
1927
+ *pbuf++ = ' ';
1928
+ pbuf = HPDF_FToA (pbuf, y + ray, eptr);
1929
+ return HPDF_StrCpy (pbuf, " c\012", eptr);
1930
+ }
1931
+
1932
+ static char*
1933
+ QuarterCircleB (char *pbuf,
1934
+ char *eptr,
1935
+ HPDF_REAL x,
1936
+ HPDF_REAL y,
1937
+ HPDF_REAL ray)
1938
+ {
1939
+ pbuf = HPDF_FToA (pbuf, x + ray * KAPPA, eptr);
1940
+ *pbuf++ = ' ';
1941
+ pbuf = HPDF_FToA (pbuf, y + ray, eptr);
1942
+ *pbuf++ = ' ';
1943
+ pbuf = HPDF_FToA (pbuf, x + ray, eptr);
1944
+ *pbuf++ = ' ';
1945
+ pbuf = HPDF_FToA (pbuf, y + ray * KAPPA, eptr);
1946
+ *pbuf++ = ' ';
1947
+ pbuf = HPDF_FToA (pbuf, x + ray, eptr);
1948
+ *pbuf++ = ' ';
1949
+ pbuf = HPDF_FToA (pbuf, y, eptr);
1950
+ return HPDF_StrCpy (pbuf, " c\012", eptr);
1951
+ }
1952
+
1953
+ static char*
1954
+ QuarterCircleC (char *pbuf,
1955
+ char *eptr,
1956
+ HPDF_REAL x,
1957
+ HPDF_REAL y,
1958
+ HPDF_REAL ray)
1959
+ {
1960
+ pbuf = HPDF_FToA (pbuf, x + ray, eptr);
1961
+ *pbuf++ = ' ';
1962
+ pbuf = HPDF_FToA (pbuf, y - ray * KAPPA, eptr);
1963
+ *pbuf++ = ' ';
1964
+ pbuf = HPDF_FToA (pbuf, x + ray * KAPPA, eptr);
1965
+ *pbuf++ = ' ';
1966
+ pbuf = HPDF_FToA (pbuf, y - ray, eptr);
1967
+ *pbuf++ = ' ';
1968
+ pbuf = HPDF_FToA (pbuf, x, eptr);
1969
+ *pbuf++ = ' ';
1970
+ pbuf = HPDF_FToA (pbuf, y - ray, eptr);
1971
+ return HPDF_StrCpy (pbuf, " c\012", eptr);
1972
+ }
1973
+
1974
+ static char*
1975
+ QuarterCircleD (char *pbuf,
1976
+ char *eptr,
1977
+ HPDF_REAL x,
1978
+ HPDF_REAL y,
1979
+ HPDF_REAL ray)
1980
+ {
1981
+ pbuf = HPDF_FToA (pbuf, x - ray * KAPPA, eptr);
1982
+ *pbuf++ = ' ';
1983
+ pbuf = HPDF_FToA (pbuf, y - ray, eptr);
1984
+ *pbuf++ = ' ';
1985
+ pbuf = HPDF_FToA (pbuf, x - ray, eptr);
1986
+ *pbuf++ = ' ';
1987
+ pbuf = HPDF_FToA (pbuf, y - ray * KAPPA, eptr);
1988
+ *pbuf++ = ' ';
1989
+ pbuf = HPDF_FToA (pbuf, x - ray, eptr);
1990
+ *pbuf++ = ' ';
1991
+ pbuf = HPDF_FToA (pbuf, y, eptr);
1992
+ return HPDF_StrCpy (pbuf, " c\012", eptr);
1993
+ }
1994
+
1995
+ HPDF_EXPORT(HPDF_STATUS)
1996
+ HPDF_Page_Circle (HPDF_Page page,
1997
+ HPDF_REAL x,
1998
+ HPDF_REAL y,
1999
+ HPDF_REAL ray)
2000
+ {
2001
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
2002
+ HPDF_GMODE_PATH_OBJECT);
2003
+ char buf[HPDF_TMP_BUF_SIZ * 2];
2004
+ char *pbuf = buf;
2005
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
2006
+ HPDF_PageAttr attr;
2007
+
2008
+ HPDF_PTRACE ((" HPDF_Page_Circle\n"));
2009
+
2010
+ if (ret != HPDF_OK)
2011
+ return ret;
2012
+
2013
+ attr = (HPDF_PageAttr)page->attr;
2014
+
2015
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
2016
+
2017
+ pbuf = HPDF_FToA (pbuf, x - ray, eptr);
2018
+ *pbuf++ = ' ';
2019
+ pbuf = HPDF_FToA (pbuf, y, eptr);
2020
+ pbuf = HPDF_StrCpy (pbuf, " m\012", eptr);
2021
+
2022
+ pbuf = QuarterCircleA (pbuf, eptr, x, y, ray);
2023
+ pbuf = QuarterCircleB (pbuf, eptr, x, y, ray);
2024
+ pbuf = QuarterCircleC (pbuf, eptr, x, y, ray);
2025
+ QuarterCircleD (pbuf, eptr, x, y, ray);
2026
+
2027
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
2028
+ return HPDF_CheckError (page->error);
2029
+
2030
+ attr->cur_pos.x = x - ray;
2031
+ attr->cur_pos.y = y;
2032
+ attr->str_pos = attr->cur_pos;
2033
+ attr->gmode = HPDF_GMODE_PATH_OBJECT;
2034
+
2035
+ return ret;
2036
+ }
2037
+
2038
+
2039
+ static char*
2040
+ QuarterEllipseA (char *pbuf,
2041
+ char *eptr,
2042
+ HPDF_REAL x,
2043
+ HPDF_REAL y,
2044
+ HPDF_REAL xray,
2045
+ HPDF_REAL yray)
2046
+ {
2047
+ pbuf = HPDF_FToA (pbuf, x - xray, eptr);
2048
+ *pbuf++ = ' ';
2049
+ pbuf = HPDF_FToA (pbuf, y + yray * KAPPA, eptr);
2050
+ *pbuf++ = ' ';
2051
+ pbuf = HPDF_FToA (pbuf, x -xray * KAPPA, eptr);
2052
+ *pbuf++ = ' ';
2053
+ pbuf = HPDF_FToA (pbuf, y + yray, eptr);
2054
+ *pbuf++ = ' ';
2055
+ pbuf = HPDF_FToA (pbuf, x, eptr);
2056
+ *pbuf++ = ' ';
2057
+ pbuf = HPDF_FToA (pbuf, y + yray, eptr);
2058
+ return HPDF_StrCpy (pbuf, " c\012", eptr);
2059
+ }
2060
+
2061
+ static char*
2062
+ QuarterEllipseB (char *pbuf,
2063
+ char *eptr,
2064
+ HPDF_REAL x,
2065
+ HPDF_REAL y,
2066
+ HPDF_REAL xray,
2067
+ HPDF_REAL yray)
2068
+ {
2069
+ pbuf = HPDF_FToA (pbuf, x + xray * KAPPA, eptr);
2070
+ *pbuf++ = ' ';
2071
+ pbuf = HPDF_FToA (pbuf, y + yray, eptr);
2072
+ *pbuf++ = ' ';
2073
+ pbuf = HPDF_FToA (pbuf, x + xray, eptr);
2074
+ *pbuf++ = ' ';
2075
+ pbuf = HPDF_FToA (pbuf, y + yray * KAPPA, eptr);
2076
+ *pbuf++ = ' ';
2077
+ pbuf = HPDF_FToA (pbuf, x + xray, eptr);
2078
+ *pbuf++ = ' ';
2079
+ pbuf = HPDF_FToA (pbuf, y, eptr);
2080
+ return HPDF_StrCpy (pbuf, " c\012", eptr);
2081
+ }
2082
+
2083
+ static char*
2084
+ QuarterEllipseC (char *pbuf,
2085
+ char *eptr,
2086
+ HPDF_REAL x,
2087
+ HPDF_REAL y,
2088
+ HPDF_REAL xray,
2089
+ HPDF_REAL yray)
2090
+ {
2091
+ pbuf = HPDF_FToA (pbuf, x + xray, eptr);
2092
+ *pbuf++ = ' ';
2093
+ pbuf = HPDF_FToA (pbuf, y - yray * KAPPA, eptr);
2094
+ *pbuf++ = ' ';
2095
+ pbuf = HPDF_FToA (pbuf, x + xray * KAPPA, eptr);
2096
+ *pbuf++ = ' ';
2097
+ pbuf = HPDF_FToA (pbuf, y - yray, eptr);
2098
+ *pbuf++ = ' ';
2099
+ pbuf = HPDF_FToA (pbuf, x, eptr);
2100
+ *pbuf++ = ' ';
2101
+ pbuf = HPDF_FToA (pbuf, y - yray, eptr);
2102
+ return HPDF_StrCpy (pbuf, " c\012", eptr);
2103
+ }
2104
+
2105
+ static char*
2106
+ QuarterEllipseD (char *pbuf,
2107
+ char *eptr,
2108
+ HPDF_REAL x,
2109
+ HPDF_REAL y,
2110
+ HPDF_REAL xray,
2111
+ HPDF_REAL yray)
2112
+ {
2113
+ pbuf = HPDF_FToA (pbuf, x - xray * KAPPA, eptr);
2114
+ *pbuf++ = ' ';
2115
+ pbuf = HPDF_FToA (pbuf, y - yray, eptr);
2116
+ *pbuf++ = ' ';
2117
+ pbuf = HPDF_FToA (pbuf, x - xray, eptr);
2118
+ *pbuf++ = ' ';
2119
+ pbuf = HPDF_FToA (pbuf, y - yray * KAPPA, eptr);
2120
+ *pbuf++ = ' ';
2121
+ pbuf = HPDF_FToA (pbuf, x - xray, eptr);
2122
+ *pbuf++ = ' ';
2123
+ pbuf = HPDF_FToA (pbuf, y, eptr);
2124
+ return HPDF_StrCpy (pbuf, " c\012", eptr);
2125
+ }
2126
+
2127
+ HPDF_EXPORT(HPDF_STATUS)
2128
+ HPDF_Page_Ellipse (HPDF_Page page,
2129
+ HPDF_REAL x,
2130
+ HPDF_REAL y,
2131
+ HPDF_REAL xray,
2132
+ HPDF_REAL yray)
2133
+ {
2134
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
2135
+ HPDF_GMODE_PATH_OBJECT);
2136
+ char buf[HPDF_TMP_BUF_SIZ];
2137
+ char *pbuf = buf;
2138
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
2139
+ HPDF_PageAttr attr;
2140
+
2141
+ HPDF_PTRACE ((" HPDF_Page_Ellipse\n"));
2142
+
2143
+ if (ret != HPDF_OK)
2144
+ return ret;
2145
+
2146
+ attr = (HPDF_PageAttr)page->attr;
2147
+
2148
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
2149
+
2150
+ pbuf = HPDF_FToA (pbuf, x - xray, eptr);
2151
+ *pbuf++ = ' ';
2152
+ pbuf = HPDF_FToA (pbuf, y, eptr);
2153
+ pbuf = HPDF_StrCpy (pbuf, " m\012", eptr);
2154
+
2155
+ pbuf = QuarterEllipseA (pbuf, eptr, x, y, xray, yray);
2156
+ pbuf = QuarterEllipseB (pbuf, eptr, x, y, xray, yray);
2157
+ pbuf = QuarterEllipseC (pbuf, eptr, x, y, xray, yray);
2158
+ QuarterEllipseD (pbuf, eptr, x, y, xray, yray);
2159
+
2160
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
2161
+ return HPDF_CheckError (page->error);
2162
+
2163
+ attr->cur_pos.x = x - xray;
2164
+ attr->cur_pos.y = y;
2165
+ attr->str_pos = attr->cur_pos;
2166
+ attr->gmode = HPDF_GMODE_PATH_OBJECT;
2167
+
2168
+ return ret;
2169
+ }
2170
+
2171
+
2172
+ /*
2173
+ * this function is based on the code which is contributed by Riccardo Cohen.
2174
+ *
2175
+ * from http://www.tinaja.com/glib/bezarc1.pdf coming from
2176
+ * http://www.whizkidtech.redprince.net/bezier/circle/
2177
+ */
2178
+ HPDF_EXPORT(HPDF_STATUS)
2179
+ HPDF_Page_Arc (HPDF_Page page,
2180
+ HPDF_REAL x,
2181
+ HPDF_REAL y,
2182
+ HPDF_REAL ray,
2183
+ HPDF_REAL ang1,
2184
+ HPDF_REAL ang2)
2185
+ {
2186
+ HPDF_BOOL cont_flg = HPDF_FALSE;
2187
+
2188
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION |
2189
+ HPDF_GMODE_PATH_OBJECT);
2190
+
2191
+ HPDF_PTRACE ((" HPDF_Page_Arc\n"));
2192
+
2193
+ if (ang1 >= ang2 || (ang2 - ang1) >= 360)
2194
+ HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0);
2195
+
2196
+ if (ret != HPDF_OK)
2197
+ return ret;
2198
+
2199
+ while (ang1 < 0 || ang2 < 0) {
2200
+ ang1 = ang1 + 360;
2201
+ ang2 = ang2 + 360;
2202
+ }
2203
+
2204
+
2205
+ for (;;) {
2206
+ if (ang2 - ang1 <= 90)
2207
+ return InternalArc (page, x, y, ray, ang1, ang2, cont_flg);
2208
+ else {
2209
+ HPDF_REAL tmp_ang = ang1 + 90;
2210
+
2211
+ if ((ret = InternalArc (page, x, y, ray, ang1, tmp_ang, cont_flg))
2212
+ != HPDF_OK)
2213
+ return ret;
2214
+
2215
+ ang1 = tmp_ang;
2216
+ }
2217
+
2218
+ if (ang1 >= ang2)
2219
+ break;
2220
+
2221
+ cont_flg = HPDF_TRUE;
2222
+ }
2223
+
2224
+ return HPDF_OK;
2225
+ }
2226
+
2227
+
2228
+ static HPDF_STATUS
2229
+ InternalArc (HPDF_Page page,
2230
+ HPDF_REAL x,
2231
+ HPDF_REAL y,
2232
+ HPDF_REAL ray,
2233
+ HPDF_REAL ang1,
2234
+ HPDF_REAL ang2,
2235
+ HPDF_BOOL cont_flg)
2236
+ {
2237
+ const HPDF_REAL PIE = 3.14159F;
2238
+
2239
+ char buf[HPDF_TMP_BUF_SIZ];
2240
+ char *pbuf = buf;
2241
+ char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
2242
+ HPDF_PageAttr attr;
2243
+ HPDF_STATUS ret;
2244
+
2245
+ HPDF_DOUBLE rx0, ry0, rx1, ry1, rx2, ry2, rx3, ry3;
2246
+ HPDF_DOUBLE x0, y0, x1, y1, x2, y2, x3, y3;
2247
+ HPDF_DOUBLE delta_angle;
2248
+ HPDF_DOUBLE new_angle;
2249
+
2250
+ HPDF_PTRACE ((" HPDF_Page_InternalArc\n"));
2251
+
2252
+ attr = (HPDF_PageAttr)page->attr;
2253
+
2254
+ HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ);
2255
+
2256
+ delta_angle = (90 - (HPDF_DOUBLE)(ang1 + ang2) / 2) / 180 * PIE;
2257
+ new_angle = (HPDF_DOUBLE)(ang2 - ang1) / 2 / 180 * PIE;
2258
+
2259
+ rx0 = ray * HPDF_COS (new_angle);
2260
+ ry0 = ray * HPDF_SIN (new_angle);
2261
+ rx2 = (ray * 4.0 - rx0) / 3.0;
2262
+ ry2 = ((ray * 1.0 - rx0) * (rx0 - ray * 3.0)) / (3.0 * ry0);
2263
+ rx1 = rx2;
2264
+ ry1 = -ry2;
2265
+ rx3 = rx0;
2266
+ ry3 = -ry0;
2267
+
2268
+ x0 = rx0 * HPDF_COS (delta_angle) - ry0 * HPDF_SIN (delta_angle) + x;
2269
+ y0 = rx0 * HPDF_SIN (delta_angle) + ry0 * HPDF_COS (delta_angle) + y;
2270
+ x1 = rx1 * HPDF_COS (delta_angle) - ry1 * HPDF_SIN (delta_angle) + x;
2271
+ y1 = rx1 * HPDF_SIN (delta_angle) + ry1 * HPDF_COS (delta_angle) + y;
2272
+ x2 = rx2 * HPDF_COS (delta_angle) - ry2 * HPDF_SIN (delta_angle) + x;
2273
+ y2 = rx2 * HPDF_SIN (delta_angle) + ry2 * HPDF_COS (delta_angle) + y;
2274
+ x3 = rx3 * HPDF_COS (delta_angle) - ry3 * HPDF_SIN (delta_angle) + x;
2275
+ y3 = rx3 * HPDF_SIN (delta_angle) + ry3 * HPDF_COS (delta_angle) + y;
2276
+
2277
+ if (!cont_flg) {
2278
+ pbuf = HPDF_FToA (pbuf, (HPDF_REAL)x0, eptr);
2279
+ *pbuf++ = ' ';
2280
+ pbuf = HPDF_FToA (pbuf, (HPDF_REAL)y0, eptr);
2281
+ pbuf = HPDF_StrCpy (pbuf, " m\012", eptr);
2282
+ }
2283
+
2284
+ pbuf = HPDF_FToA (pbuf, (HPDF_REAL)x1, eptr);
2285
+ *pbuf++ = ' ';
2286
+ pbuf = HPDF_FToA (pbuf, (HPDF_REAL)y1, eptr);
2287
+ *pbuf++ = ' ';
2288
+ pbuf = HPDF_FToA (pbuf, (HPDF_REAL)x2, eptr);
2289
+ *pbuf++ = ' ';
2290
+ pbuf = HPDF_FToA (pbuf, (HPDF_REAL)y2, eptr);
2291
+ *pbuf++ = ' ';
2292
+ pbuf = HPDF_FToA (pbuf, (HPDF_REAL)x3, eptr);
2293
+ *pbuf++ = ' ';
2294
+ pbuf = HPDF_FToA (pbuf, (HPDF_REAL)y3, eptr);
2295
+ HPDF_StrCpy (pbuf, " c\012", eptr);
2296
+
2297
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK)
2298
+ return HPDF_CheckError (page->error);
2299
+
2300
+ attr->cur_pos.x = (HPDF_REAL)x3;
2301
+ attr->cur_pos.y = (HPDF_REAL)y3;
2302
+ attr->str_pos = attr->cur_pos;
2303
+ attr->gmode = HPDF_GMODE_PATH_OBJECT;
2304
+
2305
+ return ret;
2306
+ }
2307
+
2308
+
2309
+ HPDF_EXPORT(HPDF_STATUS)
2310
+ HPDF_Page_DrawImage (HPDF_Page page,
2311
+ HPDF_Image image,
2312
+ HPDF_REAL x,
2313
+ HPDF_REAL y,
2314
+ HPDF_REAL width,
2315
+ HPDF_REAL height)
2316
+ {
2317
+ HPDF_STATUS ret;
2318
+
2319
+ if ((ret = HPDF_Page_GSave (page)) != HPDF_OK)
2320
+ return ret;
2321
+
2322
+ if ((ret = HPDF_Page_Concat (page, width, 0, 0, height, x, y)) != HPDF_OK)
2323
+ return ret;
2324
+
2325
+ if ((ret = HPDF_Page_ExecuteXObject (page, image)) != HPDF_OK)
2326
+ return ret;
2327
+
2328
+ return HPDF_Page_GRestore (page);
2329
+ }
2330
+
2331
+
2332
+ static HPDF_STATUS
2333
+ InternalWriteText (HPDF_PageAttr attr,
2334
+ const char *text)
2335
+ {
2336
+ HPDF_FontAttr font_attr = (HPDF_FontAttr)attr->gstate->font->attr;
2337
+ HPDF_STATUS ret;
2338
+
2339
+ HPDF_PTRACE ((" InternalWriteText\n"));
2340
+
2341
+ if (font_attr->type == HPDF_FONT_TYPE0_TT ||
2342
+ font_attr->type == HPDF_FONT_TYPE0_CID) {
2343
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "<")) != HPDF_OK)
2344
+ return ret;
2345
+
2346
+ if ((ret = HPDF_Stream_WriteBinary (attr->stream, text,
2347
+ HPDF_StrLen (text, HPDF_LIMIT_MAX_STRING_LEN), NULL))
2348
+ != HPDF_OK)
2349
+ return ret;
2350
+
2351
+ return HPDF_Stream_WriteStr (attr->stream, ">");
2352
+ }
2353
+
2354
+ return HPDF_Stream_WriteEscapeText (attr->stream, text);
2355
+ }
2356
+
2357
+
2358
+ HPDF_EXPORT(HPDF_STATUS)
2359
+ HPDF_Page_TextOut (HPDF_Page page,
2360
+ HPDF_REAL xpos,
2361
+ HPDF_REAL ypos,
2362
+ const char *text)
2363
+ {
2364
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT);
2365
+ HPDF_REAL x;
2366
+ HPDF_REAL y;
2367
+ HPDF_PageAttr attr;
2368
+
2369
+ HPDF_PTRACE ((" HPDF_Page_TextOut\n"));
2370
+
2371
+ if (ret != HPDF_OK)
2372
+ return ret;
2373
+
2374
+ attr = (HPDF_PageAttr)page->attr;
2375
+
2376
+ if (attr->text_matrix.a == 0) {
2377
+ y = (xpos - attr->text_matrix.x) / attr->text_matrix.c;
2378
+ x = (ypos - attr->text_matrix.y - (xpos - attr->text_matrix.x) * attr->text_matrix.d / attr->text_matrix.c) / attr->text_matrix.b;
2379
+ } else {
2380
+ y = (ypos - attr->text_matrix.y - (xpos - attr->text_matrix.x) *
2381
+ attr->text_matrix.b / attr->text_matrix.a) / (attr->text_matrix.d -
2382
+ attr->text_matrix.c * attr->text_matrix.b / attr->text_matrix.a);
2383
+ x = (xpos - attr->text_matrix.x - y * attr->text_matrix.c) /
2384
+ attr->text_matrix.a;
2385
+ }
2386
+
2387
+ if ((ret = HPDF_Page_MoveTextPos (page, x, y)) != HPDF_OK)
2388
+ return ret;
2389
+
2390
+ return HPDF_Page_ShowText (page, text);
2391
+ }
2392
+
2393
+
2394
+ HPDF_EXPORT(HPDF_STATUS)
2395
+ HPDF_Page_TextRect (HPDF_Page page,
2396
+ HPDF_REAL left,
2397
+ HPDF_REAL top,
2398
+ HPDF_REAL right,
2399
+ HPDF_REAL bottom,
2400
+ const char *text,
2401
+ HPDF_TextAlignment align,
2402
+ HPDF_UINT *len
2403
+ )
2404
+ {
2405
+ HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT);
2406
+ HPDF_REAL x;
2407
+ HPDF_REAL y;
2408
+ HPDF_PageAttr attr;
2409
+ const char *ptr = text;
2410
+ HPDF_REAL save_char_space = 0;
2411
+ HPDF_BOOL is_insufficient_space = HPDF_FALSE;
2412
+ HPDF_UINT num_rest;
2413
+ HPDF_Box bbox;
2414
+ HPDF_BOOL char_space_changed = HPDF_FALSE;
2415
+
2416
+ HPDF_PTRACE ((" HPDF_Page_TextOutEx\n"));
2417
+
2418
+ if (ret != HPDF_OK)
2419
+ return ret;
2420
+
2421
+ attr = (HPDF_PageAttr )page->attr;
2422
+
2423
+ /* no font exists */
2424
+ if (!attr->gstate->font) {
2425
+ return HPDF_RaiseError (page->error, HPDF_PAGE_FONT_NOT_FOUND, 0);
2426
+ }
2427
+
2428
+ bbox = HPDF_Font_GetBBox (attr->gstate->font);
2429
+
2430
+ if (len)
2431
+ *len = 0;
2432
+ num_rest = HPDF_StrLen (text, HPDF_LIMIT_MAX_STRING_LEN + 1);
2433
+
2434
+ if (num_rest > HPDF_LIMIT_MAX_STRING_LEN) {
2435
+ return HPDF_RaiseError (page->error, HPDF_STRING_OUT_OF_RANGE, 0);
2436
+ } else if (!num_rest)
2437
+ return HPDF_OK;
2438
+
2439
+ if (attr->gstate->text_leading == 0)
2440
+ HPDF_Page_SetTextLeading (page, (bbox.top - bbox.bottom) / 1000 *
2441
+ attr->gstate->font_size);
2442
+
2443
+ top = top - bbox.top / 1000 * attr->gstate->font_size +
2444
+ attr->gstate->text_leading;
2445
+ bottom = bottom - bbox.bottom / 1000 * attr->gstate->font_size;
2446
+
2447
+ if (attr->text_matrix.a == 0) {
2448
+ y = (left - attr->text_matrix.x) / attr->text_matrix.c;
2449
+ x = (top - attr->text_matrix.y - (left - attr->text_matrix.x) * attr->text_matrix.d / attr->text_matrix.c) / attr->text_matrix.b;
2450
+ } else {
2451
+ y = (top - attr->text_matrix.y - (left - attr->text_matrix.x) *
2452
+ attr->text_matrix.b / attr->text_matrix.a) / (attr->text_matrix.d -
2453
+ attr->text_matrix.c * attr->text_matrix.b / attr->text_matrix.a);
2454
+ x = (left - attr->text_matrix.x - y * attr->text_matrix.c) /
2455
+ attr->text_matrix.a;
2456
+ }
2457
+
2458
+ if ((ret = HPDF_Page_MoveTextPos (page, x, y)) != HPDF_OK)
2459
+ return ret;
2460
+
2461
+ if (align == HPDF_TALIGN_JUSTIFY) {
2462
+ save_char_space = attr->gstate->char_space;
2463
+ attr->gstate->char_space = 0;
2464
+ }
2465
+
2466
+ for (;;) {
2467
+ HPDF_UINT tmp_len;
2468
+ HPDF_REAL rw;
2469
+ HPDF_REAL x_adjust;
2470
+ const char *tmp_ptr;
2471
+ HPDF_UINT num_char;
2472
+ HPDF_ParseText_Rec state;
2473
+ HPDF_Encoder encoder;
2474
+ HPDF_UINT i;
2475
+
2476
+ tmp_len = HPDF_Page_MeasureText (page, ptr, right - left, HPDF_TRUE, &rw);
2477
+ if (tmp_len == 0) {
2478
+ is_insufficient_space = HPDF_TRUE;
2479
+ break;
2480
+ }
2481
+
2482
+ if (len)
2483
+ *len += tmp_len;
2484
+
2485
+ switch (align) {
2486
+ case HPDF_TALIGN_RIGHT:
2487
+ x_adjust = right - left - rw;
2488
+ if ((ret = HPDF_Page_MoveTextPos (page, x_adjust, 0)) != HPDF_OK)
2489
+ return ret;
2490
+
2491
+ if ((ret = InternalShowTextNextLine (page, ptr, tmp_len))
2492
+ != HPDF_OK)
2493
+ return HPDF_CheckError (page->error);
2494
+
2495
+ if ((ret = HPDF_Page_MoveTextPos (page, -x_adjust, 0)) != HPDF_OK)
2496
+ return ret;
2497
+ break;
2498
+ case HPDF_TALIGN_CENTER:
2499
+ x_adjust = (right - left - rw) / 2;
2500
+ if ((ret = HPDF_Page_MoveTextPos (page, x_adjust, 0)) != HPDF_OK)
2501
+ return ret;
2502
+
2503
+ if ((ret = InternalShowTextNextLine (page, ptr, tmp_len))
2504
+ != HPDF_OK)
2505
+ return HPDF_CheckError (page->error);
2506
+
2507
+ if ((ret = HPDF_Page_MoveTextPos (page, -x_adjust, 0)) != HPDF_OK)
2508
+ return ret;
2509
+ break;
2510
+ case HPDF_TALIGN_JUSTIFY:
2511
+ num_char = 0;
2512
+ encoder = ((HPDF_FontAttr)attr->gstate->font->attr)->encoder;
2513
+ tmp_ptr = ptr;
2514
+ HPDF_Encoder_SetParseText (encoder, &state, tmp_ptr, tmp_len);
2515
+ i = 0;
2516
+ while (*tmp_ptr) {
2517
+ HPDF_ByteType btype = HPDF_Encoder_ByteType (encoder, &state);
2518
+ if (btype != HPDF_BYTE_TYPE_TRIAL)
2519
+ num_char++;
2520
+
2521
+ i++;
2522
+ if (i >= tmp_len)
2523
+ break;
2524
+
2525
+ tmp_ptr++;
2526
+ }
2527
+
2528
+ if (HPDF_IS_WHITE_SPACE(*tmp_ptr))
2529
+ num_char--;
2530
+
2531
+ if (num_char > 1)
2532
+ x_adjust = (right - left - rw) / (num_char - 1);
2533
+ else
2534
+ x_adjust = 0;
2535
+
2536
+ if (num_rest == tmp_len) {
2537
+ if ((ret = HPDF_Page_SetCharSpace (page, save_char_space))
2538
+ != HPDF_OK)
2539
+ return ret;
2540
+ char_space_changed = HPDF_FALSE;
2541
+ } else {
2542
+ if ((ret = HPDF_Page_SetCharSpace (page, x_adjust))
2543
+ != HPDF_OK)
2544
+ return ret;
2545
+ char_space_changed = HPDF_TRUE;
2546
+ }
2547
+
2548
+ if ((ret = InternalShowTextNextLine (page, ptr, tmp_len))
2549
+ != HPDF_OK)
2550
+ return HPDF_CheckError (page->error);
2551
+
2552
+ attr->gstate->char_space = 0;
2553
+ break;
2554
+ default:
2555
+ if ((ret = InternalShowTextNextLine (page, ptr, tmp_len))
2556
+ != HPDF_OK)
2557
+ return HPDF_CheckError (page->error);
2558
+ }
2559
+
2560
+ num_rest -= tmp_len;
2561
+ if (num_rest <= 0)
2562
+ break;
2563
+
2564
+ if (attr->text_pos.y - attr->gstate->text_leading < bottom) {
2565
+ is_insufficient_space = HPDF_TRUE;
2566
+ break;
2567
+ }
2568
+
2569
+ ptr += tmp_len;
2570
+ }
2571
+
2572
+ if (char_space_changed) {
2573
+ if ((ret = HPDF_Page_SetCharSpace (page, save_char_space)) != HPDF_OK)
2574
+ return ret;
2575
+ }
2576
+
2577
+ if (is_insufficient_space)
2578
+ return HPDF_PAGE_INSUFFICIENT_SPACE;
2579
+ else
2580
+ return HPDF_OK;
2581
+ }
2582
+
2583
+
2584
+ static HPDF_STATUS
2585
+ InternalShowTextNextLine (HPDF_Page page,
2586
+ const char *text,
2587
+ HPDF_UINT len)
2588
+ {
2589
+ HPDF_STATUS ret;
2590
+ HPDF_PageAttr attr;
2591
+ HPDF_REAL tw;
2592
+ HPDF_FontAttr font_attr;
2593
+
2594
+ HPDF_PTRACE ((" ShowTextNextLine\n"));
2595
+
2596
+ attr = (HPDF_PageAttr)page->attr;
2597
+ font_attr = (HPDF_FontAttr)attr->gstate->font->attr;
2598
+
2599
+ if (font_attr->type == HPDF_FONT_TYPE0_TT ||
2600
+ font_attr->type == HPDF_FONT_TYPE0_CID) {
2601
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, "<")) != HPDF_OK)
2602
+ return ret;
2603
+
2604
+ if ((ret = HPDF_Stream_WriteBinary (attr->stream, text, len, NULL))
2605
+ != HPDF_OK)
2606
+ return ret;
2607
+
2608
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, ">")) != HPDF_OK)
2609
+ return ret;
2610
+ } else if ((ret = HPDF_Stream_WriteEscapeText2 (attr->stream, text,
2611
+ len)) != HPDF_OK)
2612
+ return ret;
2613
+
2614
+ if ((ret = HPDF_Stream_WriteStr (attr->stream, " \'\012")) != HPDF_OK)
2615
+ return ret;
2616
+
2617
+ tw = HPDF_Page_TextWidth (page, text);
2618
+
2619
+ /* calculate the reference point of text */
2620
+ attr->text_matrix.x -= attr->gstate->text_leading * attr->text_matrix.c;
2621
+ attr->text_matrix.y -= attr->gstate->text_leading * attr->text_matrix.d;
2622
+
2623
+ attr->text_pos.x = attr->text_matrix.x;
2624
+ attr->text_pos.y = attr->text_matrix.y;
2625
+
2626
+ if (attr->gstate->writing_mode == HPDF_WMODE_HORIZONTAL) {
2627
+ attr->text_pos.x += tw * attr->text_matrix.a;
2628
+ attr->text_pos.y += tw * attr->text_matrix.b;
2629
+ } else {
2630
+ attr->text_pos.x -= tw * attr->text_matrix.b;
2631
+ attr->text_pos.y -= tw * attr->text_matrix.a;
2632
+ }
2633
+
2634
+ return ret;
2635
+ }
2636
+
2637
+
2638
+ /*
2639
+ * This function is contributed by Adrian Nelson (adenelson).
2640
+ */
2641
+ HPDF_EXPORT(HPDF_STATUS)
2642
+ HPDF_Page_SetSlideShow (HPDF_Page page,
2643
+ HPDF_TransitionStyle type,
2644
+ HPDF_REAL disp_time,
2645
+ HPDF_REAL trans_time)
2646
+ {
2647
+ HPDF_STATUS ret = HPDF_OK;
2648
+ HPDF_Dict dict;
2649
+
2650
+ HPDF_PTRACE((" HPDF_Page_SetSlideShow\n"));
2651
+
2652
+ if (!HPDF_Page_Validate (page))
2653
+ return HPDF_INVALID_PAGE;
2654
+
2655
+ if (disp_time < 0)
2656
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_DISPLAY_TIME,
2657
+ (HPDF_STATUS)disp_time);
2658
+
2659
+ if (trans_time < 0)
2660
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_TRANSITION_TIME,
2661
+ (HPDF_STATUS)trans_time);
2662
+
2663
+ dict = HPDF_Dict_New(page->mmgr);
2664
+
2665
+ if (!dict)
2666
+ return HPDF_Error_GetCode (page->error);
2667
+
2668
+ if ((ret = HPDF_Dict_AddName (dict, "Type", "Trans")) != HPDF_OK)
2669
+ goto Fail;
2670
+
2671
+ if ((ret = HPDF_Dict_AddReal (dict, "D", trans_time)) !=
2672
+ HPDF_OK)
2673
+ goto Fail;
2674
+
2675
+ switch (type) {
2676
+ case HPDF_TS_WIPE_RIGHT:
2677
+ ret += HPDF_Dict_AddName (dict, "S", "Wipe");
2678
+ ret += HPDF_Dict_AddNumber (dict, "Di", 0);
2679
+ break;
2680
+ case HPDF_TS_WIPE_UP:
2681
+ ret += HPDF_Dict_AddName (dict, "S", "Wipe");
2682
+ ret += HPDF_Dict_AddNumber (dict, "Di", 90);
2683
+ break;
2684
+ case HPDF_TS_WIPE_LEFT:
2685
+ ret += HPDF_Dict_AddName (dict, "S", "Wipe");
2686
+ ret += HPDF_Dict_AddNumber (dict, "Di", 180);
2687
+ break;
2688
+ case HPDF_TS_WIPE_DOWN:
2689
+ ret += HPDF_Dict_AddName (dict, "S", "Wipe");
2690
+ ret += HPDF_Dict_AddNumber (dict, "Di", 270);
2691
+ break;
2692
+ case HPDF_TS_BARN_DOORS_HORIZONTAL_OUT:
2693
+ ret += HPDF_Dict_AddName (dict, "S", "Split");
2694
+ ret += HPDF_Dict_AddName (dict, "Dm", "H");
2695
+ ret += HPDF_Dict_AddName (dict, "M", "O");
2696
+ break;
2697
+ case HPDF_TS_BARN_DOORS_HORIZONTAL_IN:
2698
+ ret += HPDF_Dict_AddName (dict, "S", "Split");
2699
+ ret += HPDF_Dict_AddName (dict, "Dm", "H");
2700
+ ret += HPDF_Dict_AddName (dict, "M", "I");
2701
+ break;
2702
+ case HPDF_TS_BARN_DOORS_VERTICAL_OUT:
2703
+ ret += HPDF_Dict_AddName (dict, "S", "Split");
2704
+ ret += HPDF_Dict_AddName (dict, "Dm", "V");
2705
+ ret += HPDF_Dict_AddName (dict, "M", "O");
2706
+ break;
2707
+ case HPDF_TS_BARN_DOORS_VERTICAL_IN:
2708
+ ret += HPDF_Dict_AddName (dict, "S", "Split");
2709
+ ret += HPDF_Dict_AddName (dict, "Dm", "V");
2710
+ ret += HPDF_Dict_AddName (dict, "M", "I");
2711
+ break;
2712
+ case HPDF_TS_BOX_OUT:
2713
+ ret += HPDF_Dict_AddName (dict, "S", "Box");
2714
+ ret += HPDF_Dict_AddName (dict, "M", "O");
2715
+ break;
2716
+ case HPDF_TS_BOX_IN:
2717
+ ret += HPDF_Dict_AddName (dict, "S", "Box");
2718
+ ret += HPDF_Dict_AddName (dict, "M", "I");
2719
+ break;
2720
+ case HPDF_TS_BLINDS_HORIZONTAL:
2721
+ ret += HPDF_Dict_AddName (dict, "S", "Blinds");
2722
+ ret += HPDF_Dict_AddName (dict, "Dm", "H");
2723
+ break;
2724
+ case HPDF_TS_BLINDS_VERTICAL:
2725
+ ret += HPDF_Dict_AddName (dict, "S", "Blinds");
2726
+ ret += HPDF_Dict_AddName (dict, "Dm", "V");
2727
+ break;
2728
+ case HPDF_TS_DISSOLVE:
2729
+ ret += HPDF_Dict_AddName (dict, "S", "Dissolve");
2730
+ break;
2731
+ case HPDF_TS_GLITTER_RIGHT:
2732
+ ret += HPDF_Dict_AddName (dict, "S", "Glitter");
2733
+ ret += HPDF_Dict_AddNumber (dict, "Di", 0);
2734
+ break;
2735
+ case HPDF_TS_GLITTER_DOWN:
2736
+ ret += HPDF_Dict_AddName (dict, "S", "Glitter");
2737
+ ret += HPDF_Dict_AddNumber (dict, "Di", 270);
2738
+ break;
2739
+ case HPDF_TS_GLITTER_TOP_LEFT_TO_BOTTOM_RIGHT:
2740
+ ret += HPDF_Dict_AddName (dict, "S", "Glitter");
2741
+ ret += HPDF_Dict_AddNumber (dict, "Di", 315);
2742
+ break;
2743
+ case HPDF_TS_REPLACE:
2744
+ ret += HPDF_Dict_AddName (dict, "S", "R");
2745
+ break;
2746
+ default:
2747
+ ret = HPDF_INVALID_PAGE_SLIDESHOW_TYPE;
2748
+ }
2749
+
2750
+ if (ret != HPDF_OK)
2751
+ goto Fail;
2752
+
2753
+ if ((ret = HPDF_Dict_AddReal (page, "Dur", disp_time)) != HPDF_OK)
2754
+ goto Fail;
2755
+
2756
+ if ((ret = HPDF_Dict_Add (page, "Trans", dict)) != HPDF_OK)
2757
+ return ret;
2758
+
2759
+ return HPDF_OK;
2760
+
2761
+ Fail:
2762
+ HPDF_Dict_Free (dict);
2763
+ return HPDF_Error_GetCode (page->error);
2764
+ }