00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <ft2build.h>
00020 #include FT_INTERNAL_DEBUG_H
00021 #include FT_CACHE_H
00022 #include "ftcglyph.h"
00023 #include "ftcimage.h"
00024 #include "ftcsbits.h"
00025
00026 #include "ftccback.h"
00027 #include "ftcerror.h"
00028
00029 #define FT_COMPONENT trace_cache
00030
00031
00032 #ifdef FT_CONFIG_OPTION_OLD_INTERNALS
00033
00034
00035
00036
00037
00038 typedef struct FTC_OldFontRec_
00039 {
00040 FTC_FaceID face_id;
00041 FT_UShort pix_width;
00042 FT_UShort pix_height;
00043
00044 } FTC_OldFontRec, *FTC_OldFont;
00045
00046
00047 typedef struct FTC_OldImageDescRec_
00048 {
00049 FTC_OldFontRec font;
00050 FT_UInt32 flags;
00051
00052 } FTC_OldImageDescRec, *FTC_OldImageDesc;
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 #endif
00068
00069
00070
00071
00072
00073
00074 typedef struct FTC_BasicAttrRec_
00075 {
00076 FTC_ScalerRec scaler;
00077 FT_UInt load_flags;
00078
00079 } FTC_BasicAttrRec, *FTC_BasicAttrs;
00080
00081 #define FTC_BASIC_ATTR_COMPARE( a, b ) \
00082 FT_BOOL( FTC_SCALER_COMPARE( &(a)->scaler, &(b)->scaler ) && \
00083 (a)->load_flags == (b)->load_flags )
00084
00085 #define FTC_BASIC_ATTR_HASH( a ) \
00086 ( FTC_SCALER_HASH( &(a)->scaler ) + 31*(a)->load_flags )
00087
00088
00089 typedef struct FTC_BasicQueryRec_
00090 {
00091 FTC_GQueryRec gquery;
00092 FTC_BasicAttrRec attrs;
00093
00094 } FTC_BasicQueryRec, *FTC_BasicQuery;
00095
00096
00097 typedef struct FTC_BasicFamilyRec_
00098 {
00099 FTC_FamilyRec family;
00100 FTC_BasicAttrRec attrs;
00101
00102 } FTC_BasicFamilyRec, *FTC_BasicFamily;
00103
00104
00105 FT_CALLBACK_DEF( FT_Bool )
00106 ftc_basic_family_compare( FTC_MruNode ftcfamily,
00107 FT_Pointer ftcquery )
00108 {
00109 FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily;
00110 FTC_BasicQuery query = (FTC_BasicQuery)ftcquery;
00111
00112
00113 return FTC_BASIC_ATTR_COMPARE( &family->attrs, &query->attrs );
00114 }
00115
00116
00117 FT_CALLBACK_DEF( FT_Error )
00118 ftc_basic_family_init( FTC_MruNode ftcfamily,
00119 FT_Pointer ftcquery,
00120 FT_Pointer ftccache )
00121 {
00122 FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily;
00123 FTC_BasicQuery query = (FTC_BasicQuery)ftcquery;
00124 FTC_Cache cache = (FTC_Cache)ftccache;
00125
00126
00127 FTC_Family_Init( FTC_FAMILY( family ), cache );
00128 family->attrs = query->attrs;
00129 return 0;
00130 }
00131
00132
00133 FT_CALLBACK_DEF( FT_UInt )
00134 ftc_basic_family_get_count( FTC_Family ftcfamily,
00135 FTC_Manager manager )
00136 {
00137 FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily;
00138 FT_Error error;
00139 FT_Face face;
00140 FT_UInt result = 0;
00141
00142
00143 error = FTC_Manager_LookupFace( manager, family->attrs.scaler.face_id,
00144 &face );
00145
00146 if ( error || !face )
00147 return result;
00148
00149 if ( (FT_ULong)face->num_glyphs > FT_UINT_MAX || 0 > face->num_glyphs )
00150 {
00151 FT_TRACE1(( "ftc_basic_family_get_count: too large number of glyphs " ));
00152 FT_TRACE1(( "in this face, truncated\n", face->num_glyphs ));
00153 }
00154
00155 if ( !error )
00156 result = (FT_UInt)face->num_glyphs;
00157
00158 return result;
00159 }
00160
00161
00162 FT_CALLBACK_DEF( FT_Error )
00163 ftc_basic_family_load_bitmap( FTC_Family ftcfamily,
00164 FT_UInt gindex,
00165 FTC_Manager manager,
00166 FT_Face *aface )
00167 {
00168 FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily;
00169 FT_Error error;
00170 FT_Size size;
00171
00172
00173 error = FTC_Manager_LookupSize( manager, &family->attrs.scaler, &size );
00174 if ( !error )
00175 {
00176 FT_Face face = size->face;
00177
00178
00179 error = FT_Load_Glyph( face, gindex,
00180 family->attrs.load_flags | FT_LOAD_RENDER );
00181 if ( !error )
00182 *aface = face;
00183 }
00184
00185 return error;
00186 }
00187
00188
00189 FT_CALLBACK_DEF( FT_Error )
00190 ftc_basic_family_load_glyph( FTC_Family ftcfamily,
00191 FT_UInt gindex,
00192 FTC_Cache cache,
00193 FT_Glyph *aglyph )
00194 {
00195 FTC_BasicFamily family = (FTC_BasicFamily)ftcfamily;
00196 FT_Error error;
00197 FTC_Scaler scaler = &family->attrs.scaler;
00198 FT_Face face;
00199 FT_Size size;
00200
00201
00202
00203 error = FTC_Manager_LookupSize( cache->manager,
00204 scaler,
00205 &size );
00206 if ( !error )
00207 {
00208 face = size->face;
00209
00210 error = FT_Load_Glyph( face, gindex, family->attrs.load_flags );
00211 if ( !error )
00212 {
00213 if ( face->glyph->format == FT_GLYPH_FORMAT_BITMAP ||
00214 face->glyph->format == FT_GLYPH_FORMAT_OUTLINE )
00215 {
00216
00217 FT_Glyph glyph;
00218
00219
00220 error = FT_Get_Glyph( face->glyph, &glyph );
00221 if ( !error )
00222 {
00223 *aglyph = glyph;
00224 goto Exit;
00225 }
00226 }
00227 else
00228 error = FTC_Err_Invalid_Argument;
00229 }
00230 }
00231
00232 Exit:
00233 return error;
00234 }
00235
00236
00237 FT_CALLBACK_DEF( FT_Bool )
00238 ftc_basic_gnode_compare_faceid( FTC_Node ftcgnode,
00239 FT_Pointer ftcface_id,
00240 FTC_Cache cache )
00241 {
00242 FTC_GNode gnode = (FTC_GNode)ftcgnode;
00243 FTC_FaceID face_id = (FTC_FaceID)ftcface_id;
00244 FTC_BasicFamily family = (FTC_BasicFamily)gnode->family;
00245 FT_Bool result;
00246
00247
00248 result = FT_BOOL( family->attrs.scaler.face_id == face_id );
00249 if ( result )
00250 {
00251
00252
00253
00254 FTC_GNode_UnselectFamily( gnode, cache );
00255 }
00256 return result;
00257 }
00258
00259
00260
00261
00262
00263
00264
00265
00266 FT_CALLBACK_TABLE_DEF
00267 const FTC_IFamilyClassRec ftc_basic_image_family_class =
00268 {
00269 {
00270 sizeof ( FTC_BasicFamilyRec ),
00271 ftc_basic_family_compare,
00272 ftc_basic_family_init,
00273 0,
00274 0
00275 },
00276 ftc_basic_family_load_glyph
00277 };
00278
00279
00280 FT_CALLBACK_TABLE_DEF
00281 const FTC_GCacheClassRec ftc_basic_image_cache_class =
00282 {
00283 {
00284 ftc_inode_new,
00285 ftc_inode_weight,
00286 ftc_gnode_compare,
00287 ftc_basic_gnode_compare_faceid,
00288 ftc_inode_free,
00289
00290 sizeof ( FTC_GCacheRec ),
00291 ftc_gcache_init,
00292 ftc_gcache_done
00293 },
00294 (FTC_MruListClass)&ftc_basic_image_family_class
00295 };
00296
00297
00298
00299
00300 FT_EXPORT_DEF( FT_Error )
00301 FTC_ImageCache_New( FTC_Manager manager,
00302 FTC_ImageCache *acache )
00303 {
00304 return FTC_GCache_New( manager, &ftc_basic_image_cache_class,
00305 (FTC_GCache*)acache );
00306 }
00307
00308
00309
00310
00311 FT_EXPORT_DEF( FT_Error )
00312 FTC_ImageCache_Lookup( FTC_ImageCache cache,
00313 FTC_ImageType type,
00314 FT_UInt gindex,
00315 FT_Glyph *aglyph,
00316 FTC_Node *anode )
00317 {
00318 FTC_BasicQueryRec query;
00319 FTC_Node node = 0;
00320 FT_Error error;
00321 FT_UInt32 hash;
00322
00323
00324
00325 if ( !aglyph )
00326 {
00327 error = FTC_Err_Invalid_Argument;
00328 goto Exit;
00329 }
00330
00331 *aglyph = NULL;
00332 if ( anode )
00333 *anode = NULL;
00334
00335 #if defined( FT_CONFIG_OPTION_OLD_INTERNALS ) && ( FT_INT_MAX > 0xFFFFU )
00336
00337
00338
00339
00340
00341 if ( (FT_ULong)type->width >= 0x10000L )
00342 {
00343 FTC_OldImageDesc desc = (FTC_OldImageDesc)type;
00344
00345
00346 query.attrs.scaler.face_id = desc->font.face_id;
00347 query.attrs.scaler.width = desc->font.pix_width;
00348 query.attrs.scaler.height = desc->font.pix_height;
00349 query.attrs.load_flags = desc->flags;
00350 }
00351 else
00352
00353 #endif
00354
00355 {
00356 if ( (FT_ULong)(type->flags - FT_INT_MIN) > FT_UINT_MAX )
00357 {
00358 FT_TRACE1(( "FTC_ImageCache_Lookup: higher bits in load_flags" ));
00359 FT_TRACE1(( "0x%x are dropped\n", (type->flags & ~((FT_ULong)FT_UINT_MAX)) ));
00360 }
00361
00362 query.attrs.scaler.face_id = type->face_id;
00363 query.attrs.scaler.width = type->width;
00364 query.attrs.scaler.height = type->height;
00365 query.attrs.load_flags = (FT_UInt)type->flags;
00366 }
00367
00368 query.attrs.scaler.pixel = 1;
00369 query.attrs.scaler.x_res = 0;
00370 query.attrs.scaler.y_res = 0;
00371
00372 hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex;
00373
00374 #if 1
00375 FTC_GCACHE_LOOKUP_CMP( cache,
00376 ftc_basic_family_compare,
00377 FTC_GNode_Compare,
00378 hash, gindex,
00379 &query,
00380 node,
00381 error );
00382 #else
00383 error = FTC_GCache_Lookup( FTC_GCACHE( cache ),
00384 hash, gindex,
00385 FTC_GQUERY( &query ),
00386 &node );
00387 #endif
00388 if ( !error )
00389 {
00390 *aglyph = FTC_INODE( node )->glyph;
00391
00392 if ( anode )
00393 {
00394 *anode = node;
00395 node->ref_count++;
00396 }
00397 }
00398
00399 Exit:
00400 return error;
00401 }
00402
00403
00404
00405
00406 FT_EXPORT_DEF( FT_Error )
00407 FTC_ImageCache_LookupScaler( FTC_ImageCache cache,
00408 FTC_Scaler scaler,
00409 FT_ULong load_flags,
00410 FT_UInt gindex,
00411 FT_Glyph *aglyph,
00412 FTC_Node *anode )
00413 {
00414 FTC_BasicQueryRec query;
00415 FTC_Node node = 0;
00416 FT_Error error;
00417 FT_UInt32 hash;
00418
00419
00420
00421 if ( !aglyph || !scaler )
00422 {
00423 error = FTC_Err_Invalid_Argument;
00424 goto Exit;
00425 }
00426
00427 *aglyph = NULL;
00428 if ( anode )
00429 *anode = NULL;
00430
00431
00432 if ( load_flags > FT_UINT_MAX )
00433 {
00434 FT_TRACE1(( "FTC_ImageCache_LookupScaler: higher bits in load_flags" ));
00435 FT_TRACE1(( "0x%x are dropped\n", (load_flags & ~((FT_ULong)FT_UINT_MAX)) ));
00436 }
00437
00438 query.attrs.scaler = scaler[0];
00439 query.attrs.load_flags = (FT_UInt)load_flags;
00440
00441 hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex;
00442
00443 FTC_GCACHE_LOOKUP_CMP( cache,
00444 ftc_basic_family_compare,
00445 FTC_GNode_Compare,
00446 hash, gindex,
00447 &query,
00448 node,
00449 error );
00450 if ( !error )
00451 {
00452 *aglyph = FTC_INODE( node )->glyph;
00453
00454 if ( anode )
00455 {
00456 *anode = node;
00457 node->ref_count++;
00458 }
00459 }
00460
00461 Exit:
00462 return error;
00463 }
00464
00465
00466
00467 #ifdef FT_CONFIG_OPTION_OLD_INTERNALS
00468
00469
00470 typedef struct FTC_OldImage_Desc_
00471 {
00472 FTC_FontRec font;
00473 FT_UInt image_type;
00474
00475 } FTC_OldImage_Desc;
00476
00477
00478 #define FTC_OLD_IMAGE_FORMAT( x ) ( (x) & 7 )
00479
00480
00481 #define ftc_old_image_format_bitmap 0x0000
00482 #define ftc_old_image_format_outline 0x0001
00483
00484 #define ftc_old_image_format_mask 0x000F
00485
00486 #define ftc_old_image_flag_monochrome 0x0010
00487 #define ftc_old_image_flag_unhinted 0x0020
00488 #define ftc_old_image_flag_autohinted 0x0040
00489 #define ftc_old_image_flag_unscaled 0x0080
00490 #define ftc_old_image_flag_no_sbits 0x0100
00491
00492
00493 #define ftc_old_image_mono ftc_old_image_format_bitmap | \
00494 ftc_old_image_flag_monochrome
00495
00496
00497 #define ftc_old_image_grays ftc_old_image_format_bitmap
00498
00499
00500 #define ftc_old_image_outline ftc_old_image_format_outline
00501
00502
00503 static void
00504 ftc_image_type_from_old_desc( FTC_ImageType typ,
00505 FTC_OldImage_Desc* desc )
00506 {
00507 typ->face_id = desc->font.face_id;
00508 typ->width = desc->font.pix_width;
00509 typ->height = desc->font.pix_height;
00510
00511
00512 {
00513 FT_UInt load_flags = FT_LOAD_DEFAULT;
00514 FT_UInt type = desc->image_type;
00515
00516
00517
00518
00519
00520 if ( FTC_OLD_IMAGE_FORMAT( type ) == ftc_old_image_format_bitmap )
00521 {
00522 if ( type & ftc_old_image_flag_monochrome )
00523 load_flags |= FT_LOAD_MONOCHROME;
00524
00525
00526 if ( type & ftc_old_image_flag_no_sbits )
00527 load_flags |= FT_LOAD_NO_BITMAP;
00528 }
00529 else
00530 {
00531
00532 load_flags |= FT_LOAD_NO_BITMAP;
00533
00534 if ( type & ftc_old_image_flag_unscaled )
00535 load_flags |= FT_LOAD_NO_SCALE;
00536 }
00537
00538
00539 load_flags |= FT_LOAD_RENDER;
00540
00541 if ( type & ftc_old_image_flag_unhinted )
00542 load_flags |= FT_LOAD_NO_HINTING;
00543
00544 if ( type & ftc_old_image_flag_autohinted )
00545 load_flags |= FT_LOAD_FORCE_AUTOHINT;
00546
00547 typ->flags = load_flags;
00548 }
00549 }
00550
00551
00552 FT_EXPORT( FT_Error )
00553 FTC_Image_Cache_New( FTC_Manager manager,
00554 FTC_ImageCache *acache );
00555
00556 FT_EXPORT( FT_Error )
00557 FTC_Image_Cache_Lookup( FTC_ImageCache icache,
00558 FTC_OldImage_Desc* desc,
00559 FT_UInt gindex,
00560 FT_Glyph *aglyph );
00561
00562
00563 FT_EXPORT_DEF( FT_Error )
00564 FTC_Image_Cache_New( FTC_Manager manager,
00565 FTC_ImageCache *acache )
00566 {
00567 return FTC_ImageCache_New( manager, (FTC_ImageCache*)acache );
00568 }
00569
00570
00571
00572 FT_EXPORT_DEF( FT_Error )
00573 FTC_Image_Cache_Lookup( FTC_ImageCache icache,
00574 FTC_OldImage_Desc* desc,
00575 FT_UInt gindex,
00576 FT_Glyph *aglyph )
00577 {
00578 FTC_ImageTypeRec type0;
00579
00580
00581 if ( !desc )
00582 return FTC_Err_Invalid_Argument;
00583
00584 ftc_image_type_from_old_desc( &type0, desc );
00585
00586 return FTC_ImageCache_Lookup( (FTC_ImageCache)icache,
00587 &type0,
00588 gindex,
00589 aglyph,
00590 NULL );
00591 }
00592
00593 #endif
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603 FT_CALLBACK_TABLE_DEF
00604 const FTC_SFamilyClassRec ftc_basic_sbit_family_class =
00605 {
00606 {
00607 sizeof( FTC_BasicFamilyRec ),
00608 ftc_basic_family_compare,
00609 ftc_basic_family_init,
00610 0,
00611 0
00612 },
00613 ftc_basic_family_get_count,
00614 ftc_basic_family_load_bitmap
00615 };
00616
00617
00618 FT_CALLBACK_TABLE_DEF
00619 const FTC_GCacheClassRec ftc_basic_sbit_cache_class =
00620 {
00621 {
00622 ftc_snode_new,
00623 ftc_snode_weight,
00624 ftc_snode_compare,
00625 ftc_basic_gnode_compare_faceid,
00626 ftc_snode_free,
00627
00628 sizeof ( FTC_GCacheRec ),
00629 ftc_gcache_init,
00630 ftc_gcache_done
00631 },
00632 (FTC_MruListClass)&ftc_basic_sbit_family_class
00633 };
00634
00635
00636
00637
00638 FT_EXPORT_DEF( FT_Error )
00639 FTC_SBitCache_New( FTC_Manager manager,
00640 FTC_SBitCache *acache )
00641 {
00642 return FTC_GCache_New( manager, &ftc_basic_sbit_cache_class,
00643 (FTC_GCache*)acache );
00644 }
00645
00646
00647
00648
00649 FT_EXPORT_DEF( FT_Error )
00650 FTC_SBitCache_Lookup( FTC_SBitCache cache,
00651 FTC_ImageType type,
00652 FT_UInt gindex,
00653 FTC_SBit *ansbit,
00654 FTC_Node *anode )
00655 {
00656 FT_Error error;
00657 FTC_BasicQueryRec query;
00658 FTC_Node node = 0;
00659 FT_UInt32 hash;
00660
00661
00662 if ( anode )
00663 *anode = NULL;
00664
00665
00666 if ( !ansbit )
00667 return FTC_Err_Invalid_Argument;
00668
00669 *ansbit = NULL;
00670
00671 #if defined( FT_CONFIG_OPTION_OLD_INTERNALS ) && ( FT_INT_MAX > 0xFFFFU )
00672
00673
00674
00675
00676 if ( (FT_ULong)type->width >= 0x10000L )
00677 {
00678 FTC_OldImageDesc desc = (FTC_OldImageDesc)type;
00679
00680
00681 query.attrs.scaler.face_id = desc->font.face_id;
00682 query.attrs.scaler.width = desc->font.pix_width;
00683 query.attrs.scaler.height = desc->font.pix_height;
00684 query.attrs.load_flags = desc->flags;
00685 }
00686 else
00687
00688 #endif
00689
00690 {
00691 if ( (FT_ULong)(type->flags - FT_INT_MIN) > FT_UINT_MAX )
00692 {
00693 FT_TRACE1(( "FTC_ImageCache_Lookup: higher bits in load_flags" ));
00694 FT_TRACE1(( "0x%x are dropped\n", (type->flags & ~((FT_ULong)FT_UINT_MAX)) ));
00695 }
00696
00697 query.attrs.scaler.face_id = type->face_id;
00698 query.attrs.scaler.width = type->width;
00699 query.attrs.scaler.height = type->height;
00700 query.attrs.load_flags = (FT_UInt)type->flags;
00701 }
00702
00703 query.attrs.scaler.pixel = 1;
00704 query.attrs.scaler.x_res = 0;
00705 query.attrs.scaler.y_res = 0;
00706
00707
00708 hash = FTC_BASIC_ATTR_HASH( &query.attrs ) +
00709 gindex / FTC_SBIT_ITEMS_PER_NODE;
00710
00711 #if 1
00712 FTC_GCACHE_LOOKUP_CMP( cache,
00713 ftc_basic_family_compare,
00714 FTC_SNode_Compare,
00715 hash, gindex,
00716 &query,
00717 node,
00718 error );
00719 #else
00720 error = FTC_GCache_Lookup( FTC_GCACHE( cache ),
00721 hash,
00722 gindex,
00723 FTC_GQUERY( &query ),
00724 &node );
00725 #endif
00726 if ( error )
00727 goto Exit;
00728
00729 *ansbit = FTC_SNODE( node )->sbits +
00730 ( gindex - FTC_GNODE( node )->gindex );
00731
00732 if ( anode )
00733 {
00734 *anode = node;
00735 node->ref_count++;
00736 }
00737
00738 Exit:
00739 return error;
00740 }
00741
00742
00743
00744
00745 FT_EXPORT_DEF( FT_Error )
00746 FTC_SBitCache_LookupScaler( FTC_SBitCache cache,
00747 FTC_Scaler scaler,
00748 FT_ULong load_flags,
00749 FT_UInt gindex,
00750 FTC_SBit *ansbit,
00751 FTC_Node *anode )
00752 {
00753 FT_Error error;
00754 FTC_BasicQueryRec query;
00755 FTC_Node node = 0;
00756 FT_UInt32 hash;
00757
00758
00759 if ( anode )
00760 *anode = NULL;
00761
00762
00763 if ( !ansbit || !scaler )
00764 return FTC_Err_Invalid_Argument;
00765
00766 *ansbit = NULL;
00767
00768
00769 if ( load_flags > FT_UINT_MAX )
00770 {
00771 FT_TRACE1(( "FTC_ImageCache_LookupScaler: higher bits in load_flags" ));
00772 FT_TRACE1(( "0x%x are dropped\n", (load_flags & ~((FT_ULong)FT_UINT_MAX)) ));
00773 }
00774
00775 query.attrs.scaler = scaler[0];
00776 query.attrs.load_flags = (FT_UInt)load_flags;
00777
00778
00779 hash = FTC_BASIC_ATTR_HASH( &query.attrs ) +
00780 gindex / FTC_SBIT_ITEMS_PER_NODE;
00781
00782 FTC_GCACHE_LOOKUP_CMP( cache,
00783 ftc_basic_family_compare,
00784 FTC_SNode_Compare,
00785 hash, gindex,
00786 &query,
00787 node,
00788 error );
00789 if ( error )
00790 goto Exit;
00791
00792 *ansbit = FTC_SNODE( node )->sbits +
00793 ( gindex - FTC_GNODE( node )->gindex );
00794
00795 if ( anode )
00796 {
00797 *anode = node;
00798 node->ref_count++;
00799 }
00800
00801 Exit:
00802 return error;
00803 }
00804
00805
00806 #ifdef FT_CONFIG_OPTION_OLD_INTERNALS
00807
00808 FT_EXPORT( FT_Error )
00809 FTC_SBit_Cache_New( FTC_Manager manager,
00810 FTC_SBitCache *acache );
00811
00812 FT_EXPORT( FT_Error )
00813 FTC_SBit_Cache_Lookup( FTC_SBitCache cache,
00814 FTC_OldImage_Desc* desc,
00815 FT_UInt gindex,
00816 FTC_SBit *ansbit );
00817
00818
00819 FT_EXPORT_DEF( FT_Error )
00820 FTC_SBit_Cache_New( FTC_Manager manager,
00821 FTC_SBitCache *acache )
00822 {
00823 return FTC_SBitCache_New( manager, (FTC_SBitCache*)acache );
00824 }
00825
00826
00827 FT_EXPORT_DEF( FT_Error )
00828 FTC_SBit_Cache_Lookup( FTC_SBitCache cache,
00829 FTC_OldImage_Desc* desc,
00830 FT_UInt gindex,
00831 FTC_SBit *ansbit )
00832 {
00833 FTC_ImageTypeRec type0;
00834
00835
00836 if ( !desc )
00837 return FT_Err_Invalid_Argument;
00838
00839 ftc_image_type_from_old_desc( &type0, desc );
00840
00841 return FTC_SBitCache_Lookup( (FTC_SBitCache)cache,
00842 &type0,
00843 gindex,
00844 ansbit,
00845 NULL );
00846 }
00847
00848 #endif
00849
00850
00851