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

📄 ftxopen.c

📁 这个是Linux的qt源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
      }      else if ( glyphID < middle->Start )      {        max = middle - 1;      }      else      {        min = middle + 1;      }    } while ( min <= max );    return TTO_Err_Not_Covered;  }  FT_Error  Coverage_Index( TTO_Coverage*  c,                            FT_UShort      glyphID,                            FT_UShort*     index )  {    if ( c->CoverageFormat == 1 )      return Coverage_Index1( &c->cf.cf1, glyphID, index );    else if ( c->CoverageFormat == 2 )      return Coverage_Index2( &c->cf.cf2, glyphID, index );    return TTO_Err_Invalid_SubTable_Format;  }  /*************************************   * Class Definition related functions   *************************************/  /* ClassDefFormat1 */  static FT_Error  Load_ClassDef1( TTO_ClassDefinition*  cd,                                   FT_UShort             limit,				   FT_Stream             stream )  {    FT_Error   error;    FT_Memory  memory = stream->memory;    FT_UShort             n, count;    FT_UShort*            cva;    FT_Bool*              d;    TTO_ClassDefFormat1*  cdf1;    cdf1 = &cd->cd.cd1;    if ( ACCESS_Frame( 4L ) )      return error;    cdf1->StartGlyph         = GET_UShort();    count = cdf1->GlyphCount = GET_UShort();    FORGET_Frame();    /* sanity check; we are limited to 16bit integers */    if ( cdf1->StartGlyph + (long)count >= 0x10000L )      return TTO_Err_Invalid_SubTable;    cdf1->ClassValueArray = NULL;    if ( ALLOC_ARRAY( cdf1->ClassValueArray, count, FT_UShort ) )      return error;    d   = cd->Defined;    cva = cdf1->ClassValueArray;    if ( ACCESS_Frame( count * 2L ) )      goto Fail;    for ( n = 0; n < count; n++ )    {      cva[n] = GET_UShort();      if ( cva[n] >= limit )      {        error = TTO_Err_Invalid_SubTable;        goto Fail;      }      d[cva[n]] = TRUE;    }    FORGET_Frame();    return TT_Err_Ok;  Fail:    FREE( cva );    return error;  }  static void  Free_ClassDef1( TTO_ClassDefFormat1*  cdf1,			       FT_Memory             memory )  {    FREE( cdf1->ClassValueArray );  }  /* ClassDefFormat2 */  static FT_Error  Load_ClassDef2( TTO_ClassDefinition*  cd,                                   FT_UShort             limit,				   FT_Stream             stream )  {    FT_Error   error;    FT_Memory  memory = stream->memory;    FT_UShort              n, count;    TTO_ClassRangeRecord*  crr;    FT_Bool*               d;    TTO_ClassDefFormat2*   cdf2;    cdf2 = &cd->cd.cd2;    if ( ACCESS_Frame( 2L ) )      return error;    count = cdf2->ClassRangeCount = GET_UShort();    FORGET_Frame();    cdf2->ClassRangeRecord = NULL;    if ( ALLOC_ARRAY( cdf2->ClassRangeRecord, count, TTO_ClassRangeRecord ) )      return error;    d   = cd->Defined;    crr = cdf2->ClassRangeRecord;    if ( ACCESS_Frame( count * 6L ) )      goto Fail;    for ( n = 0; n < count; n++ )    {      crr[n].Start = GET_UShort();      crr[n].End   = GET_UShort();      crr[n].Class = GET_UShort();      /* sanity check */      if ( crr[n].Start > crr[n].End ||           crr[n].Class >= limit )      {        error = TTO_Err_Invalid_SubTable;        goto Fail;      }      d[crr[n].Class] = TRUE;    }    FORGET_Frame();    return TT_Err_Ok;  Fail:    FREE( crr );    return error;  }  static void  Free_ClassDef2( TTO_ClassDefFormat2*  cdf2,			       FT_Memory             memory )  {    FREE( cdf2->ClassRangeRecord );  }  /* ClassDefinition */  FT_Error  Load_ClassDefinition( TTO_ClassDefinition*  cd,                                  FT_UShort             limit,				  FT_Stream             stream )  {    FT_Error   error;    FT_Memory  memory = stream->memory;    if ( ALLOC_ARRAY( cd->Defined, limit, FT_Bool ) )      return error;    if ( ACCESS_Frame( 2L ) )      goto Fail;    cd->ClassFormat = GET_UShort();    FORGET_Frame();    switch ( cd->ClassFormat )    {    case 1:      error = Load_ClassDef1( cd, limit, stream );      break;    case 2:      error = Load_ClassDef2( cd, limit, stream );      break;    default:      error = TTO_Err_Invalid_SubTable_Format;      break;    }    if ( error )      goto Fail;    cd->loaded = TRUE;    return TT_Err_Ok;  Fail:    FREE( cd->Defined );    return error;  }  FT_Error  Load_EmptyClassDefinition( TTO_ClassDefinition*  cd,				       FT_Stream             stream )  {    FT_Error   error;    FT_Memory  memory = stream->memory;    if ( ALLOC_ARRAY( cd->Defined, 1, FT_Bool ) )      return error;    cd->ClassFormat = 1; /* Meaningless */    cd->Defined[0] = FALSE;    if ( ALLOC_ARRAY( cd->cd.cd1.ClassValueArray, 1, FT_UShort ) )      goto Fail;    return TT_Err_Ok;  Fail:    FREE( cd->Defined );    return error;  }  void  Free_ClassDefinition( TTO_ClassDefinition*  cd,			      FT_Memory             memory )  {    if ( !cd->loaded )      return;    FREE( cd->Defined );    switch ( cd->ClassFormat )    {    case 1:      Free_ClassDef1( &cd->cd.cd1, memory );      break;    case 2:      Free_ClassDef2( &cd->cd.cd2, memory );      break;    }  }  static inline FT_Error  Get_Class1( TTO_ClassDefFormat1*  cdf1,                               FT_UShort             glyphID,                               FT_UShort*            klass,                               FT_UShort*            index )  {    if (index)      *index = 0;    if ( glyphID >= cdf1->StartGlyph &&         glyphID <= cdf1->StartGlyph + cdf1->GlyphCount )    {      *klass = cdf1->ClassValueArray[glyphID - cdf1->StartGlyph];      return TT_Err_Ok;    }    *klass = 0;    return TTO_Err_Not_Covered;  }  /* we need the index value of the last searched class range record     in case of failure for constructed GDEF tables                  */  static inline FT_Error  Get_Class2( TTO_ClassDefFormat2*  cdf2,                               FT_UShort             glyphID,                               FT_UShort*            klass,                               FT_UShort*            index )  {    FT_Error               error = TTO_Err_Not_Covered;    int              min, max, middle;    TTO_ClassRangeRecord*  crr = cdf2->ClassRangeRecord;    *klass = 0;    /* binary search */    min = 0;    max = cdf2->ClassRangeCount - 1;    do    {      /* we use (min + max) / 2 = max - (max - min) / 2  to avoid         overflow and rounding errors                             */      middle = max - ( ( max - min ) >> 1 );      if ( glyphID >= crr[middle].Start && glyphID <= crr[middle].End )      {        *klass = crr[middle].Class;        return TT_Err_Ok;      }      else if ( glyphID < crr[middle].Start )      {        max = middle - 1;      }      else      {        min = middle + 1;      }    } while ( min <= max );    *klass = 0;    if ( index )      *index = middle;    return error;  }  inline FT_Error  Get_Class( TTO_ClassDefinition*  cd,                       FT_UShort             glyphID,                       FT_UShort*            klass,                       FT_UShort*            index )  {    if ( cd->ClassFormat == 1 )      return Get_Class1( &cd->cd.cd1, glyphID, klass, index );    else if ( cd->ClassFormat == 2 )      return Get_Class2( &cd->cd.cd2, glyphID, klass, index );    return TTO_Err_Invalid_SubTable_Format;  }  /***************************   * Device related functions   ***************************/  FT_Error  Load_Device( TTO_Device*  d,			 FT_Stream    stream )  {    FT_Error   error;    FT_Memory  memory = stream->memory;    FT_UShort   n, count;    FT_UShort*  dv;    if ( ACCESS_Frame( 6L ) )      return error;    d->StartSize   = GET_UShort();    d->EndSize     = GET_UShort();    d->DeltaFormat = GET_UShort();    FORGET_Frame();    if ( d->StartSize > d->EndSize ||         d->DeltaFormat == 0 || d->DeltaFormat > 3 )      return TTO_Err_Invalid_SubTable;    d->DeltaValue = NULL;    count = ( ( d->EndSize - d->StartSize + 1 ) >>                ( 4 - d->DeltaFormat ) ) + 1;    if ( ALLOC_ARRAY( d->DeltaValue, count, FT_UShort ) )      return error;    if ( ACCESS_Frame( count * 2L ) )    {      FREE( d->DeltaValue );      return error;    }    dv = d->DeltaValue;    for ( n = 0; n < count; n++ )      dv[n] = GET_UShort();    FORGET_Frame();    return TT_Err_Ok;  }  void  Free_Device( TTO_Device*  d,		     FT_Memory    memory )  {    FREE( d->DeltaValue );  }  /* Since we have the delta values stored in compressed form, we must     uncompress it now.  To simplify the interface, the function always     returns a meaningful value in `value'; the error is just for     information.                                 |                |     format = 1: 0011223344556677|8899101112131415|...                                 |                |                      byte 1           byte 2       00: (byte >> 14) & mask       11: (byte >> 12) & mask       ...       mask = 0x0003                                 |                |     format = 2: 0000111122223333|4444555566667777|...                                 |                |                      byte 1           byte 2       0000: (byte >> 12) & mask       1111: (byte >>  8) & mask       ...       mask = 0x000F                                 |                |     format = 3: 0000000011111111|2222222233333333|...                                 |                |                      byte 1           byte 2       00000000: (byte >> 8) & mask       11111111: (byte >> 0) & mask       ....       mask = 0x00FF                                    */  FT_Error  Get_Device( TTO_Device*  d,                        FT_UShort    size,                        FT_Short*    value )  {    FT_UShort  byte, bits, mask, f, s;    f = d->DeltaFormat;    if ( d->DeltaValue && size >= d->StartSize && size <= d->EndSize )    {      s    = size - d->StartSize;      byte = d->DeltaValue[s >> ( 4 - f )];      bits = byte >> ( 16 - ( ( s % ( 1 << ( 4 - f ) ) + 1 ) << f ) );      mask = 0xFFFF >> ( 16 - ( 1 << f ) );      *value = (FT_Short)( bits & mask );      /* conversion to a signed value */      if ( *value >= ( ( mask + 1 ) >> 1 ) )        *value -= mask + 1;      return TT_Err_Ok;    }    else    {      *value = 0;      return TTO_Err_Not_Covered;    }  }/* END */

⌨️ 快捷键说明

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