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

📄 ttsbit0.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
        for ( w = width; w >= 8; w -= 8 )        {          wval      = (FT_UInt)( wval | *p++ );          write[0]  = (FT_Byte)( write[0] | ( wval >> x_pos ) );          write    += 1;          wval    <<= 8;        }        if ( w > 0 )          wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) );        /* all bits read and there are ( x_pos + w ) bits to be written */        write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) );        if ( x_pos + w > 8 )        {          write++;          wval   <<= 8;          write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) );        }      }    }  Exit:    return error;  }  static FT_Error  tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder  decoder,                                    FT_Byte*        p,                                    FT_Byte*        limit,                                    FT_Int          x_pos,                                    FT_Int          y_pos )  {    FT_Error    error = SFNT_Err_Ok;    FT_Byte*    line;    FT_Int      bit_height, bit_width, pitch, width, height, h, nbits;    FT_Bitmap*  bitmap;    FT_UShort   rval;    if ( !decoder->bitmap_allocated )    {      error = tt_sbit_decoder_alloc_bitmap( decoder );      if ( error )        goto Exit;    }    /* check that we can write the glyph into the bitmap */    bitmap     = decoder->bitmap;    bit_width  = bitmap->width;    bit_height = bitmap->rows;    pitch      = bitmap->pitch;    line       = bitmap->buffer;    width  = decoder->metrics->width;    height = decoder->metrics->height;    if ( x_pos < 0 || x_pos + width  > bit_width  ||         y_pos < 0 || y_pos + height > bit_height )    {      error = SFNT_Err_Invalid_File_Format;      goto Exit;    }    if ( p + ( ( width * height + 7 ) >> 3 ) > limit )    {      error = SFNT_Err_Invalid_File_Format;      goto Exit;    }    /* now do the blit */    line  += y_pos * pitch + ( x_pos >> 3 );    x_pos &= 7;    /* the higher byte of `rval' is used as a buffer */    rval  = 0;    nbits = 0;    for ( h = height; h > 0; h--, line += pitch )    {      FT_Byte*  write = line;      FT_Int    w = width;      if ( x_pos )      {        w = ( width < 8 - x_pos ) ? width : 8 - x_pos;        if ( nbits < w )        {          rval  |= *p++;          nbits += 8 - w;        }        else        {          rval  >>= 8;          nbits  -= w;        }        *write++ |= ( ( rval >> nbits ) & 0xFF ) & ~( 0xFF << w );        rval    <<= 8;        w = width - w;      }      for ( ; w >= 8; w -= 8 )      {        rval     |= *p++;        *write++ |= ( rval >> nbits ) & 0xFF;        rval <<= 8;      }      if ( w > 0 )      {        if ( nbits < w )        {          rval   |= *p++;          *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );          nbits  += 8 - w;          rval <<= 8;        }        else        {          *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );          nbits  -= w;        }      }    }  Exit:    return error;  }  static FT_Error  tt_sbit_decoder_load_compound( TT_SBitDecoder  decoder,                                 FT_Byte*        p,                                 FT_Byte*        limit,                                 FT_Int          x_pos,                                 FT_Int          y_pos )  {    FT_Error  error = SFNT_Err_Ok;    FT_UInt   num_components, nn;    if ( p + 2 > limit )      goto Fail;    num_components = FT_NEXT_USHORT( p );    if ( p + 4 * num_components > limit )      goto Fail;    for ( nn = 0; nn < num_components; nn++ )    {      FT_UInt   gindex = FT_NEXT_USHORT( p );      FT_Byte   dx     = FT_NEXT_BYTE( p );      FT_Byte   dy     = FT_NEXT_BYTE( p );      /* NB: a recursive call */      error = tt_sbit_decoder_load_image( decoder, gindex,                                          x_pos + dx, y_pos + dy );      if ( error )        break;    }  Exit:    return error;  Fail:    error = SFNT_Err_Invalid_File_Format;    goto Exit;  }  static FT_Error  tt_sbit_decoder_load_bitmap( TT_SBitDecoder  decoder,                               FT_UInt         glyph_format,                               FT_ULong        glyph_start,                               FT_ULong        glyph_size,                               FT_Int          x_pos,                               FT_Int          y_pos )  {    FT_Error   error;    FT_Stream  stream = decoder->stream;    FT_Byte*   p;    FT_Byte*   p_limit;    FT_Byte*   data;    /* seek into the EBDT table now */    if ( glyph_start + glyph_size > decoder->ebdt_size )    {      error = SFNT_Err_Invalid_Argument;      goto Exit;    }    if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) ||         FT_FRAME_EXTRACT( glyph_size, data )                )      goto Exit;    p       = data;    p_limit = p + glyph_size;    /* read the data, depending on the glyph format */    switch ( glyph_format )    {    case 1:    case 2:    case 8:      error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 );      break;    case 6:    case 7:    case 9:      error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 );      break;    default:      error = SFNT_Err_Ok;    }    if ( error )      goto Fail;    {      TT_SBitDecoder_LoadFunc  loader;      switch ( glyph_format )      {      case 1:      case 6:        loader = tt_sbit_decoder_load_byte_aligned;        break;      case 2:      case 5:      case 7:        loader = tt_sbit_decoder_load_bit_aligned;        break;      case 8:        if ( p + 1 > p_limit )          goto Fail;        p += 1;  /* skip padding */        /* fall-through */      case 9:        loader = tt_sbit_decoder_load_compound;        break;      default:        goto Fail;      }      error = loader( decoder, p, p_limit, x_pos, y_pos );    }  Fail:    FT_FRAME_RELEASE( data );  Exit:    return error;  }  static FT_Error  tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,                              FT_UInt         glyph_index,                              FT_Int          x_pos,                              FT_Int          y_pos )  {    /*     *  First, we find the correct strike range that applies to this     *  glyph index.     */    FT_Byte*  p          = decoder->eblc_base + decoder->strike_index_array;    FT_Byte*  p_limit    = decoder->eblc_limit;    FT_ULong  num_ranges = decoder->strike_index_count;    FT_UInt   start, end, index_format, image_format;    FT_ULong  image_start = 0, image_end = 0, image_offset;    if ( p + 8 * num_ranges > p_limit )      goto NoBitmap;    for ( ; num_ranges > 0; num_ranges-- )    {      start = FT_NEXT_USHORT( p );      end   = FT_NEXT_USHORT( p );      if ( glyph_index >= start && glyph_index <= end )        goto FoundRange;      p += 4;  /* ignore index offset */    }    goto NoBitmap;  FoundRange:    image_offset = FT_NEXT_ULONG( p );    p = decoder->eblc_base + decoder->strike_index_array + image_offset;    if ( p + 8 > p_limit )      goto NoBitmap;    /* now find the glyph's location and extend within the ebdt table */    index_format = FT_NEXT_USHORT( p );    image_format = FT_NEXT_USHORT( p );    image_offset = FT_NEXT_ULONG ( p );    switch ( index_format )    {    case 1: /* 4-byte offsets relative to `image_offset' */      {        p += 4 * ( glyph_index - start );        if ( p + 8 > p_limit )          goto NoBitmap;        image_start = FT_NEXT_ULONG( p );        image_end   = FT_NEXT_ULONG( p );        if ( image_start == image_end )  /* missing glyph */          goto NoBitmap;      }      break;    case 2: /* big metrics, constant image size */      {        FT_ULong  image_size;        if ( p + 12 > p_limit )          goto NoBitmap;        image_size = FT_NEXT_ULONG( p );        if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )          goto NoBitmap;        image_start = image_size * ( glyph_index - start );        image_end   = image_start  + image_size;      }      break;    case 3: /* 2-byte offsets relative to 'image_offset' */      {        p += 2 * ( glyph_index - start );        if ( p + 4 > p_limit )          goto NoBitmap;        image_start = FT_NEXT_USHORT( p );        image_end   = FT_NEXT_USHORT( p );        if ( image_start == image_end )  /* missing glyph */          goto NoBitmap;      }      break;    case 4: /* sparse glyph array with (glyph,offset) pairs */      {        FT_ULong  mm, num_glyphs;        if ( p + 4 > p_limit )          goto NoBitmap;        num_glyphs = FT_NEXT_ULONG( p );        if ( p + ( num_glyphs + 1 ) * 4 > p_limit )          goto NoBitmap;        for ( mm = 0; mm < num_glyphs; mm++ )        {          FT_UInt  gindex = FT_NEXT_USHORT( p );          if ( gindex == glyph_index )          {            image_start = FT_NEXT_USHORT( p );            p          += 2;            image_end   = FT_PEEK_USHORT( p );            break;          }          p += 2;        }        if ( mm >= num_glyphs )          goto NoBitmap;      }      break;    case 5: /* constant metrics with sparse glyph codes */      {        FT_ULong  image_size, mm, num_glyphs;        if ( p + 16 > p_limit )          goto NoBitmap;        image_size = FT_NEXT_ULONG( p );        if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )          goto NoBitmap;        num_glyphs = FT_NEXT_ULONG( p );        if ( p + 2 * num_glyphs > p_limit )          goto NoBitmap;        for ( mm = 0; mm < num_glyphs; mm++ )        {          FT_UInt  gindex = FT_NEXT_USHORT( p );          if ( gindex == glyph_index )            break;        }        if ( mm >= num_glyphs )          goto NoBitmap;        image_start = image_size*mm;        image_end   = image_start + image_size;      }      break;    default:      goto NoBitmap;    }    if ( image_start > image_end )      goto NoBitmap;    image_end  -= image_start;    image_start = image_offset + image_start;    return tt_sbit_decoder_load_bitmap( decoder,                                        image_format,                                        image_start,                                        image_end,                                        x_pos,                                        y_pos );  NoBitmap:    return SFNT_Err_Invalid_Argument;  }  FT_LOCAL( FT_Error )  tt_face_load_sbit_image( TT_Face              face,                           FT_ULong             strike_index,                           FT_UInt              glyph_index,                           FT_UInt              load_flags,                           FT_Stream            stream,                           FT_Bitmap           *map,                           TT_SBit_MetricsRec  *metrics )  {    TT_SBitDecoderRec  decoder[1];    FT_Error           error;    FT_UNUSED( load_flags );    FT_UNUSED( stream );    FT_UNUSED( map );    error = tt_sbit_decoder_init( decoder, face, strike_index, metrics );    if ( !error )    {      error = tt_sbit_decoder_load_image( decoder, glyph_index, 0, 0 );      tt_sbit_decoder_done( decoder );    }    return error;  }/* EOF */

⌨️ 快捷键说明

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