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

📄 pcfread.c

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 C
📖 第 1 页 / 共 3 页
字号:
    for ( i = 0; i < nprops; i++ )    {      if ( PCF_BYTE_ORDER( format ) == MSBFirst )      {        if ( FT_STREAM_READ_FIELDS( pcf_property_msb_header, props + i ) )          goto Bail;      }      else      {        if ( FT_STREAM_READ_FIELDS( pcf_property_header, props + i ) )          goto Bail;      }    }    /* pad the property array                                            */    /*                                                                   */    /* clever here - nprops is the same as the number of odd-units read, */    /* as only isStringProp are odd length   (Keith Packard)             */    /*                                                                   */    if ( nprops & 3 )    {      i = 4 - ( nprops & 3 );      FT_Stream_Skip( stream, i );    }    if ( PCF_BYTE_ORDER( format ) == MSBFirst )      (void)FT_READ_ULONG( string_size );    else      (void)FT_READ_ULONG_LE( string_size );    if ( error )      goto Bail;    FT_TRACE4(( "  string_size = %ld\n", string_size ));    if ( FT_NEW_ARRAY( strings, string_size ) )      goto Bail;    error = FT_Stream_Read( stream, (FT_Byte*)strings, string_size );    if ( error )      goto Bail;    if ( FT_NEW_ARRAY( properties, nprops ) )      goto Bail;    for ( i = 0; i < nprops; i++ )    {      /* XXX: make atom */      if ( FT_NEW_ARRAY( properties[i].name,                         ft_strlen( strings + props[i].name ) + 1 ) )        goto Bail;      ft_strcpy( properties[i].name, strings + props[i].name );      FT_TRACE4(( "  %s:", properties[i].name ));      properties[i].isString = props[i].isString;      if ( props[i].isString )      {        if ( FT_NEW_ARRAY( properties[i].value.atom,                           ft_strlen( strings + props[i].value ) + 1 ) )          goto Bail;        ft_strcpy( properties[i].value.atom, strings + props[i].value );        FT_TRACE4(( " `%s'\n", properties[i].value.atom ));      }      else      {        properties[i].value.integer = props[i].value;        FT_TRACE4(( " %d\n", properties[i].value.integer ));      }    }    face->properties = properties;    face->nprops = nprops;    FT_FREE( props );    FT_FREE( strings );    return PCF_Err_Ok;  Bail:    FT_FREE( props );    FT_FREE( strings );    return error;  }  static FT_Error  pcf_get_metrics( FT_Stream  stream,                   PCF_Face   face )  {    FT_Error    error    = PCF_Err_Ok;    FT_Memory   memory   = FT_FACE(face)->memory;    FT_ULong    format   = 0;    FT_ULong    size     = 0;    PCF_Metric  metrics  = 0;    int         i;    int         nmetrics = -1;    error = pcf_seek_to_table_type( stream,                                    face->toc.tables,                                    face->toc.count,                                    PCF_METRICS,                                    &format,                                    &size );    if ( error )      return error;    error = FT_READ_ULONG_LE( format );    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT )     &&         !PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) )      return PCF_Err_Invalid_File_Format;    if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )    {      if ( PCF_BYTE_ORDER( format ) == MSBFirst )        (void)FT_READ_ULONG( nmetrics );      else        (void)FT_READ_ULONG_LE( nmetrics );    }    else    {      if ( PCF_BYTE_ORDER( format ) == MSBFirst )        (void)FT_READ_USHORT( nmetrics );      else        (void)FT_READ_USHORT_LE( nmetrics );    }    if ( error || nmetrics == -1 )      return PCF_Err_Invalid_File_Format;    face->nmetrics = nmetrics;    if ( FT_NEW_ARRAY( face->metrics, nmetrics ) )      return PCF_Err_Out_Of_Memory;    FT_TRACE4(( "pcf_get_metrics:\n" ));    metrics = face->metrics;    for ( i = 0; i < nmetrics; i++ )    {      pcf_get_metric( stream, format, metrics + i );      metrics[i].bits = 0;      FT_TRACE4(( "  idx %d: width=%d, "                  "lsb=%d, rsb=%d, ascent=%d, descent=%d, swidth=%d\n",                  i,                  ( metrics + i )->characterWidth,                  ( metrics + i )->leftSideBearing,                  ( metrics + i )->rightSideBearing,                  ( metrics + i )->ascent,                  ( metrics + i )->descent,                  ( metrics + i )->attributes ));      if ( error )        break;    }    if ( error )      FT_FREE( face->metrics );    return error;  }  static FT_Error  pcf_get_bitmaps( FT_Stream  stream,                   PCF_Face   face )  {    FT_Error   error  = PCF_Err_Ok;    FT_Memory  memory = FT_FACE(face)->memory;    FT_Long*   offsets;    FT_Long    bitmapSizes[GLYPHPADOPTIONS];    FT_ULong   format, size;    int        nbitmaps, i, sizebitmaps = 0;    char*      bitmaps;    error = pcf_seek_to_table_type( stream,                                    face->toc.tables,                                    face->toc.count,                                    PCF_BITMAPS,                                    &format,                                    &size );    if ( error )      return error;    error = FT_Stream_EnterFrame( stream, 8 );    if ( error )      return error;    format = FT_GET_ULONG_LE();    if ( PCF_BYTE_ORDER( format ) == MSBFirst )      nbitmaps  = FT_GET_ULONG();    else      nbitmaps  = FT_GET_ULONG_LE();    FT_Stream_ExitFrame( stream );    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )      return PCF_Err_Invalid_File_Format;    if ( nbitmaps != face->nmetrics )      return PCF_Err_Invalid_File_Format;    if ( FT_NEW_ARRAY( offsets, nbitmaps ) )      return error;    FT_TRACE4(( "pcf_get_bitmaps:\n" ));    for ( i = 0; i < nbitmaps; i++ )    {      if ( PCF_BYTE_ORDER( format ) == MSBFirst )        (void)FT_READ_LONG( offsets[i] );      else        (void)FT_READ_LONG_LE( offsets[i] );      FT_TRACE4(( "  bitmap %d: offset %ld (0x%lX)\n",                  i, offsets[i], offsets[i] ));    }    if ( error )      goto Bail;    for ( i = 0; i < GLYPHPADOPTIONS; i++ )    {      if ( PCF_BYTE_ORDER( format ) == MSBFirst )        (void)FT_READ_LONG( bitmapSizes[i] );      else        (void)FT_READ_LONG_LE( bitmapSizes[i] );      if ( error )        goto Bail;      sizebitmaps = bitmapSizes[PCF_GLYPH_PAD_INDEX( format )];      FT_TRACE4(( "  padding %d implies a size of %ld\n", i, bitmapSizes[i] ));    }    FT_TRACE4(( "  %d bitmaps, padding index %ld\n",                nbitmaps,                PCF_GLYPH_PAD_INDEX( format ) ));    FT_TRACE4(( "  bitmap size = %d\n", sizebitmaps ));    FT_UNUSED( sizebitmaps );       /* only used for debugging */    for ( i = 0; i < nbitmaps; i++ )      face->metrics[i].bits = stream->pos + offsets[i];    face->bitmapsFormat = format;    FT_FREE ( offsets );    return error;  Bail:    FT_FREE ( offsets );    FT_FREE ( bitmaps );    return error;  }  static FT_Error  pcf_get_encodings( FT_Stream  stream,                     PCF_Face   face )  {    FT_Error      error  = PCF_Err_Ok;    FT_Memory     memory = FT_FACE(face)->memory;    FT_ULong      format, size;    int           firstCol, lastCol;    int           firstRow, lastRow;    int           nencoding, encodingOffset;    int           i, j;    PCF_Encoding  tmpEncoding, encoding = 0;    error = pcf_seek_to_table_type( stream,                                    face->toc.tables,                                    face->toc.count,                                    PCF_BDF_ENCODINGS,                                    &format,                                    &size );    if ( error )      return error;    error = FT_Stream_EnterFrame( stream, 14 );    if ( error )      return error;    format = FT_GET_ULONG_LE();    if ( PCF_BYTE_ORDER( format ) == MSBFirst )    {      firstCol          = FT_GET_SHORT();      lastCol           = FT_GET_SHORT();      firstRow          = FT_GET_SHORT();      lastRow           = FT_GET_SHORT();      face->defaultChar = FT_GET_SHORT();    }    else    {      firstCol          = FT_GET_SHORT_LE();      lastCol           = FT_GET_SHORT_LE();      firstRow          = FT_GET_SHORT_LE();      lastRow           = FT_GET_SHORT_LE();      face->defaultChar = FT_GET_SHORT_LE();    }    FT_Stream_ExitFrame( stream );    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )      return PCF_Err_Invalid_File_Format;    FT_TRACE4(( "pdf_get_encodings:\n" ));    FT_TRACE4(( "  firstCol %d, lastCol %d, firstRow %d, lastRow %d\n",                firstCol, lastCol, firstRow, lastRow ));    nencoding = ( lastCol - firstCol + 1 ) * ( lastRow - firstRow + 1 );    if ( FT_NEW_ARRAY( tmpEncoding, nencoding ) )      return PCF_Err_Out_Of_Memory;    error = FT_Stream_EnterFrame( stream, 2 * nencoding );    if ( error )      goto Bail;    for ( i = 0, j = 0 ; i < nencoding; i++ )    {      if ( PCF_BYTE_ORDER( format ) == MSBFirst )        encodingOffset = FT_GET_SHORT();      else        encodingOffset = FT_GET_SHORT_LE();      if ( encodingOffset != -1 )      {        tmpEncoding[j].enc = ( ( ( i / ( lastCol - firstCol + 1 ) ) +                                 firstRow ) * 256 ) +                               ( ( i % ( lastCol - firstCol + 1 ) ) +                                 firstCol );        tmpEncoding[j].glyph = (FT_Short)encodingOffset;        FT_TRACE4(( "  code %d (0x%04X): idx %d\n",                    tmpEncoding[j].enc, tmpEncoding[j].enc,                    tmpEncoding[j].glyph ));        j++;      }    }    FT_Stream_ExitFrame( stream );    if ( FT_NEW_ARRAY( encoding, j ) )      goto Bail;    for ( i = 0; i < j; i++ )    {      encoding[i].enc   = tmpEncoding[i].enc;      encoding[i].glyph = tmpEncoding[i].glyph;    }    face->nencodings = j;    face->encodings  = encoding;    FT_FREE( tmpEncoding );    return error;  Bail:    FT_FREE( encoding );    FT_FREE( tmpEncoding );    return error;  }  static  const FT_Frame_Field  pcf_accel_header[] =  {#undef  FT_STRUCTURE#define FT_STRUCTURE  PCF_AccelRec    FT_FRAME_START( 20 ),      FT_FRAME_BYTE      ( noOverlap ),      FT_FRAME_BYTE      ( constantMetrics ),      FT_FRAME_BYTE      ( terminalFont ),      FT_FRAME_BYTE      ( constantWidth ),      FT_FRAME_BYTE      ( inkInside ),      FT_FRAME_BYTE      ( inkMetrics ),      FT_FRAME_BYTE      ( drawDirection ),      FT_FRAME_SKIP_BYTES( 1 ),      FT_FRAME_LONG_LE   ( fontAscent ),      FT_FRAME_LONG_LE   ( fontDescent ),      FT_FRAME_LONG_LE   ( maxOverlap ),    FT_FRAME_END  };

⌨️ 快捷键说明

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