WIP
This commit is contained in:
parent
40d73bc68d
commit
673a4efcbc
|
@ -52,29 +52,12 @@ struct ValueFormat : USHORT
|
||||||
yAdvDevice = 0x0080, /* Includes vertical Device table for advance */
|
yAdvDevice = 0x0080, /* Includes vertical Device table for advance */
|
||||||
ignored = 0x0F00, /* Was used in TrueType Open for MM fonts */
|
ignored = 0x0F00, /* Was used in TrueType Open for MM fonts */
|
||||||
reserved = 0xF000 /* For future use */
|
reserved = 0xF000 /* For future use */
|
||||||
|
|
||||||
|
devices = 0x00F0, /* Mask for having any Device table */
|
||||||
};
|
};
|
||||||
|
|
||||||
inline unsigned int get_len () const
|
/* All fields are options. Only those available advance the value pointer. */
|
||||||
{ return _hb_popcount32 ((unsigned int) *this); }
|
|
||||||
inline unsigned int get_size () const
|
|
||||||
{ return get_len () * Value::get_size (); }
|
|
||||||
|
|
||||||
void apply_value (hb_ot_layout_context_t *context,
|
|
||||||
const char *base,
|
|
||||||
const Value *values,
|
|
||||||
hb_internal_glyph_position_t *glyph_pos) const
|
|
||||||
{
|
|
||||||
unsigned int x_ppem, y_ppem;
|
|
||||||
hb_16dot16_t x_scale, y_scale;
|
|
||||||
unsigned int format = *this;
|
|
||||||
|
|
||||||
if (!format)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* All fields are options. Only those available advance the value
|
|
||||||
* pointer. */
|
|
||||||
#if 0
|
#if 0
|
||||||
struct ValueRecord {
|
|
||||||
SHORT xPlacement; /* Horizontal adjustment for
|
SHORT xPlacement; /* Horizontal adjustment for
|
||||||
* placement--in design units */
|
* placement--in design units */
|
||||||
SHORT yPlacement; /* Vertical adjustment for
|
SHORT yPlacement; /* Vertical adjustment for
|
||||||
|
@ -97,9 +80,24 @@ struct ValueRecord {
|
||||||
Offset yAdvDevice; /* Offset to Device table for vertical
|
Offset yAdvDevice; /* Offset to Device table for vertical
|
||||||
* advance--measured from beginning of
|
* advance--measured from beginning of
|
||||||
* PosTable (may be NULL) */
|
* PosTable (may be NULL) */
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
inline unsigned int get_len () const
|
||||||
|
{ return _hb_popcount32 ((unsigned int) *this); }
|
||||||
|
inline unsigned int get_size () const
|
||||||
|
{ return get_len () * Value::get_size (); }
|
||||||
|
|
||||||
|
void apply_value (hb_ot_layout_context_t *context,
|
||||||
|
const char *base,
|
||||||
|
const Value *values,
|
||||||
|
hb_internal_glyph_position_t *glyph_pos) const
|
||||||
|
{
|
||||||
|
unsigned int x_ppem, y_ppem;
|
||||||
|
hb_16dot16_t x_scale, y_scale;
|
||||||
|
unsigned int format = *this;
|
||||||
|
|
||||||
|
if (!format) return;
|
||||||
|
|
||||||
x_scale = context->font->x_scale;
|
x_scale = context->font->x_scale;
|
||||||
y_scale = context->font->y_scale;
|
y_scale = context->font->y_scale;
|
||||||
/* design units -> fractional pixel */
|
/* design units -> fractional pixel */
|
||||||
|
@ -124,6 +122,68 @@ struct ValueRecord {
|
||||||
if (y_ppem) glyph_pos->y_advance += (base+*(OffsetTo<Device>*)values++).get_delta (y_ppem) << 16; else values++;
|
if (y_ppem) glyph_pos->y_advance += (base+*(OffsetTo<Device>*)values++).get_delta (y_ppem) << 16; else values++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
inline bool sanitize_value_devices (SANITIZE_ARG_DEF, void *base, const Value *values) {
|
||||||
|
unsigned int format = *this;
|
||||||
|
|
||||||
|
if (format & xPlacement) values++;
|
||||||
|
if (format & yPlacement) values++;
|
||||||
|
if (format & xAdvance) values++;
|
||||||
|
if (format & yAdvance) values++;
|
||||||
|
|
||||||
|
if ((format & xPlaDevice) && !SANITIZE_BASE (*(OffsetTo<Device>*)values++, base)) return false;
|
||||||
|
if ((format & yPlaDevice) && !SANITIZE_BASE (*(OffsetTo<Device>*)values++, base)) return false;
|
||||||
|
if ((format & xAdvDevice) && !SANITIZE_BASE (*(OffsetTo<Device>*)values++, base)) return false;
|
||||||
|
if ((format & yAdvDevice) && !SANITIZE_BASE (*(OffsetTo<Device>*)values++, base)) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
inline bool has_device () {
|
||||||
|
unsigned int format = *this;
|
||||||
|
return (format & devices) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool sanitize_value (SANITIZE_ARG_DEF, void *base, const Value *values) {
|
||||||
|
TRACE_SANITIZE ();
|
||||||
|
|
||||||
|
return SANITIZE_MEM (values, get_size ()) &&
|
||||||
|
(!has_device () || sanitize_value_devices (SANITIZE_ARG, base, values));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool sanitize_values (SANITIZE_ARG_DEF, void *base, const Value *values, unsigned int count) {
|
||||||
|
TRACE_SANITIZE ();
|
||||||
|
unsigned int len = get_len ();
|
||||||
|
|
||||||
|
if (!SANITIZE_ARRAY (values, get_size (), count)) return false;
|
||||||
|
|
||||||
|
if (!has_device ()) return true;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < count; i++) {
|
||||||
|
if (!sanitize_value_devices (SANITIZE_ARG, base, values))
|
||||||
|
return false;
|
||||||
|
values += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool sanitize_values_stride_unsafe (SANITIZE_ARG_DEF, void *base, const Value *values, unsigned int count, unsigned int stride) {
|
||||||
|
TRACE_SANITIZE ();
|
||||||
|
|
||||||
|
if (!has_device ()) return true;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < count; i++) {
|
||||||
|
if (!sanitize_value_devices (SANITIZE_ARG, base, values))
|
||||||
|
return false;
|
||||||
|
values += stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
ASSERT_SIZE (ValueFormat, 2);
|
ASSERT_SIZE (ValueFormat, 2);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue