[cache] Fix error handling.
Manipulate the cache after a face is requested or a size is looked up successfully. Fixes #1270. * src/cache/ftcmanag.c (ftc_size_node_init, ftc_size_node_reset, ftc_face_node_init): Check for errors before accepting a change. * src/cache/ftcmru.c (FTC_MruList_New): Do nothing if reset fails.
This commit is contained in:
parent
b3a6a20a80
commit
d091bca546
|
@ -118,14 +118,21 @@
|
||||||
FT_Pointer ftcscaler,
|
FT_Pointer ftcscaler,
|
||||||
FT_Pointer ftcmanager )
|
FT_Pointer ftcmanager )
|
||||||
{
|
{
|
||||||
|
FT_Error error;
|
||||||
|
FT_Size size;
|
||||||
FTC_SizeNode node = (FTC_SizeNode)ftcnode;
|
FTC_SizeNode node = (FTC_SizeNode)ftcnode;
|
||||||
FTC_Scaler scaler = (FTC_Scaler)ftcscaler;
|
FTC_Scaler scaler = (FTC_Scaler)ftcscaler;
|
||||||
FTC_Manager manager = (FTC_Manager)ftcmanager;
|
FTC_Manager manager = (FTC_Manager)ftcmanager;
|
||||||
|
|
||||||
|
|
||||||
node->scaler = scaler[0];
|
error = ftc_scaler_lookup_size( manager, scaler, &size );
|
||||||
|
if ( !error )
|
||||||
|
{
|
||||||
|
node->size = size;
|
||||||
|
node->scaler = scaler[0];
|
||||||
|
}
|
||||||
|
|
||||||
return ftc_scaler_lookup_size( manager, scaler, &node->size );
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -134,16 +141,23 @@
|
||||||
FT_Pointer ftcscaler,
|
FT_Pointer ftcscaler,
|
||||||
FT_Pointer ftcmanager )
|
FT_Pointer ftcmanager )
|
||||||
{
|
{
|
||||||
|
FT_Error error;
|
||||||
|
FT_Size size;
|
||||||
FTC_SizeNode node = (FTC_SizeNode)ftcnode;
|
FTC_SizeNode node = (FTC_SizeNode)ftcnode;
|
||||||
FTC_Scaler scaler = (FTC_Scaler)ftcscaler;
|
FTC_Scaler scaler = (FTC_Scaler)ftcscaler;
|
||||||
FTC_Manager manager = (FTC_Manager)ftcmanager;
|
FTC_Manager manager = (FTC_Manager)ftcmanager;
|
||||||
|
|
||||||
|
|
||||||
FT_Done_Size( node->size );
|
error = ftc_scaler_lookup_size( manager, scaler, &size );
|
||||||
|
if ( !error )
|
||||||
|
{
|
||||||
|
FT_Done_Size( node->size );
|
||||||
|
|
||||||
node->scaler = scaler[0];
|
node->size = size;
|
||||||
|
node->scaler = scaler[0];
|
||||||
|
}
|
||||||
|
|
||||||
return ftc_scaler_lookup_size( manager, scaler, &node->size );
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -231,23 +245,25 @@
|
||||||
FT_Pointer ftcface_id,
|
FT_Pointer ftcface_id,
|
||||||
FT_Pointer ftcmanager )
|
FT_Pointer ftcmanager )
|
||||||
{
|
{
|
||||||
|
FT_Error error;
|
||||||
|
FT_Face face;
|
||||||
FTC_FaceNode node = (FTC_FaceNode)ftcnode;
|
FTC_FaceNode node = (FTC_FaceNode)ftcnode;
|
||||||
FTC_FaceID face_id = (FTC_FaceID)ftcface_id;
|
FTC_FaceID face_id = (FTC_FaceID)ftcface_id;
|
||||||
FTC_Manager manager = (FTC_Manager)ftcmanager;
|
FTC_Manager manager = (FTC_Manager)ftcmanager;
|
||||||
FT_Error error;
|
|
||||||
|
|
||||||
|
|
||||||
node->face_id = face_id;
|
|
||||||
|
|
||||||
error = manager->request_face( face_id,
|
error = manager->request_face( face_id,
|
||||||
manager->library,
|
manager->library,
|
||||||
manager->request_data,
|
manager->request_data,
|
||||||
&node->face );
|
&face );
|
||||||
if ( !error )
|
if ( !error )
|
||||||
{
|
{
|
||||||
/* destroy initial size object; it will be re-created later */
|
/* destroy initial size object; it will be re-created later */
|
||||||
if ( node->face->size )
|
if ( face->size )
|
||||||
FT_Done_Size( node->face->size );
|
FT_Done_Size( face->size );
|
||||||
|
|
||||||
|
node->face = face;
|
||||||
|
node->face_id = face_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
|
|
|
@ -249,11 +249,13 @@
|
||||||
|
|
||||||
if ( list->clazz.node_reset )
|
if ( list->clazz.node_reset )
|
||||||
{
|
{
|
||||||
FTC_MruNode_Up( &list->nodes, node );
|
|
||||||
|
|
||||||
error = list->clazz.node_reset( node, key, list->data );
|
error = list->clazz.node_reset( node, key, list->data );
|
||||||
if ( !error )
|
if ( !error )
|
||||||
goto Exit;
|
FTC_MruNode_Up( &list->nodes, node );
|
||||||
|
else
|
||||||
|
node = NULL;
|
||||||
|
|
||||||
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
FTC_MruNode_Remove( &list->nodes, node );
|
FTC_MruNode_Remove( &list->nodes, node );
|
||||||
|
|
Loading…
Reference in New Issue