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.
- data/History +57 -0
- data/License +25 -0
- data/README +165 -0
- data/examples/arc_demo.rb +82 -0
- data/examples/demo.rb +92 -0
- data/examples/encryption.rb +41 -0
- data/examples/ext_gstater_demo.rb +171 -0
- data/examples/font_demo.rb +67 -0
- data/examples/jpfont_demo.rb +122 -0
- data/examples/line_demo.rb +301 -0
- data/examples/slide_show_demo.rb +139 -0
- data/examples/text_demo2.rb +189 -0
- data/examples/ttfont_demo.rb +106 -0
- data/ext/extconf.rb +6 -0
- data/ext/hpdf.c +3779 -0
- data/ext/hpdf_annotation.c +415 -0
- data/ext/hpdf_array.c +344 -0
- data/ext/hpdf_binary.c +117 -0
- data/ext/hpdf_boolean.c +47 -0
- data/ext/hpdf_catalog.c +354 -0
- data/ext/hpdf_destination.c +339 -0
- data/ext/hpdf_dict.c +488 -0
- data/ext/hpdf_doc.c +2020 -0
- data/ext/hpdf_doc_png.c +137 -0
- data/ext/hpdf_encoder.c +2991 -0
- data/ext/hpdf_encoder_cns.c +36359 -0
- data/ext/hpdf_encoder_cnt.c +15307 -0
- data/ext/hpdf_encoder_jp.c +16125 -0
- data/ext/hpdf_encoder_kr.c +27978 -0
- data/ext/hpdf_encrypt.c +632 -0
- data/ext/hpdf_encryptdict.c +240 -0
- data/ext/hpdf_error.c +114 -0
- data/ext/hpdf_ext_gstate.c +150 -0
- data/ext/hpdf_font.c +229 -0
- data/ext/hpdf_font_cid.c +1030 -0
- data/ext/hpdf_font_tt.c +406 -0
- data/ext/hpdf_font_type1.c +391 -0
- data/ext/hpdf_fontdef.c +56 -0
- data/ext/hpdf_fontdef_base14.c +4506 -0
- data/ext/hpdf_fontdef_cid.c +194 -0
- data/ext/hpdf_fontdef_cns.c +471 -0
- data/ext/hpdf_fontdef_cnt.c +250 -0
- data/ext/hpdf_fontdef_jp.c +1904 -0
- data/ext/hpdf_fontdef_kr.c +1572 -0
- data/ext/hpdf_fontdef_tt.c +2230 -0
- data/ext/hpdf_fontdef_type1.c +524 -0
- data/ext/hpdf_gstate.c +119 -0
- data/ext/hpdf_image.c +568 -0
- data/ext/hpdf_image_png.c +424 -0
- data/ext/hpdf_info.c +164 -0
- data/ext/hpdf_list.c +333 -0
- data/ext/hpdf_mmgr.c +243 -0
- data/ext/hpdf_name.c +71 -0
- data/ext/hpdf_null.c +31 -0
- data/ext/hpdf_number.c +49 -0
- data/ext/hpdf_objects.c +172 -0
- data/ext/hpdf_outline.c +329 -0
- data/ext/hpdf_page_label.c +74 -0
- data/ext/hpdf_page_operator.c +2764 -0
- data/ext/hpdf_pages.c +1508 -0
- data/ext/hpdf_real.c +61 -0
- data/ext/hpdf_streams.c +1435 -0
- data/ext/hpdf_string.c +189 -0
- data/ext/hpdf_utils.c +438 -0
- data/ext/hpdf_xref.c +348 -0
- data/ext/include/hpdf.h +1227 -0
- data/ext/include/hpdf_annotation.h +74 -0
- data/ext/include/hpdf_catalog.h +81 -0
- data/ext/include/hpdf_conf.h +76 -0
- data/ext/include/hpdf_consts.h +549 -0
- data/ext/include/hpdf_destination.h +41 -0
- data/ext/include/hpdf_doc.h +159 -0
- data/ext/include/hpdf_encoder.h +311 -0
- data/ext/include/hpdf_encrypt.h +156 -0
- data/ext/include/hpdf_encryptdict.h +66 -0
- data/ext/include/hpdf_error.h +201 -0
- data/ext/include/hpdf_ext_gstate.h +38 -0
- data/ext/include/hpdf_font.h +112 -0
- data/ext/include/hpdf_fontdef.h +403 -0
- data/ext/include/hpdf_gstate.h +80 -0
- data/ext/include/hpdf_image.h +72 -0
- data/ext/include/hpdf_info.h +48 -0
- data/ext/include/hpdf_list.h +85 -0
- data/ext/include/hpdf_mmgr.h +82 -0
- data/ext/include/hpdf_objects.h +587 -0
- data/ext/include/hpdf_outline.h +74 -0
- data/ext/include/hpdf_page_label.h +35 -0
- data/ext/include/hpdf_pages.h +128 -0
- data/ext/include/hpdf_streams.h +276 -0
- data/ext/include/hpdf_types.h +488 -0
- data/ext/include/hpdf_utils.h +161 -0
- data/tests/arc_demo.rb +82 -0
- data/tests/demo.rb +91 -0
- data/tests/encryption.rb +41 -0
- data/tests/ext_gstater_demo.rb +171 -0
- data/tests/font_demo.rb +67 -0
- data/tests/line_demo.rb +301 -0
- data/tests/slide_show_demo.rb +139 -0
- data/tests/test_all_examples.rb +31 -0
- data/tests/text_demo2.rb +189 -0
- metadata +147 -0
data/ext/hpdf_font_tt.c
ADDED
@@ -0,0 +1,406 @@
|
|
1
|
+
/*
|
2
|
+
* << Haru Free PDF Library 2.0.3 >> -- hpdf_font_tt.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_font.h"
|
18
|
+
|
19
|
+
static HPDF_STATUS
|
20
|
+
OnWrite (HPDF_Dict obj,
|
21
|
+
HPDF_Stream stream);
|
22
|
+
|
23
|
+
static HPDF_STATUS
|
24
|
+
BeforeWrite (HPDF_Dict obj);
|
25
|
+
|
26
|
+
|
27
|
+
static void
|
28
|
+
OnFree (HPDF_Dict obj);
|
29
|
+
|
30
|
+
|
31
|
+
static HPDF_INT
|
32
|
+
CharWidth (HPDF_Font font,
|
33
|
+
HPDF_BYTE code);
|
34
|
+
|
35
|
+
static HPDF_TextWidth
|
36
|
+
TextWidth (HPDF_Font font,
|
37
|
+
const HPDF_BYTE *text,
|
38
|
+
HPDF_UINT len);
|
39
|
+
|
40
|
+
|
41
|
+
static HPDF_STATUS
|
42
|
+
CreateDescriptor (HPDF_Font font);
|
43
|
+
|
44
|
+
|
45
|
+
static HPDF_UINT
|
46
|
+
MeasureText (HPDF_Font font,
|
47
|
+
const HPDF_BYTE *text,
|
48
|
+
HPDF_UINT len,
|
49
|
+
HPDF_REAL width,
|
50
|
+
HPDF_REAL font_size,
|
51
|
+
HPDF_REAL char_space,
|
52
|
+
HPDF_REAL word_space,
|
53
|
+
HPDF_BOOL wordwrap,
|
54
|
+
HPDF_REAL *real_width);
|
55
|
+
|
56
|
+
|
57
|
+
HPDF_Font
|
58
|
+
HPDF_TTFont_New (HPDF_MMgr mmgr,
|
59
|
+
HPDF_FontDef fontdef,
|
60
|
+
HPDF_Encoder encoder,
|
61
|
+
HPDF_Xref xref)
|
62
|
+
{
|
63
|
+
HPDF_Dict font;
|
64
|
+
HPDF_FontAttr attr;
|
65
|
+
HPDF_TTFontDefAttr fontdef_attr;
|
66
|
+
HPDF_BasicEncoderAttr encoder_attr;
|
67
|
+
HPDF_STATUS ret = 0;
|
68
|
+
|
69
|
+
HPDF_PTRACE ((" HPDF_TTFont_New\n"));
|
70
|
+
|
71
|
+
font = HPDF_Dict_New (mmgr);
|
72
|
+
if (!font)
|
73
|
+
return NULL;
|
74
|
+
|
75
|
+
font->header.obj_class |= HPDF_OSUBCLASS_FONT;
|
76
|
+
|
77
|
+
/* check whether the fontdef object and the encoder object is valid. */
|
78
|
+
if (encoder->type != HPDF_ENCODER_TYPE_SINGLE_BYTE) {
|
79
|
+
HPDF_SetError(font->error, HPDF_INVALID_ENCODER_TYPE, 0);
|
80
|
+
return NULL;
|
81
|
+
}
|
82
|
+
|
83
|
+
if (fontdef->type != HPDF_FONTDEF_TYPE_TRUETYPE) {
|
84
|
+
HPDF_SetError(font->error, HPDF_INVALID_FONTDEF_TYPE, 0);
|
85
|
+
return NULL;
|
86
|
+
}
|
87
|
+
|
88
|
+
attr = HPDF_GetMem (mmgr, sizeof(HPDF_FontAttr_Rec));
|
89
|
+
if (!attr) {
|
90
|
+
HPDF_Dict_Free (font);
|
91
|
+
return NULL;
|
92
|
+
}
|
93
|
+
|
94
|
+
HPDF_MemSet (attr, 0, sizeof(HPDF_FontAttr_Rec));
|
95
|
+
|
96
|
+
font->header.obj_class |= HPDF_OSUBCLASS_FONT;
|
97
|
+
font->write_fn = OnWrite;
|
98
|
+
font->before_write_fn = BeforeWrite;
|
99
|
+
font->free_fn = OnFree;
|
100
|
+
font->attr = attr;
|
101
|
+
|
102
|
+
attr->type = HPDF_FONT_TRUETYPE;
|
103
|
+
attr->writing_mode = HPDF_WMODE_HORIZONTAL;
|
104
|
+
attr->text_width_fn = TextWidth;
|
105
|
+
attr->measure_text_fn = MeasureText;
|
106
|
+
attr->fontdef = fontdef;
|
107
|
+
attr->encoder = encoder;
|
108
|
+
attr->xref = xref;
|
109
|
+
|
110
|
+
/* singlebyte-font has a widths-array which is an array of 256 signed
|
111
|
+
* short integer.
|
112
|
+
* in the case of type1-font, widths-array for all letters is made in
|
113
|
+
* constructer. but in the case of true-type-font, the array is
|
114
|
+
* initialized at 0, and set when the corresponding character was used
|
115
|
+
* for the first time.
|
116
|
+
*/
|
117
|
+
attr->widths = HPDF_GetMem (mmgr, sizeof(HPDF_INT16) * 256);
|
118
|
+
if (!attr->widths) {
|
119
|
+
HPDF_Dict_Free (font);
|
120
|
+
return NULL;
|
121
|
+
}
|
122
|
+
|
123
|
+
HPDF_MemSet (attr->widths, 0, sizeof(HPDF_INT16) * 256);
|
124
|
+
|
125
|
+
attr->used = HPDF_GetMem (mmgr, sizeof(HPDF_BYTE) * 256);
|
126
|
+
if (!attr->used) {
|
127
|
+
HPDF_Dict_Free (font);
|
128
|
+
return NULL;
|
129
|
+
}
|
130
|
+
|
131
|
+
HPDF_MemSet (attr->used, 0, sizeof(HPDF_BYTE) * 256);
|
132
|
+
|
133
|
+
fontdef_attr = (HPDF_TTFontDefAttr)fontdef->attr;
|
134
|
+
|
135
|
+
ret += HPDF_Dict_AddName (font, "Type", "Font");
|
136
|
+
ret += HPDF_Dict_AddName (font, "BaseFont", fontdef_attr->base_font);
|
137
|
+
ret += HPDF_Dict_AddName (font, "Subtype", "TrueType");
|
138
|
+
|
139
|
+
encoder_attr = (HPDF_BasicEncoderAttr)encoder->attr;
|
140
|
+
|
141
|
+
ret += HPDF_Dict_AddNumber (font, "FirstChar", encoder_attr->first_char);
|
142
|
+
ret += HPDF_Dict_AddNumber (font, "LastChar", encoder_attr->last_char);
|
143
|
+
if (fontdef->missing_width != 0)
|
144
|
+
ret += HPDF_Dict_AddNumber (font, "MissingWidth",
|
145
|
+
fontdef->missing_width);
|
146
|
+
|
147
|
+
if (ret != HPDF_OK) {
|
148
|
+
HPDF_Dict_Free (font);
|
149
|
+
return NULL;
|
150
|
+
}
|
151
|
+
|
152
|
+
if (HPDF_Xref_Add (xref, font) != HPDF_OK)
|
153
|
+
return NULL;
|
154
|
+
|
155
|
+
return font;
|
156
|
+
}
|
157
|
+
|
158
|
+
|
159
|
+
static HPDF_STATUS
|
160
|
+
CreateDescriptor (HPDF_Font font)
|
161
|
+
{
|
162
|
+
HPDF_FontAttr font_attr = (HPDF_FontAttr)font->attr;
|
163
|
+
HPDF_FontDef def = font_attr->fontdef;
|
164
|
+
HPDF_TTFontDefAttr def_attr = (HPDF_TTFontDefAttr)def->attr;
|
165
|
+
|
166
|
+
HPDF_PTRACE ((" HPDF_TTFont_CreateDescriptor\n"));
|
167
|
+
|
168
|
+
if (!font_attr->fontdef->descriptor) {
|
169
|
+
HPDF_Dict descriptor = HPDF_Dict_New (font->mmgr);
|
170
|
+
HPDF_STATUS ret = 0;
|
171
|
+
HPDF_Array array;
|
172
|
+
|
173
|
+
if (!descriptor)
|
174
|
+
return HPDF_Error_GetCode (font->error);
|
175
|
+
|
176
|
+
ret += HPDF_Xref_Add (font_attr->xref, descriptor);
|
177
|
+
ret += HPDF_Dict_AddName (descriptor, "Type", "FontDescriptor");
|
178
|
+
ret += HPDF_Dict_AddNumber (descriptor, "Ascent", def->ascent);
|
179
|
+
ret += HPDF_Dict_AddNumber (descriptor, "Descent", def->descent);
|
180
|
+
ret += HPDF_Dict_AddNumber (descriptor, "Flags", def->flags);
|
181
|
+
|
182
|
+
array = HPDF_Box_Array_New (font->mmgr, def->font_bbox);
|
183
|
+
ret += HPDF_Dict_Add (descriptor, "FontBBox", array);
|
184
|
+
|
185
|
+
ret += HPDF_Dict_AddName (descriptor, "FontName", def_attr->base_font);
|
186
|
+
ret += HPDF_Dict_AddNumber (descriptor, "ItalicAngle",
|
187
|
+
def->italic_angle);
|
188
|
+
ret += HPDF_Dict_AddNumber (descriptor, "StemV", def->stemv);
|
189
|
+
ret += HPDF_Dict_AddNumber (descriptor, "XHeight", def->x_height);
|
190
|
+
|
191
|
+
if (def_attr->char_set)
|
192
|
+
ret += HPDF_Dict_AddName (descriptor, "CharSet",
|
193
|
+
def_attr->char_set);
|
194
|
+
|
195
|
+
if (ret != HPDF_OK)
|
196
|
+
return HPDF_Error_GetCode (font->error);
|
197
|
+
|
198
|
+
if (def_attr->embedding) {
|
199
|
+
HPDF_Dict font_data = HPDF_DictStream_New (font->mmgr,
|
200
|
+
font_attr->xref);
|
201
|
+
|
202
|
+
if (!font_data)
|
203
|
+
return HPDF_Error_GetCode (font->error);
|
204
|
+
|
205
|
+
if (HPDF_TTFontDef_SaveFontData (font_attr->fontdef,
|
206
|
+
font_data->stream) != HPDF_OK)
|
207
|
+
return HPDF_Error_GetCode (font->error);
|
208
|
+
|
209
|
+
ret += HPDF_Dict_Add (descriptor, "FontFile2", font_data);
|
210
|
+
ret += HPDF_Dict_AddNumber (font_data, "Length1",
|
211
|
+
def_attr->length1);
|
212
|
+
ret += HPDF_Dict_AddNumber (font_data, "Length2", 0);
|
213
|
+
ret += HPDF_Dict_AddNumber (font_data, "Length3", 0);
|
214
|
+
|
215
|
+
font_data->filter = font->filter;
|
216
|
+
}
|
217
|
+
|
218
|
+
if (ret != HPDF_OK)
|
219
|
+
return HPDF_Error_GetCode (font->error);
|
220
|
+
|
221
|
+
font_attr->fontdef->descriptor = descriptor;
|
222
|
+
}
|
223
|
+
|
224
|
+
return HPDF_Dict_Add (font, "FontDescriptor",
|
225
|
+
font_attr->fontdef->descriptor);
|
226
|
+
}
|
227
|
+
|
228
|
+
|
229
|
+
static HPDF_INT
|
230
|
+
CharWidth (HPDF_Font font,
|
231
|
+
HPDF_BYTE code)
|
232
|
+
{
|
233
|
+
HPDF_FontAttr attr = (HPDF_FontAttr)font->attr;
|
234
|
+
|
235
|
+
if (attr->used[code] == 0) {
|
236
|
+
HPDF_UNICODE unicode = HPDF_Encoder_ToUnicode (attr->encoder, code);
|
237
|
+
|
238
|
+
attr->used[code] = 1;
|
239
|
+
attr->widths[code] = HPDF_TTFontDef_GetCharWidth(attr->fontdef,
|
240
|
+
unicode);
|
241
|
+
}
|
242
|
+
|
243
|
+
return attr->widths[code];
|
244
|
+
}
|
245
|
+
|
246
|
+
|
247
|
+
HPDF_TextWidth
|
248
|
+
TextWidth (HPDF_Font font,
|
249
|
+
const HPDF_BYTE *text,
|
250
|
+
HPDF_UINT len)
|
251
|
+
{
|
252
|
+
HPDF_FontAttr attr = (HPDF_FontAttr)font->attr;
|
253
|
+
HPDF_TextWidth ret = {0, 0, 0, 0};
|
254
|
+
HPDF_UINT i;
|
255
|
+
HPDF_BYTE b = 0;
|
256
|
+
|
257
|
+
HPDF_PTRACE ((" HPDF_TTFont_TextWidth\n"));
|
258
|
+
|
259
|
+
if (attr->widths) {
|
260
|
+
for (i = 0; i < len; i++) {
|
261
|
+
b = text[i];
|
262
|
+
ret.numchars++;
|
263
|
+
ret.width += CharWidth (font, b);
|
264
|
+
|
265
|
+
if (HPDF_IS_WHITE_SPACE(b)) {
|
266
|
+
ret.numspace++;
|
267
|
+
ret.numwords++;
|
268
|
+
}
|
269
|
+
}
|
270
|
+
} else
|
271
|
+
HPDF_SetError (font->error, HPDF_FONT_INVALID_WIDTHS_TABLE, 0);
|
272
|
+
|
273
|
+
/* 2006.08.19 add. */
|
274
|
+
if (HPDF_IS_WHITE_SPACE(b))
|
275
|
+
; /* do nothing. */
|
276
|
+
else
|
277
|
+
ret.numwords++;
|
278
|
+
|
279
|
+
return ret;
|
280
|
+
}
|
281
|
+
|
282
|
+
|
283
|
+
HPDF_UINT
|
284
|
+
MeasureText (HPDF_Font font,
|
285
|
+
const HPDF_BYTE *text,
|
286
|
+
HPDF_UINT len,
|
287
|
+
HPDF_REAL width,
|
288
|
+
HPDF_REAL font_size,
|
289
|
+
HPDF_REAL char_space,
|
290
|
+
HPDF_REAL word_space,
|
291
|
+
HPDF_BOOL wordwrap,
|
292
|
+
HPDF_REAL *real_width)
|
293
|
+
{
|
294
|
+
HPDF_DOUBLE w = 0;
|
295
|
+
HPDF_UINT tmp_len = 0;
|
296
|
+
HPDF_UINT i;
|
297
|
+
|
298
|
+
HPDF_PTRACE ((" HPDF_TTFont_MeasureText\n"));
|
299
|
+
|
300
|
+
for (i = 0; i < len; i++) {
|
301
|
+
HPDF_BYTE b = text[i];
|
302
|
+
|
303
|
+
if (HPDF_IS_WHITE_SPACE(b)) {
|
304
|
+
tmp_len = i + 1;
|
305
|
+
|
306
|
+
if (real_width)
|
307
|
+
*real_width = w;
|
308
|
+
|
309
|
+
w += word_space;
|
310
|
+
} else if (!wordwrap) {
|
311
|
+
tmp_len = i;
|
312
|
+
|
313
|
+
if (real_width)
|
314
|
+
*real_width = w;
|
315
|
+
}
|
316
|
+
|
317
|
+
w += (HPDF_DOUBLE)CharWidth (font, b) * font_size / 1000;
|
318
|
+
|
319
|
+
/* 2006.08.04 break when it encountered line feed */
|
320
|
+
if (w > width || b == 0x0A)
|
321
|
+
return tmp_len;
|
322
|
+
|
323
|
+
if (i > 0)
|
324
|
+
w += char_space;
|
325
|
+
}
|
326
|
+
|
327
|
+
/* all of text can be put in the specified width */
|
328
|
+
if (real_width)
|
329
|
+
*real_width = w;
|
330
|
+
return len;
|
331
|
+
}
|
332
|
+
|
333
|
+
|
334
|
+
static HPDF_STATUS
|
335
|
+
OnWrite (HPDF_Dict obj,
|
336
|
+
HPDF_Stream stream)
|
337
|
+
{
|
338
|
+
HPDF_FontAttr attr = (HPDF_FontAttr)obj->attr;
|
339
|
+
HPDF_BasicEncoderAttr encoder_attr =
|
340
|
+
(HPDF_BasicEncoderAttr)attr->encoder->attr;
|
341
|
+
HPDF_UINT i;
|
342
|
+
HPDF_STATUS ret;
|
343
|
+
char buf[128];
|
344
|
+
char *pbuf = buf;
|
345
|
+
char *eptr = buf + 127;
|
346
|
+
|
347
|
+
HPDF_PTRACE ((" HPDF_Font_OnWrite\n"));
|
348
|
+
|
349
|
+
/* Widths entry */
|
350
|
+
if ((ret = HPDF_Stream_WriteEscapeName (stream, "Widths")) != HPDF_OK)
|
351
|
+
return ret;
|
352
|
+
|
353
|
+
if ((ret = HPDF_Stream_WriteStr (stream, " [\012")) != HPDF_OK)
|
354
|
+
return ret;
|
355
|
+
|
356
|
+
for (i = encoder_attr->first_char; i <= encoder_attr->last_char; i++) {
|
357
|
+
|
358
|
+
pbuf = HPDF_IToA (pbuf, attr->widths[i], eptr);
|
359
|
+
*pbuf++ = ' ';
|
360
|
+
|
361
|
+
if ((i + 1) % 16 == 0) {
|
362
|
+
HPDF_StrCpy(pbuf, "\012", eptr);
|
363
|
+
if ((ret = HPDF_Stream_WriteStr (stream, buf)) != HPDF_OK)
|
364
|
+
return ret;
|
365
|
+
pbuf = buf;
|
366
|
+
}
|
367
|
+
|
368
|
+
}
|
369
|
+
|
370
|
+
HPDF_StrCpy (pbuf, "]\012", eptr);
|
371
|
+
|
372
|
+
if ((ret = HPDF_Stream_WriteStr (stream, buf)) != HPDF_OK)
|
373
|
+
return ret;
|
374
|
+
|
375
|
+
return attr->encoder->write_fn (attr->encoder, stream);
|
376
|
+
}
|
377
|
+
|
378
|
+
static HPDF_STATUS
|
379
|
+
BeforeWrite (HPDF_Dict obj)
|
380
|
+
{
|
381
|
+
HPDF_PTRACE ((" HPDF_TTFont_BeforeWrite\n"));
|
382
|
+
|
383
|
+
return CreateDescriptor (obj);
|
384
|
+
}
|
385
|
+
|
386
|
+
static void
|
387
|
+
OnFree (HPDF_Dict obj)
|
388
|
+
{
|
389
|
+
HPDF_FontAttr attr = (HPDF_FontAttr)obj->attr;
|
390
|
+
|
391
|
+
HPDF_PTRACE ((" HPDF_TTFont_OnFree\n"));
|
392
|
+
|
393
|
+
if (attr) {
|
394
|
+
if (attr->widths) {
|
395
|
+
HPDF_FreeMem (obj->mmgr, attr->widths);
|
396
|
+
}
|
397
|
+
|
398
|
+
if (attr->used) {
|
399
|
+
HPDF_FreeMem (obj->mmgr, attr->used);
|
400
|
+
}
|
401
|
+
|
402
|
+
HPDF_FreeMem (obj->mmgr, attr);
|
403
|
+
}
|
404
|
+
}
|
405
|
+
|
406
|
+
|
@@ -0,0 +1,391 @@
|
|
1
|
+
/*
|
2
|
+
* << Haru Free PDF Library 2.0.3 >> -- hpdf_font_type1.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_font.h"
|
18
|
+
|
19
|
+
static HPDF_STATUS
|
20
|
+
Type1Font_OnWrite (HPDF_Dict obj,
|
21
|
+
HPDF_Stream stream);
|
22
|
+
|
23
|
+
|
24
|
+
static void
|
25
|
+
Type1Font_OnFree (HPDF_Dict obj);
|
26
|
+
|
27
|
+
|
28
|
+
static HPDF_TextWidth
|
29
|
+
Type1Font_TextWidth (HPDF_Font font,
|
30
|
+
const HPDF_BYTE *text,
|
31
|
+
HPDF_UINT len);
|
32
|
+
|
33
|
+
|
34
|
+
static HPDF_UINT
|
35
|
+
Type1Font_MeasureText (HPDF_Font font,
|
36
|
+
const HPDF_BYTE *text,
|
37
|
+
HPDF_UINT len,
|
38
|
+
HPDF_REAL width,
|
39
|
+
HPDF_REAL font_size,
|
40
|
+
HPDF_REAL char_space,
|
41
|
+
HPDF_REAL word_space,
|
42
|
+
HPDF_BOOL wordwrap,
|
43
|
+
HPDF_REAL *real_width);
|
44
|
+
|
45
|
+
|
46
|
+
static HPDF_STATUS
|
47
|
+
Type1Font_CreateDescriptor (HPDF_MMgr mmgr,
|
48
|
+
HPDF_Font font,
|
49
|
+
HPDF_Xref xref);
|
50
|
+
|
51
|
+
|
52
|
+
HPDF_Font
|
53
|
+
HPDF_Type1Font_New (HPDF_MMgr mmgr,
|
54
|
+
HPDF_FontDef fontdef,
|
55
|
+
HPDF_Encoder encoder,
|
56
|
+
HPDF_Xref xref)
|
57
|
+
{
|
58
|
+
HPDF_Dict font;
|
59
|
+
HPDF_FontAttr attr;
|
60
|
+
HPDF_Type1FontDefAttr fontdef_attr;
|
61
|
+
HPDF_BasicEncoderAttr encoder_attr;
|
62
|
+
HPDF_STATUS ret = 0;
|
63
|
+
HPDF_UINT i;
|
64
|
+
|
65
|
+
HPDF_PTRACE ((" HPDF_Type1Font_New\n"));
|
66
|
+
|
67
|
+
/* check whether the fontdef object and the encoder object is valid. */
|
68
|
+
if (encoder->type != HPDF_ENCODER_TYPE_SINGLE_BYTE) {
|
69
|
+
HPDF_SetError(mmgr->error, HPDF_INVALID_ENCODER_TYPE, 0);
|
70
|
+
return NULL;
|
71
|
+
}
|
72
|
+
|
73
|
+
if (fontdef->type != HPDF_FONTDEF_TYPE_TYPE1) {
|
74
|
+
HPDF_SetError(mmgr->error, HPDF_INVALID_FONTDEF_TYPE, 0);
|
75
|
+
return NULL;
|
76
|
+
}
|
77
|
+
|
78
|
+
font = HPDF_Dict_New (mmgr);
|
79
|
+
if (!font)
|
80
|
+
return NULL;
|
81
|
+
|
82
|
+
font->header.obj_class |= HPDF_OSUBCLASS_FONT;
|
83
|
+
|
84
|
+
attr = HPDF_GetMem (mmgr, sizeof(HPDF_FontAttr_Rec));
|
85
|
+
if (!attr) {
|
86
|
+
HPDF_Dict_Free (font);
|
87
|
+
return NULL;
|
88
|
+
}
|
89
|
+
|
90
|
+
font->header.obj_class |= HPDF_OSUBCLASS_FONT;
|
91
|
+
font->write_fn = Type1Font_OnWrite;
|
92
|
+
font->free_fn = Type1Font_OnFree;
|
93
|
+
|
94
|
+
HPDF_MemSet (attr, 0, sizeof(HPDF_FontAttr_Rec));
|
95
|
+
|
96
|
+
font->attr = attr;
|
97
|
+
attr->type = HPDF_FONT_TYPE1;
|
98
|
+
attr->writing_mode = HPDF_WMODE_HORIZONTAL;
|
99
|
+
attr->text_width_fn = Type1Font_TextWidth;
|
100
|
+
attr->measure_text_fn = Type1Font_MeasureText;
|
101
|
+
attr->fontdef = fontdef;
|
102
|
+
attr->encoder = encoder;
|
103
|
+
attr->xref = xref;
|
104
|
+
|
105
|
+
/* singlebyte-font has a widths-array which is an array of 256 signed
|
106
|
+
* short integer.
|
107
|
+
*/
|
108
|
+
attr->widths = HPDF_GetMem (mmgr, sizeof(HPDF_INT16) * 256);
|
109
|
+
if (!attr->widths) {
|
110
|
+
HPDF_Dict_Free (font);
|
111
|
+
return NULL;
|
112
|
+
}
|
113
|
+
|
114
|
+
encoder_attr = (HPDF_BasicEncoderAttr)encoder->attr;
|
115
|
+
|
116
|
+
HPDF_MemSet (attr->widths, 0, sizeof(HPDF_INT16) * 256);
|
117
|
+
for (i = encoder_attr->first_char; i <= encoder_attr->last_char; i++) {
|
118
|
+
HPDF_UNICODE u = encoder_attr->unicode_map[i];
|
119
|
+
|
120
|
+
HPDF_UINT16 w = HPDF_Type1FontDef_GetWidth (fontdef, u);
|
121
|
+
attr->widths[i] = w;
|
122
|
+
}
|
123
|
+
|
124
|
+
fontdef_attr = (HPDF_Type1FontDefAttr)fontdef->attr;
|
125
|
+
|
126
|
+
ret += HPDF_Dict_AddName (font, "Type", "Font");
|
127
|
+
ret += HPDF_Dict_AddName (font, "BaseFont", fontdef->base_font);
|
128
|
+
ret += HPDF_Dict_AddName (font, "Subtype", "Type1");
|
129
|
+
|
130
|
+
if (!fontdef_attr->is_base14font) {
|
131
|
+
if (fontdef->missing_width != 0)
|
132
|
+
ret += HPDF_Dict_AddNumber (font, "MissingWidth",
|
133
|
+
fontdef->missing_width);
|
134
|
+
|
135
|
+
ret += Type1Font_CreateDescriptor (mmgr, font, xref);
|
136
|
+
}
|
137
|
+
|
138
|
+
if (ret != HPDF_OK) {
|
139
|
+
HPDF_Dict_Free (font);
|
140
|
+
return NULL;
|
141
|
+
}
|
142
|
+
|
143
|
+
if (HPDF_Xref_Add (xref, font) != HPDF_OK)
|
144
|
+
return NULL;
|
145
|
+
|
146
|
+
return font;
|
147
|
+
}
|
148
|
+
|
149
|
+
|
150
|
+
static HPDF_STATUS
|
151
|
+
Type1Font_CreateDescriptor (HPDF_MMgr mmgr,
|
152
|
+
HPDF_Font font,
|
153
|
+
HPDF_Xref xref)
|
154
|
+
{
|
155
|
+
HPDF_FontAttr font_attr = (HPDF_FontAttr)font->attr;
|
156
|
+
HPDF_FontDef def = font_attr->fontdef;
|
157
|
+
HPDF_Type1FontDefAttr def_attr = (HPDF_Type1FontDefAttr)def->attr;
|
158
|
+
|
159
|
+
HPDF_PTRACE ((" HPDF_Type1Font_CreateDescriptor\n"));
|
160
|
+
|
161
|
+
if (!font_attr->fontdef->descriptor) {
|
162
|
+
HPDF_Dict descriptor = HPDF_Dict_New (mmgr);
|
163
|
+
HPDF_STATUS ret = 0;
|
164
|
+
HPDF_Array array;
|
165
|
+
|
166
|
+
if (!descriptor)
|
167
|
+
return HPDF_Error_GetCode (font->error);
|
168
|
+
|
169
|
+
ret += HPDF_Xref_Add (xref, descriptor);
|
170
|
+
ret += HPDF_Dict_AddName (descriptor, "Type", "FontDescriptor");
|
171
|
+
ret += HPDF_Dict_AddNumber (descriptor, "Ascent", def->ascent);
|
172
|
+
ret += HPDF_Dict_AddNumber (descriptor, "Descent", def->descent);
|
173
|
+
ret += HPDF_Dict_AddNumber (descriptor, "Flags", def->flags);
|
174
|
+
|
175
|
+
array = HPDF_Box_Array_New (mmgr, def->font_bbox);
|
176
|
+
ret += HPDF_Dict_Add (descriptor, "FontBBox", array);
|
177
|
+
|
178
|
+
ret += HPDF_Dict_AddName (descriptor, "FontName",
|
179
|
+
font_attr->fontdef->base_font);
|
180
|
+
ret += HPDF_Dict_AddNumber (descriptor, "ItalicAngle",
|
181
|
+
def->italic_angle);
|
182
|
+
ret += HPDF_Dict_AddNumber (descriptor, "StemV", def->stemv);
|
183
|
+
ret += HPDF_Dict_AddNumber (descriptor, "XHeight", def->x_height);
|
184
|
+
|
185
|
+
if (def_attr->char_set)
|
186
|
+
ret += HPDF_Dict_AddName (descriptor, "CharSet",
|
187
|
+
def_attr->char_set);
|
188
|
+
|
189
|
+
if (ret != HPDF_OK)
|
190
|
+
return HPDF_Error_GetCode (font->error);
|
191
|
+
|
192
|
+
if (def_attr->font_data) {
|
193
|
+
HPDF_Dict font_data = HPDF_DictStream_New (mmgr, xref);
|
194
|
+
|
195
|
+
if (!font_data)
|
196
|
+
return HPDF_Error_GetCode (font->error);
|
197
|
+
|
198
|
+
if (HPDF_Stream_WriteToStream (def_attr->font_data,
|
199
|
+
font_data->stream, HPDF_STREAM_FILTER_NONE, NULL) != HPDF_OK)
|
200
|
+
return HPDF_Error_GetCode (font->error);
|
201
|
+
|
202
|
+
ret += HPDF_Dict_Add (descriptor, "FontFile", font_data);
|
203
|
+
ret += HPDF_Dict_AddNumber (font_data, "Length1",
|
204
|
+
def_attr->length1);
|
205
|
+
ret += HPDF_Dict_AddNumber (font_data, "Length2",
|
206
|
+
def_attr->length2);
|
207
|
+
ret += HPDF_Dict_AddNumber (font_data, "Length3",
|
208
|
+
def_attr->length3);
|
209
|
+
|
210
|
+
font_data->filter = font->filter;
|
211
|
+
}
|
212
|
+
|
213
|
+
if (ret != HPDF_OK)
|
214
|
+
return HPDF_Error_GetCode (font->error);
|
215
|
+
|
216
|
+
font_attr->fontdef->descriptor = descriptor;
|
217
|
+
}
|
218
|
+
|
219
|
+
return HPDF_Dict_Add (font, "FontDescriptor",
|
220
|
+
font_attr->fontdef->descriptor);
|
221
|
+
}
|
222
|
+
|
223
|
+
|
224
|
+
static HPDF_TextWidth
|
225
|
+
Type1Font_TextWidth (HPDF_Font font,
|
226
|
+
const HPDF_BYTE *text,
|
227
|
+
HPDF_UINT len)
|
228
|
+
{
|
229
|
+
HPDF_FontAttr attr = (HPDF_FontAttr)font->attr;
|
230
|
+
HPDF_TextWidth ret = {0, 0, 0, 0};
|
231
|
+
HPDF_UINT i;
|
232
|
+
HPDF_BYTE b = 0;
|
233
|
+
|
234
|
+
HPDF_PTRACE ((" HPDF_Type1Font_TextWidth\n"));
|
235
|
+
|
236
|
+
if (attr->widths) {
|
237
|
+
for (i = 0; i < len; i++) {
|
238
|
+
b = text[i];
|
239
|
+
ret.numchars++;
|
240
|
+
ret.width += attr->widths[b];
|
241
|
+
|
242
|
+
if (HPDF_IS_WHITE_SPACE(b)) {
|
243
|
+
ret.numspace++;
|
244
|
+
ret.numwords++;
|
245
|
+
}
|
246
|
+
}
|
247
|
+
} else
|
248
|
+
HPDF_SetError (font->error, HPDF_FONT_INVALID_WIDTHS_TABLE, 0);
|
249
|
+
|
250
|
+
/* 2006.08.19 add. */
|
251
|
+
if (HPDF_IS_WHITE_SPACE(b))
|
252
|
+
; /* do nothing. */
|
253
|
+
else
|
254
|
+
ret.numwords++;
|
255
|
+
|
256
|
+
return ret;
|
257
|
+
}
|
258
|
+
|
259
|
+
|
260
|
+
static HPDF_UINT
|
261
|
+
Type1Font_MeasureText (HPDF_Font font,
|
262
|
+
const HPDF_BYTE *text,
|
263
|
+
HPDF_UINT len,
|
264
|
+
HPDF_REAL width,
|
265
|
+
HPDF_REAL font_size,
|
266
|
+
HPDF_REAL char_space,
|
267
|
+
HPDF_REAL word_space,
|
268
|
+
HPDF_BOOL wordwrap,
|
269
|
+
HPDF_REAL *real_width)
|
270
|
+
{
|
271
|
+
HPDF_REAL w = 0;
|
272
|
+
HPDF_UINT tmp_len = 0;
|
273
|
+
HPDF_UINT i;
|
274
|
+
HPDF_FontAttr attr = (HPDF_FontAttr)font->attr;
|
275
|
+
|
276
|
+
HPDF_PTRACE ((" HPDF_Type1Font_MeasureText\n"));
|
277
|
+
|
278
|
+
for (i = 0; i < len; i++) {
|
279
|
+
HPDF_BYTE b = text[i];
|
280
|
+
|
281
|
+
if (HPDF_IS_WHITE_SPACE(b)) {
|
282
|
+
tmp_len = i + 1;
|
283
|
+
|
284
|
+
if (real_width)
|
285
|
+
*real_width = w;
|
286
|
+
|
287
|
+
w += word_space;
|
288
|
+
} else if (!wordwrap) {
|
289
|
+
tmp_len = i;
|
290
|
+
|
291
|
+
if (real_width)
|
292
|
+
*real_width = w;
|
293
|
+
}
|
294
|
+
|
295
|
+
w += attr->widths[b] * font_size / 1000;
|
296
|
+
|
297
|
+
/* 2006.08.04 break when it encountered line feed */
|
298
|
+
if (w > width || b == 0x0A)
|
299
|
+
return tmp_len;
|
300
|
+
|
301
|
+
if (i > 0)
|
302
|
+
w += char_space;
|
303
|
+
}
|
304
|
+
|
305
|
+
/* all of text can be put in the specified width */
|
306
|
+
if (real_width)
|
307
|
+
*real_width = w;
|
308
|
+
|
309
|
+
return len;
|
310
|
+
}
|
311
|
+
|
312
|
+
|
313
|
+
static HPDF_STATUS
|
314
|
+
Type1Font_OnWrite (HPDF_Dict obj,
|
315
|
+
HPDF_Stream stream)
|
316
|
+
{
|
317
|
+
HPDF_FontAttr attr = (HPDF_FontAttr)obj->attr;
|
318
|
+
HPDF_Type1FontDefAttr fontdef_attr =
|
319
|
+
(HPDF_Type1FontDefAttr)attr->fontdef->attr;
|
320
|
+
HPDF_BasicEncoderAttr encoder_attr =
|
321
|
+
(HPDF_BasicEncoderAttr)attr->encoder->attr;
|
322
|
+
HPDF_UINT i;
|
323
|
+
HPDF_STATUS ret;
|
324
|
+
char buf[HPDF_TMP_BUF_SIZ];
|
325
|
+
char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
|
326
|
+
|
327
|
+
HPDF_PTRACE ((" HPDF_Font_Type1Font_OnWrite\n"));
|
328
|
+
|
329
|
+
/* if font is base14-font these entries is not required */
|
330
|
+
if (!fontdef_attr->is_base14font || encoder_attr->has_differences) {
|
331
|
+
char *pbuf;
|
332
|
+
|
333
|
+
pbuf = HPDF_StrCpy (buf, "/FirstChar ", eptr);
|
334
|
+
pbuf = HPDF_IToA (pbuf, encoder_attr->first_char, eptr);
|
335
|
+
HPDF_StrCpy (pbuf, "\012", eptr);
|
336
|
+
if ((ret = HPDF_Stream_WriteStr (stream, buf)) != HPDF_OK)
|
337
|
+
return ret;
|
338
|
+
|
339
|
+
pbuf = HPDF_StrCpy (buf, "/LastChar ", eptr);
|
340
|
+
pbuf = HPDF_IToA (pbuf, encoder_attr->last_char, eptr);
|
341
|
+
HPDF_StrCpy (pbuf, "\012", eptr);
|
342
|
+
if ((ret = HPDF_Stream_WriteStr (stream, buf)) != HPDF_OK)
|
343
|
+
return ret;
|
344
|
+
|
345
|
+
/* Widths entry */
|
346
|
+
if ((ret = HPDF_Stream_WriteEscapeName (stream, "Widths")) != HPDF_OK)
|
347
|
+
return ret;
|
348
|
+
|
349
|
+
if ((ret = HPDF_Stream_WriteStr (stream, " [\012")) != HPDF_OK)
|
350
|
+
return ret;
|
351
|
+
|
352
|
+
pbuf = buf;
|
353
|
+
for (i = encoder_attr->first_char; i <= encoder_attr->last_char; i++) {
|
354
|
+
|
355
|
+
pbuf = HPDF_IToA (pbuf, attr->widths[i], eptr);
|
356
|
+
*pbuf++ = ' ';
|
357
|
+
|
358
|
+
if ((i + 1) % 16 == 0) {
|
359
|
+
HPDF_StrCpy(pbuf, "\012", eptr);
|
360
|
+
if ((ret = HPDF_Stream_WriteStr (stream, buf)) != HPDF_OK)
|
361
|
+
return ret;
|
362
|
+
pbuf = buf;
|
363
|
+
}
|
364
|
+
}
|
365
|
+
|
366
|
+
HPDF_StrCpy (pbuf, "]\012", eptr);
|
367
|
+
|
368
|
+
if ((ret = HPDF_Stream_WriteStr (stream, buf)) != HPDF_OK)
|
369
|
+
return ret;
|
370
|
+
}
|
371
|
+
|
372
|
+
return attr->encoder->write_fn (attr->encoder, stream);
|
373
|
+
}
|
374
|
+
|
375
|
+
|
376
|
+
static void
|
377
|
+
Type1Font_OnFree (HPDF_Dict obj)
|
378
|
+
{
|
379
|
+
HPDF_FontAttr attr = (HPDF_FontAttr)obj->attr;
|
380
|
+
|
381
|
+
HPDF_PTRACE ((" HPDF_Type1Font_OnFree\n"));
|
382
|
+
|
383
|
+
if (attr) {
|
384
|
+
if (attr->widths) {
|
385
|
+
HPDF_FreeMem (obj->mmgr, attr->widths);
|
386
|
+
}
|
387
|
+
HPDF_FreeMem (obj->mmgr, attr);
|
388
|
+
}
|
389
|
+
}
|
390
|
+
|
391
|
+
|