main.cc revision aefaafe5bc4fc6d37a412c135b1079c287be7045
1/*
2 * Copyright (C) 2007,2008  Red Hat, Inc.
3 *
4 *  This is part of HarfBuzz, an OpenType Layout engine library.
5 *
6 * Permission is hereby granted, without written agreement and without
7 * license or royalty fees, to use, copy, modify, and distribute this
8 * software and its documentation for any purpose, provided that the
9 * above copyright notice and the following two paragraphs appear in
10 * all copies of this software.
11 *
12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16 * DAMAGE.
17 *
18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23 *
24 * Red Hat Author(s): Behdad Esfahbod
25 */
26
27#include "hb-ot-layout-open-private.h"
28#include "hb-ot-layout-gdef-private.h"
29#include "hb-ot-layout-gsub-private.h"
30
31#include <stdlib.h>
32#include <stdio.h>
33
34int
35main (int argc, char **argv)
36{
37  if (argc != 2) {
38    fprintf (stderr, "usage: %s font-file.ttf\n", argv[0]);
39    exit (1);
40  }
41
42  GMappedFile *mf = g_mapped_file_new (argv[1], FALSE, NULL);
43  const char *font_data = g_mapped_file_get_contents (mf);
44  int len = g_mapped_file_get_length (mf);
45
46  printf ("Opened font file %s: %d bytes long\n", argv[1], len);
47
48  const OpenTypeFontFile &ot = OpenTypeFontFile::get_for_data (font_data);
49
50  switch (ot.get_tag()) {
51  case OpenTypeFontFile::TrueTypeTag:
52    printf ("OpenType font with TrueType outlines\n");
53    break;
54  case OpenTypeFontFile::CFFTag:
55    printf ("OpenType font with CFF (Type1) outlines\n");
56    break;
57  case OpenTypeFontFile::TTCTag:
58    printf ("TrueType Collection of OpenType fonts\n");
59    break;
60  default:
61    printf ("Unknown font format\n");
62    break;
63  }
64
65  int num_fonts = ot.get_len ();
66  printf ("%d font(s) found in file\n", num_fonts);
67  for (int n_font = 0; n_font < num_fonts; n_font++) {
68    const OpenTypeFontFace &font = ot[n_font];
69    printf ("Font %d of %d:\n", n_font+1, num_fonts);
70
71    int num_tables = font.get_len ();
72    printf ("  %d table(s) found in font\n", num_tables);
73    for (int n_table = 0; n_table < num_tables; n_table++) {
74      const OpenTypeTable &table = font[n_table];
75      printf ("  Table %2d of %2d: %.4s (0x%08lx+0x%08lx)\n", n_table+1, num_tables,
76	      (const char *)table.get_tag(), table.get_offset(), table.get_length());
77
78      if (table.get_tag() == "GSUB" || table.get_tag() == "GPOS") {
79        const GSUBGPOS &g = GSUBGPOS::get_for_data (ot[table]);
80
81	const ScriptList &scripts = g.get_script_list();
82	int num_scripts = scripts.get_len ();
83	printf ("    %d script(s) found in table\n", num_scripts);
84	for (int n_script = 0; n_script < num_scripts; n_script++) {
85	  const Script &script = scripts[n_script];
86	  printf ("    Script %2d of %2d: %.4s\n", n_script+1, num_scripts,
87	          (const char *)scripts.get_tag(n_script));
88
89	  if (!script.has_default_language_system())
90	    printf ("      No default language system\n");
91	  int num_langsys = script.get_len ();
92	  printf ("      %d language system(s) found in script\n", num_langsys);
93	  for (int n_langsys = 0; n_langsys < num_langsys; n_langsys++) {
94	    const LangSys &langsys = script[n_langsys];
95	    printf ("      Language System %2d of %2d: %.4s; %d features\n", n_langsys+1, num_langsys,
96	            (const char *)script.get_tag(n_langsys),
97		    langsys.get_len ());
98	    if (!langsys.get_required_feature_index ())
99	      printf ("        No required feature\n");
100	  }
101	}
102
103	const FeatureList &features = g.get_feature_list();
104	int num_features = features.get_len ();
105	printf ("    %d feature(s) found in table\n", num_features);
106	for (int n_feature = 0; n_feature < num_features; n_feature++) {
107	  const Feature &feature = features[n_feature];
108	  printf ("    Feature %2d of %2d: %.4s; %d lookup(s)\n", n_feature+1, num_features,
109	          (const char *)features.get_tag(n_feature),
110		  feature.get_len());
111	}
112
113	const LookupList &lookups = g.get_lookup_list();
114	int num_lookups = lookups.get_len ();
115	printf ("    %d lookup(s) found in table\n", num_lookups);
116	for (int n_lookup = 0; n_lookup < num_lookups; n_lookup++) {
117	  const Lookup &lookup = lookups[n_lookup];
118	  printf ("    Lookup %2d of %2d: type %d, flags %04x\n", n_lookup+1, num_lookups,
119	          lookup.get_type(), lookup.get_flag());
120	}
121      } else if (table.get_tag() == "GDEF") {
122        const GDEF &gdef = GDEF::get_for_data (ot[table]);
123
124	for (int glyph = 0; glyph < 1; glyph++)
125	  printf ("    glyph %d has class %d and mark attachment type %d\n",
126		  glyph,
127		  gdef.get_glyph_class (glyph),
128		  gdef.get_mark_attachment_type (glyph));
129      }
130    }
131  }
132
133  return 0;
134}
135