| 1 | /* |
| 2 | * << Haru Free PDF Library >> -- hpdf_font.c |
| 3 | * |
| 4 | * URL: http://libharu.org |
| 5 | * |
| 6 | * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp> |
| 7 | * Copyright (c) 2007-2009 Antony Dovgal <tony@daylessday.org> |
| 8 | * |
| 9 | * Permission to use, copy, modify, distribute and sell this software |
| 10 | * and its documentation for any purpose is hereby granted without fee, |
| 11 | * provided that the above copyright notice appear in all copies and |
| 12 | * that both that copyright notice and this permission notice appear |
| 13 | * in supporting documentation. |
| 14 | * It is provided "as is" without express or implied warranty. |
| 15 | * |
| 16 | */ |
| 17 | |
| 18 | #include "hpdf_conf.h" |
| 19 | #include "hpdf_utils.h" |
| 20 | #include "hpdf.h" |
| 21 | |
| 22 | |
| 23 | HPDF_EXPORT(HPDF_TextWidth) |
| 24 | HPDF_Font_TextWidth (HPDF_Font font, |
| 25 | const HPDF_BYTE *text, |
| 26 | HPDF_UINT len) |
| 27 | { |
| 28 | HPDF_TextWidth tw = {0, 0, 0, 0}; |
| 29 | HPDF_FontAttr attr; |
| 30 | |
| 31 | HPDF_PTRACE ((" HPDF_Font_TextWidth\n" )); |
| 32 | |
| 33 | if (!HPDF_Font_Validate(font)) |
| 34 | return tw; |
| 35 | |
| 36 | if (len > HPDF_LIMIT_MAX_STRING_LEN) { |
| 37 | HPDF_RaiseError (font->error, HPDF_STRING_OUT_OF_RANGE, 0); |
| 38 | return tw; |
| 39 | } |
| 40 | |
| 41 | attr = (HPDF_FontAttr)font->attr; |
| 42 | |
| 43 | if (!attr->text_width_fn) { |
| 44 | HPDF_SetError (font->error, HPDF_INVALID_OBJECT, 0); |
| 45 | return tw; |
| 46 | } |
| 47 | |
| 48 | tw = attr->text_width_fn (font, text, len); |
| 49 | |
| 50 | return tw; |
| 51 | } |
| 52 | |
| 53 | |
| 54 | HPDF_EXPORT(HPDF_UINT) |
| 55 | HPDF_Font_MeasureText (HPDF_Font font, |
| 56 | const HPDF_BYTE *text, |
| 57 | HPDF_UINT len, |
| 58 | HPDF_REAL width, |
| 59 | HPDF_REAL font_size, |
| 60 | HPDF_REAL char_space, |
| 61 | HPDF_REAL word_space, |
| 62 | HPDF_BOOL wordwrap, |
| 63 | HPDF_REAL *real_width) |
| 64 | { |
| 65 | HPDF_FontAttr attr; |
| 66 | |
| 67 | HPDF_PTRACE ((" HPDF_Font_MeasureText\n" )); |
| 68 | |
| 69 | if (!HPDF_Font_Validate(font)) |
| 70 | return 0; |
| 71 | |
| 72 | if (len > HPDF_LIMIT_MAX_STRING_LEN) { |
| 73 | HPDF_RaiseError (font->error, HPDF_STRING_OUT_OF_RANGE, 0); |
| 74 | return 0; |
| 75 | } |
| 76 | |
| 77 | attr = (HPDF_FontAttr)font->attr; |
| 78 | |
| 79 | if (!attr->measure_text_fn) { |
| 80 | HPDF_RaiseError (font->error, HPDF_INVALID_OBJECT, 0); |
| 81 | return 0; |
| 82 | } |
| 83 | |
| 84 | return attr->measure_text_fn (font, text, len, width, font_size, |
| 85 | char_space, word_space, wordwrap, real_width); |
| 86 | } |
| 87 | |
| 88 | |
| 89 | HPDF_EXPORT(const char*) |
| 90 | HPDF_Font_GetFontName (HPDF_Font font) |
| 91 | { |
| 92 | HPDF_FontAttr attr; |
| 93 | |
| 94 | HPDF_PTRACE((" HPDF_Font_GetFontName\n" )); |
| 95 | |
| 96 | if (!HPDF_Font_Validate(font)) |
| 97 | return NULL; |
| 98 | |
| 99 | attr = (HPDF_FontAttr)font->attr; |
| 100 | |
| 101 | return attr->fontdef->base_font; |
| 102 | } |
| 103 | |
| 104 | |
| 105 | HPDF_EXPORT(const char*) |
| 106 | HPDF_Font_GetEncodingName (HPDF_Font font) |
| 107 | { |
| 108 | HPDF_FontAttr attr; |
| 109 | |
| 110 | HPDF_PTRACE((" HPDF_Font_GetEncodingName\n" )); |
| 111 | |
| 112 | if (!HPDF_Font_Validate(font)) |
| 113 | return NULL; |
| 114 | |
| 115 | attr = (HPDF_FontAttr)font->attr; |
| 116 | |
| 117 | return attr->encoder->name; |
| 118 | } |
| 119 | |
| 120 | |
| 121 | HPDF_EXPORT(HPDF_INT) |
| 122 | HPDF_Font_GetUnicodeWidth (HPDF_Font font, |
| 123 | HPDF_UNICODE code) |
| 124 | { |
| 125 | HPDF_FontAttr attr; |
| 126 | HPDF_FontDef fontdef; |
| 127 | |
| 128 | HPDF_PTRACE((" HPDF_Font_GetUnicodeWidth\n" )); |
| 129 | |
| 130 | if (!HPDF_Font_Validate(font)) |
| 131 | return 0; |
| 132 | |
| 133 | attr = (HPDF_FontAttr)font->attr; |
| 134 | fontdef = attr->fontdef; |
| 135 | |
| 136 | if (fontdef->type == HPDF_FONTDEF_TYPE_TYPE1) { |
| 137 | return HPDF_Type1FontDef_GetWidth (fontdef, code); |
| 138 | } else if (fontdef->type == HPDF_FONTDEF_TYPE_TRUETYPE) { |
| 139 | return HPDF_TTFontDef_GetCharWidth (fontdef, code); |
| 140 | } else if (fontdef->type == HPDF_FONTDEF_TYPE_CID) { |
| 141 | HPDF_CMapEncoderAttr encoder_attr = |
| 142 | (HPDF_CMapEncoderAttr)attr->encoder->attr; |
| 143 | HPDF_UINT l, h; |
| 144 | |
| 145 | for (l = 0; l <= 255; l++) { |
| 146 | for (h = 0; h < 255; h++) { |
| 147 | if (code == encoder_attr->unicode_map[l][h]) { |
| 148 | HPDF_UINT16 cid = encoder_attr->cid_map[l][h]; |
| 149 | |
| 150 | return HPDF_CIDFontDef_GetCIDWidth (fontdef, cid); |
| 151 | } |
| 152 | } |
| 153 | } |
| 154 | } |
| 155 | |
| 156 | HPDF_PTRACE((" HPDF_Font_GetUnicodeWidth not found (0x%04X)\n" , code)); |
| 157 | |
| 158 | return 0; |
| 159 | } |
| 160 | |
| 161 | |
| 162 | HPDF_EXPORT(HPDF_Box) |
| 163 | HPDF_Font_GetBBox (HPDF_Font font) |
| 164 | { |
| 165 | HPDF_Box bbox = {0, 0, 0, 0}; |
| 166 | |
| 167 | HPDF_PTRACE((" HPDF_Font_GetBBox\n" )); |
| 168 | if (HPDF_Font_Validate(font)) |
| 169 | return ((HPDF_FontAttr)font->attr)->fontdef->font_bbox; |
| 170 | |
| 171 | return bbox; |
| 172 | } |
| 173 | |
| 174 | HPDF_EXPORT(HPDF_INT) |
| 175 | HPDF_Font_GetAscent (HPDF_Font font) |
| 176 | { |
| 177 | HPDF_PTRACE((" HPDF_Font_GetAscent\n" )); |
| 178 | |
| 179 | if (HPDF_Font_Validate(font)) |
| 180 | return ((HPDF_FontAttr)font->attr)->fontdef->ascent; |
| 181 | |
| 182 | return 0; |
| 183 | } |
| 184 | |
| 185 | HPDF_EXPORT(HPDF_INT) |
| 186 | HPDF_Font_GetDescent (HPDF_Font font) |
| 187 | { |
| 188 | HPDF_PTRACE((" HPDF_Font_GetDescent\n" )); |
| 189 | |
| 190 | if (HPDF_Font_Validate(font)) |
| 191 | return ((HPDF_FontAttr)font->attr)->fontdef->descent; |
| 192 | |
| 193 | return 0; |
| 194 | } |
| 195 | |
| 196 | HPDF_EXPORT(HPDF_UINT) |
| 197 | HPDF_Font_GetXHeight (HPDF_Font font) |
| 198 | { |
| 199 | HPDF_PTRACE((" HPDF_Font_GetXHeight\n" )); |
| 200 | |
| 201 | if (HPDF_Font_Validate(font)) |
| 202 | return ((HPDF_FontAttr)font->attr)->fontdef->x_height; |
| 203 | |
| 204 | return 0; |
| 205 | } |
| 206 | |
| 207 | HPDF_EXPORT(HPDF_UINT) |
| 208 | HPDF_Font_GetCapHeight (HPDF_Font font) |
| 209 | { |
| 210 | HPDF_PTRACE((" HPDF_Font_GetCapHeight\n" )); |
| 211 | |
| 212 | if (HPDF_Font_Validate(font)) |
| 213 | return ((HPDF_FontAttr)font->attr)->fontdef->cap_height; |
| 214 | |
| 215 | return 0; |
| 216 | } |
| 217 | |
| 218 | |
| 219 | HPDF_BOOL |
| 220 | HPDF_Font_Validate (HPDF_Font font) |
| 221 | { |
| 222 | HPDF_PTRACE((" HPDF_Font_Validate\n" )); |
| 223 | |
| 224 | if (!font || !font->attr || font->header.obj_class != |
| 225 | (HPDF_OSUBCLASS_FONT | HPDF_OCLASS_DICT)) |
| 226 | return HPDF_FALSE; |
| 227 | |
| 228 | return HPDF_TRUE; |
| 229 | } |
| 230 | |
| 231 | |
| 232 | |