[glyf] Use range_checker_t in composite_iter_t
This commit is contained in:
parent
06e35ce052
commit
b0b8551afc
|
@ -359,9 +359,10 @@ struct glyf
|
||||||
struct composite_iter_t : hb_iter_with_fallback_t<composite_iter_t, const CompositeGlyphChain &>
|
struct composite_iter_t : hb_iter_with_fallback_t<composite_iter_t, const CompositeGlyphChain &>
|
||||||
{
|
{
|
||||||
typedef const CompositeGlyphChain *__item_t__;
|
typedef const CompositeGlyphChain *__item_t__;
|
||||||
composite_iter_t (hb_bytes_t glyph_, __item_t__ current_) : glyph (glyph_), current (current_)
|
composite_iter_t (hb_bytes_t glyph_, __item_t__ current_) :
|
||||||
|
glyph (glyph_), current (current_), checker (range_checker_t (glyph.arrayZ, glyph.length))
|
||||||
{ if (!in_range (current)) current = nullptr; }
|
{ if (!in_range (current)) current = nullptr; }
|
||||||
composite_iter_t () : glyph (hb_bytes_t ()), current (nullptr) {}
|
composite_iter_t () : glyph (hb_bytes_t ()), current (nullptr), checker (range_checker_t (nullptr, 0)) {}
|
||||||
|
|
||||||
const CompositeGlyphChain &__item__ () const { return *current; }
|
const CompositeGlyphChain &__item__ () const { return *current; }
|
||||||
bool __more__ () const { return current; }
|
bool __more__ () const { return current; }
|
||||||
|
@ -379,13 +380,14 @@ struct glyf
|
||||||
|
|
||||||
bool in_range (const CompositeGlyphChain *composite) const
|
bool in_range (const CompositeGlyphChain *composite) const
|
||||||
{
|
{
|
||||||
return glyph.sub_array ((const char *) composite - (const char *) &glyph,
|
return checker.in_range (composite, CompositeGlyphChain::min_size)
|
||||||
CompositeGlyphChain::min_size).as<CompositeGlyphChain> () != &Null (CompositeGlyphChain);
|
&& checker.in_range (composite, composite->get_size ());
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
hb_bytes_t glyph;
|
hb_bytes_t glyph;
|
||||||
__item_t__ current;
|
__item_t__ current;
|
||||||
|
range_checker_t checker;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Glyph
|
struct Glyph
|
||||||
|
@ -569,7 +571,7 @@ struct glyf
|
||||||
const bool phantom_only=false) const
|
const bool phantom_only=false) const
|
||||||
{
|
{
|
||||||
const HBUINT16 *endPtsOfContours = &StructAfter<HBUINT16> (header);
|
const HBUINT16 *endPtsOfContours = &StructAfter<HBUINT16> (header);
|
||||||
range_checker_t checker (bytes.arrayZ, 0, bytes.length);
|
range_checker_t checker (bytes.arrayZ, bytes.length);
|
||||||
int num_contours = header.numberOfContours;
|
int num_contours = header.numberOfContours;
|
||||||
if (unlikely (!checker.in_range (&endPtsOfContours[num_contours + 1]))) return false;
|
if (unlikely (!checker.in_range (&endPtsOfContours[num_contours + 1]))) return false;
|
||||||
unsigned int num_points = endPtsOfContours[num_contours - 1] + 1;
|
unsigned int num_points = endPtsOfContours[num_contours - 1] + 1;
|
||||||
|
|
|
@ -80,20 +80,19 @@ struct contour_point_vector_t : hb_vector_t<contour_point_t>
|
||||||
|
|
||||||
struct range_checker_t
|
struct range_checker_t
|
||||||
{
|
{
|
||||||
range_checker_t (const void *table_, unsigned int start_offset_, unsigned int end_offset_)
|
range_checker_t (const void *data_, unsigned int length_)
|
||||||
: table ((const char*) table_), start_offset (start_offset_), end_offset (end_offset_) {}
|
: data ((const char *) data_), length (length_) {}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
bool in_range (const T *p) const
|
bool in_range (const T *p, unsigned int size = T::static_size) const
|
||||||
{
|
{
|
||||||
return ((const char *) p) >= table + start_offset
|
return ((const char *) p) >= data
|
||||||
&& ((const char *) p + T::static_size) <= table + end_offset;
|
&& ((const char *) p + size) <= data + length;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const char *table;
|
const char *data;
|
||||||
const unsigned int start_offset;
|
const unsigned int length;
|
||||||
const unsigned int end_offset;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Tuple : UnsizedArrayOf<F2DOT14> {};
|
struct Tuple : UnsizedArrayOf<F2DOT14> {};
|
||||||
|
@ -234,7 +233,7 @@ struct GlyphVarData
|
||||||
{
|
{
|
||||||
if (var_data->has_shared_point_numbers ())
|
if (var_data->has_shared_point_numbers ())
|
||||||
{
|
{
|
||||||
range_checker_t checker (var_data, 0, length);
|
range_checker_t checker (var_data, length);
|
||||||
const HBUINT8 *base = &(var_data+var_data->data);
|
const HBUINT8 *base = &(var_data+var_data->data);
|
||||||
const HBUINT8 *p = base;
|
const HBUINT8 *p = base;
|
||||||
if (!unpack_points (p, shared_indices, checker)) return false;
|
if (!unpack_points (p, shared_indices, checker)) return false;
|
||||||
|
@ -612,7 +611,7 @@ struct gvar
|
||||||
if (unlikely (!iterator.in_range (p, length)))
|
if (unlikely (!iterator.in_range (p, length)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
range_checker_t checker (p, 0, length);
|
range_checker_t checker (p, length);
|
||||||
hb_vector_t<unsigned int> private_indices;
|
hb_vector_t<unsigned int> private_indices;
|
||||||
if (iterator.current_tuple->has_private_points () &&
|
if (iterator.current_tuple->has_private_points () &&
|
||||||
!GlyphVarData::unpack_points (p, private_indices, checker))
|
!GlyphVarData::unpack_points (p, private_indices, checker))
|
||||||
|
|
Loading…
Reference in New Issue