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

📄 pfrsbit.c

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    else      *found_offset = PFR_NEXT_USHORT( buff );  }  /* load bitmap metrics.  "*padvance" must be set to the default value */  /* before calling this function...                                    */  /*                                                                    */  static FT_Error  pfr_load_bitmap_metrics( FT_Byte**  pdata,                           FT_Byte*   limit,                           FT_Long    scaled_advance,                           FT_Long   *axpos,                           FT_Long   *aypos,                           FT_UInt   *axsize,                           FT_UInt   *aysize,                           FT_Long   *aadvance,                           FT_UInt   *aformat )  {    FT_Error  error = 0;    FT_Byte   flags;    FT_Char   b;    FT_Byte*  p = *pdata;    FT_Long   xpos, ypos, advance;    FT_UInt   xsize, ysize;    PFR_CHECK( 1 );    flags = PFR_NEXT_BYTE( p );    xpos    = 0;    ypos    = 0;    xsize   = 0;    ysize   = 0;    advance = 0;    switch ( flags & 3 )    {    case 0:      PFR_CHECK( 1 );      b    = PFR_NEXT_INT8( p );      xpos = b >> 4;      ypos = ( (FT_Char)( b << 4 ) ) >> 4;      break;    case 1:      PFR_CHECK( 2 );      xpos = PFR_NEXT_INT8( p );      ypos = PFR_NEXT_INT8( p );      break;    case 2:      PFR_CHECK( 4 );      xpos = PFR_NEXT_SHORT( p );      ypos = PFR_NEXT_SHORT( p );      break;    case 3:      PFR_CHECK( 6 );      xpos = PFR_NEXT_LONG( p );      ypos = PFR_NEXT_LONG( p );      break;    default:      ;    }    flags >>= 2;    switch ( flags & 3 )    {    case 0:      /* blank image */      xsize = 0;      ysize = 0;      break;    case 1:      PFR_CHECK( 1 );      b     = PFR_NEXT_BYTE( p );      xsize = ( b >> 4 ) & 0xF;      ysize = b & 0xF;      break;    case 2:      PFR_CHECK( 2 );      xsize = PFR_NEXT_BYTE( p );      ysize = PFR_NEXT_BYTE( p );      break;    case 3:      PFR_CHECK( 4 );      xsize = PFR_NEXT_USHORT( p );      ysize = PFR_NEXT_USHORT( p );      break;    default:      ;    }    flags >>= 2;    switch ( flags & 3 )    {    case 0:      advance = scaled_advance;      break;    case 1:      PFR_CHECK( 1 );      advance = PFR_NEXT_INT8( p ) << 8;      break;    case 2:      PFR_CHECK( 2 );      advance = PFR_NEXT_SHORT( p );      break;    case 3:      PFR_CHECK( 3 );      advance = PFR_NEXT_LONG( p );      break;    default:      ;    }    *axpos    = xpos;    *aypos    = ypos;    *axsize   = xsize;    *aysize   = ysize;    *aadvance = advance;    *aformat  = flags >> 2;    *pdata    = p;  Exit:    return error;  Too_Short:    error = PFR_Err_Invalid_Table;    FT_ERROR(( "pfr_load_bitmap_metrics: invalid glyph data\n" ));    goto Exit;  }  static FT_Error  pfr_load_bitmap_bits( FT_Byte*    p,                        FT_Byte*    limit,                        FT_UInt     format,                        FT_Bool     decreasing,                        FT_Bitmap*  target )  {    FT_Error          error = 0;    PFR_BitWriterRec  writer;    if ( target->rows > 0 && target->width > 0 )    {      pfr_bitwriter_init( &writer, target, decreasing );      switch ( format )      {      case 0: /* packed bits */        pfr_bitwriter_decode_bytes( &writer, p, limit );        break;      case 1: /* RLE1 */        pfr_bitwriter_decode_rle1( &writer, p, limit );        break;      case 2: /* RLE2 */        pfr_bitwriter_decode_rle2( &writer, p, limit );        break;      default:        FT_ERROR(( "pfr_read_bitmap_data: invalid image type\n" ));        error = PFR_Err_Invalid_File_Format;      }    }    return error;  }  /*************************************************************************/  /*************************************************************************/  /*****                                                               *****/  /*****                     BITMAP LOADING                            *****/  /*****                                                               *****/  /*************************************************************************/  /*************************************************************************/  FT_LOCAL( FT_Error )  pfr_slot_load_bitmap( PFR_Slot  glyph,                        PFR_Size  size,                        FT_UInt   glyph_index )  {    FT_Error     error;    PFR_Face     face   = (PFR_Face) glyph->root.face;    FT_Stream    stream = face->root.stream;    PFR_PhyFont  phys   = &face->phy_font;    FT_ULong     gps_offset;    FT_ULong     gps_size;    PFR_Char     character;    PFR_Strike   strike;    character = &phys->chars[glyph_index];    /* Look-up a bitmap strike corresponding to the current */    /* character dimensions                                 */    {      FT_UInt  n;      strike = phys->strikes;      for ( n = 0; n < phys->num_strikes; n++ )      {        if ( strike->x_ppm == (FT_UInt)size->root.metrics.x_ppem &&             strike->y_ppm == (FT_UInt)size->root.metrics.y_ppem )        {          goto Found_Strike;        }        strike++;      }      /* couldn't find it */      return PFR_Err_Invalid_Argument;    }  Found_Strike:    /* Now lookup the glyph's position within the file */    {      FT_UInt  char_len;      char_len = 4;      if ( strike->flags & 1 ) char_len += 1;      if ( strike->flags & 2 ) char_len += 1;      if ( strike->flags & 4 ) char_len += 1;      /* Access data directly in the frame to speed lookups */      if ( FT_STREAM_SEEK( phys->bct_offset + strike->bct_offset ) ||           FT_FRAME_ENTER( char_len * strike->num_bitmaps )        )        goto Exit;      pfr_lookup_bitmap_data( stream->cursor,                              stream->limit,                              strike->num_bitmaps,                              strike->flags,                              character->char_code,                              &gps_offset,                              &gps_size );      FT_FRAME_EXIT();      if ( gps_size == 0 )      {        /* Could not find a bitmap program string for this glyph */        error = PFR_Err_Invalid_Argument;        goto Exit;      }    }    /* get the bitmap metrics */    {      FT_Long   xpos, ypos, advance;      FT_UInt   xsize, ysize, format;      FT_Byte*  p;      advance = FT_MulDiv( size->root.metrics.x_ppem << 8,                           character->advance,                           phys->metrics_resolution );      /* XXX: handle linearHoriAdvance correctly! */      if ( FT_STREAM_SEEK( face->header.gps_section_offset + gps_offset ) ||           FT_FRAME_ENTER( gps_size )                                     )        goto Exit;      p     = stream->cursor;      error = pfr_load_bitmap_metrics( &p, stream->limit,                                       advance,                                       &xpos, &ypos,                                       &xsize, &ysize,                                       &advance, &format );      if ( !error )      {        glyph->root.format = FT_GLYPH_FORMAT_BITMAP;        /* Set up glyph bitmap and metrics */        glyph->root.bitmap.width      = (FT_Int)xsize;        glyph->root.bitmap.rows       = (FT_Int)ysize;        glyph->root.bitmap.pitch      = (FT_Long)( xsize + 7 ) >> 3;        glyph->root.bitmap.pixel_mode = FT_PIXEL_MODE_MONO;        glyph->root.metrics.width        = (FT_Long)xsize << 6;        glyph->root.metrics.height       = (FT_Long)ysize << 6;        glyph->root.metrics.horiBearingX = xpos << 6;        glyph->root.metrics.horiBearingY = ypos << 6;        glyph->root.metrics.horiAdvance  = FT_PIX_ROUND( ( advance >> 2 ) );        glyph->root.metrics.vertBearingX = - glyph->root.metrics.width >> 1;        glyph->root.metrics.vertBearingY = 0;        glyph->root.metrics.vertAdvance  = size->root.metrics.height;        glyph->root.bitmap_left = xpos;        glyph->root.bitmap_top  = ypos + ysize;        /* Allocate and read bitmap data */        {          FT_ULong  len = glyph->root.bitmap.pitch * ysize;          error = ft_glyphslot_alloc_bitmap( &glyph->root, len );          if ( !error )          {            error = pfr_load_bitmap_bits(                      p,                      stream->limit,                      format,                      FT_BOOL(face->header.color_flags & 2),                      &glyph->root.bitmap );          }        }      }      FT_FRAME_EXIT();    }  Exit:    return error;  }/* END */

⌨️ 快捷键说明

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