diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 000000000..ba2906d06 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1 @@ +main diff --git a/src/Makefile b/src/Makefile index 55bc4e81c..f5e9ac225 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,3 +1,3 @@ -all: harfbuzz-ng +all: main CXXFLAGS = -Wall -Wextra `pkg-config --cflags --libs glib-2.0` diff --git a/src/harfbuzz-common.h b/src/harfbuzz-common.h new file mode 100644 index 000000000..b11539fd6 --- /dev/null +++ b/src/harfbuzz-common.h @@ -0,0 +1,14 @@ +#ifndef HARFBUZZ_COMMON_H +#define HARFBUZZ_COMMON_H + +#include + +# ifdef __cplusplus +# define HARFBUZZ_BEGIN_DECLS() extern "C" { extern int harfbuzz_dummy_prototype (int) +# define HARFBUZZ_END_DECLS() } extern "C" int harfbuzz_dummy_prototype (int) +# else /* !__cplusplus */ +# define HARFBUZZ_BEGIN_DECLS() extern int harfbuzz_dummy_prototype (int) +# define HARFBUZZ_END_DECLS() extern int harfbuzz_dummy_prototype (int) +# endif /* !__cplusplus */ + +#endif /* HARFBUZZ_COMMON_H */ diff --git a/src/harfbuzz-ng.cc b/src/harfbuzz-open-private.h similarity index 85% rename from src/harfbuzz-ng.cc rename to src/harfbuzz-open-private.h index d23021f0d..041d2ebc9 100644 --- a/src/harfbuzz-ng.cc +++ b/src/harfbuzz-open-private.h @@ -1,15 +1,12 @@ +#ifndef HARFBUZZ_OPEN_PRIVATE_H +#define HARFBUZZ_OPEN_PRIVATE_H + +#include "harfbuzz-open.h" + #include #include #include -/* Public header */ - -typedef uint32_t hb_tag_t; -#define HB_TAG(a,b,c,d) ((hb_tag_t)(((uint8_t)a<<24)|((uint8_t)b<<16)|((uint8_t)c<<8)|(uint8_t)d)) - - -/* Implementation */ - /* Macros to convert to/from BigEndian */ #define hb_be_uint8_t #define hb_be_int8_t @@ -697,106 +694,4 @@ struct GSUBGPOSHeader { * GSUB table */ }; -struct GSUB : GSUBGPOSHeader { -}; - -struct GPOS : GSUBGPOSHeader { -}; - - -#include -#include - -int -main (int argc, char **argv) -{ - if (argc != 2) { - fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]); - exit (1); - } - - GMappedFile *mf = g_mapped_file_new (argv[1], FALSE, NULL); - const char *font_data = g_mapped_file_get_contents (mf); - int len = g_mapped_file_get_length (mf); - - printf ("Opened font file %s: %d bytes long\n", argv[1], len); - - const OpenTypeFontFile &ot = OpenTypeFontFile::get (font_data); - - switch (ot.tag) { - case OpenTypeFontFile::TrueTypeTag: - printf ("OpenType font with TrueType outlines\n"); - break; - case OpenTypeFontFile::CFFTag: - printf ("OpenType font with CFF (Type1) outlines\n"); - break; - case OpenTypeFontFile::TTCTag: - printf ("TrueType Collection of OpenType fonts\n"); - break; - default: - printf ("Unknown font format\n"); - break; - } - - int num_fonts = ot.get_len (); - 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]; - printf ("Font %d of %d:\n", n_font+1, num_fonts); - - int num_tables = font.get_len (); - 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]; - printf (" Table %2d of %2d: %.4s (0x%06x+0x%06x)\n", n_table+1, num_tables, - (const char *)table.tag, (int)table.offset, (int)table.length); - - if (table.tag == "GSUB" || table.tag == "GPOS") { - const GSUBGPOSHeader &g = (const GSUBGPOSHeader&)*ot[table]; - - const ScriptList &scripts = *g.get_script_list(); - int num_scripts = scripts.get_len (); - printf (" %d script(s) found in table\n", num_scripts); - for (int n_script = 0; n_script < num_scripts; n_script++) { - const Script &script = scripts[n_script]; - printf (" Script %2d of %2d: %.4s\n", n_script+1, num_scripts, - (const char *)scripts.get_tag(n_script)); - - if (script.get_default_language_system () == NULL) - printf (" No default language system\n"); - int num_langsys = script.get_len (); - printf (" %d language system(s) found in script\n", num_langsys); - for (int n_langsys = 0; n_langsys < num_langsys; n_langsys++) { - const LangSys &langsys = script[n_langsys]; - printf (" Language System %2d of %2d: %.4s; %d features\n", n_langsys+1, num_langsys, - (const char *)script.get_tag(n_langsys), - langsys.get_len ()); - if (!langsys.get_required_feature_index ()) - printf (" No required feature\n"); - } - } - - const FeatureList &features = *g.get_feature_list(); - int num_features = features.get_len (); - printf (" %d feature(s) found in table\n", num_features); - for (int n_feature = 0; n_feature < num_features; n_feature++) { - const Feature &feature = features[n_feature]; - printf (" Feature %2d of %2d: %.4s; %d lookup(s)\n", n_feature+1, num_features, - (const char *)features.get_tag(n_feature), - (int)feature.lookupCount); - } - - const LookupList &lookups = *g.get_lookup_list(); - int num_lookups = lookups.get_len (); - printf (" %d lookup(s) found in table\n", num_lookups); - for (int n_lookup = 0; n_lookup < num_lookups; n_lookup++) { - const Lookup &lookup = lookups[n_lookup]; - printf (" Lookup %2d of %2d: type %d, flags %04x\n", n_lookup+1, num_lookups, - (int)lookup.lookupType, (unsigned int)lookup.lookupFlag); - } - } - } - } - - return 0; -} +#endif /* HARFBUZZ_OPEN_PRIVATE_H */ diff --git a/src/harfbuzz-open.h b/src/harfbuzz-open.h new file mode 100644 index 000000000..f52fda704 --- /dev/null +++ b/src/harfbuzz-open.h @@ -0,0 +1,13 @@ +#ifndef HARFBUZZ_OPEN_H +#define HARFBUZZ_OPEN_H + +#include "harfbuzz-common.h" + +HARFBUZZ_BEGIN_DECLS(); + +typedef uint32_t hb_tag_t; +#define HB_TAG(a,b,c,d) ((hb_tag_t)(((uint8_t)a<<24)|((uint8_t)b<<16)|((uint8_t)c<<8)|(uint8_t)d)) + +HARFBUZZ_END_DECLS(); + +#endif /* HARFBUZZ_OPEN_H */ diff --git a/src/main.cc b/src/main.cc new file mode 100644 index 000000000..d5ddf16b1 --- /dev/null +++ b/src/main.cc @@ -0,0 +1,98 @@ +#include "harfbuzz-open-private.h" + +#include +#include + +int +main (int argc, char **argv) +{ + if (argc != 2) { + fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]); + exit (1); + } + + GMappedFile *mf = g_mapped_file_new (argv[1], FALSE, NULL); + const char *font_data = g_mapped_file_get_contents (mf); + int len = g_mapped_file_get_length (mf); + + printf ("Opened font file %s: %d bytes long\n", argv[1], len); + + const OpenTypeFontFile &ot = OpenTypeFontFile::get (font_data); + + switch (ot.tag) { + case OpenTypeFontFile::TrueTypeTag: + printf ("OpenType font with TrueType outlines\n"); + break; + case OpenTypeFontFile::CFFTag: + printf ("OpenType font with CFF (Type1) outlines\n"); + break; + case OpenTypeFontFile::TTCTag: + printf ("TrueType Collection of OpenType fonts\n"); + break; + default: + printf ("Unknown font format\n"); + break; + } + + int num_fonts = ot.get_len (); + 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]; + printf ("Font %d of %d:\n", n_font+1, num_fonts); + + int num_tables = font.get_len (); + 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]; + printf (" Table %2d of %2d: %.4s (0x%06x+0x%06x)\n", n_table+1, num_tables, + (const char *)table.tag, (int)table.offset, (int)table.length); + + if (table.tag == "GSUB" || table.tag == "GPOS") { + const GSUBGPOSHeader &g = (const GSUBGPOSHeader&)*ot[table]; + + const ScriptList &scripts = *g.get_script_list(); + int num_scripts = scripts.get_len (); + printf (" %d script(s) found in table\n", num_scripts); + for (int n_script = 0; n_script < num_scripts; n_script++) { + const Script &script = scripts[n_script]; + printf (" Script %2d of %2d: %.4s\n", n_script+1, num_scripts, + (const char *)scripts.get_tag(n_script)); + + if (script.get_default_language_system () == NULL) + printf (" No default language system\n"); + int num_langsys = script.get_len (); + printf (" %d language system(s) found in script\n", num_langsys); + for (int n_langsys = 0; n_langsys < num_langsys; n_langsys++) { + const LangSys &langsys = script[n_langsys]; + printf (" Language System %2d of %2d: %.4s; %d features\n", n_langsys+1, num_langsys, + (const char *)script.get_tag(n_langsys), + langsys.get_len ()); + if (!langsys.get_required_feature_index ()) + printf (" No required feature\n"); + } + } + + const FeatureList &features = *g.get_feature_list(); + int num_features = features.get_len (); + printf (" %d feature(s) found in table\n", num_features); + for (int n_feature = 0; n_feature < num_features; n_feature++) { + const Feature &feature = features[n_feature]; + printf (" Feature %2d of %2d: %.4s; %d lookup(s)\n", n_feature+1, num_features, + (const char *)features.get_tag(n_feature), + (int)feature.lookupCount); + } + + const LookupList &lookups = *g.get_lookup_list(); + int num_lookups = lookups.get_len (); + printf (" %d lookup(s) found in table\n", num_lookups); + for (int n_lookup = 0; n_lookup < num_lookups; n_lookup++) { + const Lookup &lookup = lookups[n_lookup]; + printf (" Lookup %2d of %2d: type %d, flags %04x\n", n_lookup+1, num_lookups, + (int)lookup.lookupType, (unsigned int)lookup.lookupFlag); + } + } + } + } + + return 0; +}