blob: a3f8c3a1f1c82a207985fb60158d593884f3b0d1 [file] [log] [blame]
/***************************************************************************/
/* */
/* fi.c */
/* */
/* 2 characters ligature test program for AAT/TrueTypeGX font driver. */
/* */
/* Copyright 2004 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. */
/***************************************************************************/
/* "fi" is the typical alphabet ligature. *
* "fl" is another good candidate to be tried. */
const char * target = "fi";
#include <ft2build.h>
#include FT_LAYOUT_H
#include FT_GXLAYOUT_H
#include FT_INTERNAL_OBJECTS_H /* for FT_FACE_MEMORY */
#include <stdio.h>
FT_Error try_lig(FT_Face face, char a, char b);
int
main(int argc, char ** argv)
{
FT_Error error;
int result = 0;
FT_Library library;
FT_Face face;
if ( argc != 2 )
{
fprintf(stderr, "Usage: %s fontfile\n", argv[0]);
return 1;
}
error = FT_Init_FreeType ( &library );
if ( error )
{
fprintf(stderr, "Abort: Fail to initialize FT2\n");
result = 1;
goto Fail;
}
error = FT_New_Face (library, argv[1], 0, &face);
if ( error )
{
fprintf(stderr, "Abort: Fail to open the file\n");
result = 1;
goto Fail;
}
if ( !( face->face_flags & FT_FACE_FLAG_GLYPH_SUBSTITUTION) )
{
fprintf(stderr, "Abort: No substitution table for the face\n");
result = 1;
goto Fail;
}
fprintf(stdout, "-------------------\n");
fprintf(stdout,
"File: %s\nName: %s\n",
argv[1],
((FT_Face)face)->family_name);
error = try_lig( face, target[0], target[1] );
if ( error )
{
fprintf(stderr, "Abort: Fail to substitute\n");
result = 1;
}
FT_Done_Face ( face );
Fail:
FT_Done_FreeType (library);
return result;
}
FT_Error
try_lig( FT_Face face, char c1, char c2 )
{
FT_Error error = FT_Err_Ok;
FTL_EngineType engine_type;
FTL_GlyphArray in, out;
FTL_FeaturesRequest request;
/* Get the engine type */
if (( error = FTL_Query_EngineType( face, &engine_type ) ))
goto Fail;
/* Ignore if the engine type is not GX. */
if ( engine_type != FTL_TRUETYPEGX_ENGINE )
{
fprintf(stderr, "Abort: Not GX font.\n");
goto Fail;
}
/* Allocate input and output glyphs arrays.
The lenght for input has already been known: 2 */
FTL_New_Glyphs_Array ( FT_FACE_MEMORY(face), &in );
FTL_New_Glyphs_Array ( FT_FACE_MEMORY(face), &out );
FTL_Set_Glyphs_Array_Length ( in, 2 );
/* Get glyph id for c1 and c2 */
in->glyphs[0].gid = FT_Get_Char_Index( face, c1 );
in->glyphs[1].gid = FT_Get_Char_Index( face, c2 );
fprintf(stdout, "[IN]%c: %u, %c: %u\n",
c1, in->glyphs[0].gid,
c2, in->glyphs[1].gid);
/* Create a features-request. */
FTL_New_FeaturesRequest ( face, &request );
/* -------------------------------------
* YOU CAN SET SOME LAYOUT SETTINGS HERE
* -------------------------------------
* In this program, just use default.
* -------------------------------------
*/
/* Activeate the features request */
FTL_Activate_FeaturesRequest( request );
/* Do substitute the glyphs */
FTL_Substitute_Glyphs( face, in, out );
/* Free the features-request */
FTL_Done_FeaturesRequest ( request );
fprintf(stdout,
"[OUT]%c: %u, %c: %u%s\n",
c1, out->glyphs[0].gid,
c2, out->glyphs[1].gid,
(out->glyphs[1].gid == 0xFFFF)? "<empty>": "");
/* Free glyphs arrays */
FTL_Done_Glyphs_Array ( in );
FTL_Done_Glyphs_Array ( out );
Fail:
return error;
}
/* END */