Blame example/otflist.c

Packit daac2c
/* otflist.c -- List OpenType fonts.
Packit daac2c
Packit daac2c
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Packit daac2c
  National Institute of Advanced Industrial Science and Technology (AIST)
Packit daac2c
  Registration Number H15PRO167
Packit daac2c
Packit daac2c
This file is part of libotf.
Packit daac2c
Packit daac2c
Libotf is free software; you can redistribute it and/or modify it
Packit daac2c
under the terms of the GNU Lesser General Public License as published
Packit daac2c
by the Free Software Foundation; either version 2.1 of the License, or
Packit daac2c
(at your option) any later version.
Packit daac2c
Packit daac2c
Libotf is distributed in the hope that it will be useful, but WITHOUT
Packit daac2c
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
Packit daac2c
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
Packit daac2c
License for more details.
Packit daac2c
Packit daac2c
You should have received a copy of the GNU Lesser General Public
Packit daac2c
License along with this library, in a file named COPYING; if not,
Packit daac2c
write to the Free Software Foundation, Inc., 59 Temple Place, Suite
Packit daac2c
330, Boston, MA 02111-1307, USA.  */
Packit daac2c
Packit daac2c
#include <stdio.h>
Packit daac2c
#include <unistd.h>
Packit daac2c
#include <string.h>
Packit daac2c
#include <sys/types.h>
Packit daac2c
#include <dirent.h>
Packit daac2c
Packit daac2c
#include <ft2build.h>
Packit daac2c
#include FT_FREETYPE_H
Packit daac2c
Packit daac2c
#include "config.h"
Packit daac2c
#ifdef HAVE_ALLOCA_H
Packit daac2c
#include <alloca.h>
Packit daac2c
#endif
Packit daac2c
Packit daac2c
#include <otf.h>
Packit daac2c
Packit daac2c
/* Format MSG by FMT and print the result to the stderr, and exit.  */
Packit daac2c
Packit daac2c
#define FATAL_ERROR(fmt, arg)	\
Packit daac2c
  do {				\
Packit daac2c
    fprintf (stderr, fmt, arg);	\
Packit daac2c
    exit (1);			\
Packit daac2c
  } while (0)
Packit daac2c
Packit daac2c
Packit daac2c
void
Packit daac2c
print_tag (OTF_Tag tag)
Packit daac2c
{
Packit daac2c
  char name[5];
Packit daac2c
Packit daac2c
  OTF_tag_name (tag, name);
Packit daac2c
  printf ("%s", name);
Packit daac2c
}
Packit daac2c
Packit daac2c
void
Packit daac2c
print_gsub_gpos_info (OTF *otf, char *table)
Packit daac2c
{
Packit daac2c
  int i, j;
Packit daac2c
Packit daac2c
  if (OTF_get_table (otf, table) == 0)
Packit daac2c
    {
Packit daac2c
      OTF_ScriptList *scripts;
Packit daac2c
      OTF_FeatureList *features;
Packit daac2c
Packit daac2c
      if (! strcmp (table, "GSUB"))
Packit daac2c
	scripts = &otf->gsub->ScriptList, features = &otf->gsub->FeatureList;
Packit daac2c
      else
Packit daac2c
	scripts = &otf->gpos->ScriptList, features = &otf->gpos->FeatureList;
Packit daac2c
Packit daac2c
      printf ("  %s scripts: ", table);
Packit daac2c
      for (i = 0; i < scripts->ScriptCount; i++)
Packit daac2c
	{
Packit daac2c
	  OTF_Script *script = scripts->Script + i;
Packit daac2c
Packit daac2c
	  if (i > 0)
Packit daac2c
	    printf (", ");
Packit daac2c
	  print_tag (script->ScriptTag);
Packit daac2c
	  if (script->LangSysCount > 0)
Packit daac2c
	    {
Packit daac2c
	      printf (" (");
Packit daac2c
	      for (j = 0; j < script->LangSysCount; j++)
Packit daac2c
		{
Packit daac2c
		  if (j > 0)
Packit daac2c
		    printf (", ");
Packit daac2c
		  print_tag (script->LangSysRecord[j].LangSysTag);
Packit daac2c
		}
Packit daac2c
	      printf (")");
Packit daac2c
	    }
Packit daac2c
	}
Packit daac2c
      printf ("\n");
Packit daac2c
Packit daac2c
      printf ("  %s features: ", table);
Packit daac2c
      for (i = 0; i < features->FeatureCount; i++)
Packit daac2c
	{
Packit daac2c
	  if (i > 0)
Packit daac2c
	    printf (",");
Packit daac2c
	  print_tag (features->Feature[i].FeatureTag);
Packit daac2c
	}
Packit daac2c
      printf ("\n");
Packit daac2c
    }
Packit daac2c
}
Packit daac2c
void
Packit daac2c
help_and_exit (char *prog)
Packit daac2c
{
Packit daac2c
  printf ("otflist %s\n", LIBOTF_VERSION);
Packit daac2c
  printf ("Usage: %s [-l] [-h] [DIR]\n", prog);
Packit daac2c
  printf ("List information about OpenType font files in the directory DIR.\n");
Packit daac2c
  printf ("It actually lists all fonts that can be handled by Freetype.\n");
Packit daac2c
  printf ("  -h		print this help, then exit\n");
Packit daac2c
  printf ("  -l		use a long listing mode\n");
Packit daac2c
  exit (0);
Packit daac2c
}
Packit daac2c
Packit daac2c
int
Packit daac2c
filter (const struct dirent *direntry)
Packit daac2c
{
Packit daac2c
  int len = strlen (direntry->d_name);
Packit daac2c
  const char *ext = direntry->d_name + (len - 4);
Packit daac2c
Packit daac2c
  return (len >= 5
Packit daac2c
	  && (! strncmp (ext, ".ttf", 4)
Packit daac2c
	      || ! strncmp (ext, ".TTF", 4)
Packit daac2c
	      || ! strncmp (ext, ".ttc", 4)
Packit daac2c
	      || ! strncmp (ext, ".TTC", 4)
Packit daac2c
	      || ! strncmp (ext, ".otf", 4)
Packit daac2c
	      || ! strncmp (ext, ".OTF", 4)
Packit daac2c
	      || ! strncmp (ext, ".PFA", 4)
Packit daac2c
	      || ! strncmp (ext, ".pfa", 4)
Packit daac2c
	      || ! strncmp (ext, ".PFB", 4)
Packit daac2c
	      || ! strncmp (ext, ".pfb", 4)));
Packit daac2c
}
Packit daac2c
Packit daac2c
int dir_index = 0;
Packit daac2c
Packit daac2c
#ifdef HAVE_SCANDIR
Packit daac2c
Packit daac2c
struct dirent **namelist = NULL;
Packit daac2c
int num_files = 0;
Packit daac2c
Packit daac2c
char *
Packit daac2c
next_file (char *dirname)
Packit daac2c
{
Packit daac2c
  if (dir_index == 0)
Packit daac2c
    {
Packit daac2c
#ifdef HAVE_ALPHASORT
Packit daac2c
      num_files = scandir (".", &namelist, filter, alphasort);
Packit daac2c
#else
Packit daac2c
      num_files = scandir (".", &namelist, filter, NULL);
Packit daac2c
#endif
Packit daac2c
    }
Packit daac2c
  if (dir_index == num_files)
Packit daac2c
    return NULL;
Packit daac2c
  return namelist[dir_index++]->d_name;
Packit daac2c
}
Packit daac2c
Packit daac2c
#else  /* not HAVE_SCANDIR */
Packit daac2c
Packit daac2c
DIR *dirp;
Packit daac2c
Packit daac2c
char *
Packit daac2c
next_file (char *dirname)
Packit daac2c
{
Packit daac2c
  struct dirent *dirent;
Packit daac2c
Packit daac2c
  if (dir_index == 0)
Packit daac2c
    dirp = opendir (dirname);
Packit daac2c
  while ((dirent = readdir (dirp))
Packit daac2c
	 && (strcmp (dirent->d_name, ".") == 0
Packit daac2c
	     || strcmp (dirent->d_name, "..") == 0));
Packit daac2c
  if (! dirent)
Packit daac2c
    return NULL;
Packit daac2c
  dir_index++;
Packit daac2c
  return dirent->d_name;
Packit daac2c
}
Packit daac2c
Packit daac2c
#endif /* not HAVE_SCANDIR */
Packit daac2c
Packit daac2c
int
Packit daac2c
main (int argc, char **argv)
Packit daac2c
{ 
Packit daac2c
  FT_Library ft_library;
Packit daac2c
  FT_Face face;
Packit daac2c
  char *filename;
Packit daac2c
  int long_format = 0;
Packit daac2c
  int i;
Packit daac2c
Packit daac2c
  if (FT_Init_FreeType (&ft_library))
Packit daac2c
    FATAL_ERROR ("%s\n", "!! Freetype initialization failed.");
Packit daac2c
Packit daac2c
  if (argc > 1)
Packit daac2c
    {
Packit daac2c
      if (! strcmp (argv[1], "-h") || ! strcmp (argv[1], "--help"))
Packit daac2c
	help_and_exit (argv[0]);
Packit daac2c
      if (! strcmp (argv[1], "-l"))
Packit daac2c
	long_format = 1, argc--, argv++;
Packit daac2c
    }
Packit daac2c
  if (argc == 2)
Packit daac2c
    {
Packit daac2c
      if (chdir (argv[1]) < 0)
Packit daac2c
	FATAL_ERROR ("Can't change directory to %s\n", argv[1]);
Packit daac2c
    }
Packit daac2c
Packit daac2c
  while ((filename = next_file (".")) != NULL)
Packit daac2c
    {
Packit daac2c
      if (! FT_New_Face (ft_library, filename, 0, &face))
Packit daac2c
	{
Packit daac2c
	  OTF *otf = OTF_open (filename);
Packit daac2c
	  char *name, *family = NULL, *style = NULL;
Packit daac2c
Packit daac2c
	  if (otf)
Packit daac2c
	    {
Packit daac2c
	      OTF_get_table (otf, "name");
Packit daac2c
Packit daac2c
	      if (! (family = otf->name->name[16]))
Packit daac2c
		family = otf->name->name[1];
Packit daac2c
	      if (! (style = otf->name->name[17]))
Packit daac2c
		style = otf->name->name[2];
Packit daac2c
	    }
Packit daac2c
	  if (! family)
Packit daac2c
	    family = face->family_name;
Packit daac2c
	  if (! style)
Packit daac2c
	    style = face->style_name;
Packit daac2c
Packit daac2c
	  name = alloca (strlen (filename)
Packit daac2c
			 + strlen (family)
Packit daac2c
			 + 4);
Packit daac2c
	  sprintf (name, "%s (%s)", filename, family);
Packit daac2c
	  printf ("%-40s %s", name, style);
Packit daac2c
	  for (i = 0; i < face->num_charmaps; i++)
Packit daac2c
	    printf (" %d-%d", face->charmaps[i]->platform_id,
Packit daac2c
		    face->charmaps[i]->encoding_id);
Packit daac2c
	  printf ("\n");
Packit daac2c
	  if (otf && long_format)
Packit daac2c
	    {
Packit daac2c
	      print_gsub_gpos_info (otf, "GSUB");
Packit daac2c
	      print_gsub_gpos_info (otf, "GPOS");
Packit daac2c
	    }
Packit daac2c
	  if (otf)
Packit daac2c
	    OTF_close (otf);
Packit daac2c
	}
Packit daac2c
      else
Packit daac2c
	{
Packit daac2c
	  printf ("%s fail to open\n", filename);
Packit daac2c
	}
Packit daac2c
    }
Packit daac2c
  exit (0);
Packit daac2c
}