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

📄 cffgload.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 5 页
字号:
            cff_builder_add_point( builder, x, y, 1 );            args += 4;          }          args = stack;          break;        case cff_op_hhcurveto:          FT_TRACE4(( " hhcurveto" ));          if ( cff_builder_start_point( builder, x, y ) )            goto Fail;          args = stack;          if ( num_args & 1 )          {            y += args[0];            args++;            num_args--;          }          if ( num_args % 4 != 0 )            goto Stack_Underflow;          if ( check_points( builder, 3 * ( num_args / 4 ) ) )            goto Fail;          while ( args < decoder->top )          {            x += args[0];            cff_builder_add_point( builder, x, y, 0 );            x += args[1];            y += args[2];            cff_builder_add_point( builder, x, y, 0 );            x += args[3];            cff_builder_add_point( builder, x, y, 1 );            args += 4;          }          args = stack;          break;        case cff_op_vhcurveto:        case cff_op_hvcurveto:          {            FT_Int  phase;            FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto"                                               : " hvcurveto" ));            if ( cff_builder_start_point( builder, x, y ) )              goto Fail;            args = stack;            if ( num_args < 4 || ( num_args % 4 ) > 1 )              goto Stack_Underflow;            if ( check_points( builder, ( num_args / 4 ) * 3 ) )              goto Stack_Underflow;            phase = ( op == cff_op_hvcurveto );            while ( num_args >= 4 )            {              num_args -= 4;              if ( phase )              {                x += args[0];                cff_builder_add_point( builder, x, y, 0 );                x += args[1];                y += args[2];                cff_builder_add_point( builder, x, y, 0 );                y += args[3];                if ( num_args == 1 )                  x += args[4];                cff_builder_add_point( builder, x, y, 1 );              }              else              {                y += args[0];                cff_builder_add_point( builder, x, y, 0 );                x += args[1];                y += args[2];                cff_builder_add_point( builder, x, y, 0 );                x += args[3];                if ( num_args == 1 )                  y += args[4];                cff_builder_add_point( builder, x, y, 1 );              }              args  += 4;              phase ^= 1;            }            args = stack;          }          break;        case cff_op_rlinecurve:          {            FT_Int  num_lines = ( num_args - 6 ) / 2;            FT_TRACE4(( " rlinecurve" ));            if ( num_args < 8 || ( num_args - 6 ) & 1 )              goto Stack_Underflow;            if ( cff_builder_start_point( builder, x, y ) ||                 check_points( builder, num_lines + 3 )   )              goto Fail;            args = stack;            /* first, add the line segments */            while ( num_lines > 0 )            {              x += args[0];              y += args[1];              cff_builder_add_point( builder, x, y, 1 );              args += 2;              num_lines--;            }            /* then the curve */            x += args[0];            y += args[1];            cff_builder_add_point( builder, x, y, 0 );            x += args[2];            y += args[3];            cff_builder_add_point( builder, x, y, 0 );            x += args[4];            y += args[5];            cff_builder_add_point( builder, x, y, 1 );            args = stack;          }          break;        case cff_op_rcurveline:          {            FT_Int  num_curves = ( num_args - 2 ) / 6;            FT_TRACE4(( " rcurveline" ));            if ( num_args < 8 || ( num_args - 2 ) % 6 )              goto Stack_Underflow;            if ( cff_builder_start_point ( builder, x, y ) ||                 check_points( builder, num_curves*3 + 2 ) )              goto Fail;            args = stack;            /* first, add the curves */            while ( num_curves > 0 )            {              x += args[0];              y += args[1];              cff_builder_add_point( builder, x, y, 0 );              x += args[2];              y += args[3];              cff_builder_add_point( builder, x, y, 0 );              x += args[4];              y += args[5];              cff_builder_add_point( builder, x, y, 1 );              args += 6;              num_curves--;            }            /* then the final line */            x += args[0];            y += args[1];            cff_builder_add_point( builder, x, y, 1 );            args = stack;          }          break;        case cff_op_hflex1:          {            FT_Pos start_y;            FT_TRACE4(( " hflex1" ));            args = stack;            /* adding five more points; 4 control points, 1 on-curve point */            /* make sure we have enough space for the start point if it    */            /* needs to be added                                           */            if ( cff_builder_start_point( builder, x, y ) ||                 check_points( builder, 6 )               )              goto Fail;            /* Record the starting point's y position for later use */            start_y = y;            /* first control point */            x += args[0];            y += args[1];            cff_builder_add_point( builder, x, y, 0 );            /* second control point */            x += args[2];            y += args[3];            cff_builder_add_point( builder, x, y, 0 );            /* join point; on curve, with y-value the same as the last */            /* control point's y-value                                 */            x += args[4];            cff_builder_add_point( builder, x, y, 1 );            /* third control point, with y-value the same as the join */            /* point's y-value                                        */            x += args[5];            cff_builder_add_point( builder, x, y, 0 );            /* fourth control point */            x += args[6];            y += args[7];            cff_builder_add_point( builder, x, y, 0 );            /* ending point, with y-value the same as the start   */            x += args[8];            y  = start_y;            cff_builder_add_point( builder, x, y, 1 );            args = stack;            break;          }        case cff_op_hflex:          {            FT_Pos start_y;            FT_TRACE4(( " hflex" ));            args = stack;            /* adding six more points; 4 control points, 2 on-curve points */            if ( cff_builder_start_point( builder, x, y ) ||                 check_points( builder, 6 )               )              goto Fail;            /* record the starting point's y-position for later use */            start_y = y;            /* first control point */            x += args[0];            cff_builder_add_point( builder, x, y, 0 );            /* second control point */            x += args[1];            y += args[2];            cff_builder_add_point( builder, x, y, 0 );            /* join point; on curve, with y-value the same as the last */            /* control point's y-value                                 */            x += args[3];            cff_builder_add_point( builder, x, y, 1 );            /* third control point, with y-value the same as the join */            /* point's y-value                                        */            x += args[4];            cff_builder_add_point( builder, x, y, 0 );            /* fourth control point */            x += args[5];            y  = start_y;            cff_builder_add_point( builder, x, y, 0 );            /* ending point, with y-value the same as the start point's */            /* y-value -- we don't add this point, though               */            x += args[6];            cff_builder_add_point( builder, x, y, 1 );            args = stack;            break;          }        case cff_op_flex1:          {            FT_Pos    start_x, start_y; /* record start x, y values for */                                        /* alter use                                */            FT_Fixed  dx = 0, dy = 0;   /* used in horizontal/vertical  */                                        /* algorithm below              */            FT_Int    horizontal, count;            FT_TRACE4(( " flex1" ));            /* adding six more points; 4 control points, 2 on-curve points */            if ( cff_builder_start_point( builder, x, y ) ||                 check_points( builder, 6 )               )              goto Fail;            /* record the starting point's x, y position for later use */            start_x = x;            start_y = y;            /* XXX: figure out whether this is supposed to be a horizontal */            /*      or vertical flex; the Type 2 specification is vague... */            args = stack;            /* grab up to the last argument */            for ( count = 5; count > 0; count-- )            {              dx += args[0];              dy += args[1];              args += 2;            }            /* rewind */            args = stack;            if ( dx < 0 ) dx = -dx;            if ( dy < 0 ) dy = -dy;            /* strange test, but here it is... */            horizontal = ( dx > dy );            for ( count = 5; count > 0; count-- )            {              x += args[0];              y += args[1];              cff_builder_add_point( builder, x, y, (FT_Bool)( count == 3 ) );              args += 2;            }            /* is last operand an x- or y-delta? */            if ( horizontal )            {              x += args[0];              y  = start_y;            }            else            {              x  = start_x;              y += args[0];            }            cff_builder_add_point( builder, x, y, 1 );            args = stack;            break;           }        case cff_op_flex:          {            FT_UInt  count;            FT_TRACE4(( " flex" ));            if ( cff_builder_start_point( builder, x, y ) ||                 check_points( builder, 6 )               )              goto Fail;            args = stack;            for ( count = 6; count > 0; count-- )            {              x += args[0];              y += args[1];              cff_builder_add_point( builder, x, y,                                     (FT_Bool)( count == 4 || count == 1 ) );              args += 2;            }            args = stack;          }          break;        case cff_op_endchar:          FT_TRACE4(( " endchar" ));          /* We are going to emulate the seac operator. */          if ( num_args == 4 )          {            /* Save glyph width so that the subglyphs don't overwrite it. */            FT_Pos  glyph_width = decoder->glyph_width;            error = cff_operator_seac( decoder,                                       args[0],                                       args[1],                                       (FT_Int)( args[2] >> 16 ),                                       (FT_Int)( args[3] >> 16 ) );            args += 4;            decoder->glyph_width = glyph_width;          }          else          {            if ( !error )              error = CFF_Err_Ok;            cff_builder_close_contour( builder );            /* close hints recording session */            if ( hinter )            {              if ( hinter->close( hinter->hints,                                  builder->current->n_points ) )                goto Syntax_Error;              /* apply hints to the loaded glyph outline now */              hinter->apply( hinter->hints,                             builder->current,                             (PSH_Globals)builder->hints_globals,                             decoder->hint_mode );            }            /* add current outline to the glyph slot */            FT_GlyphLoader_Add( builder->loader );          }          /* return now! */          FT_TRACE4(( "\n\n" ));          return error;        case cff_op_abs:          FT_TRACE4(( " abs" ));          if ( args[0] < 0 )            args[0] = -args[0];          args++;          break;        case cff_op_add:          FT_TRACE4(( " add" ));          args[0] += args[1];          args++;          break;        case cff_op_sub:          FT_TRACE4(( " sub" ));          args[0] -= args[1];          args++;          break;        case cff_op_div:          FT_TRACE4(( " div" ));          args[0] = FT_DivFix( args[0], args[1] );          args++;          break;        case cff_op_neg:          FT_TRACE4(( " neg" ));          args[0] = -args[0];          args++;          break;        case cff_op_random:          {            FT_Fixed  Rand;

⌨️ 快捷键说明

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