📄 bdfdrivr.c
字号:
charset_registry = bdf_get_font_property( font, "CHARSET_REGISTRY" ); charset_encoding = bdf_get_font_property( font, "CHARSET_ENCODING" ); if ( ( charset_registry != NULL ) && ( charset_encoding != NULL ) ) { if ( ( charset_registry->format == BDF_ATOM ) && ( charset_encoding->format == BDF_ATOM ) && ( charset_registry->value.atom != NULL ) && ( charset_encoding->value.atom != NULL ) ) { const char* s; if ( FT_NEW_ARRAY( face->charset_encoding, strlen( charset_encoding->value.atom ) + 1 ) ) goto Exit; if ( FT_NEW_ARRAY( face->charset_registry, 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 (root->num_charmaps) root->charmap = root->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 (root->num_charmaps) root->charmap = root->charmaps[0]; } } } Exit: return error; Fail: BDF_Face_Done( face ); return BDF_Err_Unknown_File_Format; } static FT_Error BDF_Set_Pixel_Size( FT_Size size ) { BDF_Face face = (BDF_Face)FT_SIZE_FACE( size ); FT_Face root = FT_FACE( face ); FT_TRACE4(( "rec %d - pres %d\n", size->metrics.y_ppem, root->available_sizes->height )); if ( size->metrics.y_ppem == root->available_sizes->height ) { size->metrics.ascender = face->bdffont->bbx.ascent << 6; size->metrics.descender = face->bdffont->bbx.descent * ( -64 ); size->metrics.height = face->bdffont->bbx.height << 6; size->metrics.max_advance = face->bdffont->bbx.width << 6; return BDF_Err_Ok; } else return BDF_Err_Invalid_Pixel_Size; } static 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; int i, j, count; unsigned char *p, *pp; FT_UNUSED( load_flags ); if ( !face ) { error = BDF_Err_Invalid_Argument; goto Exit; } if ( glyph_index > 0 ) glyph_index--; /* slot, bitmap => freetype, glyph => bdflib */ glyph = face->bdffont->glyphs[glyph_index]; bitmap->rows = glyph.bbx.height; bitmap->width = glyph.bbx.width; if ( bpp == 1 ) { bitmap->pixel_mode = FT_PIXEL_MODE_MONO; 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 ); } else { /* blow up pixmap to have 8 bits per pixel */ bitmap->pixel_mode = FT_PIXEL_MODE_GRAY; bitmap->pitch = bitmap->width; error = ft_glyphslot_alloc_bitmap( slot, bitmap->rows * bitmap->pitch ); if ( error ) goto Exit; switch ( bpp ) { case 2: bitmap->num_grays = 4; count = 0; p = glyph.bitmap; for ( i = 0; i < bitmap->rows; i++ ) { pp = p; /* get the full bytes */ for ( j = 0; j < ( bitmap->width >> 2 ); j++ ) { bitmap->buffer[count++] = (FT_Byte)( ( *pp & 0xC0 ) >> 6 ); bitmap->buffer[count++] = (FT_Byte)( ( *pp & 0x30 ) >> 4 ); bitmap->buffer[count++] = (FT_Byte)( ( *pp & 0x0C ) >> 2 ); bitmap->buffer[count++] = (FT_Byte)( *pp & 0x03 ); pp++; } /* get remaining pixels (if any) */ switch ( bitmap->width & 3 ) { case 3: bitmap->buffer[count++] = (FT_Byte)( ( *pp & 0xC0 ) >> 6 ); /* fall through */ case 2: bitmap->buffer[count++] = (FT_Byte)( ( *pp & 0x30 ) >> 4 ); /* fall through */ case 1: bitmap->buffer[count++] = (FT_Byte)( ( *pp & 0x0C ) >> 2 ); /* fall through */ case 0: break; } p += glyph.bpr; } break; case 4: bitmap->num_grays = 16; count = 0; p = glyph.bitmap; for ( i = 0; i < bitmap->rows; i++ ) { pp = p; /* get the full bytes */ for ( j = 0; j < ( bitmap->width >> 1 ); j++ ) { bitmap->buffer[count++] = (FT_Byte)( ( *pp & 0xF0 ) >> 4 ); bitmap->buffer[count++] = (FT_Byte)( *pp & 0x0F ); pp++; } /* get remaining pixel (if any) */ switch ( bitmap->width & 1 ) { case 1: bitmap->buffer[count++] = (FT_Byte)( ( *pp & 0xF0 ) >> 4 ); /* fall through */ case 0: break; } p += glyph.bpr; } break; case 8: bitmap->num_grays = 256; FT_MEM_COPY( bitmap->buffer, glyph.bitmap, bitmap->rows * bitmap->pitch ); break; } } slot->bitmap_left = 0; 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.y_offset + glyph.bbx.height ) << 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; } 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 != NULL ) { 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_Module_Interface bdf_driver_requester( FT_Module module, const char* name ) { FT_UNUSED( module ); if ( name && ft_strcmp( name, "get_bdf_property" ) == 0 ) return (FT_Module_Interface)bdf_get_bdf_property; return NULL; } 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 ), (FT_Face_InitFunc) BDF_Face_Init, (FT_Face_DoneFunc) BDF_Face_Done, (FT_Size_InitFunc) 0, (FT_Size_DoneFunc) 0, (FT_Slot_InitFunc) 0, (FT_Slot_DoneFunc) 0, (FT_Size_ResetPointsFunc) BDF_Set_Pixel_Size, (FT_Size_ResetPixelsFunc) BDF_Set_Pixel_Size, (FT_Slot_LoadFunc) BDF_Glyph_Load, (FT_Face_GetKerningFunc) 0, (FT_Face_AttachFunc) 0, (FT_Face_GetAdvancesFunc) 0 };/* END */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -