hpdf 2.0.8

Sign up to get free protection for your applications and to get access to all the features.
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
+ }