63 lines
1.3 KiB
C++
63 lines
1.3 KiB
C++
#ifndef OT_VAR_VARC_COORD_SETTER_HH
|
|
#define OT_VAR_VARC_COORD_SETTER_HH
|
|
|
|
|
|
#include "../../../hb.hh"
|
|
|
|
|
|
namespace OT {
|
|
//namespace Var {
|
|
|
|
|
|
struct coord_setter_t
|
|
{
|
|
coord_setter_t (hb_array_t<const int> coords_)
|
|
{
|
|
length = coords_.length;
|
|
if (length <= ARRAY_LENGTH (static_coords))
|
|
hb_memcpy (static_coords, coords_.arrayZ, length * sizeof (int));
|
|
else
|
|
dynamic_coords.extend (coords_);
|
|
}
|
|
|
|
int& operator [] (unsigned idx)
|
|
{
|
|
if (unlikely (idx >= HB_VAR_COMPOSITE_MAX_AXES))
|
|
return Crap(int);
|
|
|
|
if (length <= ARRAY_LENGTH (static_coords))
|
|
{
|
|
if (idx < ARRAY_LENGTH (static_coords))
|
|
{
|
|
while (length <= idx)
|
|
static_coords[length++] = 0;
|
|
return static_coords[idx];
|
|
}
|
|
else
|
|
dynamic_coords.extend (hb_array (static_coords, length));
|
|
}
|
|
|
|
if (dynamic_coords.length <= idx)
|
|
{
|
|
if (unlikely (!dynamic_coords.resize (idx + 1)))
|
|
return Crap(int);
|
|
length = idx + 1;
|
|
}
|
|
return dynamic_coords.arrayZ[idx];
|
|
}
|
|
|
|
hb_array_t<int> get_coords ()
|
|
{ return length <= ARRAY_LENGTH (static_coords) ? hb_array (static_coords, length) : dynamic_coords.as_array (); }
|
|
|
|
private:
|
|
hb_vector_t<int> dynamic_coords;
|
|
unsigned length;
|
|
int static_coords[sizeof (void *) * 8];
|
|
};
|
|
|
|
|
|
//} // namespace Var
|
|
|
|
} // namespace OT
|
|
|
|
#endif /* OT_VAR_VARC_COORD_SETTER_HH */
|