Mercurial > hgrepos > Python2 > PyMuPDF
comparison mupdf-source/thirdparty/harfbuzz/src/hb-ot-post-table-v2subset.hh @ 2:b50eed0cc0ef upstream
ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4.
The directory name has changed: no version number in the expanded directory now.
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Mon, 15 Sep 2025 11:43:07 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 1:1d09e1dec1d9 | 2:b50eed0cc0ef |
|---|---|
| 1 /* | |
| 2 * Copyright © 2021 Google, Inc. | |
| 3 * | |
| 4 * This is part of HarfBuzz, a text shaping library. | |
| 5 * | |
| 6 * Permission is hereby granted, without written agreement and without | |
| 7 * license or royalty fees, to use, copy, modify, and distribute this | |
| 8 * software and its documentation for any purpose, provided that the | |
| 9 * above copyright notice and the following two paragraphs appear in | |
| 10 * all copies of this software. | |
| 11 * | |
| 12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR | |
| 13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES | |
| 14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN | |
| 15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH | |
| 16 * DAMAGE. | |
| 17 * | |
| 18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, | |
| 19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
| 20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS | |
| 21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO | |
| 22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | |
| 23 * | |
| 24 */ | |
| 25 | |
| 26 #ifndef HB_OT_POST_TABLE_V2SUBSET_HH | |
| 27 #define HB_OT_POST_TABLE_V2SUBSET_HH | |
| 28 | |
| 29 #include "hb-open-type.hh" | |
| 30 #include "hb-ot-post-table.hh" | |
| 31 | |
| 32 /* | |
| 33 * post -- PostScript | |
| 34 * https://docs.microsoft.com/en-us/typography/opentype/spec/post | |
| 35 */ | |
| 36 | |
| 37 namespace OT { | |
| 38 template<typename Iterator> | |
| 39 HB_INTERNAL bool postV2Tail::serialize (hb_serialize_context_t *c, | |
| 40 Iterator it, | |
| 41 const void* _post) const | |
| 42 { | |
| 43 TRACE_SERIALIZE (this); | |
| 44 auto *out = c->start_embed (this); | |
| 45 if (unlikely (!c->check_success (out))) return_trace (false); | |
| 46 if (!out->glyphNameIndex.serialize (c, + it | |
| 47 | hb_map (hb_second))) | |
| 48 return_trace (false); | |
| 49 | |
| 50 hb_set_t copied_indices; | |
| 51 for (const auto& _ : + it ) | |
| 52 { | |
| 53 unsigned glyph_id = _.first; | |
| 54 unsigned new_index = _.second; | |
| 55 | |
| 56 if (new_index < 258) continue; | |
| 57 if (copied_indices.has (new_index)) continue; | |
| 58 copied_indices.add (new_index); | |
| 59 | |
| 60 hb_bytes_t s = reinterpret_cast<const post::accelerator_t*> (_post)->find_glyph_name (glyph_id); | |
| 61 HBUINT8 *o = c->allocate_size<HBUINT8> (HBUINT8::static_size * (s.length + 1)); | |
| 62 if (unlikely (!o)) return_trace (false); | |
| 63 if (!c->check_assign (o[0], s.length, HB_SERIALIZE_ERROR_INT_OVERFLOW)) return_trace (false); | |
| 64 hb_memcpy (o+1, s.arrayZ, HBUINT8::static_size * s.length); | |
| 65 } | |
| 66 | |
| 67 return_trace (true); | |
| 68 } | |
| 69 | |
| 70 HB_INTERNAL bool postV2Tail::subset (hb_subset_context_t *c) const | |
| 71 { | |
| 72 TRACE_SUBSET (this); | |
| 73 | |
| 74 const hb_map_t &reverse_glyph_map = *c->plan->reverse_glyph_map; | |
| 75 unsigned num_glyphs = c->plan->num_output_glyphs (); | |
| 76 hb_map_t old_new_index_map, old_gid_new_index_map; | |
| 77 unsigned i = 0; | |
| 78 | |
| 79 post::accelerator_t _post (c->plan->source); | |
| 80 | |
| 81 hb_hashmap_t<hb_bytes_t, uint32_t, true> glyph_name_to_new_index; | |
| 82 for (hb_codepoint_t new_gid = 0; new_gid < num_glyphs; new_gid++) | |
| 83 { | |
| 84 hb_codepoint_t old_gid = reverse_glyph_map.get (new_gid); | |
| 85 unsigned old_index = glyphNameIndex[old_gid]; | |
| 86 | |
| 87 unsigned new_index; | |
| 88 const uint32_t *new_index2; | |
| 89 if (old_index <= 257) new_index = old_index; | |
| 90 else if (old_new_index_map.has (old_index, &new_index2)) | |
| 91 { | |
| 92 new_index = *new_index2; | |
| 93 } else { | |
| 94 hb_bytes_t s = _post.find_glyph_name (old_gid); | |
| 95 new_index = glyph_name_to_new_index.get (s); | |
| 96 if (new_index == (unsigned)-1) | |
| 97 { | |
| 98 int standard_glyph_index = -1; | |
| 99 for (unsigned i = 0; i < format1_names_length; i++) | |
| 100 { | |
| 101 if (s == format1_names (i)) | |
| 102 { | |
| 103 standard_glyph_index = i; | |
| 104 break; | |
| 105 } | |
| 106 } | |
| 107 | |
| 108 if (standard_glyph_index == -1) | |
| 109 { | |
| 110 new_index = 258 + i; | |
| 111 i++; | |
| 112 } | |
| 113 else | |
| 114 { new_index = standard_glyph_index; } | |
| 115 glyph_name_to_new_index.set (s, new_index); | |
| 116 } | |
| 117 old_new_index_map.set (old_index, new_index); | |
| 118 } | |
| 119 old_gid_new_index_map.set (old_gid, new_index); | |
| 120 } | |
| 121 | |
| 122 auto index_iter = | |
| 123 + hb_range (num_glyphs) | |
| 124 | hb_map (reverse_glyph_map) | |
| 125 | hb_map_retains_sorting ([&](hb_codepoint_t old_gid) | |
| 126 { | |
| 127 unsigned new_index = old_gid_new_index_map.get (old_gid); | |
| 128 return hb_pair_t<unsigned, unsigned> (old_gid, new_index); | |
| 129 }) | |
| 130 ; | |
| 131 | |
| 132 return_trace (serialize (c->serializer, index_iter, &_post)); | |
| 133 } | |
| 134 | |
| 135 } /* namespace OT */ | |
| 136 #endif /* HB_OT_POST_TABLE_V2SUBSET_HH */ |
