[aat] trak sanitization

This commit is contained in:
Ebrahim Byagowi 2018-02-25 12:30:33 +03:30 committed by Behdad Esfahbod
parent becb1d9eea
commit bb82f01383
4 changed files with 78 additions and 25 deletions

View File

@ -35,7 +35,7 @@ find src/ | entr printf '\0' | while read -d ""; do
fi fi
done done
read -n 1 -p "[T]est, [D]ebug, [R]estart, [Q]uit?" answer read -n 1 -p "[T]est, [D]ebug, [R]estart, [Q]uit? " answer
case "$answer" in case "$answer" in
t|T ) t|T )
if [[ $CMAKENINJA ]]; then if [[ $CMAKENINJA ]]; then
@ -48,7 +48,7 @@ d|D )
if [[ $CMAKENINJA ]]; then if [[ $CMAKENINJA ]]; then
echo "Not supported on cmake builds yet" echo "Not supported on cmake builds yet"
else else
build/libtool --mode=execute $GDB build/util/hb-shape $@ build/libtool --mode=execute $GDB -- build/util/hb-shape $@
fi fi
;; ;;
r|R ) r|R )

View File

@ -39,11 +39,15 @@ namespace AAT {
struct TrackTableEntry struct TrackTableEntry
{ {
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c, const void *base, uint16_t size) const
{ {
TRACE_SANITIZE (this); TRACE_SANITIZE (this);
/* XXX Sanitize values */ return_trace (c->check_struct (this) && ((base+values).sanitize (c, size)));
return_trace (c->check_struct (this)); }
inline Fixed get_track_value () const
{
return track;
} }
inline float get_value (const void *base, unsigned int index) const inline float get_value (const void *base, unsigned int index) const
@ -64,11 +68,29 @@ struct TrackTableEntry
struct TrackData struct TrackData
{ {
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
{ {
TRACE_SANITIZE (this); TRACE_SANITIZE (this);
/* TODO */ if (!(c->check_struct (this)))
return_trace (c->check_struct (this)); return_trace (false);
uint16_t tracks = (uint16_t) nTracks;
uint16_t sizes = (uint16_t) nSizes;
// It should have at least one track
if (tracks < 1) return_trace (false);
// We can not do interpolation with less than two
if (sizes < 2) return_trace (false);
if (!((base+sizeTable).sanitize (c, sizes)))
return_trace (false);
for (uint16_t i = 0; i < tracks; ++i)
if (!(trackTable[i].sanitize (c, base, sizes)))
return_trace (false);
return_trace (true);
} }
inline float get_tracking (const void *base, float ptem) const inline float get_tracking (const void *base, float ptem) const
@ -84,26 +106,37 @@ struct TrackData
/* TODO Clean this up. */ /* TODO Clean this up. */
// TODO: Make indexing work and use only an entry with zero track uint16_t tracks = (uint16_t) nTracks;
const TrackTableEntry &trackTableEntry = trackTable[0]; uint16_t sizes = (uint16_t) nSizes;
const TrackTableEntry *trackTableEntry = nullptr;
for (unsigned int i = 0; i < sizes; ++i)
// For now we only seek for track entries with zero tracking value
if (trackTable[i].get_track_value () == 0)
trackTableEntry = &trackTable[0];
// We couldn't match any, exit
if (!trackTableEntry) return 0.;
/* TODO bfind() */ /* TODO bfind() */
unsigned int size_index; unsigned int size_index;
for (size_index = 0; size_index < nSizes; ++size_index) UnsizedArrayOf<Fixed> size_table = base+sizeTable;
if ((base+sizeTable)[size_index] >= fixed_size) for (size_index = 0; size_index < sizes; ++size_index)
if (size_table[size_index] >= fixed_size)
break; break;
// We don't attempt to extrapolate to larger or smaller values // TODO(ebraminio): We don't attempt to extrapolate to larger or
if (size_index == nSizes) // smaller values for now but we should do, per spec
return trackTableEntry.get_value (base, nSizes - 1); if (size_index == sizes)
if (size_index == 0 || (base+sizeTable)[size_index] == fixed_size) return trackTableEntry->get_value (base, sizes - 1);
return trackTableEntry.get_value (base, size_index); if (size_index == 0 || size_table[size_index] == fixed_size)
return trackTableEntry->get_value (base, size_index);
float s0 = (base+sizeTable)[size_index - 1].to_float (); float s0 = size_table[size_index - 1].to_float ();
float s1 = (base+sizeTable)[size_index].to_float (); float s1 = size_table[size_index].to_float ();
float t = (csspx - s0) / (s1 - s0); float t = (csspx - s0) / (s1 - s0);
return t * trackTableEntry.get_value (base, size_index) + return t * trackTableEntry->get_value (base, size_index) +
(1.0 - t) * trackTableEntry.get_value (base, size_index - 1); (1.0 - t) * trackTableEntry->get_value (base, size_index - 1);
} }
protected: protected:
@ -124,8 +157,28 @@ struct trak
inline bool sanitize (hb_sanitize_context_t *c) const inline bool sanitize (hb_sanitize_context_t *c) const
{ {
TRACE_SANITIZE (this); TRACE_SANITIZE (this);
/* TODO */
return_trace (c->check_struct (this)); if (!(c->check_struct (this)))
return_trace (false);
if ((format != 0) || (reserved != 0))
return_trace (false);
if (horizData)
{
const TrackData &trackData = this+horizData;
if (!trackData.sanitize (c, this))
return_trace (false);
}
if (vertData)
{
const TrackData &trackData = this+horizData;
if (!trackData.sanitize (c, this))
return_trace (false);
}
return_trace (true);
} }
inline bool apply (hb_aat_apply_context_t *c) const inline bool apply (hb_aat_apply_context_t *c) const

View File

@ -36,7 +36,7 @@
#include "hb-aat-layout-trak-table.hh" #include "hb-aat-layout-trak-table.hh"
/* /*
* mort/morx * morx/kerx/trak
*/ */
static inline const AAT::ankr& static inline const AAT::ankr&

View File

@ -454,7 +454,7 @@ struct font_options_t : option_group_t
default_font_size = default_font_size_; default_font_size = default_font_size_;
x_ppem = 0; x_ppem = 0;
y_ppem = 0; y_ppem = 0;
ptem = .0; ptem = 0.;
subpixel_bits = subpixel_bits_; subpixel_bits = subpixel_bits_;
font_file = nullptr; font_file = nullptr;
face_index = 0; face_index = 0;