author | erikj |
Tue, 12 Sep 2017 19:03:39 +0200 | |
changeset 47216 | 71c04702a3d5 |
parent 43232 | jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc@8e39ad39979f |
child 48274 | 51772bf1fb0c |
permissions | -rw-r--r-- |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
1 |
/* |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
2 |
* Copyright © 2011,2014 Google, Inc. |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
3 |
* |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
4 |
* This is part of HarfBuzz, a text shaping library. |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
5 |
* |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
6 |
* Permission is hereby granted, without written agreement and without |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
7 |
* license or royalty fees, to use, copy, modify, and distribute this |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
8 |
* software and its documentation for any purpose, provided that the |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
9 |
* above copyright notice and the following two paragraphs appear in |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
10 |
* all copies of this software. |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
11 |
* |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
12 |
* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
13 |
* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
14 |
* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
15 |
* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
16 |
* DAMAGE. |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
17 |
* |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
18 |
* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
19 |
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
20 |
* FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
21 |
* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
22 |
* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
23 |
* |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
24 |
* Google Author(s): Behdad Esfahbod, Roozbeh Pournader |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
25 |
*/ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
26 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
27 |
#include "hb-private.hh" |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
28 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
29 |
#include "hb-ot.h" |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
30 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
31 |
#include "hb-font-private.hh" |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
32 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
33 |
#include "hb-ot-cmap-table.hh" |
43232 | 34 |
#include "hb-ot-cbdt-table.hh" |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
35 |
#include "hb-ot-glyf-table.hh" |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
36 |
#include "hb-ot-head-table.hh" |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
37 |
#include "hb-ot-hhea-table.hh" |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
38 |
#include "hb-ot-hmtx-table.hh" |
40435 | 39 |
#include "hb-ot-os2-table.hh" |
40 |
//#include "hb-ot-post-table.hh" |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
41 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
42 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
43 |
struct hb_ot_face_metrics_accelerator_t |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
44 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
45 |
unsigned int num_metrics; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
46 |
unsigned int num_advances; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
47 |
unsigned int default_advance; |
40435 | 48 |
unsigned short ascender; |
49 |
unsigned short descender; |
|
50 |
unsigned short line_gap; |
|
43232 | 51 |
bool has_font_extents; |
40435 | 52 |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
53 |
const OT::_mtx *table; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
54 |
hb_blob_t *blob; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
55 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
56 |
inline void init (hb_face_t *face, |
40435 | 57 |
hb_tag_t _hea_tag, |
58 |
hb_tag_t _mtx_tag, |
|
43232 | 59 |
hb_tag_t os2_tag, |
60 |
unsigned int default_advance = 0) |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
61 |
{ |
43232 | 62 |
this->default_advance = default_advance ? default_advance : face->get_upem (); |
40435 | 63 |
|
64 |
bool got_font_extents = false; |
|
65 |
if (os2_tag) |
|
66 |
{ |
|
67 |
hb_blob_t *os2_blob = OT::Sanitizer<OT::os2>::sanitize (face->reference_table (os2_tag)); |
|
68 |
const OT::os2 *os2 = OT::Sanitizer<OT::os2>::lock_instance (os2_blob); |
|
69 |
#define USE_TYPO_METRICS (1u<<7) |
|
70 |
if (0 != (os2->fsSelection & USE_TYPO_METRICS)) |
|
71 |
{ |
|
72 |
this->ascender = os2->sTypoAscender; |
|
73 |
this->descender = os2->sTypoDescender; |
|
74 |
this->line_gap = os2->sTypoLineGap; |
|
75 |
got_font_extents = (this->ascender | this->descender) != 0; |
|
76 |
} |
|
77 |
hb_blob_destroy (os2_blob); |
|
78 |
} |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
79 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
80 |
hb_blob_t *_hea_blob = OT::Sanitizer<OT::_hea>::sanitize (face->reference_table (_hea_tag)); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
81 |
const OT::_hea *_hea = OT::Sanitizer<OT::_hea>::lock_instance (_hea_blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
82 |
this->num_advances = _hea->numberOfLongMetrics; |
40435 | 83 |
if (!got_font_extents) |
84 |
{ |
|
85 |
this->ascender = _hea->ascender; |
|
86 |
this->descender = _hea->descender; |
|
87 |
this->line_gap = _hea->lineGap; |
|
43232 | 88 |
got_font_extents = (this->ascender | this->descender) != 0; |
40435 | 89 |
} |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
90 |
hb_blob_destroy (_hea_blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
91 |
|
43232 | 92 |
this->has_font_extents = got_font_extents; |
93 |
||
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
94 |
this->blob = OT::Sanitizer<OT::_mtx>::sanitize (face->reference_table (_mtx_tag)); |
40435 | 95 |
|
96 |
/* Cap num_metrics() and num_advances() based on table length. */ |
|
97 |
unsigned int len = hb_blob_get_length (this->blob); |
|
98 |
if (unlikely (this->num_advances * 4 > len)) |
|
99 |
this->num_advances = len / 4; |
|
100 |
this->num_metrics = this->num_advances + (len - 4 * this->num_advances) / 2; |
|
101 |
||
102 |
/* We MUST set num_metrics to zero if num_advances is zero. |
|
103 |
* Our get_advance() depends on that. */ |
|
104 |
if (unlikely (!this->num_advances)) |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
105 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
106 |
this->num_metrics = this->num_advances = 0; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
107 |
hb_blob_destroy (this->blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
108 |
this->blob = hb_blob_get_empty (); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
109 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
110 |
this->table = OT::Sanitizer<OT::_mtx>::lock_instance (this->blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
111 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
112 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
113 |
inline void fini (void) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
114 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
115 |
hb_blob_destroy (this->blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
116 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
117 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
118 |
inline unsigned int get_advance (hb_codepoint_t glyph) const |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
119 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
120 |
if (unlikely (glyph >= this->num_metrics)) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
121 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
122 |
/* If this->num_metrics is zero, it means we don't have the metrics table |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
123 |
* for this direction: return default advance. Otherwise, it means that the |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
124 |
* glyph index is out of bound: return zero. */ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
125 |
if (this->num_metrics) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
126 |
return 0; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
127 |
else |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
128 |
return this->default_advance; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
129 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
130 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
131 |
if (glyph >= this->num_advances) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
132 |
glyph = this->num_advances - 1; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
133 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
134 |
return this->table->longMetric[glyph].advance; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
135 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
136 |
}; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
137 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
138 |
struct hb_ot_face_glyf_accelerator_t |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
139 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
140 |
bool short_offset; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
141 |
unsigned int num_glyphs; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
142 |
const OT::loca *loca; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
143 |
const OT::glyf *glyf; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
144 |
hb_blob_t *loca_blob; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
145 |
hb_blob_t *glyf_blob; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
146 |
unsigned int glyf_len; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
147 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
148 |
inline void init (hb_face_t *face) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
149 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
150 |
hb_blob_t *head_blob = OT::Sanitizer<OT::head>::sanitize (face->reference_table (HB_OT_TAG_head)); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
151 |
const OT::head *head = OT::Sanitizer<OT::head>::lock_instance (head_blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
152 |
if ((unsigned int) head->indexToLocFormat > 1 || head->glyphDataFormat != 0) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
153 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
154 |
/* Unknown format. Leave num_glyphs=0, that takes care of disabling us. */ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
155 |
hb_blob_destroy (head_blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
156 |
return; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
157 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
158 |
this->short_offset = 0 == head->indexToLocFormat; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
159 |
hb_blob_destroy (head_blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
160 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
161 |
this->loca_blob = OT::Sanitizer<OT::loca>::sanitize (face->reference_table (HB_OT_TAG_loca)); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
162 |
this->loca = OT::Sanitizer<OT::loca>::lock_instance (this->loca_blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
163 |
this->glyf_blob = OT::Sanitizer<OT::glyf>::sanitize (face->reference_table (HB_OT_TAG_glyf)); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
164 |
this->glyf = OT::Sanitizer<OT::glyf>::lock_instance (this->glyf_blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
165 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
166 |
this->num_glyphs = MAX (1u, hb_blob_get_length (this->loca_blob) / (this->short_offset ? 2 : 4)) - 1; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
167 |
this->glyf_len = hb_blob_get_length (this->glyf_blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
168 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
169 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
170 |
inline void fini (void) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
171 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
172 |
hb_blob_destroy (this->loca_blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
173 |
hb_blob_destroy (this->glyf_blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
174 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
175 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
176 |
inline bool get_extents (hb_codepoint_t glyph, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
177 |
hb_glyph_extents_t *extents) const |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
178 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
179 |
if (unlikely (glyph >= this->num_glyphs)) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
180 |
return false; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
181 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
182 |
unsigned int start_offset, end_offset; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
183 |
if (this->short_offset) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
184 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
185 |
start_offset = 2 * this->loca->u.shortsZ[glyph]; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
186 |
end_offset = 2 * this->loca->u.shortsZ[glyph + 1]; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
187 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
188 |
else |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
189 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
190 |
start_offset = this->loca->u.longsZ[glyph]; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
191 |
end_offset = this->loca->u.longsZ[glyph + 1]; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
192 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
193 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
194 |
if (start_offset > end_offset || end_offset > this->glyf_len) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
195 |
return false; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
196 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
197 |
if (end_offset - start_offset < OT::glyfGlyphHeader::static_size) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
198 |
return true; /* Empty glyph; zero extents. */ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
199 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
200 |
const OT::glyfGlyphHeader &glyph_header = OT::StructAtOffset<OT::glyfGlyphHeader> (this->glyf, start_offset); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
201 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
202 |
extents->x_bearing = MIN (glyph_header.xMin, glyph_header.xMax); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
203 |
extents->y_bearing = MAX (glyph_header.yMin, glyph_header.yMax); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
204 |
extents->width = MAX (glyph_header.xMin, glyph_header.xMax) - extents->x_bearing; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
205 |
extents->height = MIN (glyph_header.yMin, glyph_header.yMax) - extents->y_bearing; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
206 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
207 |
return true; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
208 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
209 |
}; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
210 |
|
43232 | 211 |
struct hb_ot_face_cbdt_accelerator_t |
212 |
{ |
|
213 |
hb_blob_t *cblc_blob; |
|
214 |
hb_blob_t *cbdt_blob; |
|
215 |
const OT::CBLC *cblc; |
|
216 |
const OT::CBDT *cbdt; |
|
217 |
||
218 |
unsigned int cbdt_len; |
|
219 |
float upem; |
|
220 |
||
221 |
inline void init (hb_face_t *face) |
|
222 |
{ |
|
223 |
upem = face->get_upem(); |
|
224 |
||
225 |
cblc_blob = OT::Sanitizer<OT::CBLC>::sanitize (face->reference_table (HB_OT_TAG_CBLC)); |
|
226 |
cbdt_blob = OT::Sanitizer<OT::CBDT>::sanitize (face->reference_table (HB_OT_TAG_CBDT)); |
|
227 |
cbdt_len = hb_blob_get_length (cbdt_blob); |
|
228 |
||
229 |
if (hb_blob_get_length (cblc_blob) == 0) { |
|
230 |
cblc = NULL; |
|
231 |
cbdt = NULL; |
|
232 |
return; /* Not a bitmap font. */ |
|
233 |
} |
|
234 |
cblc = OT::Sanitizer<OT::CBLC>::lock_instance (cblc_blob); |
|
235 |
cbdt = OT::Sanitizer<OT::CBDT>::lock_instance (cbdt_blob); |
|
236 |
||
237 |
} |
|
238 |
||
239 |
inline void fini (void) |
|
240 |
{ |
|
241 |
hb_blob_destroy (this->cblc_blob); |
|
242 |
hb_blob_destroy (this->cbdt_blob); |
|
243 |
} |
|
244 |
||
245 |
inline bool get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const |
|
246 |
{ |
|
247 |
unsigned int x_ppem = upem, y_ppem = upem; /* TODO Use font ppem if available. */ |
|
248 |
||
249 |
if (cblc == NULL) |
|
250 |
return false; // Not a color bitmap font. |
|
251 |
||
252 |
const OT::IndexSubtableRecord *subtable_record = this->cblc->find_table(glyph, &x_ppem, &y_ppem); |
|
253 |
if (subtable_record == NULL) |
|
254 |
return false; |
|
255 |
||
256 |
if (subtable_record->get_extents (extents)) |
|
257 |
return true; |
|
258 |
||
259 |
unsigned int image_offset = 0, image_length = 0, image_format = 0; |
|
260 |
if (!subtable_record->get_image_data (glyph, &image_offset, &image_length, &image_format)) |
|
261 |
return false; |
|
262 |
||
263 |
{ |
|
264 |
/* TODO Move the following into CBDT struct when adding more formats. */ |
|
265 |
||
266 |
if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length)) |
|
267 |
return false; |
|
268 |
||
269 |
switch (image_format) |
|
270 |
{ |
|
271 |
case 17: { |
|
272 |
if (unlikely (image_length < OT::GlyphBitmapDataFormat17::min_size)) |
|
273 |
return false; |
|
274 |
||
275 |
const OT::GlyphBitmapDataFormat17& glyphFormat17 = |
|
276 |
OT::StructAtOffset<OT::GlyphBitmapDataFormat17> (this->cbdt, image_offset); |
|
277 |
glyphFormat17.glyphMetrics.get_extents (extents); |
|
278 |
} |
|
279 |
break; |
|
280 |
default: |
|
281 |
// TODO: Support other image formats. |
|
282 |
return false; |
|
283 |
} |
|
284 |
} |
|
285 |
||
286 |
/* Convert to the font units. */ |
|
287 |
extents->x_bearing *= upem / (float) x_ppem; |
|
288 |
extents->y_bearing *= upem / (float) y_ppem; |
|
289 |
extents->width *= upem / (float) x_ppem; |
|
290 |
extents->height *= upem / (float) y_ppem; |
|
291 |
||
292 |
return true; |
|
293 |
} |
|
294 |
}; |
|
295 |
||
40435 | 296 |
typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj, |
297 |
hb_codepoint_t codepoint, |
|
298 |
hb_codepoint_t *glyph); |
|
299 |
||
300 |
template <typename Type> |
|
301 |
static inline bool get_glyph_from (const void *obj, |
|
302 |
hb_codepoint_t codepoint, |
|
303 |
hb_codepoint_t *glyph) |
|
304 |
{ |
|
305 |
const Type *typed_obj = (const Type *) obj; |
|
306 |
return typed_obj->get_glyph (codepoint, glyph); |
|
307 |
} |
|
308 |
||
309 |
template <typename Type> |
|
310 |
static inline bool get_glyph_from_symbol (const void *obj, |
|
311 |
hb_codepoint_t codepoint, |
|
312 |
hb_codepoint_t *glyph) |
|
313 |
{ |
|
314 |
const Type *typed_obj = (const Type *) obj; |
|
315 |
if (likely (typed_obj->get_glyph (codepoint, glyph))) |
|
316 |
return true; |
|
317 |
||
318 |
if (codepoint <= 0x00FFu) |
|
319 |
{ |
|
320 |
/* For symbol-encoded OpenType fonts, we duplicate the |
|
321 |
* U+F000..F0FF range at U+0000..U+00FF. That's what |
|
322 |
* Windows seems to do, and that's hinted about at: |
|
323 |
* http://www.microsoft.com/typography/otspec/recom.htm |
|
324 |
* under "Non-Standard (Symbol) Fonts". */ |
|
325 |
return typed_obj->get_glyph (0xF000u + codepoint, glyph); |
|
326 |
} |
|
327 |
||
328 |
return false; |
|
329 |
} |
|
330 |
||
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
331 |
struct hb_ot_face_cmap_accelerator_t |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
332 |
{ |
40435 | 333 |
hb_cmap_get_glyph_func_t get_glyph_func; |
334 |
const void *get_glyph_data; |
|
335 |
OT::CmapSubtableFormat4::accelerator_t format4_accel; |
|
336 |
||
337 |
const OT::CmapSubtableFormat14 *uvs_table; |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
338 |
hb_blob_t *blob; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
339 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
340 |
inline void init (hb_face_t *face) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
341 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
342 |
this->blob = OT::Sanitizer<OT::cmap>::sanitize (face->reference_table (HB_OT_TAG_cmap)); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
343 |
const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (this->blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
344 |
const OT::CmapSubtable *subtable = NULL; |
40435 | 345 |
const OT::CmapSubtableFormat14 *subtable_uvs = NULL; |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
346 |
|
40435 | 347 |
bool symbol = false; |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
348 |
/* 32-bit subtables. */ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
349 |
if (!subtable) subtable = cmap->find_subtable (3, 10); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
350 |
if (!subtable) subtable = cmap->find_subtable (0, 6); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
351 |
if (!subtable) subtable = cmap->find_subtable (0, 4); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
352 |
/* 16-bit subtables. */ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
353 |
if (!subtable) subtable = cmap->find_subtable (3, 1); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
354 |
if (!subtable) subtable = cmap->find_subtable (0, 3); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
355 |
if (!subtable) subtable = cmap->find_subtable (0, 2); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
356 |
if (!subtable) subtable = cmap->find_subtable (0, 1); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
357 |
if (!subtable) subtable = cmap->find_subtable (0, 0); |
43232 | 358 |
if (!subtable) |
359 |
{ |
|
360 |
subtable = cmap->find_subtable (3, 0); |
|
361 |
if (subtable) symbol = true; |
|
362 |
} |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
363 |
/* Meh. */ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
364 |
if (!subtable) subtable = &OT::Null(OT::CmapSubtable); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
365 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
366 |
/* UVS subtable. */ |
40435 | 367 |
if (!subtable_uvs) |
368 |
{ |
|
369 |
const OT::CmapSubtable *st = cmap->find_subtable (0, 5); |
|
370 |
if (st && st->u.format == 14) |
|
371 |
subtable_uvs = &st->u.format14; |
|
372 |
} |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
373 |
/* Meh. */ |
40435 | 374 |
if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtableFormat14); |
375 |
||
376 |
this->uvs_table = subtable_uvs; |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
377 |
|
40435 | 378 |
this->get_glyph_data = subtable; |
379 |
if (unlikely (symbol)) |
|
380 |
this->get_glyph_func = get_glyph_from_symbol<OT::CmapSubtable>; |
|
381 |
else |
|
382 |
switch (subtable->u.format) { |
|
383 |
/* Accelerate format 4 and format 12. */ |
|
384 |
default: this->get_glyph_func = get_glyph_from<OT::CmapSubtable>; break; |
|
385 |
case 12: this->get_glyph_func = get_glyph_from<OT::CmapSubtableFormat12>; break; |
|
386 |
case 4: |
|
387 |
{ |
|
388 |
this->format4_accel.init (&subtable->u.format4); |
|
389 |
this->get_glyph_data = &this->format4_accel; |
|
390 |
this->get_glyph_func = this->format4_accel.get_glyph_func; |
|
391 |
} |
|
392 |
break; |
|
393 |
} |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
394 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
395 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
396 |
inline void fini (void) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
397 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
398 |
hb_blob_destroy (this->blob); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
399 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
400 |
|
40435 | 401 |
inline bool get_nominal_glyph (hb_codepoint_t unicode, |
402 |
hb_codepoint_t *glyph) const |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
403 |
{ |
40435 | 404 |
return this->get_glyph_func (this->get_glyph_data, unicode, glyph); |
405 |
} |
|
406 |
||
407 |
inline bool get_variation_glyph (hb_codepoint_t unicode, |
|
408 |
hb_codepoint_t variation_selector, |
|
409 |
hb_codepoint_t *glyph) const |
|
410 |
{ |
|
411 |
switch (this->uvs_table->get_glyph_variant (unicode, |
|
412 |
variation_selector, |
|
413 |
glyph)) |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
414 |
{ |
40435 | 415 |
case OT::GLYPH_VARIANT_NOT_FOUND: return false; |
416 |
case OT::GLYPH_VARIANT_FOUND: return true; |
|
417 |
case OT::GLYPH_VARIANT_USE_DEFAULT: break; |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
418 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
419 |
|
40435 | 420 |
return get_nominal_glyph (unicode, glyph); |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
421 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
422 |
}; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
423 |
|
40435 | 424 |
template <typename T> |
425 |
struct hb_lazy_loader_t |
|
426 |
{ |
|
427 |
inline void init (hb_face_t *face_) |
|
428 |
{ |
|
429 |
face = face_; |
|
430 |
instance = NULL; |
|
431 |
} |
|
432 |
||
433 |
inline void fini (void) |
|
434 |
{ |
|
435 |
if (instance && instance != &OT::Null(T)) |
|
436 |
{ |
|
437 |
instance->fini(); |
|
438 |
free (instance); |
|
439 |
} |
|
440 |
} |
|
441 |
||
442 |
inline const T* operator-> (void) const |
|
443 |
{ |
|
444 |
retry: |
|
445 |
T *p = (T *) hb_atomic_ptr_get (&instance); |
|
446 |
if (unlikely (!p)) |
|
447 |
{ |
|
448 |
p = (T *) calloc (1, sizeof (T)); |
|
449 |
if (unlikely (!p)) |
|
450 |
return &OT::Null(T); |
|
451 |
p->init (face); |
|
452 |
if (unlikely (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), NULL, p))) |
|
453 |
{ |
|
454 |
p->fini (); |
|
455 |
goto retry; |
|
456 |
} |
|
457 |
} |
|
458 |
return p; |
|
459 |
} |
|
460 |
||
461 |
private: |
|
462 |
hb_face_t *face; |
|
463 |
T *instance; |
|
464 |
}; |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
465 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
466 |
struct hb_ot_font_t |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
467 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
468 |
hb_ot_face_cmap_accelerator_t cmap; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
469 |
hb_ot_face_metrics_accelerator_t h_metrics; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
470 |
hb_ot_face_metrics_accelerator_t v_metrics; |
40435 | 471 |
hb_lazy_loader_t<hb_ot_face_glyf_accelerator_t> glyf; |
43232 | 472 |
hb_lazy_loader_t<hb_ot_face_cbdt_accelerator_t> cbdt; |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
473 |
}; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
474 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
475 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
476 |
static hb_ot_font_t * |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
477 |
_hb_ot_font_create (hb_face_t *face) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
478 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
479 |
hb_ot_font_t *ot_font = (hb_ot_font_t *) calloc (1, sizeof (hb_ot_font_t)); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
480 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
481 |
if (unlikely (!ot_font)) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
482 |
return NULL; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
483 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
484 |
ot_font->cmap.init (face); |
40435 | 485 |
ot_font->h_metrics.init (face, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, HB_OT_TAG_os2); |
43232 | 486 |
ot_font->v_metrics.init (face, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, HB_TAG_NONE, |
487 |
ot_font->h_metrics.ascender - ot_font->h_metrics.descender); /* TODO Can we do this lazily? */ |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
488 |
ot_font->glyf.init (face); |
43232 | 489 |
ot_font->cbdt.init (face); |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
490 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
491 |
return ot_font; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
492 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
493 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
494 |
static void |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
495 |
_hb_ot_font_destroy (hb_ot_font_t *ot_font) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
496 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
497 |
ot_font->cmap.fini (); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
498 |
ot_font->h_metrics.fini (); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
499 |
ot_font->v_metrics.fini (); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
500 |
ot_font->glyf.fini (); |
43232 | 501 |
ot_font->cbdt.fini (); |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
502 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
503 |
free (ot_font); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
504 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
505 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
506 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
507 |
static hb_bool_t |
40435 | 508 |
hb_ot_get_nominal_glyph (hb_font_t *font HB_UNUSED, |
509 |
void *font_data, |
|
510 |
hb_codepoint_t unicode, |
|
511 |
hb_codepoint_t *glyph, |
|
512 |
void *user_data HB_UNUSED) |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
513 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
514 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
515 |
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; |
40435 | 516 |
return ot_font->cmap.get_nominal_glyph (unicode, glyph); |
517 |
} |
|
518 |
||
519 |
static hb_bool_t |
|
520 |
hb_ot_get_variation_glyph (hb_font_t *font HB_UNUSED, |
|
521 |
void *font_data, |
|
522 |
hb_codepoint_t unicode, |
|
523 |
hb_codepoint_t variation_selector, |
|
524 |
hb_codepoint_t *glyph, |
|
525 |
void *user_data HB_UNUSED) |
|
526 |
{ |
|
527 |
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; |
|
528 |
return ot_font->cmap.get_variation_glyph (unicode, variation_selector, glyph); |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
529 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
530 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
531 |
static hb_position_t |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
532 |
hb_ot_get_glyph_h_advance (hb_font_t *font HB_UNUSED, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
533 |
void *font_data, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
534 |
hb_codepoint_t glyph, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
535 |
void *user_data HB_UNUSED) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
536 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
537 |
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
538 |
return font->em_scale_x (ot_font->h_metrics.get_advance (glyph)); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
539 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
540 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
541 |
static hb_position_t |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
542 |
hb_ot_get_glyph_v_advance (hb_font_t *font HB_UNUSED, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
543 |
void *font_data, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
544 |
hb_codepoint_t glyph, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
545 |
void *user_data HB_UNUSED) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
546 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
547 |
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
548 |
return font->em_scale_y (-(int) ot_font->v_metrics.get_advance (glyph)); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
549 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
550 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
551 |
static hb_bool_t |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
552 |
hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
553 |
void *font_data, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
554 |
hb_codepoint_t glyph, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
555 |
hb_glyph_extents_t *extents, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
556 |
void *user_data HB_UNUSED) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
557 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
558 |
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; |
40435 | 559 |
bool ret = ot_font->glyf->get_extents (glyph, extents); |
43232 | 560 |
if (!ret) |
561 |
ret = ot_font->cbdt->get_extents (glyph, extents); |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
562 |
extents->x_bearing = font->em_scale_x (extents->x_bearing); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
563 |
extents->y_bearing = font->em_scale_y (extents->y_bearing); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
564 |
extents->width = font->em_scale_x (extents->width); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
565 |
extents->height = font->em_scale_y (extents->height); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
566 |
return ret; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
567 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
568 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
569 |
static hb_bool_t |
40435 | 570 |
hb_ot_get_font_h_extents (hb_font_t *font HB_UNUSED, |
571 |
void *font_data, |
|
572 |
hb_font_extents_t *metrics, |
|
573 |
void *user_data HB_UNUSED) |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
574 |
{ |
40435 | 575 |
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; |
576 |
metrics->ascender = font->em_scale_y (ot_font->h_metrics.ascender); |
|
577 |
metrics->descender = font->em_scale_y (ot_font->h_metrics.descender); |
|
578 |
metrics->line_gap = font->em_scale_y (ot_font->h_metrics.line_gap); |
|
43232 | 579 |
return ot_font->h_metrics.has_font_extents; |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
580 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
581 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
582 |
static hb_bool_t |
40435 | 583 |
hb_ot_get_font_v_extents (hb_font_t *font HB_UNUSED, |
584 |
void *font_data, |
|
585 |
hb_font_extents_t *metrics, |
|
586 |
void *user_data HB_UNUSED) |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
587 |
{ |
40435 | 588 |
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; |
589 |
metrics->ascender = font->em_scale_x (ot_font->v_metrics.ascender); |
|
590 |
metrics->descender = font->em_scale_x (ot_font->v_metrics.descender); |
|
591 |
metrics->line_gap = font->em_scale_x (ot_font->v_metrics.line_gap); |
|
43232 | 592 |
return ot_font->v_metrics.has_font_extents; |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
593 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
594 |
|
40435 | 595 |
static hb_font_funcs_t *static_ot_funcs = NULL; |
596 |
||
597 |
#ifdef HB_USE_ATEXIT |
|
598 |
static |
|
599 |
void free_static_ot_funcs (void) |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
600 |
{ |
40435 | 601 |
hb_font_funcs_destroy (static_ot_funcs); |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
602 |
} |
40435 | 603 |
#endif |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
604 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
605 |
static hb_font_funcs_t * |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
606 |
_hb_ot_get_font_funcs (void) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
607 |
{ |
40435 | 608 |
retry: |
609 |
hb_font_funcs_t *funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ot_funcs); |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
610 |
|
40435 | 611 |
if (unlikely (!funcs)) |
612 |
{ |
|
613 |
funcs = hb_font_funcs_create (); |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
614 |
|
40435 | 615 |
hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, NULL, NULL); |
616 |
hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, NULL, NULL); |
|
617 |
hb_font_funcs_set_nominal_glyph_func (funcs, hb_ot_get_nominal_glyph, NULL, NULL); |
|
618 |
hb_font_funcs_set_variation_glyph_func (funcs, hb_ot_get_variation_glyph, NULL, NULL); |
|
619 |
hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ot_get_glyph_h_advance, NULL, NULL); |
|
620 |
hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ot_get_glyph_v_advance, NULL, NULL); |
|
621 |
//hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, NULL, NULL); |
|
622 |
//hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, NULL, NULL); |
|
623 |
//hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ot_get_glyph_h_kerning, NULL, NULL); TODO |
|
624 |
//hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ot_get_glyph_v_kerning, NULL, NULL); |
|
625 |
hb_font_funcs_set_glyph_extents_func (funcs, hb_ot_get_glyph_extents, NULL, NULL); |
|
626 |
//hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ot_get_glyph_contour_point, NULL, NULL); TODO |
|
627 |
//hb_font_funcs_set_glyph_name_func (funcs, hb_ot_get_glyph_name, NULL, NULL); TODO |
|
628 |
//hb_font_funcs_set_glyph_from_name_func (funcs, hb_ot_get_glyph_from_name, NULL, NULL); TODO |
|
629 |
||
630 |
hb_font_funcs_make_immutable (funcs); |
|
631 |
||
632 |
if (!hb_atomic_ptr_cmpexch (&static_ot_funcs, NULL, funcs)) { |
|
633 |
hb_font_funcs_destroy (funcs); |
|
634 |
goto retry; |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
635 |
} |
40435 | 636 |
|
637 |
#ifdef HB_USE_ATEXIT |
|
638 |
atexit (free_static_ot_funcs); /* First person registers atexit() callback. */ |
|
639 |
#endif |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
640 |
}; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
641 |
|
40435 | 642 |
return funcs; |
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
643 |
} |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
644 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
645 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
646 |
/** |
40435 | 647 |
* hb_ot_font_set_funcs: |
648 |
* |
|
34414
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
649 |
* Since: 0.9.28 |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
650 |
**/ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
651 |
void |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
652 |
hb_ot_font_set_funcs (hb_font_t *font) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
653 |
{ |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
654 |
hb_ot_font_t *ot_font = _hb_ot_font_create (font->face); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
655 |
if (unlikely (!ot_font)) |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
656 |
return; |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
657 |
|
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
658 |
hb_font_set_funcs (font, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
659 |
_hb_ot_get_font_funcs (), |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
660 |
ot_font, |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
661 |
(hb_destroy_func_t) _hb_ot_font_destroy); |
e496a8d8fc8a
8143177: Integrate harfbuzz opentype layout engine per JEP 258
prr
parents:
diff
changeset
|
662 |
} |