[GPOS] Split LigatureArray.hh
This commit is contained in:
parent
68b2742fe4
commit
ea11029a6e
|
@ -109,6 +109,7 @@ HB_BASE_sources = \
|
||||||
OT/Layout/GPOS/CursivePos.hh \
|
OT/Layout/GPOS/CursivePos.hh \
|
||||||
OT/Layout/GPOS/ExtensionPos.hh \
|
OT/Layout/GPOS/ExtensionPos.hh \
|
||||||
OT/Layout/GPOS/GPOS.hh \
|
OT/Layout/GPOS/GPOS.hh \
|
||||||
|
OT/Layout/GPOS/LigatureArray.hh \
|
||||||
OT/Layout/GPOS/MarkArray.hh \
|
OT/Layout/GPOS/MarkArray.hh \
|
||||||
OT/Layout/GPOS/MarkBasePosFormat1.hh \
|
OT/Layout/GPOS/MarkBasePosFormat1.hh \
|
||||||
OT/Layout/GPOS/MarkBasePos.hh \
|
OT/Layout/GPOS/MarkBasePos.hh \
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
#ifndef OT_LAYOUT_GPOS_LIGATUREARRAY_HH
|
||||||
|
#define OT_LAYOUT_GPOS_LIGATUREARRAY_HH
|
||||||
|
|
||||||
|
namespace OT {
|
||||||
|
namespace Layout {
|
||||||
|
namespace GPOS_impl {
|
||||||
|
|
||||||
|
|
||||||
|
typedef AnchorMatrix LigatureAttach; /* component-major--
|
||||||
|
* in order of writing direction--,
|
||||||
|
* mark-minor--
|
||||||
|
* ordered by class--zero-based. */
|
||||||
|
|
||||||
|
/* Array of LigatureAttach tables ordered by LigatureCoverage Index */
|
||||||
|
struct LigatureArray : List16OfOffset16To<LigatureAttach>
|
||||||
|
{
|
||||||
|
template <typename Iterator,
|
||||||
|
hb_requires (hb_is_iterator (Iterator))>
|
||||||
|
bool subset (hb_subset_context_t *c,
|
||||||
|
Iterator coverage,
|
||||||
|
unsigned class_count,
|
||||||
|
const hb_map_t *klass_mapping) const
|
||||||
|
{
|
||||||
|
TRACE_SUBSET (this);
|
||||||
|
const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
|
||||||
|
|
||||||
|
auto *out = c->serializer->start_embed (this);
|
||||||
|
if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
|
||||||
|
|
||||||
|
for (const auto _ : + hb_zip (coverage, *this)
|
||||||
|
| hb_filter (glyphset, hb_first))
|
||||||
|
{
|
||||||
|
auto *matrix = out->serialize_append (c->serializer);
|
||||||
|
if (unlikely (!matrix)) return_trace (false);
|
||||||
|
|
||||||
|
const LigatureAttach& src = (this + _.second);
|
||||||
|
auto indexes =
|
||||||
|
+ hb_range (src.rows * class_count)
|
||||||
|
| hb_filter ([=] (unsigned index) { return klass_mapping->has (index % class_count); })
|
||||||
|
;
|
||||||
|
matrix->serialize_subset (c,
|
||||||
|
_.second,
|
||||||
|
this,
|
||||||
|
src.rows,
|
||||||
|
indexes);
|
||||||
|
}
|
||||||
|
return_trace (this->len);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* OT_LAYOUT_GPOS_LIGATUREARRAY_HH */
|
|
@ -1,51 +1,12 @@
|
||||||
#ifndef OT_LAYOUT_GPOS_MARKLIGPOSFORMAT1_HH
|
#ifndef OT_LAYOUT_GPOS_MARKLIGPOSFORMAT1_HH
|
||||||
#define OT_LAYOUT_GPOS_MARKLIGPOSFORMAT1_HH
|
#define OT_LAYOUT_GPOS_MARKLIGPOSFORMAT1_HH
|
||||||
|
|
||||||
|
#include "LigatureArray.hh"
|
||||||
|
|
||||||
namespace OT {
|
namespace OT {
|
||||||
namespace Layout {
|
namespace Layout {
|
||||||
namespace GPOS_impl {
|
namespace GPOS_impl {
|
||||||
|
|
||||||
typedef AnchorMatrix LigatureAttach; /* component-major--
|
|
||||||
* in order of writing direction--,
|
|
||||||
* mark-minor--
|
|
||||||
* ordered by class--zero-based. */
|
|
||||||
|
|
||||||
/* Array of LigatureAttach tables ordered by LigatureCoverage Index */
|
|
||||||
struct LigatureArray : List16OfOffset16To<LigatureAttach>
|
|
||||||
{
|
|
||||||
template <typename Iterator,
|
|
||||||
hb_requires (hb_is_iterator (Iterator))>
|
|
||||||
bool subset (hb_subset_context_t *c,
|
|
||||||
Iterator coverage,
|
|
||||||
unsigned class_count,
|
|
||||||
const hb_map_t *klass_mapping) const
|
|
||||||
{
|
|
||||||
TRACE_SUBSET (this);
|
|
||||||
const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
|
|
||||||
|
|
||||||
auto *out = c->serializer->start_embed (this);
|
|
||||||
if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
|
|
||||||
|
|
||||||
for (const auto _ : + hb_zip (coverage, *this)
|
|
||||||
| hb_filter (glyphset, hb_first))
|
|
||||||
{
|
|
||||||
auto *matrix = out->serialize_append (c->serializer);
|
|
||||||
if (unlikely (!matrix)) return_trace (false);
|
|
||||||
|
|
||||||
const LigatureAttach& src = (this + _.second);
|
|
||||||
auto indexes =
|
|
||||||
+ hb_range (src.rows * class_count)
|
|
||||||
| hb_filter ([=] (unsigned index) { return klass_mapping->has (index % class_count); })
|
|
||||||
;
|
|
||||||
matrix->serialize_subset (c,
|
|
||||||
_.second,
|
|
||||||
this,
|
|
||||||
src.rows,
|
|
||||||
indexes);
|
|
||||||
}
|
|
||||||
return_trace (this->len);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MarkLigPosFormat1
|
struct MarkLigPosFormat1
|
||||||
{
|
{
|
||||||
|
|
|
@ -113,6 +113,7 @@ hb_base_sources = files(
|
||||||
'OT/Layout/GPOS/CursivePos.hh',
|
'OT/Layout/GPOS/CursivePos.hh',
|
||||||
'OT/Layout/GPOS/ExtensionPos.hh',
|
'OT/Layout/GPOS/ExtensionPos.hh',
|
||||||
'OT/Layout/GPOS/GPOS.hh',
|
'OT/Layout/GPOS/GPOS.hh',
|
||||||
|
'OT/Layout/GPOS/LigatureArray.hh',
|
||||||
'OT/Layout/GPOS/MarkArray.hh',
|
'OT/Layout/GPOS/MarkArray.hh',
|
||||||
'OT/Layout/GPOS/MarkBasePosFormat1.hh',
|
'OT/Layout/GPOS/MarkBasePosFormat1.hh',
|
||||||
'OT/Layout/GPOS/MarkBasePos.hh',
|
'OT/Layout/GPOS/MarkBasePos.hh',
|
||||||
|
|
Loading…
Reference in New Issue