Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Backport-of: f42dab85924d6a74d1c2c87bca1970e2362f45ea
- Loading branch information
Showing
265 changed files
with
35,929 additions
and
22,657 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
## Harfbuzz v2.8 | ||
## Harfbuzz v4.4.1 | ||
|
||
### Harfbuzz License | ||
|
||
|
165 changes: 165 additions & 0 deletions
165
src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS.hh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
#ifndef OT_LAYOUT_GPOS_HH | ||
#define OT_LAYOUT_GPOS_HH | ||
|
||
#include "../../hb-ot-layout-common.hh" | ||
#include "../../hb-ot-layout-gsubgpos.hh" | ||
#include "GPOS/Common.hh" | ||
#include "GPOS/PosLookup.hh" | ||
|
||
namespace OT { | ||
namespace Layout { | ||
|
||
static void | ||
propagate_attachment_offsets (hb_glyph_position_t *pos, | ||
unsigned int len, | ||
unsigned int i, | ||
hb_direction_t direction, | ||
unsigned nesting_level = HB_MAX_NESTING_LEVEL); | ||
|
||
/* | ||
* GPOS -- Glyph Positioning | ||
* https://docs.microsoft.com/en-us/typography/opentype/spec/gpos | ||
*/ | ||
|
||
struct GPOS : GSUBGPOS | ||
{ | ||
static constexpr hb_tag_t tableTag = HB_OT_TAG_GPOS; | ||
|
||
using Lookup = GPOS_impl::PosLookup; | ||
|
||
const GPOS_impl::PosLookup& get_lookup (unsigned int i) const | ||
{ return static_cast<const GPOS_impl::PosLookup &> (GSUBGPOS::get_lookup (i)); } | ||
|
||
static inline void position_start (hb_font_t *font, hb_buffer_t *buffer); | ||
static inline void position_finish_advances (hb_font_t *font, hb_buffer_t *buffer); | ||
static inline void position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer); | ||
|
||
bool subset (hb_subset_context_t *c) const | ||
{ | ||
hb_subset_layout_context_t l (c, tableTag, c->plan->gpos_lookups, c->plan->gpos_langsys, c->plan->gpos_features); | ||
return GSUBGPOS::subset<GPOS_impl::PosLookup> (&l); | ||
} | ||
|
||
bool sanitize (hb_sanitize_context_t *c) const | ||
{ return GSUBGPOS::sanitize<GPOS_impl::PosLookup> (c); } | ||
|
||
HB_INTERNAL bool is_blocklisted (hb_blob_t *blob, | ||
hb_face_t *face) const; | ||
|
||
void collect_variation_indices (hb_collect_variation_indices_context_t *c) const | ||
{ | ||
for (unsigned i = 0; i < GSUBGPOS::get_lookup_count (); i++) | ||
{ | ||
if (!c->gpos_lookups->has (i)) continue; | ||
const GPOS_impl::PosLookup &l = get_lookup (i); | ||
l.dispatch (c); | ||
} | ||
} | ||
|
||
void closure_lookups (hb_face_t *face, | ||
const hb_set_t *glyphs, | ||
hb_set_t *lookup_indexes /* IN/OUT */) const | ||
{ GSUBGPOS::closure_lookups<GPOS_impl::PosLookup> (face, glyphs, lookup_indexes); } | ||
|
||
typedef GSUBGPOS::accelerator_t<GPOS> accelerator_t; | ||
}; | ||
|
||
|
||
static void | ||
propagate_attachment_offsets (hb_glyph_position_t *pos, | ||
unsigned int len, | ||
unsigned int i, | ||
hb_direction_t direction, | ||
unsigned nesting_level) | ||
{ | ||
/* Adjusts offsets of attached glyphs (both cursive and mark) to accumulate | ||
* offset of glyph they are attached to. */ | ||
int chain = pos[i].attach_chain(), type = pos[i].attach_type(); | ||
if (likely (!chain)) | ||
return; | ||
|
||
pos[i].attach_chain() = 0; | ||
|
||
unsigned int j = (int) i + chain; | ||
|
||
if (unlikely (j >= len)) | ||
return; | ||
|
||
if (unlikely (!nesting_level)) | ||
return; | ||
|
||
propagate_attachment_offsets (pos, len, j, direction, nesting_level - 1); | ||
|
||
assert (!!(type & GPOS_impl::ATTACH_TYPE_MARK) ^ !!(type & GPOS_impl::ATTACH_TYPE_CURSIVE)); | ||
|
||
if (type & GPOS_impl::ATTACH_TYPE_CURSIVE) | ||
{ | ||
if (HB_DIRECTION_IS_HORIZONTAL (direction)) | ||
pos[i].y_offset += pos[j].y_offset; | ||
else | ||
pos[i].x_offset += pos[j].x_offset; | ||
} | ||
else /*if (type & GPOS_impl::ATTACH_TYPE_MARK)*/ | ||
{ | ||
pos[i].x_offset += pos[j].x_offset; | ||
pos[i].y_offset += pos[j].y_offset; | ||
|
||
assert (j < i); | ||
if (HB_DIRECTION_IS_FORWARD (direction)) | ||
for (unsigned int k = j; k < i; k++) { | ||
pos[i].x_offset -= pos[k].x_advance; | ||
pos[i].y_offset -= pos[k].y_advance; | ||
} | ||
else | ||
for (unsigned int k = j + 1; k < i + 1; k++) { | ||
pos[i].x_offset += pos[k].x_advance; | ||
pos[i].y_offset += pos[k].y_advance; | ||
} | ||
} | ||
} | ||
|
||
void | ||
GPOS::position_start (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) | ||
{ | ||
unsigned int count = buffer->len; | ||
for (unsigned int i = 0; i < count; i++) | ||
buffer->pos[i].attach_chain() = buffer->pos[i].attach_type() = 0; | ||
} | ||
|
||
void | ||
GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSED) | ||
{ | ||
//_hb_buffer_assert_gsubgpos_vars (buffer); | ||
} | ||
|
||
void | ||
GPOS::position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer) | ||
{ | ||
_hb_buffer_assert_gsubgpos_vars (buffer); | ||
|
||
unsigned int len; | ||
hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, &len); | ||
hb_direction_t direction = buffer->props.direction; | ||
|
||
/* Handle attachments */ | ||
if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT) | ||
for (unsigned i = 0; i < len; i++) | ||
propagate_attachment_offsets (pos, len, i, direction); | ||
|
||
if (unlikely (font->slant)) | ||
{ | ||
for (unsigned i = 0; i < len; i++) | ||
if (unlikely (pos[i].y_offset)) | ||
pos[i].x_offset += _hb_roundf (font->slant_xy * pos[i].y_offset); | ||
} | ||
} | ||
|
||
} | ||
|
||
struct GPOS_accelerator_t : Layout::GPOS::accelerator_t { | ||
GPOS_accelerator_t (hb_face_t *face) : Layout::GPOS::accelerator_t (face) {} | ||
}; | ||
|
||
} | ||
|
||
#endif /* OT_LAYOUT_GPOS_HH */ |
84 changes: 84 additions & 0 deletions
84
src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/Anchor.hh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
#ifndef OT_LAYOUT_GPOS_ANCHOR_HH | ||
#define OT_LAYOUT_GPOS_ANCHOR_HH | ||
|
||
#include "AnchorFormat1.hh" | ||
#include "AnchorFormat2.hh" | ||
#include "AnchorFormat3.hh" | ||
|
||
namespace OT { | ||
namespace Layout { | ||
namespace GPOS_impl { | ||
|
||
struct Anchor | ||
{ | ||
protected: | ||
union { | ||
HBUINT16 format; /* Format identifier */ | ||
AnchorFormat1 format1; | ||
AnchorFormat2 format2; | ||
AnchorFormat3 format3; | ||
} u; | ||
public: | ||
DEFINE_SIZE_UNION (2, format); | ||
|
||
bool sanitize (hb_sanitize_context_t *c) const | ||
{ | ||
TRACE_SANITIZE (this); | ||
if (!u.format.sanitize (c)) return_trace (false); | ||
switch (u.format) { | ||
case 1: return_trace (u.format1.sanitize (c)); | ||
case 2: return_trace (u.format2.sanitize (c)); | ||
case 3: return_trace (u.format3.sanitize (c)); | ||
default:return_trace (true); | ||
} | ||
} | ||
|
||
void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id, | ||
float *x, float *y) const | ||
{ | ||
*x = *y = 0; | ||
switch (u.format) { | ||
case 1: u.format1.get_anchor (c, glyph_id, x, y); return; | ||
case 2: u.format2.get_anchor (c, glyph_id, x, y); return; | ||
case 3: u.format3.get_anchor (c, glyph_id, x, y); return; | ||
default: return; | ||
} | ||
} | ||
|
||
bool subset (hb_subset_context_t *c) const | ||
{ | ||
TRACE_SUBSET (this); | ||
switch (u.format) { | ||
case 1: return_trace (bool (reinterpret_cast<Anchor *> (u.format1.copy (c->serializer)))); | ||
case 2: | ||
if (c->plan->flags & HB_SUBSET_FLAGS_NO_HINTING) | ||
{ | ||
// AnchorFormat 2 just containins extra hinting information, so | ||
// if hints are being dropped convert to format 1. | ||
return_trace (bool (reinterpret_cast<Anchor *> (u.format1.copy (c->serializer)))); | ||
} | ||
return_trace (bool (reinterpret_cast<Anchor *> (u.format2.copy (c->serializer)))); | ||
case 3: return_trace (bool (reinterpret_cast<Anchor *> (u.format3.copy (c->serializer, | ||
c->plan->layout_variation_idx_map)))); | ||
default:return_trace (false); | ||
} | ||
} | ||
|
||
void collect_variation_indices (hb_collect_variation_indices_context_t *c) const | ||
{ | ||
switch (u.format) { | ||
case 1: case 2: | ||
return; | ||
case 3: | ||
u.format3.collect_variation_indices (c); | ||
return; | ||
default: return; | ||
} | ||
} | ||
}; | ||
|
||
} | ||
} | ||
} | ||
|
||
#endif // OT_LAYOUT_GPOS_ANCHOR_HH |
46 changes: 46 additions & 0 deletions
46
src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/AnchorFormat1.hh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
#ifndef OT_LAYOUT_GPOS_ANCHORFORMAT1_HH | ||
#define OT_LAYOUT_GPOS_ANCHORFORMAT1_HH | ||
|
||
namespace OT { | ||
namespace Layout { | ||
namespace GPOS_impl { | ||
|
||
struct AnchorFormat1 | ||
{ | ||
protected: | ||
HBUINT16 format; /* Format identifier--format = 1 */ | ||
FWORD xCoordinate; /* Horizontal value--in design units */ | ||
FWORD yCoordinate; /* Vertical value--in design units */ | ||
public: | ||
DEFINE_SIZE_STATIC (6); | ||
|
||
bool sanitize (hb_sanitize_context_t *c) const | ||
{ | ||
TRACE_SANITIZE (this); | ||
return_trace (c->check_struct (this)); | ||
} | ||
|
||
void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id HB_UNUSED, | ||
float *x, float *y) const | ||
{ | ||
hb_font_t *font = c->font; | ||
*x = font->em_fscale_x (xCoordinate); | ||
*y = font->em_fscale_y (yCoordinate); | ||
} | ||
|
||
AnchorFormat1* copy (hb_serialize_context_t *c) const | ||
{ | ||
TRACE_SERIALIZE (this); | ||
AnchorFormat1* out = c->embed<AnchorFormat1> (this); | ||
if (!out) return_trace (out); | ||
out->format = 1; | ||
return_trace (out); | ||
} | ||
}; | ||
|
||
|
||
} | ||
} | ||
} | ||
|
||
#endif // OT_LAYOUT_GPOS_ANCHORFORMAT1_HH |
58 changes: 58 additions & 0 deletions
58
src/java.desktop/share/native/libharfbuzz/OT/Layout/GPOS/AnchorFormat2.hh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
#ifndef OT_LAYOUT_GPOS_ANCHORFORMAT2_HH | ||
#define OT_LAYOUT_GPOS_ANCHORFORMAT2_HH | ||
|
||
namespace OT { | ||
namespace Layout { | ||
namespace GPOS_impl { | ||
|
||
struct AnchorFormat2 | ||
{ | ||
|
||
protected: | ||
HBUINT16 format; /* Format identifier--format = 2 */ | ||
FWORD xCoordinate; /* Horizontal value--in design units */ | ||
FWORD yCoordinate; /* Vertical value--in design units */ | ||
HBUINT16 anchorPoint; /* Index to glyph contour point */ | ||
public: | ||
DEFINE_SIZE_STATIC (8); | ||
|
||
bool sanitize (hb_sanitize_context_t *c) const | ||
{ | ||
TRACE_SANITIZE (this); | ||
return_trace (c->check_struct (this)); | ||
} | ||
|
||
void get_anchor (hb_ot_apply_context_t *c, hb_codepoint_t glyph_id, | ||
float *x, float *y) const | ||
{ | ||
hb_font_t *font = c->font; | ||
|
||
#ifdef HB_NO_HINTING | ||
*x = font->em_fscale_x (xCoordinate); | ||
*y = font->em_fscale_y (yCoordinate); | ||
return; | ||
#endif | ||
|
||
unsigned int x_ppem = font->x_ppem; | ||
unsigned int y_ppem = font->y_ppem; | ||
hb_position_t cx = 0, cy = 0; | ||
bool ret; | ||
|
||
ret = (x_ppem || y_ppem) && | ||
font->get_glyph_contour_point_for_origin (glyph_id, anchorPoint, HB_DIRECTION_LTR, &cx, &cy); | ||
*x = ret && x_ppem ? cx : font->em_fscale_x (xCoordinate); | ||
*y = ret && y_ppem ? cy : font->em_fscale_y (yCoordinate); | ||
} | ||
|
||
AnchorFormat2* copy (hb_serialize_context_t *c) const | ||
{ | ||
TRACE_SERIALIZE (this); | ||
return_trace (c->embed<AnchorFormat2> (this)); | ||
} | ||
}; | ||
|
||
} | ||
} | ||
} | ||
|
||
#endif // OT_LAYOUT_GPOS_ANCHORFORMAT2_HH |
Oops, something went wrong.
689a837
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Review
Issues