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

📄 bdfdrivr.c

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -