ref: 6b0149b826bc78d7de29501f361caa022ff5ea3f
parent: b46a2d8a7448955dae9b1ec5d853a2d3c9be3481
author: David Turner <[email protected]>
date: Tue Mar 28 06:14:24 EST 2000
a new simple program to display composite glyphs in a given font. Used during auto-hinting research
--- /dev/null
+++ b/demos/src/compos.c
@@ -1,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 */