Commit 6b0149b826bc78d7de29501f361caa022ff5ea3f

David Turner 2000-03-28T11:14:24

a new simple program to display composite glyphs in a given font. Used during auto-hinting research

diff --git a/demos/src/compos.c b/demos/src/compos.c
new file mode 100644
index 0000000..d7a77c3
--- /dev/null
+++ b/demos/src/compos.c
@@ -0,0 +1,193 @@
+/****************************************************************************/
+/*                                                                          */
+/*  The FreeType project -- a free and portable quality TrueType renderer.  */
+/*                                                                          */
+/*  Copyright 1996-1998 by                                                  */
+/*  D. Turner, R.Wilhelm, and W. Lemberg                                    */
+/*                                                                          */
+/*  compos: this is a very simple program used to test the flag             */
+/*          FT_LOAD_NO_RECURSE                                              */
+/*                                                                          */
+/*  NOTE:  This is just a test program that is used to show off and         */
+/*         debug the current engine.                                        */
+/*                                                                          */
+/****************************************************************************/
+
+#include "freetype.h"
+#include "ftobjs.h"
+#include "ftdriver.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+#define gettext( x )  ( x )
+
+  FT_Error      error;
+
+  FT_Library    library;
+  FT_Face       face;
+  FT_Size       size;
+  FT_GlyphSlot  slot;
+
+  unsigned int  num_glyphs;
+  int           ptsize;
+
+  int  Fail;
+  int  Num;
+
+
+
+  static void  Usage( char*  name )
+  {
+    printf( "compos: test FT_LOAD_NO_RECURSE load flag - www.freetype.org\n" );
+    printf( "------------------------------------------------------------\n" );
+    printf( "\n" );
+    printf( "Usage: %s fontname[.ttf|.ttc] [fontname2..]\n", name );
+    printf( "\n" );
+
+    exit( 1 );
+  }
+
+
+  static void  Panic( const char*  message )
+  {
+    fprintf( stderr, "%s\n  error code = 0x%04x\n", message, error );
+    exit(1);
+  }
+
+
+  int  main( int  argc, char**  argv ) 
+  {
+    int           i, file_index;
+    unsigned int  id;
+    char          filename[128 + 4];
+    char          alt_filename[128 + 4];
+    char*         execname;
+    char*         fname;
+
+
+    execname = argv[0];
+
+    if ( argc < 2 )
+      Usage( execname );
+
+    error = FT_Init_FreeType( &library );
+    if (error) Panic( "Could not create library object" );
+
+    /* Now check all files */
+    for ( file_index = 1; file_index < argc; file_index++ )
+    {
+      fname = argv[file_index];
+      i     = strlen( fname );
+      while ( i > 0 && fname[i] != '\\' && fname[i] != '/' )
+      {
+        if ( fname[i] == '.' )
+          i = 0;
+        i--;
+      }
+
+      filename[128] = '\0';
+      alt_filename[128] = '\0';
+
+      strncpy( filename, fname, 128 );
+      strncpy( alt_filename, fname, 128 );
+
+#ifndef macintosh
+      if ( i >= 0 )
+      {
+        strncpy( filename + strlen( filename ), ".ttf", 4 );
+        strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
+      }
+#endif
+      i     = strlen( filename );
+      fname = filename;
+
+      while ( i >= 0 )
+#ifndef macintosh
+        if ( filename[i] == '/' || filename[i] == '\\' )
+#else
+        if ( filename[i] == ':' )
+#endif
+        {
+          fname = filename + i + 1;
+          i = -1;
+        }
+        else 
+          i--;
+
+      printf( "%s:\n", fname );
+
+      /* Load face */
+      error = FT_New_Face( library, filename, 0, &face );
+      if (error)
+      {
+        if (error == FT_Err_Invalid_File_Format)
+          printf( "unknown format\n" );
+        else
+          printf( "could not find/open file (error: %d)\n", error );
+        continue;
+      }
+
+      num_glyphs = face->num_glyphs;
+      slot       = face->glyph;
+
+      Fail = 0;
+      {
+        for ( id = 0; id < num_glyphs; id++ )
+        {
+          int  has_scale;
+          
+          error = FT_Load_Glyph( face, id, FT_LOAD_NO_RECURSE );
+          if (!error && slot->format == ft_glyph_format_composite)
+          {
+            int           n;
+            FT_SubGlyph*  subg = slot->subglyphs;
+
+            printf( "%4d:", id );
+            for ( n = 0; n < slot->num_subglyphs; n++, subg++ )
+            {
+              has_scale = subg->flags & (
+                            FT_SUBGLYPH_FLAG_SCALE |
+                            FT_SUBGLYPH_FLAG_XY_SCALE |
+                            FT_SUBGLYPH_FLAG_2X2 );
+              
+              printf( " [%d%c",
+                      subg->index,
+                      subg->flags & FT_SUBGLYPH_FLAG_USE_MY_METRICS ? '*' : ' ' );
+                      
+              if ( subg->arg1|subg->arg2 )
+              {
+                if ( subg->flags & FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ) 
+                  printf( "(%d,%d)", subg->arg1, subg->arg2 );
+                else
+                  printf( "<%d,%d>", subg->arg1, subg->arg2 );
+              }
+                
+              if (has_scale)
+                printf( "-{%0.3f %0.3f %0.3f %0.3f}",
+                        subg->transform.xx/65536.0,
+                        subg->transform.xy/65536.0,
+                        subg->transform.yx/65536.0,
+                        subg->transform.yy/65536.0 );
+              printf( "]" );
+            }
+            printf( " adv=%ld lsb=%ld\n",
+                    slot->metrics.horiAdvance,
+                    slot->metrics.horiBearingX );
+          }
+        }
+      }
+
+      FT_Done_Face( face );
+    }
+
+    FT_Done_FreeType(library);
+    exit( 0 );      /* for safety reasons */
+
+    return 0;       /* never reached */
+  }
+
+
+/* End */