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

📄 ttgload.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        /* exit states: Load_Glyph                                  */        /*                                                          */      case Load_Composite:        /* create a new element on the stack */        load_top++;        if ( load_top > face->maxComponents )        {          error = TT_Err_Invalid_Composite;          goto Fail;        }        subglyph2 = exec->loadStack + load_top;        Init_Glyph_Component( subglyph2, subglyph, NULL );        subglyph2->is_hinted = subglyph->is_hinted;        /* now read composite header */        if ( ACCESS_Frame( 4L ) )          goto Fail_File;        subglyph->element_flag = new_flags = GET_UShort();        subglyph2->index = GET_UShort();        FORGET_Frame();        k = 1 + 1;        if ( new_flags & ARGS_ARE_WORDS )          k *= 2;        if ( new_flags & WE_HAVE_A_SCALE )          k += 2;        else if ( new_flags & WE_HAVE_AN_XY_SCALE )          k += 4;        else if ( new_flags & WE_HAVE_A_2X2 )          k += 8;        if ( ACCESS_Frame( k ) )          goto Fail_File;        if ( new_flags & ARGS_ARE_WORDS )        {          k = GET_Short();          l = GET_Short();        }        else        {          k = GET_Char();          l = GET_Char();        }        subglyph->arg1 = k;        subglyph->arg2 = l;        if ( new_flags & ARGS_ARE_XY_VALUES )        {          subglyph->transform.ox = k;          subglyph->transform.oy = l;        }        xx = 1L << 16;        xy = 0;        yx = 0;        yy = 1L << 16;        if ( new_flags & WE_HAVE_A_SCALE )        {          xx = (Fixed)GET_Short() << 2;          yy = xx;          subglyph2->is_scaled = TRUE;        }        else if ( new_flags & WE_HAVE_AN_XY_SCALE )        {          xx = (Fixed)GET_Short() << 2;          yy = (Fixed)GET_Short() << 2;          subglyph2->is_scaled = TRUE;        }        else if ( new_flags & WE_HAVE_A_2X2 )        {          xx = (Fixed)GET_Short() << 2;          xy = (Fixed)GET_Short() << 2;          yx = (Fixed)GET_Short() << 2;          yy = (Fixed)GET_Short() << 2;          subglyph2->is_scaled = TRUE;        }        FORGET_Frame();        subglyph->transform.xx = xx;        subglyph->transform.xy = xy;        subglyph->transform.yx = yx;        subglyph->transform.yy = yy;        k = TT_MulFix( xx, yy ) -  TT_MulFix( xy, yx );        /* disable hinting in case of scaling/slanting */        if ( ABS( k ) != (1L << 16) )          subglyph2->is_hinted = FALSE;        subglyph->file_offset = FILE_Pos();        phase = Load_Glyph;        break;        /************************************************************/        /*                                                          */        /* Load_End state                                           */        /*                                                          */        /*   after loading a glyph, apply transformation and offset */        /*   where necessary, pops element and continue or          */        /*   stop process.                                          */        /*                                                          */        /* exit states : Load_Composite and Load_Exit               */        /*                                                          */      case Load_End:        if ( load_top > 0 )        {          subglyph2 = subglyph;          load_top--;          subglyph = exec->loadStack + load_top;          /* check advance width and left side bearing */          if ( !subglyph->preserve_pps &&               subglyph->element_flag & USE_MY_METRICS )          {            subglyph->metrics.horiBearingX = subglyph2->metrics.horiBearingX;            subglyph->metrics.horiAdvance  = subglyph2->metrics.horiAdvance;            subglyph->pp1 = subglyph2->pp1;            subglyph->pp2 = subglyph2->pp2;            subglyph->preserve_pps = TRUE;          }          /* apply scale */          if ( subglyph2->is_scaled )          {            TT_Vector*  cur = subglyph2->zone.cur;            TT_Vector*  org = subglyph2->zone.org;            for ( u = 0; u < num_points; u++ )            {              nx = TT_MulFix( cur->x, subglyph->transform.xx ) +                   TT_MulFix( cur->y, subglyph->transform.yx );              ny = TT_MulFix( cur->x, subglyph->transform.xy ) +                   TT_MulFix( cur->y, subglyph->transform.yy );              cur->x = nx;              cur->y = ny;              nx = TT_MulFix( org->x, subglyph->transform.xx ) +                   TT_MulFix( org->y, subglyph->transform.yx );              ny = TT_MulFix( org->x, subglyph->transform.xy ) +                   TT_MulFix( org->y, subglyph->transform.yy );              org->x = nx;              org->y = ny;              cur++;              org++;            }          }          /* adjust counts */          num_elem_points = subglyph->zone.n_points;          for ( k = 0; k < num_contours; k++ )            subglyph2->zone.contours[k] += num_elem_points;          subglyph->zone.n_points   += num_points;          subglyph->zone.n_contours += num_contours;          left_points   -= num_points;          left_contours -= num_contours;          if ( !(subglyph->element_flag & ARGS_ARE_XY_VALUES) )          {            /* move second glyph according to control points */            /* the attach points are relative to the specific component */            u = (UShort)subglyph->arg1;            v = (UShort)subglyph->arg2;            if ( u >= num_elem_points ||                 v >= num_points )            {              error = TT_Err_Invalid_Composite;              goto Fail;            }            /* adjust count */            v += num_elem_points;            x = subglyph->zone.cur[u].x - subglyph->zone.cur[v].x;            y = subglyph->zone.cur[u].y - subglyph->zone.cur[v].y;          }          else          {            /* apply offset */            x = subglyph->transform.ox;            y = subglyph->transform.oy;            if ( load_flags & TTLOAD_SCALE_GLYPH )            {              x = Scale_X( &exec->metrics, x );              y = Scale_Y( &exec->metrics, y );              if ( subglyph->element_flag & ROUND_XY_TO_GRID )              {                x = (x+32) & -64;                y = (y+32) & -64;              }            }          }          translate_array( num_points, subglyph2->zone.cur, x, y );          cur_to_org( num_points, &subglyph2->zone );          num_points   = subglyph->zone.n_points;          num_contours = subglyph->zone.n_contours;          /* check for last component */          if ( FILE_Seek( subglyph->file_offset ) )            goto Fail_File;          if ( subglyph->element_flag & MORE_COMPONENTS )            phase = Load_Composite;          else          {            error = Load_Composite_End( num_points,                                        num_contours,                                        exec,                                        subglyph,                                        load_flags,                                        stream );            if ( error )              goto Fail;            phase = Load_End;          }        }        else          phase = Load_Exit;        break;      case Load_Exit:        break;      }    }    /* finally, copy the points arrays to the glyph object */    exec->pts = base_pts;    for ( u = 0; u < num_points + 2; u++ )    {      glyph->outline.points[u] = exec->pts.cur[u];      glyph->outline.flags [u] = exec->pts.touch[u];    }    for ( k = 0; k < num_contours; k++ )      glyph->outline.contours[k] = exec->pts.contours[k];    glyph->outline.n_points    = num_points;    glyph->outline.n_contours  = num_contours;    glyph->outline.second_pass = TRUE;    /* translate array so that (0,0) is the glyph's origin */    translate_array( num_points + 2,                     glyph->outline.points,                     -subglyph->pp1.x,                     0 );    TT_Get_Outline_BBox( &glyph->outline, &glyph->metrics.bbox );    if ( subglyph->is_hinted )    {      /* grid-fit the bounding box */      glyph->metrics.bbox.xMin &= -64;      glyph->metrics.bbox.yMin &= -64;      glyph->metrics.bbox.xMax  = (glyph->metrics.bbox.xMax+63) & -64;      glyph->metrics.bbox.yMax  = (glyph->metrics.bbox.yMax+63) & -64;    }    /* get the device-independent scaled horizontal metrics */    /* take care of fixed-pitch fonts...                    */    {      TT_Pos  left_bearing;      TT_Pos  advance;      left_bearing = subglyph->metrics.horiBearingX;      advance      = subglyph->metrics.horiAdvance;      if ( face->postscript.isFixedPitch )        advance = face->horizontalHeader.advance_Width_Max;      if ( load_flags & TTLOAD_SCALE_GLYPH )      {        left_bearing = Scale_X( &exec->metrics, left_bearing );        advance      = Scale_X( &exec->metrics, advance      );      }      glyph->metrics.linearHoriBearingX = left_bearing;      glyph->metrics.linearHoriAdvance  = advance;    }    glyph->metrics.horiBearingX = glyph->metrics.bbox.xMin;    glyph->metrics.horiBearingY = glyph->metrics.bbox.yMax;    glyph->metrics.horiAdvance  = subglyph->pp2.x - subglyph->pp1.x;    /* Now take care of vertical metrics.  In the case where there is    */    /* no vertical information within the font (relatively common), make */    /* up some metrics `by hand' ...                                     */    {      Short   top_bearing;    /* vertical top side bearing (EM units) */      UShort  advance_height; /* vertical advance height (EM units)   */      TT_Pos  left;     /* scaled vertical left side bearing          */      TT_Pos  Top;      /* scaled original vertical top side bearing  */      TT_Pos  top;      /* scaled vertical top side bearing           */      TT_Pos  advance;  /* scaled vertical advance height             */      /* Get the unscaled `tsb' and `ah' values */      if ( face->verticalInfo                          &&           face->verticalHeader.number_Of_VMetrics > 0 )      {        /* Don't assume that both the vertical header and vertical */        /* metrics are present in the same font :-)                */        TT_Get_Metrics( (TT_Horizontal_Header*)&face->verticalHeader,                        glyph_index,                        &top_bearing,                        &advance_height );      }      else      {        /* Make up the distances from the horizontal header..     */        /* NOTE: The OS/2 values are the only `portable' ones,    */        /*       which is why we use them...                      */        /*                                                        */        /* NOTE2: The sTypoDescender is negative, which is why    */        /*        we compute the baseline-to-baseline distance    */        /*        here with :                                     */        /*             ascender - descender + linegap             */        /*                                                        */        top_bearing    = (Short) (face->os2.sTypoLineGap / 2);        advance_height = (UShort)(face->os2.sTypoAscender -                                  face->os2.sTypoDescender +                                  face->os2.sTypoLineGap);      }      /* We must adjust the top_bearing value from the bounding box given         in the glyph header to te bounding box calculated with         TT_Get_Outline_BBox()                                            */      /* scale the metrics */      if ( load_flags & TTLOAD_SCALE_GLYPH )      {        Top     = Scale_Y( &exec->metrics, top_bearing );        top     = Scale_Y( &exec->metrics,                           top_bearing + subglyph->metrics.bbox.yMax ) -                    glyph->metrics.bbox.yMax;        advance = Scale_Y( &exec->metrics, advance_height );      }      else      {        Top     = top_bearing;        top     = top_bearing + subglyph->metrics.bbox.yMax -                    glyph->metrics.bbox.yMax;        advance = advance_height;      }      glyph->metrics.linearVertBearingY = Top;      glyph->metrics.linearVertAdvance  = advance;      /* XXX : for now, we have no better algo for the lsb, but it should */      /*       work ok..                                                  */      /*                                                                  */      left = ( glyph->metrics.bbox.xMin - glyph->metrics.bbox.xMax ) / 2;      /* grid-fit them if necessary */      if ( subglyph->is_hinted )      {        left   &= -64;        top     = (top + 63) & -64;        advance = (advance + 32) & -64;      }      glyph->metrics.vertBearingX = left;      glyph->metrics.vertBearingY = top;      glyph->metrics.vertAdvance  = advance;    }    /* Adjust advance width to the value contained in the hdmx table. */    if ( !exec->face->postscript.isFixedPitch && instance &&         subglyph->is_hinted )    {      widths = Get_Advance_Widths( exec->face,                                   exec->instance->metrics.x_ppem );      if ( widths )        glyph->metrics.horiAdvance = widths[glyph_index] << 6;    }    glyph->outline.dropout_mode = (Char)exec->GS.scan_type;    error = TT_Err_Ok;  Fail_File:  Fail:    DONE_Stream( stream );  Fin:    /* reset the execution context */    exec->pts = base_pts;    if ( !instance || !instance->debug )      Done_Context( exec );    return error;  }/* END */

⌨️ 快捷键说明

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