GDEF completely working now

This commit is contained in:
Behdad Esfahbod 2008-01-27 21:19:51 -05:00
parent 6f425b1179
commit 54e5aac5e2
5 changed files with 39 additions and 26 deletions

View File

@ -27,6 +27,10 @@
#ifndef HB_OT_LAYOUT_OPEN_PRIVATE_H
#define HB_OT_LAYOUT_OPEN_PRIVATE_H
#ifndef HB_OT_LAYOUT_CC
#error "This file should only be included from hb-ot-layout.c"
#endif
#include "hb-ot-layout-private.h"
@ -127,7 +131,7 @@
return &(*this)[i]; \
return NULL; \
} \
inline const Type& get_##name_by_tag (hb_tag_t tag) const { \
inline const Type& get_##name##_by_tag (hb_tag_t tag) const { \
for (unsigned int i = 0; i < this->get_len (); i++) \
if (tag == (*this)[i].tag) \
return (*this)[i]; \
@ -158,6 +162,7 @@
private: inline Type() {} /* cannot be instantiated */ \
public:
/* TODO use a global nul-array for most Null's */
/* defines Null##Type as a safe nil instance of Type */
#define DEFINE_NULL_DATA(Type, size, data) \
static const unsigned char Null##Type##Data[size] = data; \
@ -170,11 +175,11 @@
ASSERT_SIZE (Type, size); \
DEFINE_NULL_DATA (Type, size, data)
#define DEFINE_NULL_ALIAS(NewType, OldType) \
static const NewType &Null##NewType = *(NewType *)Null##OldType##Data
/* XXX static */ const NewType &Null##NewType = *(NewType *)Null##OldType##Data
/* get_for_data() is a static class method returning a reference to an
* instance of Type located at the input data location. It's just a
* fancy cast! */
* fancy, NULL-safe, cast! */
#define STATIC_DEFINE_GET_FOR_DATA(Type) \
static inline const Type& get_for_data (const char *data) { \
extern const Type &Null##Type; \

View File

@ -27,10 +27,6 @@
#ifndef HB_OT_LAYOUT_PRIVATE_H
#define HB_OT_LAYOUT_PRIVATE_H
#ifndef HB_OT_LAYOUT_CC
#error "This file should only be included from hb-ot-layout.c"
#endif
#include "hb-private.h"
#include "hb-ot-layout.h"
@ -43,17 +39,23 @@ typedef uint16_t hb_ot_layout_glyph_properties_t;
typedef uint16_t hb_ot_layout_lookup_flags_t;
typedef int hb_ot_layout_coverage_t; /* -1 is not covered, >= 0 otherwise */
/* XXX #define HB_OT_LAYOUT_INTERNAL static */
#define HB_OT_LAYOUT_INTERNAL
HB_BEGIN_DECLS();
static hb_bool_t
/*
* GDEF
*/
HB_OT_LAYOUT_INTERNAL hb_bool_t
_hb_ot_layout_has_new_glyph_classes (HB_OT_Layout *layout);
static hb_ot_layout_glyph_properties_t
HB_OT_LAYOUT_INTERNAL hb_ot_layout_glyph_properties_t
_hb_ot_layout_get_glyph_properties (HB_OT_Layout *layout,
hb_glyph_t glyph);
static bool
HB_OT_LAYOUT_INTERNAL hb_bool_t
_hb_ot_layout_check_glyph_properties (HB_OT_Layout *layout,
HB_GlyphItem gitem,
hb_ot_layout_lookup_flags_t lookup_flags,

View File

@ -61,9 +61,9 @@ hb_ot_layout_create (const char *font_data,
const OpenTypeFontFile &font = OpenTypeFontFile::get_for_data (font_data);
const OpenTypeFontFace &face = font.get_face (face_index);
layout->gdef = &GDEF::get_for_data (font.get_table_data (face.get_table (GDEF::Tag)));
layout->gsub = &GSUB::get_for_data (font.get_table_data (face.get_table (GSUB::Tag)));
//layout->gpos = &GPOS::get_for_data (font.get_table_data (face.get_table (GPOS::Tag)));
layout->gdef = &GDEF::get_for_data (font.get_table_data (face.get_table_by_tag (GDEF::Tag)));
layout->gsub = &GSUB::get_for_data (font.get_table_data (face.get_table_by_tag (GSUB::Tag)));
//layout->gpos = &GPOS::get_for_data (font.get_table_data (face.get_table_by_tag (GPOS::Tag)));
return layout;
}
@ -84,13 +84,13 @@ hb_ot_layout_has_font_glyph_classes (HB_OT_Layout *layout)
return layout->gdef->has_glyph_classes ();
}
static hb_bool_t
HB_OT_LAYOUT_INTERNAL hb_bool_t
_hb_ot_layout_has_new_glyph_classes (HB_OT_Layout *layout)
{
return layout->new_gdef.len > 0;
}
static hb_ot_layout_glyph_properties_t
HB_OT_LAYOUT_INTERNAL hb_ot_layout_glyph_properties_t
_hb_ot_layout_get_glyph_properties (HB_OT_Layout *layout,
hb_glyph_t glyph)
{
@ -117,19 +117,18 @@ _hb_ot_layout_get_glyph_properties (HB_OT_Layout *layout,
}
}
static bool
HB_OT_LAYOUT_INTERNAL hb_bool_t
_hb_ot_layout_check_glyph_properties (HB_OT_Layout *layout,
HB_GlyphItem gitem,
hb_ot_layout_lookup_flags_t lookup_flags,
hb_ot_layout_glyph_properties_t *property)
{
/* TODO ugh, clean this mess up */
hb_ot_layout_glyph_class_t basic_glyph_class;
hb_ot_layout_glyph_properties_t desired_attachment_class;
if (gitem->gproperties == HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED)
if (gitem->gproperties == HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN)
{
gitem->gproperties = _hb_ot_layout_get_glyph_properties (layout, gitem->gindex);
gitem->gproperties = *property = _hb_ot_layout_get_glyph_properties (layout, gitem->gindex);
if (gitem->gproperties == HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED)
return false;
}
@ -177,7 +176,7 @@ hb_ot_layout_get_glyph_class (HB_OT_Layout *layout,
properties = _hb_ot_layout_get_glyph_properties (layout, glyph);
if (properties & 0xFF)
if (properties & 0xFF00)
return HB_OT_LAYOUT_GLYPH_CLASS_MARK;
return (hb_ot_layout_glyph_class_t) properties;

View File

@ -52,4 +52,11 @@
#define ASSERT_SIZE(_type, _size) ASSERT_STATIC (sizeof (_type) == (_size))
/*
* buffer
*/
/* XXX */
#define HB_BUFFER_GLYPH_PROPERTIES_UNKNOWN 0xFFFF
#endif /* HB_PRIVATE_H */

View File

@ -63,21 +63,21 @@ main (int argc, char **argv)
break;
}
int num_fonts = ot.get_len ();
int num_fonts = ot.get_face_count ();
printf ("%d font(s) found in file\n", num_fonts);
for (int n_font = 0; n_font < num_fonts; n_font++) {
const OpenTypeFontFace &font = ot[n_font];
const OpenTypeFontFace &font = ot.get_face (n_font);
printf ("Font %d of %d:\n", n_font+1, num_fonts);
int num_tables = font.get_len ();
int num_tables = font.get_table_count ();
printf (" %d table(s) found in font\n", num_tables);
for (int n_table = 0; n_table < num_tables; n_table++) {
const OpenTypeTable &table = font[n_table];
const OpenTypeTable &table = font.get_table (n_table);
printf (" Table %2d of %2d: %.4s (0x%08lx+0x%08lx)\n", n_table+1, num_tables,
(const char *)table.get_tag(), table.get_offset(), table.get_length());
if (table.get_tag() == "GSUB" || table.get_tag() == "GPOS") {
const GSUBGPOS &g = GSUBGPOS::get_for_data (ot[table]);
if (table.get_tag() == GSUBGPOS::GSUBTag || table.get_tag() == GSUBGPOS::GPOSTag) {
const GSUBGPOS &g = GSUBGPOS::get_for_data (ot.get_table_data (table));
const ScriptList &scripts = g.get_script_list();
int num_scripts = scripts.get_len ();