parent
947962a287
commit
28f0367aab
|
@ -293,11 +293,121 @@ struct KerxSubTableFormat2
|
||||||
|
|
||||||
struct KerxSubTableFormat4
|
struct KerxSubTableFormat4
|
||||||
{
|
{
|
||||||
|
struct EntryData
|
||||||
|
{
|
||||||
|
HBUINT16 ankrActionIndex;/* Either 0xFFFF (for no action) or the index of
|
||||||
|
* the action to perform. */
|
||||||
|
public:
|
||||||
|
DEFINE_SIZE_STATIC (2);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct driver_context_t
|
||||||
|
{
|
||||||
|
static const bool in_place = true;
|
||||||
|
enum Flags
|
||||||
|
{
|
||||||
|
Mark = 0x8000, /* If set, remember this glyph as the marked glyph. */
|
||||||
|
DontAdvance = 0x4000, /* If set, don't advance to the next glyph before
|
||||||
|
* going to the new state. */
|
||||||
|
Reserved = 0x3FFF, /* Not used; set to 0. */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum SubTableFlags
|
||||||
|
{
|
||||||
|
ActionType = 0xC0000000, /* A two-bit field containing the action type. */
|
||||||
|
Unused = 0x3F000000, /* Unused - must be zero. */
|
||||||
|
Offset = 0x00FFFFFF, /* Masks the offset in bytes from the beginning
|
||||||
|
* of the subtable to the beginning of the control
|
||||||
|
* point table. */
|
||||||
|
};
|
||||||
|
|
||||||
|
inline driver_context_t (const KerxSubTableFormat4 *table,
|
||||||
|
hb_aat_apply_context_t *c_) :
|
||||||
|
c (c_),
|
||||||
|
action_type ((table->flags & ActionType) >> 30),
|
||||||
|
ankrData ((HBUINT16 *) ((const char *) &table->machine + (table->flags & Offset))),
|
||||||
|
mark_set (false),
|
||||||
|
mark (0) {}
|
||||||
|
|
||||||
|
inline bool is_actionable (StateTableDriver<EntryData> *driver,
|
||||||
|
const Entry<EntryData> *entry)
|
||||||
|
{
|
||||||
|
return entry->data.ankrActionIndex != 0xFFFF;
|
||||||
|
}
|
||||||
|
inline bool transition (StateTableDriver<EntryData> *driver,
|
||||||
|
const Entry<EntryData> *entry)
|
||||||
|
{
|
||||||
|
hb_buffer_t *buffer = driver->buffer;
|
||||||
|
unsigned int flags = entry->flags;
|
||||||
|
|
||||||
|
if (mark_set && entry->data.ankrActionIndex != 0xFFFF)
|
||||||
|
{
|
||||||
|
switch (action_type)
|
||||||
|
{
|
||||||
|
case 0: /* Control Point Actions.*/
|
||||||
|
{
|
||||||
|
/* indexed into glyph outline. */
|
||||||
|
const HBUINT16 *data = &ankrData[entry->data.ankrActionIndex];
|
||||||
|
if (!c->sanitizer.check_array (data, 2))
|
||||||
|
return false;
|
||||||
|
HB_UNUSED unsigned int markControlPoint = *data++;
|
||||||
|
HB_UNUSED unsigned int currControlPoint = *data++;
|
||||||
|
/* TODO */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1: /* Anchor Point Actions. */
|
||||||
|
{
|
||||||
|
/* Indexed into 'ankr' table. */
|
||||||
|
const HBUINT16 *data = &ankrData[entry->data.ankrActionIndex];
|
||||||
|
if (!c->sanitizer.check_array (data, 2))
|
||||||
|
return false;
|
||||||
|
HB_UNUSED unsigned int markAnchorPoint = *data++;
|
||||||
|
HB_UNUSED unsigned int currAnchorPoint = *data++;
|
||||||
|
/* TODO */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2: /* Control Point Coordinate Actions. */
|
||||||
|
{
|
||||||
|
const FWORD *data = (const FWORD *) &ankrData[entry->data.ankrActionIndex];
|
||||||
|
if (!c->sanitizer.check_array (data, 4))
|
||||||
|
return false;
|
||||||
|
HB_UNUSED int markX = *data++;
|
||||||
|
HB_UNUSED int markY = *data++;
|
||||||
|
HB_UNUSED int currX = *data++;
|
||||||
|
HB_UNUSED int currY = *data++;
|
||||||
|
/* TODO */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & Mark)
|
||||||
|
{
|
||||||
|
mark_set = true;
|
||||||
|
mark = buffer->idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
hb_aat_apply_context_t *c;
|
||||||
|
unsigned int action_type;
|
||||||
|
const HBUINT16 *ankrData;
|
||||||
|
bool mark_set;
|
||||||
|
unsigned int mark;
|
||||||
|
};
|
||||||
|
|
||||||
inline bool apply (hb_aat_apply_context_t *c) const
|
inline bool apply (hb_aat_apply_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_APPLY (this);
|
TRACE_APPLY (this);
|
||||||
|
|
||||||
/* TODO */
|
driver_context_t dc (this, c);
|
||||||
|
|
||||||
|
StateTableDriver<EntryData> driver (machine, c->buffer, c->font->face);
|
||||||
|
driver.drive (&dc);
|
||||||
|
|
||||||
return_trace (true);
|
return_trace (true);
|
||||||
}
|
}
|
||||||
|
@ -306,14 +416,18 @@ struct KerxSubTableFormat4
|
||||||
{
|
{
|
||||||
TRACE_SANITIZE (this);
|
TRACE_SANITIZE (this);
|
||||||
|
|
||||||
/* TODO */
|
/* The rest of array sanitizations are done at run-time. */
|
||||||
return_trace (likely (c->check_struct (this)));
|
return_trace (c->check_struct (this) &&
|
||||||
|
machine.sanitize (c) &&
|
||||||
|
flags.sanitize (c));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
KerxSubTableHeader header;
|
KerxSubTableHeader header;
|
||||||
|
StateTable<EntryData> machine;
|
||||||
|
HBUINT32 flags;
|
||||||
public:
|
public:
|
||||||
DEFINE_SIZE_STATIC (12);
|
DEFINE_SIZE_STATIC (32);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct KerxSubTableFormat6
|
struct KerxSubTableFormat6
|
||||||
|
|
Loading…
Reference in New Issue