[HarfBuzz] harfbuzz: Branch 'name-table' - 2 commits
Behdad Esfahbod
behdad at kemper.freedesktop.org
Tue Oct 16 06:09:56 UTC 2018
src/hb-ot-name-table.hh | 30 +++++++++---------------------
src/hb-ot-name.cc | 22 ++++++++++++++++++++++
src/hb-ot-name.h | 8 ++++++--
3 files changed, 37 insertions(+), 23 deletions(-)
New commits:
commit f65dba8ef8540016c07bf07a64c0b6b056435f2b
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Oct 15 23:09:28 2018 -0700
[name] Start implementing hb_ot_name_get_utf16()
diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh
index 37a2d42f..3d7b7311 100644
--- a/src/hb-ot-name-table.hh
+++ b/src/hb-ot-name-table.hh
@@ -165,8 +165,9 @@ struct name
inline void init (hb_face_t *face)
{
this->blob = hb_sanitize_context_t().reference_table<name> (face);
- const name *table = this->blob->as<name> ();
- const hb_array_t<NameRecord> &all_names = hb_array_t<NameRecord> (table->nameRecordZ.arrayZ, table->count);
+ this->table = this->blob->as<name> ();
+ const hb_array_t<NameRecord> &all_names = hb_array_t<NameRecord> (this->table->nameRecordZ.arrayZ,
+ this->table->count);
this->names.init ();
@@ -204,6 +205,7 @@ struct name
private:
hb_blob_t *blob;
public:
+ const name *table;
hb_vector_t<hb_ot_name_entry_t> names;
};
diff --git a/src/hb-ot-name.cc b/src/hb-ot-name.cc
index 85995f8c..b5143d3d 100644
--- a/src/hb-ot-name.cc
+++ b/src/hb-ot-name.cc
@@ -48,3 +48,25 @@ hb_ot_name_get_names (hb_face_t *face,
*entries = name.names.arrayZ();
return name.names.len;
}
+
+
+hb_bool_t
+hb_ot_name_get_utf16 (hb_face_t *face,
+ hb_name_id_t name_id,
+ hb_language_t language,
+ unsigned int *text_size /* IN/OUT */,
+ uint16_t *text /* OUT */)
+{
+ const OT::name_accelerator_t &name = _get_name (face);
+ unsigned int idx = 0; //XXX
+ hb_bytes_t bytes = name.table->get_name (idx);
+ if (*text_size)
+ {
+ /* TODO Switch to walking string and validating. */
+ memcpy (text, bytes.arrayZ, MIN (*text_size * 2, bytes.len));
+ }
+ /* XXX Null-terminate. */
+ *text_size = bytes.len / 2; //TODO
+ /* TODO Fallback? */
+ return true; //XXX
+}
diff --git a/src/hb-ot-name.h b/src/hb-ot-name.h
index ddd2c254..0bf72c6b 100644
--- a/src/hb-ot-name.h
+++ b/src/hb-ot-name.h
@@ -49,12 +49,14 @@ typedef unsigned int hb_name_id_t;
#define HB_NAME_ID_INVALID 0xFFFF
+#if 0
HB_EXTERN hb_bool_t
-hb_ot_name_get_utf8 (hb_face_t *face,
+Xhb_ot_name_get_utf8 (hb_face_t *face,
hb_name_id_t name_id,
hb_language_t language,
unsigned int *text_size /* IN/OUT */,
char *text /* OUT */);
+#endif
HB_EXTERN hb_bool_t
hb_ot_name_get_utf16 (hb_face_t *face,
@@ -63,12 +65,14 @@ hb_ot_name_get_utf16 (hb_face_t *face,
unsigned int *text_size /* IN/OUT */,
uint16_t *text /* OUT */);
+#if 0
HB_EXTERN hb_bool_t
-hb_ot_name_get_utf32 (hb_face_t *face,
+Xhb_ot_name_get_utf32 (hb_face_t *face,
hb_name_id_t name_id,
hb_language_t language,
unsigned int *text_size /* IN/OUT */,
uint32_t *text /* OUT */);
+#endif
typedef struct hb_ot_name_entry_t
commit 7742644191752b6599837ca2e5009e5d89978747
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Mon Oct 15 23:00:27 2018 -0700
[name] Implement hb_bytes_t get_name()
diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh
index 5625ab2c..37a2d42f 100644
--- a/src/hb-ot-name-table.hh
+++ b/src/hb-ot-name-table.hh
@@ -131,26 +131,11 @@ struct name
{
static const hb_tag_t tableTag = HB_OT_TAG_name;
- inline unsigned int get_name (unsigned int platform_id,
- unsigned int encoding_id,
- unsigned int language_id,
- unsigned int name_id,
- void *buffer,
- unsigned int buffer_length) const
+ inline hb_bytes_t get_name (unsigned int idx) const
{
- NameRecord key;
- key.platformID.set (platform_id);
- key.encodingID.set (encoding_id);
- key.languageID.set (language_id);
- key.nameID.set (name_id);
- NameRecord *match = (NameRecord *) bsearch (&key, nameRecordZ.arrayZ, count, sizeof (nameRecordZ[0]), NameRecord::cmp);
-
- if (!match)
- return 0;
-
- unsigned int length = MIN (buffer_length, (unsigned int) match->length);
- memcpy (buffer, (char *) this + stringOffset + match->offset, length);
- return length;
+ const hb_array_t<NameRecord> &all_names = hb_array_t<NameRecord> (nameRecordZ.arrayZ, count);
+ const NameRecord &record = all_names[idx];
+ return hb_bytes_t ((char *) this + stringOffset + record.offset, record.length);
}
inline unsigned int get_size (void) const
@@ -160,6 +145,7 @@ struct name
TRACE_SANITIZE (this);
char *string_pool = (char *) this + stringOffset;
unsigned int _count = count;
+ /* Move to run-time?! */
for (unsigned int i = 0; i < _count; i++)
if (!nameRecordZ[i].sanitize (c, string_pool)) return_trace (false);
return_trace (true);
More information about the HarfBuzz
mailing list