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

📄 bdfdrivr.c

📁 下载来的一个看图软件的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -