[aat/morx] Implement NoncontextualSubtables
Also makes hb-ot-shape call morx for now instead of GSUB... Just for testing.
This commit is contained in:
parent
4cf3ab1d81
commit
748b989a1f
|
@ -183,10 +183,10 @@ struct LookupFormat0
|
||||||
friend struct Lookup<T>;
|
friend struct Lookup<T>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline const T& get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
|
inline const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
|
||||||
{
|
{
|
||||||
if (unlikely (glyph_id >= num_glyphs)) return Null(T);
|
if (unlikely (glyph_id >= num_glyphs)) return nullptr;
|
||||||
return arrayZ[glyph_id];
|
return &arrayZ[glyph_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
|
@ -230,10 +230,10 @@ struct LookupFormat2
|
||||||
friend struct Lookup<T>;
|
friend struct Lookup<T>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline const T& get_value (hb_codepoint_t glyph_id) const
|
inline const T* get_value (hb_codepoint_t glyph_id) const
|
||||||
{
|
{
|
||||||
const LookupSegmentSingle<T> *v = segments.bsearch (glyph_id);
|
const LookupSegmentSingle<T> *v = segments.bsearch (glyph_id);
|
||||||
return v ? v->value : Null(T);
|
return v ? &v->value : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
|
@ -255,9 +255,9 @@ struct LookupFormat2
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct LookupSegmentArray
|
struct LookupSegmentArray
|
||||||
{
|
{
|
||||||
inline const T& get_value (hb_codepoint_t glyph_id, const void *base) const
|
inline const T* get_value (hb_codepoint_t glyph_id, const void *base) const
|
||||||
{
|
{
|
||||||
return first <= glyph_id && glyph_id <= last ? (base+valuesZ)[glyph_id - first] : Null(T);
|
return first <= glyph_id && glyph_id <= last ? &(base+valuesZ)[glyph_id - first] : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int cmp (hb_codepoint_t g) const {
|
inline int cmp (hb_codepoint_t g) const {
|
||||||
|
@ -287,10 +287,10 @@ struct LookupFormat4
|
||||||
friend struct Lookup<T>;
|
friend struct Lookup<T>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline const T& get_value (hb_codepoint_t glyph_id) const
|
inline const T* get_value (hb_codepoint_t glyph_id) const
|
||||||
{
|
{
|
||||||
const LookupSegmentArray<T> *v = segments.bsearch (glyph_id);
|
const LookupSegmentArray<T> *v = segments.bsearch (glyph_id);
|
||||||
return v ? v->get_value (glyph_id, this) : Null(T);
|
return v ? v->get_value (glyph_id, this) : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
|
@ -332,10 +332,10 @@ struct LookupFormat6
|
||||||
friend struct Lookup<T>;
|
friend struct Lookup<T>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline const T& get_value (hb_codepoint_t glyph_id) const
|
inline const T* get_value (hb_codepoint_t glyph_id) const
|
||||||
{
|
{
|
||||||
const LookupSingle<T> *v = entries.bsearch (glyph_id);
|
const LookupSingle<T> *v = entries.bsearch (glyph_id);
|
||||||
return v ? v->value : Null(T);
|
return v ? &v->value : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
|
@ -358,9 +358,9 @@ struct LookupFormat8
|
||||||
friend struct Lookup<T>;
|
friend struct Lookup<T>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline const T& get_value (hb_codepoint_t glyph_id) const
|
inline const T* get_value (hb_codepoint_t glyph_id) const
|
||||||
{
|
{
|
||||||
return firstGlyph <= glyph_id && glyph_id - firstGlyph < glyphCount ? valueArrayZ[glyph_id - firstGlyph] : Null(T);
|
return firstGlyph <= glyph_id && glyph_id - firstGlyph < glyphCount ? &valueArrayZ[glyph_id - firstGlyph] : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
|
@ -384,7 +384,7 @@ struct LookupFormat8
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct Lookup
|
struct Lookup
|
||||||
{
|
{
|
||||||
inline const T& get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
|
inline const T* get_value (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
|
||||||
{
|
{
|
||||||
switch (u.format) {
|
switch (u.format) {
|
||||||
case 0: return u.format0.get_value (glyph_id, num_glyphs);
|
case 0: return u.format0.get_value (glyph_id, num_glyphs);
|
||||||
|
@ -392,7 +392,7 @@ struct Lookup
|
||||||
case 4: return u.format4.get_value (glyph_id);
|
case 4: return u.format4.get_value (glyph_id);
|
||||||
case 6: return u.format6.get_value (glyph_id);
|
case 6: return u.format6.get_value (glyph_id);
|
||||||
case 8: return u.format8.get_value (glyph_id);
|
case 8: return u.format8.get_value (glyph_id);
|
||||||
default:return Null(T);
|
default:return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -423,10 +423,6 @@ struct Lookup
|
||||||
DEFINE_SIZE_UNION (2, format);
|
DEFINE_SIZE_UNION (2, format);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Instantiate, to catch compile errors.
|
|
||||||
Lookup<GlyphID> g;
|
|
||||||
Lookup<Tag> t;
|
|
||||||
|
|
||||||
|
|
||||||
} /* namespace AAT */
|
} /* namespace AAT */
|
||||||
|
|
||||||
|
|
|
@ -27,8 +27,8 @@
|
||||||
#ifndef HB_AAT_LAYOUT_MORX_TABLE_HH
|
#ifndef HB_AAT_LAYOUT_MORX_TABLE_HH
|
||||||
#define HB_AAT_LAYOUT_MORX_TABLE_HH
|
#define HB_AAT_LAYOUT_MORX_TABLE_HH
|
||||||
|
|
||||||
#include <hb-open-type-private.hh>
|
#include "hb-open-type-private.hh"
|
||||||
#include <hb-aat-layout-common-private.hh>
|
#include "hb-aat-layout-common-private.hh"
|
||||||
|
|
||||||
#define HB_AAT_TAG_MORT HB_TAG('m','o','r','t')
|
#define HB_AAT_TAG_MORT HB_TAG('m','o','r','t')
|
||||||
#define HB_AAT_TAG_MORX HB_TAG('m','o','r','x')
|
#define HB_AAT_TAG_MORX HB_TAG('m','o','r','x')
|
||||||
|
@ -41,7 +41,13 @@ using namespace OT;
|
||||||
|
|
||||||
struct RearrangementSubtable
|
struct RearrangementSubtable
|
||||||
{
|
{
|
||||||
/* TODO */
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
|
{
|
||||||
|
TRACE_APPLY (this);
|
||||||
|
/* TODO */
|
||||||
|
return_trace (false);
|
||||||
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
|
@ -52,7 +58,13 @@ struct RearrangementSubtable
|
||||||
|
|
||||||
struct ContextualSubtable
|
struct ContextualSubtable
|
||||||
{
|
{
|
||||||
/* TODO */
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
|
{
|
||||||
|
TRACE_APPLY (this);
|
||||||
|
/* TODO */
|
||||||
|
return_trace (false);
|
||||||
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
|
@ -63,7 +75,13 @@ struct ContextualSubtable
|
||||||
|
|
||||||
struct LigatureSubtable
|
struct LigatureSubtable
|
||||||
{
|
{
|
||||||
/* TODO */
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
|
{
|
||||||
|
TRACE_APPLY (this);
|
||||||
|
/* TODO */
|
||||||
|
return_trace (false);
|
||||||
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
|
@ -74,6 +92,26 @@ struct LigatureSubtable
|
||||||
|
|
||||||
struct NoncontextualSubtable
|
struct NoncontextualSubtable
|
||||||
{
|
{
|
||||||
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
|
{
|
||||||
|
TRACE_APPLY (this);
|
||||||
|
hb_buffer_t *buffer = c->buffer;
|
||||||
|
hb_glyph_info_t *info = buffer->info;
|
||||||
|
unsigned int num_glyphs = c->face->get_num_glyphs ();
|
||||||
|
bool ret = false;
|
||||||
|
unsigned int count = buffer->len;
|
||||||
|
for (unsigned int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
const GlyphID *replacement = substitute.get_value (info[i].codepoint, num_glyphs);
|
||||||
|
if (replacement)
|
||||||
|
{
|
||||||
|
info[i].codepoint = *replacement;
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return_trace (ret);
|
||||||
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
|
@ -88,7 +126,13 @@ struct NoncontextualSubtable
|
||||||
|
|
||||||
struct InsertionSubtable
|
struct InsertionSubtable
|
||||||
{
|
{
|
||||||
/* TODO */
|
inline bool apply (hb_apply_context_t *c) const
|
||||||
|
{
|
||||||
|
TRACE_APPLY (this);
|
||||||
|
/* TODO */
|
||||||
|
return_trace (false);
|
||||||
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
|
@ -136,6 +180,11 @@ struct ChainSubtable
|
||||||
Insertion = 5
|
Insertion = 5
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline void apply (hb_apply_context_t *c) const
|
||||||
|
{
|
||||||
|
dispatch (c);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename context_t>
|
template <typename context_t>
|
||||||
inline typename context_t::return_t dispatch (context_t *c) const
|
inline typename context_t::return_t dispatch (context_t *c) const
|
||||||
{
|
{
|
||||||
|
@ -180,6 +229,16 @@ struct ChainSubtable
|
||||||
template <typename UINT>
|
template <typename UINT>
|
||||||
struct Chain
|
struct Chain
|
||||||
{
|
{
|
||||||
|
inline void apply (hb_apply_context_t *c) const
|
||||||
|
{
|
||||||
|
const ChainSubtable<UINT> *subtable = &StructAtOffset<ChainSubtable<UINT> > (featureZ, featureZ[0].static_size * featureCount);
|
||||||
|
unsigned int count = subtableCount;
|
||||||
|
for (unsigned int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
subtable->apply (c);
|
||||||
|
subtable = &StructAfter<ChainSubtable<UINT> > (*subtable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline unsigned int get_size (void) const { return length; }
|
inline unsigned int get_size (void) const { return length; }
|
||||||
|
|
||||||
|
@ -231,6 +290,17 @@ struct mortmorx
|
||||||
static const hb_tag_t mortTag = HB_AAT_TAG_MORT;
|
static const hb_tag_t mortTag = HB_AAT_TAG_MORT;
|
||||||
static const hb_tag_t morxTag = HB_AAT_TAG_MORX;
|
static const hb_tag_t morxTag = HB_AAT_TAG_MORX;
|
||||||
|
|
||||||
|
inline void apply (hb_apply_context_t *c) const
|
||||||
|
{
|
||||||
|
const Chain<UINT> *chain = chains;
|
||||||
|
unsigned int count = chainCount;
|
||||||
|
for (unsigned int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
chain->apply (c);
|
||||||
|
chain = &StructAfter<Chain<UINT> > (*chain);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline bool sanitize (hb_sanitize_context_t *c) const
|
inline bool sanitize (hb_sanitize_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
|
|
|
@ -34,4 +34,7 @@
|
||||||
#include "hb-open-type-private.hh"
|
#include "hb-open-type-private.hh"
|
||||||
|
|
||||||
|
|
||||||
|
HB_INTERNAL void
|
||||||
|
hb_aat_layout_substitute (OT::hb_apply_context_t *c);
|
||||||
|
|
||||||
#endif /* HB_AAT_LAYOUT_PRIVATE_HH */
|
#endif /* HB_AAT_LAYOUT_PRIVATE_HH */
|
||||||
|
|
|
@ -25,7 +25,9 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "hb-open-type-private.hh"
|
#include "hb-open-type-private.hh"
|
||||||
|
|
||||||
#include "hb-ot-layout-private.hh"
|
#include "hb-ot-layout-private.hh"
|
||||||
|
#include "hb-ot-layout-gsubgpos-private.hh"
|
||||||
|
|
||||||
#include "hb-aat-layout-private.hh"
|
#include "hb-aat-layout-private.hh"
|
||||||
#include "hb-aat-layout-morx-table.hh"
|
#include "hb-aat-layout-morx-table.hh"
|
||||||
|
@ -39,10 +41,10 @@ _get_morx (hb_face_t *face)
|
||||||
{
|
{
|
||||||
if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(AAT::morx);
|
if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(AAT::morx);
|
||||||
hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
|
hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
|
||||||
return *(layout->morx.get ());
|
return *(layout->morx.get ()); /* XXX this doesn't call set_num_glyphs on sanitizer. */
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static inline void
|
||||||
_hb_aat_layout_create (hb_face_t *face)
|
_hb_aat_layout_create (hb_face_t *face)
|
||||||
{
|
{
|
||||||
OT::Sanitizer<AAT::morx> sanitizer;
|
OT::Sanitizer<AAT::morx> sanitizer;
|
||||||
|
@ -55,3 +57,10 @@ _hb_aat_layout_create (hb_face_t *face)
|
||||||
OT::Sanitizer<AAT::Lookup<OT::GlyphID> >::lock_instance (morx_blob)->get_value (1, face->get_num_glyphs ());
|
OT::Sanitizer<AAT::Lookup<OT::GlyphID> >::lock_instance (morx_blob)->get_value (1, face->get_num_glyphs ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
hb_aat_layout_substitute (OT::hb_apply_context_t *c)
|
||||||
|
{
|
||||||
|
const AAT::morx& morx = _get_morx (c->face);
|
||||||
|
morx.apply (c);
|
||||||
|
}
|
||||||
|
|
|
@ -40,6 +40,8 @@
|
||||||
#include "hb-unicode-private.hh"
|
#include "hb-unicode-private.hh"
|
||||||
#include "hb-set-private.hh"
|
#include "hb-set-private.hh"
|
||||||
|
|
||||||
|
#include "hb-ot-layout-gsubgpos-private.hh"
|
||||||
|
#include "hb-aat-layout-private.hh"
|
||||||
|
|
||||||
static hb_tag_t common_features[] = {
|
static hb_tag_t common_features[] = {
|
||||||
HB_TAG('c','c','m','p'),
|
HB_TAG('c','c','m','p'),
|
||||||
|
@ -613,6 +615,10 @@ hb_ot_substitute_complex (hb_ot_shape_context_t *c)
|
||||||
hb_synthesize_glyph_classes (c);
|
hb_synthesize_glyph_classes (c);
|
||||||
|
|
||||||
c->plan->substitute (c->font, buffer);
|
c->plan->substitute (c->font, buffer);
|
||||||
|
|
||||||
|
/* XXX Call morx instead. */
|
||||||
|
OT::hb_apply_context_t ac (0, c->font, c->buffer);
|
||||||
|
hb_aat_layout_substitute (&ac);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
|
Loading…
Reference in New Issue