212 lines
5.9 KiB
C
212 lines
5.9 KiB
C
/***************************************************************************/
|
|
/* */
|
|
/* 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 */
|