⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bdfdrivr.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 );        else          bsize->size = bsize->width << 6;        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_STRDUP( face->charset_encoding,                            charset_encoding->value.atom ) ||                 FT_STRDUP( face->charset_registry,                            charset_registry->value.atom ) )              goto Exit;            /* 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_Size_Select( FT_Size   size,                   FT_ULong  strike_index )  {    bdf_font_t*  bdffont = ( (BDF_Face)size->face )->bdffont;    FT_Select_Metrics( size->face, strike_index );    size->metrics.ascender    = bdffont->font_ascent << 6;    size->metrics.descender   = -bdffont->font_descent << 6;    size->metrics.max_advance = bdffont->bbx.width << 6;    return BDF_Err_Ok;  }  FT_CALLBACK_DEF( FT_Error )  BDF_Size_Request( FT_Size          size,                    FT_Size_Request  req )  {    FT_Face          face    = size->face;    FT_Bitmap_Size*  bsize   = face->available_sizes;    bdf_font_t*      bdffont = ( (BDF_Face)face )->bdffont;    FT_Error         error   = BDF_Err_Invalid_Pixel_Size;    FT_Long          height;    height = FT_REQUEST_HEIGHT( req );    height = ( height + 32 ) >> 6;    switch ( req->type )    {    case FT_SIZE_REQUEST_TYPE_NOMINAL:      if ( height == ( bsize->y_ppem + 32 ) >> 6 )        error = BDF_Err_Ok;      break;    case FT_SIZE_REQUEST_TYPE_REAL_DIM:      if ( height == ( bdffont->font_ascent +                       bdffont->font_descent ) )        error = BDF_Err_Ok;      break;    default:      error = BDF_Err_Unimplemented_Feature;      break;    }    if ( error )      return error;    else      return BDF_Size_Select( size, 0 );  }  FT_CALLBACK_DEF( FT_Error )  BDF_Glyph_Load( FT_GlyphSlot  slot,                  FT_Size       size,                  FT_UInt       glyph_index,                  FT_Int32      load_flags )  {    BDF_Face     bdf    = (BDF_Face)FT_SIZE_FACE( size );    FT_Face      face   = FT_FACE( bdf );    FT_Error     error  = BDF_Err_Ok;    FT_Bitmap*   bitmap = &slot->bitmap;    bdf_glyph_t  glyph;    int          bpp    = bdf->bdffont->bpp;    FT_UNUSED( load_flags );    if ( !face || glyph_index >= (FT_UInt)face->num_glyphs )    {      error = BDF_Err_Invalid_Argument;      goto Exit;    }    /* index 0 is the undefined glyph */    if ( glyph_index == 0 )      glyph_index = bdf->default_glyph;    else      glyph_index--;    /* slot, bitmap => freetype, glyph => bdflib */    glyph = bdf->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->format      = FT_GLYPH_FORMAT_BITMAP;    slot->bitmap_left = glyph.bbx.x_offset;    slot->bitmap_top  = glyph.bbx.ascent;    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;    /*     * XXX DWIDTH1 and VVECTOR should be parsed and     * used here, provided such fonts do exist.     */    ft_synthesize_vertical_metrics( &slot->metrics,                                    bdf->bdffont->bbx.height << 6 );  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 */#ifdef FT_CONFIG_OPTION_OLD_INTERNALS    ft_stub_set_char_sizes,    ft_stub_set_pixel_sizes,#endif    BDF_Glyph_Load,    0,                          /* FT_Face_GetKerningFunc   */    0,                          /* FT_Face_AttachFunc       */    0,                          /* FT_Face_GetAdvancesFunc  */    BDF_Size_Request,    BDF_Size_Select  };/* END */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -