| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright © 2014 Google, Inc. | 2 * Copyright © 2014 Google, Inc. |
| 3 * | 3 * |
| 4 * This is part of HarfBuzz, a text shaping library. | 4 * This is part of HarfBuzz, a text shaping library. |
| 5 * | 5 * |
| 6 * Permission is hereby granted, without written agreement and without | 6 * Permission is hereby granted, without written agreement and without |
| 7 * license or royalty fees, to use, copy, modify, and distribute this | 7 * license or royalty fees, to use, copy, modify, and distribute this |
| 8 * software and its documentation for any purpose, provided that the | 8 * software and its documentation for any purpose, provided that the |
| 9 * above copyright notice and the following two paragraphs appear in | 9 * above copyright notice and the following two paragraphs appear in |
| 10 * all copies of this software. | 10 * all copies of this software. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 { | 44 { |
| 45 inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const | 45 inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const |
| 46 { | 46 { |
| 47 hb_codepoint_t gid = codepoint < 256 ? glyphIdArray[codepoint] : 0; | 47 hb_codepoint_t gid = codepoint < 256 ? glyphIdArray[codepoint] : 0; |
| 48 if (!gid) | 48 if (!gid) |
| 49 return false; | 49 return false; |
| 50 *glyph = gid; | 50 *glyph = gid; |
| 51 return true; | 51 return true; |
| 52 } | 52 } |
| 53 | 53 |
| 54 inline bool sanitize (hb_sanitize_context_t *c) { | 54 inline bool sanitize (hb_sanitize_context_t *c) const |
| 55 { |
| 55 TRACE_SANITIZE (this); | 56 TRACE_SANITIZE (this); |
| 56 return TRACE_RETURN (c->check_struct (this)); | 57 return TRACE_RETURN (c->check_struct (this)); |
| 57 } | 58 } |
| 58 | 59 |
| 59 protected: | 60 protected: |
| 60 USHORT format; /* Format number is set to 0. */ | 61 USHORT format; /* Format number is set to 0. */ |
| 61 USHORT lengthZ; /* Byte length of this subtable. */ | 62 USHORT lengthZ; /* Byte length of this subtable. */ |
| 62 USHORT languageZ; /* Ignore. */ | 63 USHORT languageZ; /* Ignore. */ |
| 63 BYTE glyphIdArray[256];/* An array that maps character | 64 BYTE glyphIdArray[256];/* An array that maps character |
| 64 * code to glyph index values. */ | 65 * code to glyph index values. */ |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 gid = glyphIdArray[index]; | 119 gid = glyphIdArray[index]; |
| 119 if (unlikely (!gid)) | 120 if (unlikely (!gid)) |
| 120 return false; | 121 return false; |
| 121 gid += idDelta[i]; | 122 gid += idDelta[i]; |
| 122 } | 123 } |
| 123 | 124 |
| 124 *glyph = gid & 0xFFFFu; | 125 *glyph = gid & 0xFFFFu; |
| 125 return true; | 126 return true; |
| 126 } | 127 } |
| 127 | 128 |
| 128 inline bool sanitize (hb_sanitize_context_t *c) | 129 inline bool sanitize (hb_sanitize_context_t *c) const |
| 129 { | 130 { |
| 130 TRACE_SANITIZE (this); | 131 TRACE_SANITIZE (this); |
| 131 if (unlikely (!c->check_struct (this))) | 132 if (unlikely (!c->check_struct (this))) |
| 132 return TRACE_RETURN (false); | 133 return TRACE_RETURN (false); |
| 133 | 134 |
| 134 if (unlikely (!c->check_range (this, length))) | 135 if (unlikely (!c->check_range (this, length))) |
| 135 { | 136 { |
| 136 /* Some broken fonts have too long of a "length" value. | 137 /* Some broken fonts have too long of a "length" value. |
| 137 * If that is the case, just change the value to truncate | 138 * If that is the case, just change the value to truncate |
| 138 * the subtable at the end of the blob. */ | 139 * the subtable at the end of the blob. */ |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 friend struct CmapSubtableFormat12; | 177 friend struct CmapSubtableFormat12; |
| 177 friend struct CmapSubtableFormat13; | 178 friend struct CmapSubtableFormat13; |
| 178 | 179 |
| 179 int cmp (hb_codepoint_t codepoint) const | 180 int cmp (hb_codepoint_t codepoint) const |
| 180 { | 181 { |
| 181 if (codepoint < startCharCode) return -1; | 182 if (codepoint < startCharCode) return -1; |
| 182 if (codepoint > endCharCode) return +1; | 183 if (codepoint > endCharCode) return +1; |
| 183 return 0; | 184 return 0; |
| 184 } | 185 } |
| 185 | 186 |
| 186 inline bool sanitize (hb_sanitize_context_t *c) { | 187 inline bool sanitize (hb_sanitize_context_t *c) const |
| 188 { |
| 187 TRACE_SANITIZE (this); | 189 TRACE_SANITIZE (this); |
| 188 return TRACE_RETURN (c->check_struct (this)); | 190 return TRACE_RETURN (c->check_struct (this)); |
| 189 } | 191 } |
| 190 | 192 |
| 191 private: | 193 private: |
| 192 ULONG startCharCode; /* First character code in this group. */ | 194 ULONG startCharCode; /* First character code in this group. */ |
| 193 ULONG endCharCode; /* Last character code in this group. */ | 195 ULONG endCharCode; /* Last character code in this group. */ |
| 194 ULONG glyphID; /* Glyph index; interpretation depends on | 196 ULONG glyphID; /* Glyph index; interpretation depends on |
| 195 * subtable format. */ | 197 * subtable format. */ |
| 196 public: | 198 public: |
| 197 DEFINE_SIZE_STATIC (12); | 199 DEFINE_SIZE_STATIC (12); |
| 198 }; | 200 }; |
| 199 | 201 |
| 200 template <typename UINT> | 202 template <typename UINT> |
| 201 struct CmapSubtableTrimmed | 203 struct CmapSubtableTrimmed |
| 202 { | 204 { |
| 203 inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const | 205 inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const |
| 204 { | 206 { |
| 205 /* Rely on our implicit array bound-checking. */ | 207 /* Rely on our implicit array bound-checking. */ |
| 206 hb_codepoint_t gid = glyphIdArray[codepoint - startCharCode]; | 208 hb_codepoint_t gid = glyphIdArray[codepoint - startCharCode]; |
| 207 if (!gid) | 209 if (!gid) |
| 208 return false; | 210 return false; |
| 209 *glyph = gid; | 211 *glyph = gid; |
| 210 return true; | 212 return true; |
| 211 } | 213 } |
| 212 | 214 |
| 213 inline bool sanitize (hb_sanitize_context_t *c) { | 215 inline bool sanitize (hb_sanitize_context_t *c) const |
| 216 { |
| 214 TRACE_SANITIZE (this); | 217 TRACE_SANITIZE (this); |
| 215 return TRACE_RETURN (c->check_struct (this) && glyphIdArray.sanitize (c)); | 218 return TRACE_RETURN (c->check_struct (this) && glyphIdArray.sanitize (c)); |
| 216 } | 219 } |
| 217 | 220 |
| 218 protected: | 221 protected: |
| 219 UINT formatReserved; /* Subtable format and (maybe) padding. */ | 222 UINT formatReserved; /* Subtable format and (maybe) padding. */ |
| 220 UINT lengthZ; /* Byte length of this subtable. */ | 223 UINT lengthZ; /* Byte length of this subtable. */ |
| 221 UINT languageZ; /* Ignore. */ | 224 UINT languageZ; /* Ignore. */ |
| 222 UINT startCharCode; /* First character code covered. */ | 225 UINT startCharCode; /* First character code covered. */ |
| 223 ArrayOf<GlyphID, UINT> | 226 ArrayOf<GlyphID, UINT> |
| (...skipping 11 matching lines...) Expand all Loading... |
| 235 { | 238 { |
| 236 inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const | 239 inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const |
| 237 { | 240 { |
| 238 int i = groups.bsearch (codepoint); | 241 int i = groups.bsearch (codepoint); |
| 239 if (i == -1) | 242 if (i == -1) |
| 240 return false; | 243 return false; |
| 241 *glyph = T::group_get_glyph (groups[i], codepoint); | 244 *glyph = T::group_get_glyph (groups[i], codepoint); |
| 242 return true; | 245 return true; |
| 243 } | 246 } |
| 244 | 247 |
| 245 inline bool sanitize (hb_sanitize_context_t *c) { | 248 inline bool sanitize (hb_sanitize_context_t *c) const |
| 249 { |
| 246 TRACE_SANITIZE (this); | 250 TRACE_SANITIZE (this); |
| 247 return TRACE_RETURN (c->check_struct (this) && groups.sanitize (c)); | 251 return TRACE_RETURN (c->check_struct (this) && groups.sanitize (c)); |
| 248 } | 252 } |
| 249 | 253 |
| 250 protected: | 254 protected: |
| 251 USHORT format; /* Subtable format; set to 12. */ | 255 USHORT format; /* Subtable format; set to 12. */ |
| 252 USHORT reservedZ; /* Reserved; set to 0. */ | 256 USHORT reservedZ; /* Reserved; set to 0. */ |
| 253 ULONG lengthZ; /* Byte length of this subtable. */ | 257 ULONG lengthZ; /* Byte length of this subtable. */ |
| 254 ULONG languageZ; /* Ignore. */ | 258 ULONG languageZ; /* Ignore. */ |
| 255 SortedArrayOf<CmapSubtableLongGroup, ULONG> | 259 SortedArrayOf<CmapSubtableLongGroup, ULONG> |
| (...skipping 25 matching lines...) Expand all Loading... |
| 281 | 285 |
| 282 struct UnicodeValueRange | 286 struct UnicodeValueRange |
| 283 { | 287 { |
| 284 inline int cmp (const hb_codepoint_t &codepoint) const | 288 inline int cmp (const hb_codepoint_t &codepoint) const |
| 285 { | 289 { |
| 286 if (codepoint < startUnicodeValue) return -1; | 290 if (codepoint < startUnicodeValue) return -1; |
| 287 if (codepoint > startUnicodeValue + additionalCount) return +1; | 291 if (codepoint > startUnicodeValue + additionalCount) return +1; |
| 288 return 0; | 292 return 0; |
| 289 } | 293 } |
| 290 | 294 |
| 291 inline bool sanitize (hb_sanitize_context_t *c) { | 295 inline bool sanitize (hb_sanitize_context_t *c) const |
| 296 { |
| 292 TRACE_SANITIZE (this); | 297 TRACE_SANITIZE (this); |
| 293 return TRACE_RETURN (c->check_struct (this)); | 298 return TRACE_RETURN (c->check_struct (this)); |
| 294 } | 299 } |
| 295 | 300 |
| 296 UINT24 startUnicodeValue; /* First value in this range. */ | 301 UINT24 startUnicodeValue; /* First value in this range. */ |
| 297 BYTE additionalCount; /* Number of additional values in this | 302 BYTE additionalCount; /* Number of additional values in this |
| 298 * range. */ | 303 * range. */ |
| 299 public: | 304 public: |
| 300 DEFINE_SIZE_STATIC (4); | 305 DEFINE_SIZE_STATIC (4); |
| 301 }; | 306 }; |
| 302 | 307 |
| 303 typedef SortedArrayOf<UnicodeValueRange, ULONG> DefaultUVS; | 308 typedef SortedArrayOf<UnicodeValueRange, ULONG> DefaultUVS; |
| 304 | 309 |
| 305 struct UVSMapping | 310 struct UVSMapping |
| 306 { | 311 { |
| 307 inline int cmp (const hb_codepoint_t &codepoint) const | 312 inline int cmp (const hb_codepoint_t &codepoint) const |
| 308 { | 313 { |
| 309 return unicodeValue.cmp (codepoint); | 314 return unicodeValue.cmp (codepoint); |
| 310 } | 315 } |
| 311 | 316 |
| 312 inline bool sanitize (hb_sanitize_context_t *c) { | 317 inline bool sanitize (hb_sanitize_context_t *c) const |
| 318 { |
| 313 TRACE_SANITIZE (this); | 319 TRACE_SANITIZE (this); |
| 314 return TRACE_RETURN (c->check_struct (this)); | 320 return TRACE_RETURN (c->check_struct (this)); |
| 315 } | 321 } |
| 316 | 322 |
| 317 UINT24 unicodeValue; /* Base Unicode value of the UVS */ | 323 UINT24 unicodeValue; /* Base Unicode value of the UVS */ |
| 318 GlyphID glyphID; /* Glyph ID of the UVS */ | 324 GlyphID glyphID; /* Glyph ID of the UVS */ |
| 319 public: | 325 public: |
| 320 DEFINE_SIZE_STATIC (5); | 326 DEFINE_SIZE_STATIC (5); |
| 321 }; | 327 }; |
| 322 | 328 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 341 return GLYPH_VARIANT_FOUND; | 347 return GLYPH_VARIANT_FOUND; |
| 342 } | 348 } |
| 343 return GLYPH_VARIANT_NOT_FOUND; | 349 return GLYPH_VARIANT_NOT_FOUND; |
| 344 } | 350 } |
| 345 | 351 |
| 346 inline int cmp (const hb_codepoint_t &variation_selector) const | 352 inline int cmp (const hb_codepoint_t &variation_selector) const |
| 347 { | 353 { |
| 348 return varSelector.cmp (variation_selector); | 354 return varSelector.cmp (variation_selector); |
| 349 } | 355 } |
| 350 | 356 |
| 351 inline bool sanitize (hb_sanitize_context_t *c, void *base) { | 357 inline bool sanitize (hb_sanitize_context_t *c, const void *base) const |
| 358 { |
| 352 TRACE_SANITIZE (this); | 359 TRACE_SANITIZE (this); |
| 353 return TRACE_RETURN (c->check_struct (this) && | 360 return TRACE_RETURN (c->check_struct (this) && |
| 354 defaultUVS.sanitize (c, base) && | 361 defaultUVS.sanitize (c, base) && |
| 355 nonDefaultUVS.sanitize (c, base)); | 362 nonDefaultUVS.sanitize (c, base)); |
| 356 } | 363 } |
| 357 | 364 |
| 358 UINT24 varSelector; /* Variation selector. */ | 365 UINT24 varSelector; /* Variation selector. */ |
| 359 OffsetTo<DefaultUVS, ULONG> | 366 OffsetTo<DefaultUVS, ULONG> |
| 360 defaultUVS; /* Offset to Default UVS Table. May be 0. */ | 367 defaultUVS; /* Offset to Default UVS Table. May be 0. */ |
| 361 OffsetTo<NonDefaultUVS, ULONG> | 368 OffsetTo<NonDefaultUVS, ULONG> |
| 362 nonDefaultUVS; /* Offset to Non-Default UVS Table. May be 0. */ | 369 nonDefaultUVS; /* Offset to Non-Default UVS Table. May be 0. */ |
| 363 public: | 370 public: |
| 364 DEFINE_SIZE_STATIC (11); | 371 DEFINE_SIZE_STATIC (11); |
| 365 }; | 372 }; |
| 366 | 373 |
| 367 struct CmapSubtableFormat14 | 374 struct CmapSubtableFormat14 |
| 368 { | 375 { |
| 369 inline glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint, | 376 inline glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint, |
| 370 hb_codepoint_t variation_selector, | 377 hb_codepoint_t variation_selector, |
| 371 hb_codepoint_t *glyph) const | 378 hb_codepoint_t *glyph) const |
| 372 { | 379 { |
| 373 return record[record.bsearch(variation_selector)].get_glyph (codepoint, glyp
h, this); | 380 return record[record.bsearch(variation_selector)].get_glyph (codepoint, glyp
h, this); |
| 374 } | 381 } |
| 375 | 382 |
| 376 inline bool sanitize (hb_sanitize_context_t *c) { | 383 inline bool sanitize (hb_sanitize_context_t *c) const |
| 384 { |
| 377 TRACE_SANITIZE (this); | 385 TRACE_SANITIZE (this); |
| 378 return TRACE_RETURN (c->check_struct (this) && | 386 return TRACE_RETURN (c->check_struct (this) && |
| 379 record.sanitize (c, this)); | 387 record.sanitize (c, this)); |
| 380 } | 388 } |
| 381 | 389 |
| 382 protected: | 390 protected: |
| 383 USHORT format; /* Format number is set to 0. */ | 391 USHORT format; /* Format number is set to 0. */ |
| 384 ULONG lengthZ; /* Byte length of this subtable. */ | 392 ULONG lengthZ; /* Byte length of this subtable. */ |
| 385 SortedArrayOf<VariationSelectorRecord, ULONG> | 393 SortedArrayOf<VariationSelectorRecord, ULONG> |
| 386 record; /* Variation selector records; sorted | 394 record; /* Variation selector records; sorted |
| (...skipping 24 matching lines...) Expand all Loading... |
| 411 inline glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint, | 419 inline glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint, |
| 412 hb_codepoint_t variation_selector, | 420 hb_codepoint_t variation_selector, |
| 413 hb_codepoint_t *glyph) const | 421 hb_codepoint_t *glyph) const |
| 414 { | 422 { |
| 415 switch (u.format) { | 423 switch (u.format) { |
| 416 case 14: return u.format14.get_glyph_variant(codepoint, variation_selector,
glyph); | 424 case 14: return u.format14.get_glyph_variant(codepoint, variation_selector,
glyph); |
| 417 default: return GLYPH_VARIANT_NOT_FOUND; | 425 default: return GLYPH_VARIANT_NOT_FOUND; |
| 418 } | 426 } |
| 419 } | 427 } |
| 420 | 428 |
| 421 inline bool sanitize (hb_sanitize_context_t *c) { | 429 inline bool sanitize (hb_sanitize_context_t *c) const |
| 430 { |
| 422 TRACE_SANITIZE (this); | 431 TRACE_SANITIZE (this); |
| 423 if (!u.format.sanitize (c)) return TRACE_RETURN (false); | 432 if (!u.format.sanitize (c)) return TRACE_RETURN (false); |
| 424 switch (u.format) { | 433 switch (u.format) { |
| 425 case 0: return TRACE_RETURN (u.format0 .sanitize (c)); | 434 case 0: return TRACE_RETURN (u.format0 .sanitize (c)); |
| 426 case 4: return TRACE_RETURN (u.format4 .sanitize (c)); | 435 case 4: return TRACE_RETURN (u.format4 .sanitize (c)); |
| 427 case 6: return TRACE_RETURN (u.format6 .sanitize (c)); | 436 case 6: return TRACE_RETURN (u.format6 .sanitize (c)); |
| 428 case 10: return TRACE_RETURN (u.format10.sanitize (c)); | 437 case 10: return TRACE_RETURN (u.format10.sanitize (c)); |
| 429 case 12: return TRACE_RETURN (u.format12.sanitize (c)); | 438 case 12: return TRACE_RETURN (u.format12.sanitize (c)); |
| 430 case 13: return TRACE_RETURN (u.format13.sanitize (c)); | 439 case 13: return TRACE_RETURN (u.format13.sanitize (c)); |
| 431 case 14: return TRACE_RETURN (u.format14.sanitize (c)); | 440 case 14: return TRACE_RETURN (u.format14.sanitize (c)); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 454 inline int cmp (const EncodingRecord &other) const | 463 inline int cmp (const EncodingRecord &other) const |
| 455 { | 464 { |
| 456 int ret; | 465 int ret; |
| 457 ret = platformID.cmp (other.platformID); | 466 ret = platformID.cmp (other.platformID); |
| 458 if (ret) return ret; | 467 if (ret) return ret; |
| 459 ret = encodingID.cmp (other.encodingID); | 468 ret = encodingID.cmp (other.encodingID); |
| 460 if (ret) return ret; | 469 if (ret) return ret; |
| 461 return 0; | 470 return 0; |
| 462 } | 471 } |
| 463 | 472 |
| 464 inline bool sanitize (hb_sanitize_context_t *c, void *base) { | 473 inline bool sanitize (hb_sanitize_context_t *c, const void *base) const |
| 474 { |
| 465 TRACE_SANITIZE (this); | 475 TRACE_SANITIZE (this); |
| 466 return TRACE_RETURN (c->check_struct (this) && | 476 return TRACE_RETURN (c->check_struct (this) && |
| 467 subtable.sanitize (c, base)); | 477 subtable.sanitize (c, base)); |
| 468 } | 478 } |
| 469 | 479 |
| 470 USHORT platformID; /* Platform ID. */ | 480 USHORT platformID; /* Platform ID. */ |
| 471 USHORT encodingID; /* Platform-specific encoding ID. */ | 481 USHORT encodingID; /* Platform-specific encoding ID. */ |
| 472 OffsetTo<CmapSubtable, ULONG> | 482 OffsetTo<CmapSubtable, ULONG> |
| 473 subtable; /* Byte offset from beginning of table to the su
btable for this encoding. */ | 483 subtable; /* Byte offset from beginning of table to the su
btable for this encoding. */ |
| 474 public: | 484 public: |
| (...skipping 14 matching lines...) Expand all Loading... |
| 489 /* Note: We can use bsearch, but since it has no performance | 499 /* Note: We can use bsearch, but since it has no performance |
| 490 * implications, we use lsearch and as such accept fonts with | 500 * implications, we use lsearch and as such accept fonts with |
| 491 * unsorted subtable list. */ | 501 * unsorted subtable list. */ |
| 492 int result = encodingRecord./*bsearch*/lsearch (key); | 502 int result = encodingRecord./*bsearch*/lsearch (key); |
| 493 if (result == -1 || !encodingRecord[result].subtable) | 503 if (result == -1 || !encodingRecord[result].subtable) |
| 494 return NULL; | 504 return NULL; |
| 495 | 505 |
| 496 return &(this+encodingRecord[result].subtable); | 506 return &(this+encodingRecord[result].subtable); |
| 497 } | 507 } |
| 498 | 508 |
| 499 inline bool sanitize (hb_sanitize_context_t *c) { | 509 inline bool sanitize (hb_sanitize_context_t *c) const |
| 510 { |
| 500 TRACE_SANITIZE (this); | 511 TRACE_SANITIZE (this); |
| 501 return TRACE_RETURN (c->check_struct (this) && | 512 return TRACE_RETURN (c->check_struct (this) && |
| 502 likely (version == 0) && | 513 likely (version == 0) && |
| 503 encodingRecord.sanitize (c, this)); | 514 encodingRecord.sanitize (c, this)); |
| 504 } | 515 } |
| 505 | 516 |
| 506 USHORT version; /* Table version number (0). */ | 517 USHORT version; /* Table version number (0). */ |
| 507 SortedArrayOf<EncodingRecord> | 518 SortedArrayOf<EncodingRecord> |
| 508 encodingRecord; /* Encoding tables. */ | 519 encodingRecord; /* Encoding tables. */ |
| 509 public: | 520 public: |
| 510 DEFINE_SIZE_ARRAY (4, encodingRecord); | 521 DEFINE_SIZE_ARRAY (4, encodingRecord); |
| 511 }; | 522 }; |
| 512 | 523 |
| 513 | 524 |
| 514 } /* namespace OT */ | 525 } /* namespace OT */ |
| 515 | 526 |
| 516 | 527 |
| 517 #endif /* HB_OT_CMAP_TABLE_HH */ | 528 #endif /* HB_OT_CMAP_TABLE_HH */ |
| OLD | NEW |