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

📄 cffgload.c

📁 下载来的一个看图软件的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
            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 );            y += args[3];            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 Memory_Error;          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 Memory_Error;          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 Memory_Error;            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 Memory_Error;            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 Memory_Error;            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 Memory_Error;            /* Record the starting point's y postion 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 Memory_Error;            /* 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_Int  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 Memory_Error;            /* record the starting point's x, y postion 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 += (FT_Int)args[0];              dy += (FT_Int)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 Memory_Error;            args = stack;            for ( count = 6; count > 0; count-- )            {              x += args[0];              y += args[1];              cff_builder_add_point( builder, x, y,                                     (FT_Bool)( count == 3 || count == 0 ) );              args += 2;            }            args = stack;          }          break;        case cff_op_endchar:          FT_TRACE4(( " endchar" ));          /* We are going to emulate the seac operator. */          if ( num_args == 4 )          {            error = cff_operator_seac( decoder,                                       args[0] >> 16,                                       args[1] >> 16,                                       (FT_Int)( args[2] >> 16 ),                                       (FT_Int)( args[3] >> 16 ) );            args += 4;          }          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 + -