📄 bdfdrivr.c
字号:
if ( prop ) bsize->width = (FT_Short)( ( prop->value.int32 + 5 ) / 10 ); else bsize->width = (FT_Short)( bsize->height * 2/3 ); prop = bdf_get_font_property( font, "POINT_SIZE" ); if ( prop ) /* convert from 722.7 decipoints to 72 points per inch */ bsize->size = (FT_Pos)( ( prop->value.int32 * 64 * 7200 + 36135L ) / 72270L ); prop = bdf_get_font_property( font, "PIXEL_SIZE" ); if ( prop ) bsize->y_ppem = (FT_Short)prop->value.int32 << 6; prop = bdf_get_font_property( font, "RESOLUTION_X" ); if ( prop ) resolution_x = (FT_Short)prop->value.int32; prop = bdf_get_font_property( font, "RESOLUTION_Y" ); if ( prop ) resolution_y = (FT_Short)prop->value.int32; if ( bsize->y_ppem == 0 ) { bsize->y_ppem = bsize->size; if ( resolution_y ) bsize->y_ppem = bsize->y_ppem * resolution_y / 72; } if ( resolution_x && resolution_y ) bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y; else bsize->x_ppem = bsize->y_ppem; } /* encoding table */ { bdf_glyph_t* cur = font->glyphs; unsigned long n; if ( FT_NEW_ARRAY( face->en_table, font->glyphs_size ) ) goto Exit; face->default_glyph = 0; for ( n = 0; n < font->glyphs_size; n++ ) { (face->en_table[n]).enc = cur[n].encoding; FT_TRACE4(( "idx %d, val 0x%lX\n", n, cur[n].encoding )); (face->en_table[n]).glyph = (FT_Short)n; if ( cur[n].encoding == font->default_char ) face->default_glyph = n; } } /* charmaps */ { bdf_property_t *charset_registry = 0, *charset_encoding = 0; FT_Bool unicode_charmap = 0; charset_registry = bdf_get_font_property( font, "CHARSET_REGISTRY" ); charset_encoding = bdf_get_font_property( font, "CHARSET_ENCODING" ); if ( charset_registry && charset_encoding ) { if ( charset_registry->format == BDF_ATOM && charset_encoding->format == BDF_ATOM && charset_registry->value.atom && charset_encoding->value.atom ) { const char* s; if ( FT_NEW_ARRAY( face->charset_encoding, ft_strlen( charset_encoding->value.atom ) + 1 ) ) goto Exit; if ( FT_NEW_ARRAY( face->charset_registry, ft_strlen( charset_registry->value.atom ) + 1 ) ) goto Exit; ft_strcpy( face->charset_registry, charset_registry->value.atom ); ft_strcpy( face->charset_encoding, charset_encoding->value.atom ); /* Uh, oh, compare first letters manually to avoid dependency on locales. */ s = face->charset_registry; if ( ( s[0] == 'i' || s[0] == 'I' ) && ( s[1] == 's' || s[1] == 'S' ) && ( s[2] == 'o' || s[2] == 'O' ) ) { s += 3; if ( !ft_strcmp( s, "10646" ) || ( !ft_strcmp( s, "8859" ) && !ft_strcmp( face->charset_encoding, "1" ) ) ) unicode_charmap = 1; } { FT_CharMapRec charmap; charmap.face = FT_FACE( face ); charmap.encoding = FT_ENCODING_NONE; charmap.platform_id = 0; charmap.encoding_id = 0; if ( unicode_charmap ) { charmap.encoding = FT_ENCODING_UNICODE; charmap.platform_id = 3; charmap.encoding_id = 1; } error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL );#if 0 /* Select default charmap */ if ( bdfface->num_charmaps ) bdfface->charmap = bdfface->charmaps[0];#endif } goto Exit; } } /* otherwise assume Adobe standard encoding */ { FT_CharMapRec charmap; charmap.face = FT_FACE( face ); charmap.encoding = FT_ENCODING_ADOBE_STANDARD; charmap.platform_id = 7; charmap.encoding_id = 0; error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL ); /* Select default charmap */ if ( bdfface->num_charmaps ) bdfface->charmap = bdfface->charmaps[0]; } } } Exit: return error; Fail: BDF_Face_Done( bdfface ); return BDF_Err_Unknown_File_Format; } FT_CALLBACK_DEF( FT_Error ) BDF_Set_Pixel_Size( FT_Size size, FT_UInt char_width, FT_UInt char_height ) { BDF_Face face = (BDF_Face)FT_SIZE_FACE( size ); FT_Face root = FT_FACE( face ); FT_UNUSED( char_width ); if ( char_height == (FT_UInt)root->available_sizes->height ) { size->metrics.ascender = face->bdffont->font_ascent << 6; size->metrics.descender = -face->bdffont->font_descent << 6; size->metrics.height = ( face->bdffont->font_ascent + face->bdffont->font_descent ) << 6; size->metrics.max_advance = face->bdffont->bbx.width << 6; return BDF_Err_Ok; } else return BDF_Err_Invalid_Pixel_Size; } FT_CALLBACK_DEF( FT_Error ) BDF_Set_Point_Size( FT_Size size, FT_F26Dot6 char_width, FT_F26Dot6 char_height, FT_UInt horz_resolution, FT_UInt vert_resolution ) { BDF_Face face = (BDF_Face)FT_SIZE_FACE( size ); FT_Face root = FT_FACE( face ); FT_UNUSED( char_width ); FT_UNUSED( char_height ); FT_UNUSED( horz_resolution ); FT_UNUSED( vert_resolution ); FT_TRACE4(( "rec %d - pres %d\n", size->metrics.y_ppem, root->available_sizes->y_ppem )); if ( size->metrics.y_ppem == root->available_sizes->y_ppem >> 6 ) { size->metrics.ascender = face->bdffont->font_ascent << 6; size->metrics.descender = -face->bdffont->font_descent << 6; size->metrics.height = ( face->bdffont->font_ascent + face->bdffont->font_descent ) << 6; size->metrics.max_advance = face->bdffont->bbx.width << 6; return BDF_Err_Ok; } else return BDF_Err_Invalid_Pixel_Size; } FT_CALLBACK_DEF( FT_Error ) BDF_Glyph_Load( FT_GlyphSlot slot, FT_Size size, FT_UInt glyph_index, FT_Int32 load_flags ) { BDF_Face face = (BDF_Face)FT_SIZE_FACE( size ); FT_Error error = BDF_Err_Ok; FT_Bitmap* bitmap = &slot->bitmap; bdf_glyph_t glyph; int bpp = face->bdffont->bpp; FT_UNUSED( load_flags ); if ( !face ) { error = BDF_Err_Invalid_Argument; goto Exit; } /* index 0 is the undefined glyph */ if ( glyph_index == 0 ) glyph_index = face->default_glyph; else glyph_index--; /* slot, bitmap => freetype, glyph => bdflib */ glyph = face->bdffont->glyphs[glyph_index]; bitmap->rows = glyph.bbx.height; bitmap->width = glyph.bbx.width; bitmap->pitch = glyph.bpr; /* note: we don't allocate a new array to hold the bitmap; */ /* we can simply point to it */ ft_glyphslot_set_bitmap( slot, glyph.bitmap ); switch ( bpp ) { case 1: bitmap->pixel_mode = FT_PIXEL_MODE_MONO; break; case 2: bitmap->pixel_mode = FT_PIXEL_MODE_GRAY2; break; case 4: bitmap->pixel_mode = FT_PIXEL_MODE_GRAY4; break; case 8: bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; bitmap->num_grays = 256; break; } slot->bitmap_left = glyph.bbx.x_offset; slot->bitmap_top = glyph.bbx.ascent; /* FZ XXX: TODO: vertical metrics */ slot->metrics.horiAdvance = glyph.dwidth << 6; slot->metrics.horiBearingX = glyph.bbx.x_offset << 6; slot->metrics.horiBearingY = glyph.bbx.ascent << 6; slot->metrics.width = bitmap->width << 6; slot->metrics.height = bitmap->rows << 6; slot->linearHoriAdvance = (FT_Fixed)glyph.dwidth << 16; slot->format = FT_GLYPH_FORMAT_BITMAP; Exit: return error; } /* * * BDF SERVICE * */ static FT_Error bdf_get_bdf_property( BDF_Face face, const char* prop_name, BDF_PropertyRec *aproperty ) { bdf_property_t* prop; FT_ASSERT( face && face->bdffont ); prop = bdf_get_font_property( face->bdffont, prop_name ); if ( prop ) { switch ( prop->format ) { case BDF_ATOM: aproperty->type = BDF_PROPERTY_TYPE_ATOM; aproperty->u.atom = prop->value.atom; break; case BDF_INTEGER: aproperty->type = BDF_PROPERTY_TYPE_INTEGER; aproperty->u.integer = prop->value.int32; break; case BDF_CARDINAL: aproperty->type = BDF_PROPERTY_TYPE_CARDINAL; aproperty->u.cardinal = prop->value.card32; break; default: goto Fail; } return 0; } Fail: return BDF_Err_Invalid_Argument; } static FT_Error bdf_get_charset_id( BDF_Face face, const char* *acharset_encoding, const char* *acharset_registry ) { *acharset_encoding = face->charset_encoding; *acharset_registry = face->charset_registry; return 0; } static const FT_Service_BDFRec bdf_service_bdf = { (FT_BDF_GetCharsetIdFunc)bdf_get_charset_id, (FT_BDF_GetPropertyFunc) bdf_get_bdf_property }; /* * * SERVICES LIST * */ static const FT_ServiceDescRec bdf_services[] = { { FT_SERVICE_ID_BDF, &bdf_service_bdf }, { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_BDF }, { NULL, NULL } }; FT_CALLBACK_DEF( FT_Module_Interface ) bdf_driver_requester( FT_Module module, const char* name ) { FT_UNUSED( module ); return ft_service_list_lookup( bdf_services, name ); } FT_CALLBACK_TABLE_DEF const FT_Driver_ClassRec bdf_driver_class = { { FT_MODULE_FONT_DRIVER | FT_MODULE_DRIVER_NO_OUTLINES, sizeof ( FT_DriverRec ), "bdf", 0x10000L, 0x20000L, 0, (FT_Module_Constructor)0, (FT_Module_Destructor) 0, (FT_Module_Requester) bdf_driver_requester }, sizeof ( BDF_FaceRec ), sizeof ( FT_SizeRec ), sizeof ( FT_GlyphSlotRec ), BDF_Face_Init, BDF_Face_Done, 0, /* FT_Size_InitFunc */ 0, /* FT_Size_DoneFunc */ 0, /* FT_Slot_InitFunc */ 0, /* FT_Slot_DoneFunc */ BDF_Set_Point_Size, BDF_Set_Pixel_Size, BDF_Glyph_Load, 0, /* FT_Face_GetKerningFunc */ 0, /* FT_Face_AttachFunc */ 0, /* FT_Face_GetAdvancesFunc */ };/* END */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -