/***************************************************************************/ /* */ /* otdemo.c */ /* */ /* Demo program for FreeType/OpenType font driver implementation (body).*/ /* */ /* Copyright 2003 by */ /* Masatake YAMATO and Redhat K.K. */ /* */ /* This file may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ /***************************************************************************/ /* Development of the code in this file is support of */ /* Information-technology Promotion Agency, Japan. */ /***************************************************************************/ #include #include FT_LAYOUT_H #include FT_OTLAYOUT_H #include #include #include /* KANA specific implementation */ /* Script */ #define OT_SCRIPT_KANA FT_MAKE_TAG('k', 'a', 'n', 'a') /* Language */ #define OT_LANGUAGE_JAPANESE FT_MAKE_TAG('J', 'A', 'N', ' ') /* Feature */ #define OT_FEATURE_VERT FT_MAKE_TAG('v', 'e', 'r', 't') #define OT_FEATURE_VRT2 FT_MAKE_TAG('v', 'r', 't', '2') /* Property bit */ enum { OT_VERT = 1 << 0, OT_VRT2 = 1 << 1 }; /* Property */ enum { OT_VERT_P = (~OT_VERT) & (~OT_VRT2) }; void doit(FT_Face face); int main(int argc, char ** argv) { FT_Library library; FT_Face face; poptContext optCon; int rc; const char * file; static int arg_memprof = 0; struct poptOption optTable [] = { { "memprof", 'm', POPT_ARG_NONE, &arg_memprof, 0, "Enter to infinite loop to run under memprof", ""}, POPT_AUTOHELP POPT_TABLEEND }; FTL_EngineType engine_type; optCon = poptGetContext(argv[0], argc, (const char **)argv, optTable, 0); poptSetOtherOptionHelp(optCon, "[options] otfont\n"); rc = poptReadDefaultConfig (optCon, 0); if (rc < 0) { fprintf(stderr, "Fail to read .popt config file: %s\n", poptStrerror(rc)); exit (1); } while ((rc = poptGetNextOpt(optCon)) > 0) if (rc != -1) { fprintf(stderr, "bad argument %s: %s\n", poptBadOption(optCon, POPT_BADOPTION_NOALIAS), poptStrerror(rc)); exit (1); } if (FT_Init_FreeType (&library)) { fprintf(stderr, "Error in %s\n", "FT_Init_FreeType"); exit (1); } file = poptGetArg(optCon); if (!file) { poptPrintHelp(optCon, stderr, 0); exit(1); } if ( FT_New_Face (library, file, 0, &face) ) { fprintf(stderr, "Error in %s: %s\n", "FT_New_Face", file); exit (1); } if ( !( face->face_flags & FT_FACE_FLAG_GLYPH_SUBSTITUTION) ) { fprintf(stderr, "Abort: No substitution table for the face\n"); exit(1); } if ( FTL_Query_EngineType( face, &engine_type ) || ( engine_type != FTL_OPENTYPE_ENGINE ) ) { fprintf(stderr, "No OT table is existed: %s\n", file); exit ( 1 ); } doit( face ); if ( FT_Done_Face ( face ) ) fprintf(stderr, "Error in %s: %s\n", "FT_Done_Face", file); if ( FT_Done_FreeType (library) ) { fprintf(stderr, "Error in %s\n", "FT_Done_FreeType"); exit(1); } if ( arg_memprof || getenv("_MEMPROF_SOCKET") ) { fprintf(stderr, "Enter infinite loop for memprof\n"); while (1); } return 0; } void doit(FT_Face face) { FTL_FeaturesRequest request; FT_UInt script_index, feature_index; FT_Memory memory = face->stream->memory; FTL_GlyphArray in, out; FT_Int i; if ( FTL_New_FeaturesRequest( face, &request ) ) { fprintf(stderr, "error: %s\n", "FTL_New_FeaturesRequest"); return ; } if ( !OTL_FeaturesRequest_Find_Script ( (OTL_FeaturesRequest)request, OT_TABLE_GSUB, OT_SCRIPT_KANA, &script_index ) ) { fprintf(stderr, "cannot find script: %s\n", "OTL_FeaturesRequest_Find_Script"); return ; } if ( !OTL_FeaturesRequest_Find_Feature( (OTL_FeaturesRequest)request, OT_TABLE_GSUB, OT_FEATURE_VERT, script_index, 0xffff, /* default language system */ &feature_index ) ) { fprintf(stderr, "cannot find feature: %s\n", "OTL_FeaturesRequest_Find_Feature"); return ; } OTL_FeaturesRequest_Add_Feature ( (OTL_FeaturesRequest)request, OT_TABLE_GSUB, feature_index, OT_VERT ); if ( FTL_New_Glyphs_Array ( memory, &in ) || FTL_New_Glyphs_Array ( memory, &out ) ) { fprintf(stderr, "mem error: %s\n", "FTL_New_Glyphs_Array"); return ; } if ( FTL_Set_Glyphs_Array_Length ( in, 14751 ) ) { fprintf(stderr, "mem error: %s\n", "FTL_Set_Glyphs_Array_Length"); return ; } for ( i = 0; i < 14751; i++ ) { in->glyphs[i].gid = i; in->glyphs[i].ot_prop = OT_VERT_P; } FTL_Activate_FeaturesRequest( request ); FTL_Substitute_Glyphs ( face, in, out ); for ( i = 0; i < 14751; i++ ) { if ( out->glyphs[i].gid != i ) fprintf( stdout, "%d => %u\n", i, out->glyphs[i].gid ); } FTL_Done_Glyphs_Array ( out ); FTL_Done_Glyphs_Array ( in ); FTL_Done_FeaturesRequest ( request ); } /* END */