Coverage Report

Created: 2025-08-03 06:54

/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 */