1 /* otflist.c -- List OpenType fonts.
3 Copyright (C) 2003, 2004
4 National Institute of Advanced Industrial Science and Technology (AIST)
5 Registration Number H15PRO167
7 This file is part of libotf.
9 Libotf is free software; you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published
11 by the Free Software Foundation; either version 2.1 of the License, or
12 (at your option) any later version.
14 Libotf is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17 License for more details.
19 You should have received a copy of the GNU Lesser General Public
20 License along with this library, in a file named COPYING; if not,
21 write to the Free Software Foundation, Inc., 59 Temple Place, Suite
22 330, Boston, MA 02111-1307, USA. */
30 #include FT_FREETYPE_H
34 /* Format MSG by FMT and print the result to the stderr, and exit. */
36 #define FATAL_ERROR(fmt, arg) \
38 fprintf (stderr, fmt, arg); \
44 print_tag (OTF_Tag tag)
48 OTF_tag_name (tag, name);
53 print_gsub_gpos_info (OTF *otf, char *table)
57 if (OTF_get_table (otf, table) == 0)
59 OTF_ScriptList *scripts;
60 OTF_FeatureList *features;
62 if (! strcmp (table, "GSUB"))
63 scripts = &otf->gsub->ScriptList, features = &otf->gsub->FeatureList;
65 scripts = &otf->gpos->ScriptList, features = &otf->gpos->FeatureList;
67 printf (" %s scripts: ", table);
68 for (i = 0; i < scripts->ScriptCount; i++)
70 OTF_Script *script = scripts->Script + i;
74 print_tag (script->ScriptTag);
75 if (script->LangSysCount > 0)
78 for (j = 0; j < script->LangSysCount; j++)
82 print_tag (script->LangSysRecord[j].LangSysTag);
89 printf (" %s features: ", table);
90 for (i = 0; i < features->FeatureCount; i++)
94 print_tag (features->Feature[i].FeatureTag);
100 help_and_exit (char *prog)
102 printf ("otflist %s\n", LIBOTF_VERSION);
103 printf ("Usage: %s [-l] [-h] [DIR]\n", prog);
104 printf ("List information about OpenType font files in the directory DIR.\n");
105 printf ("It actually lists all fonts that can be handled by Freetype.\n");
106 printf (" -h print this help, then exit\n");
107 printf (" -l use a long listing mode\n");
112 filter (const struct dirent *direntry)
114 int len = strlen (direntry->d_name);
115 const char *ext = direntry->d_name + (len - 4);
118 && (! strncmp (ext, ".ttf", 4)
119 || ! strncmp (ext, ".TTF", 4)
120 || ! strncmp (ext, ".otf", 4)
121 || ! strncmp (ext, ".OTF", 4)
122 || ! strncmp (ext, ".PFA", 4)
123 || ! strncmp (ext, ".pfa", 4)
124 || ! strncmp (ext, ".PFB", 4)
125 || ! strncmp (ext, ".pfb", 4)));
129 main (int argc, char **argv)
131 FT_Library ft_library;
134 struct dirent **namelist;
138 if (FT_Init_FreeType (&ft_library))
139 FATAL_ERROR ("%s\n", "!! Freetype initialization failed.");
143 if (! strcmp (argv[1], "-h") || ! strcmp (argv[1], "--help"))
144 help_and_exit (argv[0]);
145 if (! strcmp (argv[1], "-l"))
146 long_format = 1, argc--, argv++;
150 if (chdir (argv[1]) < 0)
151 FATAL_ERROR ("Can't change directory to %s\n", argv[1]);
153 n = scandir (".", &namelist, filter, alphasort);
155 for (i = 0; i < n; i++)
156 if (! FT_New_Face (ft_library, namelist[i]->d_name, 0, &face))
158 OTF *otf = OTF_open (namelist[i]->d_name);
159 char *name, *family = NULL, *style = NULL;
163 OTF_get_table (otf, "name");
165 if (! (family = otf->name->name[16]))
166 family = otf->name->name[1];
167 if (! (style = otf->name->name[17]))
168 style = otf->name->name[2];
171 family = face->family_name;
173 style = face->style_name;
175 name = alloca (strlen (namelist[i]->d_name)
178 sprintf (name, "%s (%s)", namelist[i]->d_name, family);
179 printf ("%-40s %s", name, style);
180 for (j = 0; j < face->num_charmaps; j++)
181 printf (" %d-%d", face->charmaps[j]->platform_id,
182 face->charmaps[j]->encoding_id);
184 if (otf && long_format)
186 print_gsub_gpos_info (otf, "GSUB");
187 print_gsub_gpos_info (otf, "GPOS");
194 printf ("%s fail to open\n", namelist[i]->d_name);