[HarfBuzz] harfbuzz: Branch 'master'
Behdad Esfahbod
behdad at kemper.freedesktop.org
Thu Oct 26 00:01:33 UTC 2017
src/hb-ot-font.cc | 9 +--
src/hb-ot-post-table.hh | 139 ++++++++++++++++++++++++++----------------------
2 files changed, 81 insertions(+), 67 deletions(-)
New commits:
commit 543bd58d7a4fbe285ec9304ff3223a728dbdbb76
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Wed Oct 25 17:40:50 2017 -0600
[post] Touch up and fixes
The get_glyph_from_name() is incorrect; needs fixing.
diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc
index dff27bf4..c0ce89df 100644
--- a/src/hb-ot-font.cc
+++ b/src/hb-ot-font.cc
@@ -320,18 +320,15 @@ struct hb_ot_face_post_accelerator_t
}
inline bool get_glyph_name (hb_codepoint_t glyph,
- char *name, unsigned int size) const
+ char *name, unsigned int size) const
{
- if (unlikely (!name) || unlikely(!size))
- return false;
-
return this->post->get_glyph_name (glyph, name, size, this->post_len);
}
inline bool get_glyph_from_name (const char *name, int len,
- hb_codepoint_t *glyph) const
+ hb_codepoint_t *glyph) const
{
- if (unlikely (!name) || unlikely(!len))
+ if (unlikely (!len))
return false;
return this->post->get_glyph_from_name (name, len, glyph, this->post_len);
diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh
index c0d25f2b..293dda62 100644
--- a/src/hb-ot-post-table.hh
+++ b/src/hb-ot-post-table.hh
@@ -113,69 +113,80 @@ struct post
return_trace (false);
if (version.to_int () == 0x00020000)
{
- const postV2Tail &v2 = StructAfter<postV2Tail>(*this);
+ const postV2Tail &v2 = StructAfter<postV2Tail> (*this);
return_trace (v2.sanitize (c));
}
return_trace (true);
}
inline bool get_glyph_name (hb_codepoint_t glyph,
- char *buffer, unsigned int buffer_length,
- unsigned int blob_len) const
+ char *buffer, unsigned int buffer_length,
+ unsigned int blob_len) const
{
if (version.to_int () == 0x00010000)
{
if (glyph >= NUM_FORMAT1_NAMES)
- return false;
+ return false;
- strncpy(buffer, format1_names[glyph], buffer_length);
- buffer[buffer_length] = '\0';
+ if (!buffer_length)
+ return true;
+ strncpy (buffer, format1_names[glyph], buffer_length);
+ buffer[buffer_length - 1] = '\0';
return true;
}
if (version.to_int () == 0x00020000)
{
- const postV2Tail &v2 = StructAfter<postV2Tail>(*this);
+ const postV2Tail &v2 = StructAfter<postV2Tail> (*this);
if (glyph >= v2.numberOfGlyphs)
- return false;
+ return false;
+
+ if (!buffer_length)
+ return true;
unsigned int index = v2.glyphNameIndex[glyph];
- if (index >= NUM_FORMAT1_NAMES)
+ if (index < NUM_FORMAT1_NAMES)
{
- unsigned int offset = min_size + v2.min_size + 2 * v2.numberOfGlyphs;
- char* data = (char*) this + offset;
- for (unsigned int i = 0; data < (char*) this + blob_len; i++)
- {
- unsigned int name_length = data[0];
- data++;
- if (i == index - NUM_FORMAT1_NAMES)
- {
- unsigned int remaining = (char*) this + blob_len - data;
- name_length = MIN (name_length, buffer_length);
- name_length = MIN (name_length, remaining);
- memcpy (buffer, data, name_length);
- buffer[name_length] = '\0';
- return true;
- }
- data += name_length;
- }
- return false;
+ if (!buffer_length)
+ return true;
+ strncpy (buffer, format1_names[index], buffer_length);
+ buffer[buffer_length - 1] = '\0';
+ return true;
}
- else
+ index -= NUM_FORMAT1_NAMES;
+
+ unsigned int offset = min_size + v2.min_size + 2 * v2.numberOfGlyphs;
+ unsigned char *data = (unsigned char *) this + offset;
+ unsigned char *end = (unsigned char *) this + blob_len;
+ for (unsigned int i = 0; data < end; i++)
{
- strncpy(buffer, format1_names[index], buffer_length);
- buffer[buffer_length] = '\0';
- return true;
+ unsigned int name_length = data[0];
+ data++;
+ if (i == index)
+ {
+ if (unlikely (!name_length))
+ return false;
+
+ unsigned int remaining = end - data;
+ name_length = MIN (name_length, buffer_length - 1);
+ name_length = MIN (name_length, remaining);
+ memcpy (buffer, data, name_length);
+ buffer[name_length] = '\0';
+ return true;
+ }
+ data += name_length;
}
+
+ return false;
}
return false;
}
inline bool get_glyph_from_name (const char *name, int len,
- hb_codepoint_t *glyph,
- unsigned int blob_len) const
+ hb_codepoint_t *glyph,
+ unsigned int blob_len) const
{
if (len < 0)
len = strlen (name);
@@ -184,45 +195,51 @@ struct post
{
for (int i = 0; i < NUM_FORMAT1_NAMES; i++)
{
- if (strncmp (name, format1_names[i], len) == 0)
- {
- *glyph = i;
- return true;
- }
+ if (strncmp (name, format1_names[i], len) == 0 && format1_names[len] == '\0')
+ {
+ *glyph = i;
+ return true;
+ }
}
return false;
}
if (version.to_int () == 0x00020000)
{
- const postV2Tail &v2 = StructAfter<postV2Tail>(*this);
+ const postV2Tail &v2 = StructAfter<postV2Tail> (*this);
unsigned int offset = min_size + v2.min_size + 2 * v2.numberOfGlyphs;
char* data = (char*) this + offset;
+
+ /* XXX The following code is wrong. */
+ return false;
for (hb_codepoint_t gid = 0; gid < v2.numberOfGlyphs; gid++)
{
- unsigned int index = v2.glyphNameIndex[gid];
- if (index >= NUM_FORMAT1_NAMES)
- {
- for (unsigned int i = 0; data < (char*) this + blob_len; i++)
- {
- unsigned int name_length = data[0];
- unsigned int remaining = (char*) this + blob_len - data - 1;
- name_length = MIN (name_length, remaining);
- if (name_length == len && strncmp (name, data + 1, len) == 0)
- {
- *glyph = gid;
- return true;
- }
- data += name_length + 1;
- }
- return false;
- }
- else if (strncmp (name, format1_names[index], len) == 0)
- {
- *glyph = gid;
- return true;
- }
+ unsigned int index = v2.glyphNameIndex[gid];
+ if (index < NUM_FORMAT1_NAMES)
+ {
+ if (strncmp (name, format1_names[index], len) == 0 && format1_names[len] == '\0')
+ {
+ *glyph = gid;
+ return true;
+ }
+ continue;
+ }
+ index -= NUM_FORMAT1_NAMES;
+
+ for (unsigned int i = 0; data < (char*) this + blob_len; i++)
+ {
+ unsigned int name_length = data[0];
+ unsigned int remaining = (char*) this + blob_len - data - 1;
+ name_length = MIN (name_length, remaining);
+ if (name_length == (unsigned int) len && strncmp (name, data + 1, len) == 0)
+ {
+ *glyph = gid;
+ return true;
+ }
+ data += name_length + 1;
+ }
+ return false;
}
return false;
More information about the HarfBuzz
mailing list