blob: a7da6014a95d0e90b62931d142afa9b9a5f4ae4b [file] [log] [blame]
/***************************************************************************/
/* */
/* otlayout.c */
/* */
/* OpenType based layout engine(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. */
/***************************************************************************/
/*
* Experimental: No support for gpos now.
*/
#include <ft2build.h>
#include FT_LIST_H
#include FT_OTLAYOUT_H
#include "otltypes.h"
#include "ot-types.h"
#include "ot-ruleset.h"
#include "ot-info.h"
#include "oterrors.h"
FT_LOCAL_DEF ( FT_Error )
otl_get_font ( FT_Face face, FTL_Font * font)
{
*font = ((OT_Face)face)->extra.data;
if ( *font )
return FT_Err_Ok;
else
return OT_Err_Invalid_Face_Handle;
}
FT_LOCAL_DEF ( FTL_EngineType )
otl_get_engine_type ( FT_Face face )
{
return FTL_OPENTYPE_ENGINE;
}
FT_LOCAL ( FT_Error )
otl_new_features_request( FT_Face face, FTL_FeaturesRequest * ftl_request)
{
FT_Error error;
FT_Memory memory = FT_FACE_MEMORY(face);
OTL_Font font;
OTL_FeaturesRequest request;
if (( error = otl_get_font ( face, (FTL_Font*)&font ) ))
goto Exit;
if ( FT_NEW(request) )
goto Exit;
request->ruleset = ot_ruleset_new ( font->info );
if ( !request->ruleset )
{
error = OT_Err_Invalid_Argument; /* ??? */
goto Failure;
}
if (( error = FTL_FeaturesRequest_Init ( face, (FTL_FeaturesRequest)request ) ))
goto Failure;
*ftl_request = (FTL_FeaturesRequest)request;
Exit:
return error;
Failure:
if ( request->ruleset )
ot_ruleset_delete( request->ruleset );
FT_FREE( request );
return error;
}
FT_LOCAL ( FT_Error )
otl_done_features_request( FTL_FeaturesRequest request)
{
FT_Error error;
FTL_Font font;
FT_Face face;
FT_Memory memory;
FT_ASSERT( request );
font = FTL_FEATURES_REQUEST_FONT ( request );
FT_ASSERT( font );
face = FTL_FONT_FACE(font);
if ( !face )
return OT_Err_Invalid_Argument;
memory = FT_FACE_MEMORY( face );
ot_ruleset_delete ( ((OTL_FeaturesRequest)request)->ruleset );
error = FTL_FeaturesRequest_Finalize ( request );
FT_FREE( request ); /* broken */
return error;
}
FT_LOCAL ( FT_Error )
otl_copy_features_request( FTL_FeaturesRequest from,
FTL_FeaturesRequest to)
{
FT_Error error;
ot_ruleset_copy(((OTL_FeaturesRequest)from)->ruleset, ((OTL_FeaturesRequest)to)->ruleset);
error = FTL_FeaturesRequest_Copy( from, to );
return error;
}
FT_LOCAL ( FT_Error )
otl_substitute_glyphs ( FT_Face face,
FTL_FeaturesRequest request,
FTL_GlyphArray in,
FTL_GlyphArray out )
{
FT_Error error = FT_Err_Ok;
if (( error = FTL_Copy_Glyphs_Array ( in, out ) ))
return error;
ot_ruleset_shape ( ((OTL_FeaturesRequest)request)->ruleset, out );
return FT_Err_Ok;
}
FT_EXPORT( FT_Bool )
OTL_FeaturesRequest_Find_Script ( OTL_FeaturesRequest request,
OTTableType table_type,
OTTag script_tag,
FT_UInt *script_index)
{
OTL_Font font = (OTL_Font)FTL_FEATURES_REQUEST_FONT( request );
return ot_info_find_script ( font->info,
table_type,
script_tag,
script_index )
? 1: 0;
}
FT_EXPORT( FT_Bool )
OTL_FeaturesRequest_Find_Language ( OTL_FeaturesRequest request,
OTTableType table_type,
FT_UInt script_index,
OTTag language_tag,
FT_UInt *language_index,
FT_UInt *required_feature_index )
{
OTL_Font font = (OTL_Font)FTL_FEATURES_REQUEST_FONT( request );
return ot_info_find_language ( font->info,
table_type,
script_index,
language_tag,
language_index,
required_feature_index )
? 1: 0;
}
FT_EXPORT ( FT_Bool )
OTL_FeaturesRequest_Find_Feature ( OTL_FeaturesRequest request,
OTTableType table_type,
OTTag feature_tag,
FT_UInt script_index,
FT_UInt language_index,
FT_UInt *feature_index )
{
OTL_Font font = (OTL_Font)FTL_FEATURES_REQUEST_FONT( request );
return ot_info_find_feature ( font->info,
table_type,
feature_tag,
script_index,
language_index,
feature_index )
? 1: 0;
}
FT_EXPORT ( OTL_Tag_List )
OTL_FeaturesRequest_List_Scripts ( OTL_FeaturesRequest request,
OTTableType table_type )
{
FT_Error error;
OTL_Font font = (OTL_Font)FTL_FEATURES_REQUEST_FONT( request );
FT_Face face = FTL_FONT_FACE(font);
FT_Memory memory = FT_FACE_MEMORY(face);
OTL_Tag_List tag_list;
if ( FT_NEW(tag_list) )
return NULL;
tag_list->request = request;
tag_list->tags = ot_info_list_scripts( font->info, table_type );
return tag_list;
}
FT_EXPORT ( OTL_Tag_List )
OTL_FeaturesRequest_List_Languages ( OTL_FeaturesRequest request,
OTTableType table_type,
FT_UInt script_index )
{
FT_Error error;
OTL_Font font = (OTL_Font)FTL_FEATURES_REQUEST_FONT( request );
FT_Face face = FTL_FONT_FACE( font );
FT_Memory memory = FT_FACE_MEMORY( face );
OTL_Tag_List tag_list;
if ( FT_NEW(tag_list) )
return NULL;
tag_list->request = request;
tag_list->tags = ot_info_list_languages( font->info,
table_type,
script_index,
0 );
return tag_list;
}
FT_EXPORT ( OTL_Tag_List )
OTL_FeaturesRequest_List_Features ( OTL_FeaturesRequest request,
OTTableType table_type,
FT_UInt script_index,
FT_UInt language_index )
{
FT_Error error;
OTL_Font font = (OTL_Font)FTL_FEATURES_REQUEST_FONT( request );
FT_Face face = FTL_FONT_FACE(font);
FT_Memory memory = FT_FACE_MEMORY( face );
OTL_Tag_List tag_list;
if ( FT_NEW(tag_list) )
return NULL;
tag_list->request = request;
tag_list->tags = ot_info_list_features( font->info,
table_type,
0,
script_index,
language_index );
return tag_list;
}
FT_EXPORT ( FT_Error )
OTL_Tag_List_Done ( OTL_Tag_List taglist )
{
FTL_FeaturesRequest request = (FTL_FeaturesRequest)taglist->request;
FTL_Font font = FTL_FEATURES_REQUEST_FONT( request );
FT_Face face = FTL_FONT_FACE(font);
FT_Memory memory = FT_FACE_MEMORY( face );
FT_FREE ( taglist );
return FT_Err_Ok;
}
FT_EXPORT ( FT_Error )
OTL_FeaturesRequest_Add_Feature ( OTL_FeaturesRequest request,
OTTableType table_type,
FT_UInt feature_index,
FT_ULong property_bit)
{
ot_ruleset_add_feature( request->ruleset,
table_type,
feature_index,
property_bit );
return FT_Err_Ok;
}
/* END */