/src/harfbuzz/src/OT/glyf/glyf-helpers.hh
Line | Count | Source |
1 | | #ifndef OT_GLYF_GLYF_HELPERS_HH |
2 | | #define OT_GLYF_GLYF_HELPERS_HH |
3 | | |
4 | | |
5 | | #include "../../hb-open-type.hh" |
6 | | #include "../../hb-subset-plan.hh" |
7 | | |
8 | | #include "loca.hh" |
9 | | |
10 | | |
11 | | namespace OT { |
12 | | namespace glyf_impl { |
13 | | |
14 | | |
15 | | template<typename IteratorIn, typename TypeOut, |
16 | | hb_requires (hb_is_source_of (IteratorIn, unsigned int))> |
17 | | static void |
18 | | _write_loca (IteratorIn&& it, |
19 | | const hb_sorted_vector_t<hb_codepoint_pair_t> new_to_old_gid_list, |
20 | | bool short_offsets, |
21 | | TypeOut *dest, |
22 | | unsigned num_offsets) |
23 | 8.18k | { |
24 | 8.18k | unsigned right_shift = short_offsets ? 1 : 0; |
25 | 8.18k | unsigned offset = 0; |
26 | 8.18k | TypeOut value; |
27 | 8.18k | value = 0; |
28 | 8.18k | *dest++ = value; |
29 | 8.18k | hb_codepoint_t last = 0; |
30 | 8.18k | for (auto _ : new_to_old_gid_list) |
31 | 6.41M | { |
32 | 6.41M | hb_codepoint_t gid = _.first; |
33 | 27.8M | for (; last < gid; last++) |
34 | 21.4M | { |
35 | 21.4M | DEBUG_MSG (SUBSET, nullptr, "loca entry empty offset %u", offset); |
36 | 21.4M | *dest++ = value; |
37 | 21.4M | } |
38 | | |
39 | 6.41M | unsigned padded_size = *it++; |
40 | 6.41M | offset += padded_size; |
41 | 6.41M | DEBUG_MSG (SUBSET, nullptr, "loca entry gid %" PRIu32 " offset %u padded-size %u", gid, offset, padded_size); |
42 | 6.41M | value = offset >> right_shift; |
43 | 6.41M | *dest++ = value; |
44 | | |
45 | 6.41M | last++; // Skip over gid |
46 | 6.41M | } |
47 | 8.18k | unsigned num_glyphs = num_offsets - 1; |
48 | 8.18k | for (; last < num_glyphs; last++) |
49 | 1 | { |
50 | 1 | DEBUG_MSG (SUBSET, nullptr, "loca entry empty offset %u", offset); |
51 | 1 | *dest++ = value; |
52 | 1 | } |
53 | 8.18k | } Unexecuted instantiation: hb-common.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EtLj2EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Unexecuted instantiation: hb-common.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EjLj4EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Unexecuted instantiation: hb-ot-face.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EtLj2EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Unexecuted instantiation: hb-ot-face.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EjLj4EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Unexecuted instantiation: hb-ot-font.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EtLj2EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Unexecuted instantiation: hb-ot-font.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EjLj4EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Unexecuted instantiation: VARC.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EtLj2EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Unexecuted instantiation: VARC.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EjLj4EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Unexecuted instantiation: hb-subset-plan.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EtLj2EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Unexecuted instantiation: hb-subset-plan.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EjLj4EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Unexecuted instantiation: hb-subset-plan-var.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EtLj2EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Unexecuted instantiation: hb-subset-plan-var.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EjLj4EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j hb-subset-table-other.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EtLj2EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Line | Count | Source | 23 | 5.12k | { | 24 | 5.12k | unsigned right_shift = short_offsets ? 1 : 0; | 25 | 5.12k | unsigned offset = 0; | 26 | 5.12k | TypeOut value; | 27 | 5.12k | value = 0; | 28 | 5.12k | *dest++ = value; | 29 | 5.12k | hb_codepoint_t last = 0; | 30 | 5.12k | for (auto _ : new_to_old_gid_list) | 31 | 996k | { | 32 | 996k | hb_codepoint_t gid = _.first; | 33 | 3.72M | for (; last < gid; last++) | 34 | 2.72M | { | 35 | 2.72M | DEBUG_MSG (SUBSET, nullptr, "loca entry empty offset %u", offset); | 36 | 2.72M | *dest++ = value; | 37 | 2.72M | } | 38 | | | 39 | 996k | unsigned padded_size = *it++; | 40 | 996k | offset += padded_size; | 41 | 996k | DEBUG_MSG (SUBSET, nullptr, "loca entry gid %" PRIu32 " offset %u padded-size %u", gid, offset, padded_size); | 42 | 996k | value = offset >> right_shift; | 43 | 996k | *dest++ = value; | 44 | | | 45 | 996k | last++; // Skip over gid | 46 | 996k | } | 47 | 5.12k | unsigned num_glyphs = num_offsets - 1; | 48 | 5.13k | for (; last < num_glyphs; last++) | 49 | 1 | { | 50 | 1 | DEBUG_MSG (SUBSET, nullptr, "loca entry empty offset %u", offset); | 51 | 1 | *dest++ = value; | 52 | 1 | } | 53 | 5.12k | } |
hb-subset-table-other.cc:_ZN2OT9glyf_implL11_write_locaIR10hb_array_tIKjENS_7NumTypeILb1EjLj4EEETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEvOS9_11hb_vector_tI9hb_pair_tIjjELb1EEbPT0_j Line | Count | Source | 23 | 3.05k | { | 24 | 3.05k | unsigned right_shift = short_offsets ? 1 : 0; | 25 | 3.05k | unsigned offset = 0; | 26 | 3.05k | TypeOut value; | 27 | 3.05k | value = 0; | 28 | 3.05k | *dest++ = value; | 29 | 3.05k | hb_codepoint_t last = 0; | 30 | 3.05k | for (auto _ : new_to_old_gid_list) | 31 | 5.41M | { | 32 | 5.41M | hb_codepoint_t gid = _.first; | 33 | 24.1M | for (; last < gid; last++) | 34 | 18.7M | { | 35 | 18.7M | DEBUG_MSG (SUBSET, nullptr, "loca entry empty offset %u", offset); | 36 | 18.7M | *dest++ = value; | 37 | 18.7M | } | 38 | | | 39 | 5.41M | unsigned padded_size = *it++; | 40 | 5.41M | offset += padded_size; | 41 | 5.41M | DEBUG_MSG (SUBSET, nullptr, "loca entry gid %" PRIu32 " offset %u padded-size %u", gid, offset, padded_size); | 42 | 5.41M | value = offset >> right_shift; | 43 | 5.41M | *dest++ = value; | 44 | | | 45 | 5.41M | last++; // Skip over gid | 46 | 5.41M | } | 47 | 3.05k | unsigned num_glyphs = num_offsets - 1; | 48 | 3.05k | for (; last < num_glyphs; last++) | 49 | 0 | { | 50 | 0 | DEBUG_MSG (SUBSET, nullptr, "loca entry empty offset %u", offset); | 51 | 0 | *dest++ = value; | 52 | 0 | } | 53 | 3.05k | } |
|
54 | | |
55 | | static bool |
56 | | _add_head_and_set_loca_version (hb_subset_plan_t *plan, bool use_short_loca) |
57 | 8.18k | { |
58 | 8.18k | hb_blob_t *head_blob = hb_sanitize_context_t ().reference_table<head> (plan->source); |
59 | 8.18k | hb_blob_t *head_prime_blob = hb_blob_copy_writable_or_fail (head_blob); |
60 | 8.18k | hb_blob_destroy (head_blob); |
61 | | |
62 | 8.18k | if (unlikely (!head_prime_blob)) |
63 | 6.06k | return false; |
64 | | |
65 | 2.12k | head *head_prime = (head *) hb_blob_get_data_writable (head_prime_blob, nullptr); |
66 | 2.12k | head_prime->indexToLocFormat = use_short_loca ? 0 : 1; |
67 | 2.12k | if (plan->normalized_coords) |
68 | 556 | { |
69 | 556 | head_prime->xMin = plan->head_maxp_info.xMin; |
70 | 556 | head_prime->xMax = plan->head_maxp_info.xMax; |
71 | 556 | head_prime->yMin = plan->head_maxp_info.yMin; |
72 | 556 | head_prime->yMax = plan->head_maxp_info.yMax; |
73 | | |
74 | 556 | unsigned orig_flag = head_prime->flags; |
75 | 556 | if (plan->head_maxp_info.allXMinIsLsb) |
76 | 152 | orig_flag |= 1 << 1; |
77 | 404 | else |
78 | 404 | orig_flag &= ~(1 << 1); |
79 | 556 | head_prime->flags = orig_flag; |
80 | 556 | } |
81 | 2.12k | bool success = plan->add_table (HB_OT_TAG_head, head_prime_blob); |
82 | | |
83 | 2.12k | hb_blob_destroy (head_prime_blob); |
84 | 2.12k | return success; |
85 | 8.18k | } Unexecuted instantiation: hb-common.cc:OT::glyf_impl::_add_head_and_set_loca_version(hb_subset_plan_t*, bool) Unexecuted instantiation: hb-ot-face.cc:OT::glyf_impl::_add_head_and_set_loca_version(hb_subset_plan_t*, bool) Unexecuted instantiation: hb-ot-font.cc:OT::glyf_impl::_add_head_and_set_loca_version(hb_subset_plan_t*, bool) Unexecuted instantiation: VARC.cc:OT::glyf_impl::_add_head_and_set_loca_version(hb_subset_plan_t*, bool) Unexecuted instantiation: hb-subset-plan.cc:OT::glyf_impl::_add_head_and_set_loca_version(hb_subset_plan_t*, bool) Unexecuted instantiation: hb-subset-plan-var.cc:OT::glyf_impl::_add_head_and_set_loca_version(hb_subset_plan_t*, bool) hb-subset-table-other.cc:OT::glyf_impl::_add_head_and_set_loca_version(hb_subset_plan_t*, bool) Line | Count | Source | 57 | 8.18k | { | 58 | 8.18k | hb_blob_t *head_blob = hb_sanitize_context_t ().reference_table<head> (plan->source); | 59 | 8.18k | hb_blob_t *head_prime_blob = hb_blob_copy_writable_or_fail (head_blob); | 60 | 8.18k | hb_blob_destroy (head_blob); | 61 | | | 62 | 8.18k | if (unlikely (!head_prime_blob)) | 63 | 6.06k | return false; | 64 | | | 65 | 2.12k | head *head_prime = (head *) hb_blob_get_data_writable (head_prime_blob, nullptr); | 66 | 2.12k | head_prime->indexToLocFormat = use_short_loca ? 0 : 1; | 67 | 2.12k | if (plan->normalized_coords) | 68 | 556 | { | 69 | 556 | head_prime->xMin = plan->head_maxp_info.xMin; | 70 | 556 | head_prime->xMax = plan->head_maxp_info.xMax; | 71 | 556 | head_prime->yMin = plan->head_maxp_info.yMin; | 72 | 556 | head_prime->yMax = plan->head_maxp_info.yMax; | 73 | | | 74 | 556 | unsigned orig_flag = head_prime->flags; | 75 | 556 | if (plan->head_maxp_info.allXMinIsLsb) | 76 | 152 | orig_flag |= 1 << 1; | 77 | 404 | else | 78 | 404 | orig_flag &= ~(1 << 1); | 79 | 556 | head_prime->flags = orig_flag; | 80 | 556 | } | 81 | 2.12k | bool success = plan->add_table (HB_OT_TAG_head, head_prime_blob); | 82 | | | 83 | 2.12k | hb_blob_destroy (head_prime_blob); | 84 | 2.12k | return success; | 85 | 8.18k | } |
|
86 | | |
87 | | template<typename Iterator, |
88 | | hb_requires (hb_is_source_of (Iterator, unsigned int))> |
89 | | static bool |
90 | | _add_loca_and_head (hb_subset_context_t *c, |
91 | | Iterator padded_offsets, |
92 | | bool use_short_loca) |
93 | 8.18k | { |
94 | 8.18k | unsigned num_offsets = c->plan->num_output_glyphs () + 1; |
95 | 8.18k | unsigned entry_size = use_short_loca ? 2 : 4; |
96 | | |
97 | 8.18k | char *loca_prime_data = (char *) hb_malloc (entry_size * num_offsets); |
98 | | |
99 | 8.18k | if (unlikely (!loca_prime_data)) return false; |
100 | | |
101 | 8.18k | DEBUG_MSG (SUBSET, nullptr, "loca entry_size %u num_offsets %u size %u", |
102 | 8.18k | entry_size, num_offsets, entry_size * num_offsets); |
103 | | |
104 | 8.18k | if (use_short_loca) |
105 | 5.12k | _write_loca (padded_offsets, c->plan->new_to_old_gid_list, true, (HBUINT16 *) loca_prime_data, num_offsets); |
106 | 3.05k | else |
107 | 3.05k | _write_loca (padded_offsets, c->plan->new_to_old_gid_list, false, (HBUINT32 *) loca_prime_data, num_offsets); |
108 | | |
109 | 8.18k | hb_blob_t *loca_blob = hb_blob_create (loca_prime_data, |
110 | 8.18k | entry_size * num_offsets, |
111 | 8.18k | HB_MEMORY_MODE_WRITABLE, |
112 | 8.18k | loca_prime_data, |
113 | 8.18k | hb_free); |
114 | | |
115 | 8.18k | bool result = c->plan->add_table (HB_OT_TAG_loca, loca_blob) |
116 | 8.18k | && _add_head_and_set_loca_version (c->plan, use_short_loca); |
117 | | |
118 | 8.18k | hb_blob_destroy (loca_blob); |
119 | 8.18k | return result; |
120 | 8.18k | } Unexecuted instantiation: hb-common.cc:_ZN2OT9glyf_implL18_add_loca_and_headI10hb_array_tIKjETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEbP19hb_subset_context_tS6_b Unexecuted instantiation: hb-ot-face.cc:_ZN2OT9glyf_implL18_add_loca_and_headI10hb_array_tIKjETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEbP19hb_subset_context_tS6_b Unexecuted instantiation: hb-ot-font.cc:_ZN2OT9glyf_implL18_add_loca_and_headI10hb_array_tIKjETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEbP19hb_subset_context_tS6_b Unexecuted instantiation: VARC.cc:_ZN2OT9glyf_implL18_add_loca_and_headI10hb_array_tIKjETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEbP19hb_subset_context_tS6_b Unexecuted instantiation: hb-subset-plan.cc:_ZN2OT9glyf_implL18_add_loca_and_headI10hb_array_tIKjETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEbP19hb_subset_context_tS6_b Unexecuted instantiation: hb-subset-plan-var.cc:_ZN2OT9glyf_implL18_add_loca_and_headI10hb_array_tIKjETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEbP19hb_subset_context_tS6_b hb-subset-table-other.cc:_ZN2OT9glyf_implL18_add_loca_and_headI10hb_array_tIKjETnPN12hb_enable_ifIXsr15hb_is_source_ofIT_jEE5valueEvE4typeELPv0EEEbP19hb_subset_context_tS6_b Line | Count | Source | 93 | 8.18k | { | 94 | 8.18k | unsigned num_offsets = c->plan->num_output_glyphs () + 1; | 95 | 8.18k | unsigned entry_size = use_short_loca ? 2 : 4; | 96 | | | 97 | 8.18k | char *loca_prime_data = (char *) hb_malloc (entry_size * num_offsets); | 98 | | | 99 | 8.18k | if (unlikely (!loca_prime_data)) return false; | 100 | | | 101 | 8.18k | DEBUG_MSG (SUBSET, nullptr, "loca entry_size %u num_offsets %u size %u", | 102 | 8.18k | entry_size, num_offsets, entry_size * num_offsets); | 103 | | | 104 | 8.18k | if (use_short_loca) | 105 | 5.12k | _write_loca (padded_offsets, c->plan->new_to_old_gid_list, true, (HBUINT16 *) loca_prime_data, num_offsets); | 106 | 3.05k | else | 107 | 3.05k | _write_loca (padded_offsets, c->plan->new_to_old_gid_list, false, (HBUINT32 *) loca_prime_data, num_offsets); | 108 | | | 109 | 8.18k | hb_blob_t *loca_blob = hb_blob_create (loca_prime_data, | 110 | 8.18k | entry_size * num_offsets, | 111 | 8.18k | HB_MEMORY_MODE_WRITABLE, | 112 | 8.18k | loca_prime_data, | 113 | 8.18k | hb_free); | 114 | | | 115 | 8.18k | bool result = c->plan->add_table (HB_OT_TAG_loca, loca_blob) | 116 | 8.18k | && _add_head_and_set_loca_version (c->plan, use_short_loca); | 117 | | | 118 | 8.18k | hb_blob_destroy (loca_blob); | 119 | 8.18k | return result; | 120 | 8.18k | } |
|
121 | | |
122 | | |
123 | | } /* namespace glyf_impl */ |
124 | | } /* namespace OT */ |
125 | | |
126 | | |
127 | | #endif /* OT_GLYF_GLYF_HELPERS_HH */ |