| /***************************************************************************/ |
| /* */ |
| /* 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 <ft2build.h> |
| #include FT_LAYOUT_H |
| #include FT_OTLAYOUT_H |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <popt.h> |
| |
| /* 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 */ |