Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: third_party/freetype/src/smooth/ftgrays.c

Issue 815103002: Update freetype to 2.5.4. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Adjust GYP and GN Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/freetype/src/smooth/ftgrays.h ('k') | third_party/freetype/src/smooth/ftsmerrs.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /***************************************************************************/ 1 /***************************************************************************/
2 /* */ 2 /* */
3 /* ftgrays.c */ 3 /* ftgrays.c */
4 /* */ 4 /* */
5 /* A new `perfect' anti-aliasing renderer (body). */ 5 /* A new `perfect' anti-aliasing renderer (body). */
6 /* */ 6 /* */
7 /* Copyright 2000-2003, 2005-2013 by */ 7 /* Copyright 2000-2003, 2005-2014 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
9 /* */ 9 /* */
10 /* This file is part of the FreeType project, and may only be used, */ 10 /* This file is part of the FreeType project, and may only be used, */
11 /* modified, and distributed under the terms of the FreeType project */ 11 /* modified, and distributed under the terms of the FreeType project */
12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
13 /* this file you indicate that you have read the license and */ 13 /* this file you indicate that you have read the license and */
14 /* understand and accept it fully. */ 14 /* understand and accept it fully. */
15 /* */ 15 /* */
16 /***************************************************************************/ 16 /***************************************************************************/
17 17
18 /*************************************************************************/ 18 /*************************************************************************/
19 /* */ 19 /* */
20 /* This file can be compiled without the rest of the FreeType engine, by */ 20 /* This file can be compiled without the rest of the FreeType engine, by */
21 /* defining the _STANDALONE_ macro when compiling it. You also need to */ 21 /* defining the _STANDALONE_ macro when compiling it. You also need to */
22 /* put the files `ftgrays.h' and `ftimage.h' into the current */ 22 /* put the files `ftgrays.h' and `ftimage.h' into the current */
23 /* compilation directory. Typically, you could do something like */ 23 /* compilation directory. Typically, you could do something like */
24 /* */ 24 /* */
25 /* - copy `src/smooth/ftgrays.c' (this file) to your current directory */ 25 /* - copy `src/smooth/ftgrays.c' (this file) to your current directory */
26 /* */ 26 /* */
27 /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */ 27 /* - copy `include/ftimage.h' and `src/smooth/ftgrays.h' to the same */
28 /* same directory */ 28 /* directory */
29 /* */ 29 /* */
30 /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in */ 30 /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in */
31 /* */ 31 /* */
32 /* cc -c -D_STANDALONE_ ftgrays.c */ 32 /* cc -c -D_STANDALONE_ ftgrays.c */
33 /* */ 33 /* */
34 /* The renderer can be initialized with a call to */ 34 /* The renderer can be initialized with a call to */
35 /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated */ 35 /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated */
36 /* with a call to `ft_gray_raster.raster_render'. */ 36 /* with a call to `ft_gray_raster.raster_render'. */
37 /* */ 37 /* */
38 /* See the comments and documentation in the file `ftimage.h' for more */ 38 /* See the comments and documentation in the file `ftimage.h' for more */
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 #define FT_COMPONENT trace_smooth 91 #define FT_COMPONENT trace_smooth
92 92
93 93
94 #ifdef _STANDALONE_ 94 #ifdef _STANDALONE_
95 95
96 96
97 /* Auxiliary macros for token concatenation. */ 97 /* Auxiliary macros for token concatenation. */
98 #define FT_ERR_XCAT( x, y ) x ## y 98 #define FT_ERR_XCAT( x, y ) x ## y
99 #define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) 99 #define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y )
100 100
101 #define FT_BEGIN_STMNT do {
102 #define FT_END_STMNT } while ( 0 )
103
101 104
102 /* define this to dump debugging information */ 105 /* define this to dump debugging information */
103 /* #define FT_DEBUG_LEVEL_TRACE */ 106 /* #define FT_DEBUG_LEVEL_TRACE */
104 107
105 108
106 #ifdef FT_DEBUG_LEVEL_TRACE 109 #ifdef FT_DEBUG_LEVEL_TRACE
107 #include <stdio.h> 110 #include <stdio.h>
108 #include <stdarg.h> 111 #include <stdarg.h>
109 #endif 112 #endif
110 113
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 raster_reset_, \ 230 raster_reset_, \
228 raster_set_mode_, \ 231 raster_set_mode_, \
229 raster_render_, \ 232 raster_render_, \
230 raster_done_ \ 233 raster_done_ \
231 }; 234 };
232 235
233 236
234 #else /* !_STANDALONE_ */ 237 #else /* !_STANDALONE_ */
235 238
236 239
237 #include "../../include/ft2build.h" 240 #include <ft2build.h>
238 #include "ftgrays.h" 241 #include "ftgrays.h"
239 #include "../../include/freetype/internal/ftobjs.h" 242 #include FT_INTERNAL_OBJECTS_H
240 #include "../../include/freetype/internal/ftdebug.h" 243 #include FT_INTERNAL_DEBUG_H
241 #include "../../include/freetype/ftoutln.h" 244 #include FT_OUTLINE_H
242 245
243 #include "ftsmerrs.h" 246 #include "ftsmerrs.h"
244 247
245 #include "ftspic.h" 248 #include "ftspic.h"
246 249
247 #define Smooth_Err_Invalid_Mode Smooth_Err_Cannot_Render_Glyph 250 #define Smooth_Err_Invalid_Mode Smooth_Err_Cannot_Render_Glyph
248 #define Smooth_Err_Memory_Overflow Smooth_Err_Out_Of_Memory 251 #define Smooth_Err_Memory_Overflow Smooth_Err_Out_Of_Memory
249 #define ErrRaster_Memory_Overflow Smooth_Err_Out_Of_Memory 252 #define ErrRaster_Memory_Overflow Smooth_Err_Out_Of_Memory
250 253
251 254
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 306
304 #if PIXEL_BITS >= 6 307 #if PIXEL_BITS >= 6
305 #define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) ) 308 #define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) )
306 #define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) ) 309 #define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) )
307 #else 310 #else
308 #define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) ) 311 #define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) )
309 #define DOWNSCALE( x ) ( (x) << ( 6 - PIXEL_BITS ) ) 312 #define DOWNSCALE( x ) ( (x) << ( 6 - PIXEL_BITS ) )
310 #endif 313 #endif
311 314
312 315
316 /* Compute `dividend / divisor' and return both its quotient and */
317 /* remainder, cast to a specific type. This macro also ensures that */
318 /* the remainder is always positive. */
319 #define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \
320 FT_BEGIN_STMNT \
321 (quotient) = (type)( (dividend) / (divisor) ); \
322 (remainder) = (type)( (dividend) % (divisor) ); \
323 if ( (remainder) < 0 ) \
324 { \
325 (quotient)--; \
326 (remainder) += (type)(divisor); \
327 } \
328 FT_END_STMNT
329
330 #ifdef __arm__
331 /* Work around a bug specific to GCC which make the compiler fail to */
332 /* optimize a division and modulo operation on the same parameters */
333 /* into a single call to `__aeabi_idivmod'. See */
334 /* */
335 /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43721 */
336 #undef FT_DIV_MOD
337 #define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \
338 FT_BEGIN_STMNT \
339 (quotient) = (type)( (dividend) / (divisor) ); \
340 (remainder) = (type)( (dividend) - (quotient) * (divisor) ); \
341 if ( (remainder) < 0 ) \
342 { \
343 (quotient)--; \
344 (remainder) += (type)(divisor); \
345 } \
346 FT_END_STMNT
347 #endif /* __arm__ */
348
349
313 /*************************************************************************/ 350 /*************************************************************************/
314 /* */ 351 /* */
315 /* TYPE DEFINITIONS */ 352 /* TYPE DEFINITIONS */
316 /* */ 353 /* */
317 354
318 /* don't change the following types to FT_Int or FT_Pos, since we might */ 355 /* don't change the following types to FT_Int or FT_Pos, since we might */
319 /* need to define them to "float" or "double" when experimenting with */ 356 /* need to define them to "float" or "double" when experimenting with */
320 /* new algorithms */ 357 /* new algorithms */
321 358
322 typedef long TCoord; /* integer scanline/pixel coordinate */ 359 typedef long TCoord; /* integer scanline/pixel coordinate */
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 *pcell = cell; 578 *pcell = cell;
542 579
543 Exit: 580 Exit:
544 return cell; 581 return cell;
545 } 582 }
546 583
547 584
548 static void 585 static void
549 gray_record_cell( RAS_ARG ) 586 gray_record_cell( RAS_ARG )
550 { 587 {
551 if ( !ras.invalid && ( ras.area | ras.cover ) ) 588 if ( ras.area | ras.cover )
552 { 589 {
553 PCell cell = gray_find_cell( RAS_VAR ); 590 PCell cell = gray_find_cell( RAS_VAR );
554 591
555 592
556 cell->area += ras.area; 593 cell->area += ras.area;
557 cell->cover += ras.cover; 594 cell->cover += ras.cover;
558 } 595 }
559 } 596 }
560 597
561 598
(...skipping 28 matching lines...) Expand all
590 627
591 /* are we moving to a different cell ? */ 628 /* are we moving to a different cell ? */
592 if ( ex != ras.ex || ey != ras.ey ) 629 if ( ex != ras.ex || ey != ras.ey )
593 { 630 {
594 /* record the current one if it is valid */ 631 /* record the current one if it is valid */
595 if ( !ras.invalid ) 632 if ( !ras.invalid )
596 gray_record_cell( RAS_VAR ); 633 gray_record_cell( RAS_VAR );
597 634
598 ras.area = 0; 635 ras.area = 0;
599 ras.cover = 0; 636 ras.cover = 0;
637 ras.ex = ex;
638 ras.ey = ey;
600 } 639 }
601 640
602 ras.ex = ex;
603 ras.ey = ey;
604 ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey || 641 ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey ||
605 ex >= ras.count_ex ); 642 ex >= ras.count_ex );
606 } 643 }
607 644
608 645
609 /*************************************************************************/ 646 /*************************************************************************/
610 /* */ 647 /* */
611 /* Start a new contour at a given cell. */ 648 /* Start a new contour at a given cell. */
612 /* */ 649 /* */
613 static void 650 static void
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 incr = 1; 716 incr = 1;
680 717
681 if ( dx < 0 ) 718 if ( dx < 0 )
682 { 719 {
683 p = fx1 * ( y2 - y1 ); 720 p = fx1 * ( y2 - y1 );
684 first = 0; 721 first = 0;
685 incr = -1; 722 incr = -1;
686 dx = -dx; 723 dx = -dx;
687 } 724 }
688 725
689 delta = (TCoord)( p / dx ); 726 FT_DIV_MOD( TCoord, p, dx, delta, mod );
690 mod = (TCoord)( p % dx );
691 if ( mod < 0 )
692 {
693 delta--;
694 mod += (TCoord)dx;
695 }
696 727
697 ras.area += (TArea)(( fx1 + first ) * delta); 728 ras.area += (TArea)(( fx1 + first ) * delta);
698 ras.cover += delta; 729 ras.cover += delta;
699 730
700 ex1 += incr; 731 ex1 += incr;
701 gray_set_cell( RAS_VAR_ ex1, ey ); 732 gray_set_cell( RAS_VAR_ ex1, ey );
702 y1 += delta; 733 y1 += delta;
703 734
704 if ( ex1 != ex2 ) 735 if ( ex1 != ex2 )
705 { 736 {
706 TCoord lift, rem; 737 TCoord lift, rem;
707 738
708 739
709 p = ONE_PIXEL * ( y2 - y1 + delta ); 740 p = ONE_PIXEL * ( y2 - y1 + delta );
710 lift = (TCoord)( p / dx ); 741 FT_DIV_MOD( TCoord, p, dx, lift, rem );
711 rem = (TCoord)( p % dx );
712 if ( rem < 0 )
713 {
714 lift--;
715 rem += (TCoord)dx;
716 }
717 742
718 mod -= (int)dx; 743 mod -= (int)dx;
719 744
720 while ( ex1 != ex2 ) 745 while ( ex1 != ex2 )
721 { 746 {
722 delta = lift; 747 delta = lift;
723 mod += rem; 748 mod += rem;
724 if ( mod >= 0 ) 749 if ( mod >= 0 )
725 { 750 {
726 mod -= (TCoord)dx; 751 mod -= (TCoord)dx;
(...skipping 29 matching lines...) Expand all
756 781
757 782
758 ey1 = TRUNC( ras.last_ey ); 783 ey1 = TRUNC( ras.last_ey );
759 ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */ 784 ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */
760 fy1 = (TCoord)( ras.y - ras.last_ey ); 785 fy1 = (TCoord)( ras.y - ras.last_ey );
761 fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) ); 786 fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) );
762 787
763 dx = to_x - ras.x; 788 dx = to_x - ras.x;
764 dy = to_y - ras.y; 789 dy = to_y - ras.y;
765 790
766 /* XXX: we should do something about the trivial case where dx == 0, */
767 /* as it happens very often! */
768
769 /* perform vertical clipping */ 791 /* perform vertical clipping */
770 { 792 {
771 TCoord min, max; 793 TCoord min, max;
772 794
773 795
774 min = ey1; 796 min = ey1;
775 max = ey2; 797 max = ey2;
776 if ( ey1 > ey2 ) 798 if ( ey1 > ey2 )
777 { 799 {
778 min = ey2; 800 min = ey2;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
837 incr = 1; 859 incr = 1;
838 860
839 if ( dy < 0 ) 861 if ( dy < 0 )
840 { 862 {
841 p = fy1 * dx; 863 p = fy1 * dx;
842 first = 0; 864 first = 0;
843 incr = -1; 865 incr = -1;
844 dy = -dy; 866 dy = -dy;
845 } 867 }
846 868
847 delta = (int)( p / dy ); 869 FT_DIV_MOD( int, p, dy, delta, mod );
848 mod = (int)( p % dy );
849 if ( mod < 0 )
850 {
851 delta--;
852 mod += (TCoord)dy;
853 }
854 870
855 x = ras.x + delta; 871 x = ras.x + delta;
856 gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first ); 872 gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first );
857 873
858 ey1 += incr; 874 ey1 += incr;
859 gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); 875 gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
860 876
861 if ( ey1 != ey2 ) 877 if ( ey1 != ey2 )
862 { 878 {
863 p = ONE_PIXEL * dx; 879 p = ONE_PIXEL * dx;
864 lift = (int)( p / dy ); 880 FT_DIV_MOD( int, p, dy, lift, rem );
865 rem = (int)( p % dy );
866 if ( rem < 0 )
867 {
868 lift--;
869 rem += (int)dy;
870 }
871 mod -= (int)dy; 881 mod -= (int)dy;
872 882
873 while ( ey1 != ey2 ) 883 while ( ey1 != ey2 )
874 { 884 {
875 delta = lift; 885 delta = lift;
876 mod += rem; 886 mod += rem;
877 if ( mod >= 0 ) 887 if ( mod >= 0 )
878 { 888 {
879 mod -= (int)dy; 889 mod -= (int)dy;
880 delta++; 890 delta++;
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1074 /* F. Hain, at */ 1084 /* F. Hain, at */
1075 /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camer a-ready%20CISST02%202.pdf */ 1085 /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camer a-ready%20CISST02%202.pdf */
1076 1086
1077 { 1087 {
1078 TPos dx, dy, dx_, dy_; 1088 TPos dx, dy, dx_, dy_;
1079 TPos dx1, dy1, dx2, dy2; 1089 TPos dx1, dy1, dx2, dy2;
1080 TPos L, s, s_limit; 1090 TPos L, s, s_limit;
1081 1091
1082 1092
1083 /* dx and dy are x and y components of the P0-P3 chord vector. */ 1093 /* dx and dy are x and y components of the P0-P3 chord vector. */
1084 dx = arc[3].x - arc[0].x; 1094 dx = dx_ = arc[3].x - arc[0].x;
1085 dy = arc[3].y - arc[0].y; 1095 dy = dy_ = arc[3].y - arc[0].y;
1086 1096
1087 /* L is an (under)estimate of the Euclidean distance P0-P3. */ 1097 L = FT_HYPOT( dx_, dy_ );
1088 /* */
1089 /* If dx >= dy, then r = sqrt(dx^2 + dy^2) can be overestimated */
1090 /* with least maximum error by */
1091 /* */
1092 /* r_upperbound = dx + (sqrt(2) - 1) * dy , */
1093 /* */
1094 /* where sqrt(2) - 1 can be (over)estimated by 107/256, giving an */
1095 /* error of no more than 8.4%. */
1096 /* */
1097 /* Similarly, some elementary calculus shows that r can be */
1098 /* underestimated with least maximum error by */
1099 /* */
1100 /* r_lowerbound = sqrt(2 + sqrt(2)) / 2 * dx */
1101 /* + sqrt(2 - sqrt(2)) / 2 * dy . */
1102 /* */
1103 /* 236/256 and 97/256 are (under)estimates of the two algebraic */
1104 /* numbers, giving an error of no more than 8.1%. */
1105
1106 dx_ = FT_ABS( dx );
1107 dy_ = FT_ABS( dy );
1108
1109 /* This is the same as */
1110 /* */
1111 /* L = ( 236 * FT_MAX( dx_, dy_ ) */
1112 /* + 97 * FT_MIN( dx_, dy_ ) ) >> 8; */
1113 L = ( dx_ > dy_ ? 236 * dx_ + 97 * dy_
1114 : 97 * dx_ + 236 * dy_ ) >> 8;
1115 1098
1116 /* Avoid possible arithmetic overflow below by splitting. */ 1099 /* Avoid possible arithmetic overflow below by splitting. */
1117 if ( L > 32767 ) 1100 if ( L > 32767 )
1118 goto Split; 1101 goto Split;
1119 1102
1120 /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */ 1103 /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */
1121 s_limit = L * (TPos)( ONE_PIXEL / 6 ); 1104 s_limit = L * (TPos)( ONE_PIXEL / 6 );
1122 1105
1123 /* s is L * the perpendicular distance from P1 to the line P0-P3. */ 1106 /* s is L * the perpendicular distance from P1 to the line P0-P3. */
1124 dx1 = arc[1].x - arc[0].x; 1107 dx1 = arc[1].x - arc[0].x;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1164 1147
1165 1148
1166 static int 1149 static int
1167 gray_move_to( const FT_Vector* to, 1150 gray_move_to( const FT_Vector* to,
1168 gray_PWorker worker ) 1151 gray_PWorker worker )
1169 { 1152 {
1170 TPos x, y; 1153 TPos x, y;
1171 1154
1172 1155
1173 /* record current cell, if any */ 1156 /* record current cell, if any */
1174 gray_record_cell( RAS_VAR ); 1157 if ( !ras.invalid )
1158 gray_record_cell( RAS_VAR );
1175 1159
1176 /* start to a new position */ 1160 /* start to a new position */
1177 x = UPSCALE( to->x ); 1161 x = UPSCALE( to->x );
1178 y = UPSCALE( to->y ); 1162 y = UPSCALE( to->y );
1179 1163
1180 gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) ); 1164 gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) );
1181 1165
1182 worker->x = x; 1166 worker->x = x;
1183 worker->y = y; 1167 worker->y = y;
1184 return 0; 1168 return 0;
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1349 FT_TRACE7(( "[%d..%d]:%02x ", 1333 FT_TRACE7(( "[%d..%d]:%02x ",
1350 span->x, span->x + span->len - 1, span->coverage )); 1334 span->x, span->x + span->len - 1, span->coverage ));
1351 FT_TRACE7(( "\n" )); 1335 FT_TRACE7(( "\n" ));
1352 } 1336 }
1353 1337
1354 #endif /* FT_DEBUG_LEVEL_TRACE */ 1338 #endif /* FT_DEBUG_LEVEL_TRACE */
1355 1339
1356 ras.num_gray_spans = 0; 1340 ras.num_gray_spans = 0;
1357 ras.span_y = (int)y; 1341 ras.span_y = (int)y;
1358 1342
1359 count = 0;
1360 span = ras.gray_spans; 1343 span = ras.gray_spans;
1361 } 1344 }
1362 else 1345 else
1363 span++; 1346 span++;
1364 » // Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077. 1347
1365 » // Limited to the value range of 'x', we have to crop it for avoid the overflow.
1366 » if (x < 32768) {
1367 /* add a gray span to the current list */ 1348 /* add a gray span to the current list */
1368 span->x = (short)x; 1349 span->x = (short)x;
1369 span->len = (unsigned short)acount; 1350 span->len = (unsigned short)acount;
1370 span->coverage = (unsigned char)coverage; 1351 span->coverage = (unsigned char)coverage;
1371 1352
1372 ras.num_gray_spans++; 1353 ras.num_gray_spans++;
1373 }
1374 } 1354 }
1375 } 1355 }
1376 1356
1377 1357
1378 #ifdef FT_DEBUG_LEVEL_TRACE 1358 #ifdef FT_DEBUG_LEVEL_TRACE
1379 1359
1380 /* to be called while in the debugger -- */ 1360 /* to be called while in the debugger -- */
1381 /* this function causes a compiler warning since it is unused otherwise */ 1361 /* this function causes a compiler warning since it is unused otherwise */
1382 static void 1362 static void
1383 gray_dump_cells( RAS_ARG ) 1363 gray_dump_cells( RAS_ARG )
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1528 int error; 1508 int error;
1529 1509
1530 int n; /* index of contour in outline */ 1510 int n; /* index of contour in outline */
1531 int first; /* index of first point in contour */ 1511 int first; /* index of first point in contour */
1532 char tag; /* current point's state */ 1512 char tag; /* current point's state */
1533 1513
1534 int shift; 1514 int shift;
1535 TPos delta; 1515 TPos delta;
1536 1516
1537 1517
1538 if ( !outline || !func_interface ) 1518 if ( !outline )
1519 return FT_THROW( Invalid_Outline );
1520
1521 if ( !func_interface )
1539 return FT_THROW( Invalid_Argument ); 1522 return FT_THROW( Invalid_Argument );
1540 1523
1541 shift = func_interface->shift; 1524 shift = func_interface->shift;
1542 delta = func_interface->delta; 1525 delta = func_interface->delta;
1543 first = 0; 1526 first = 0;
1544 1527
1545 for ( n = 0; n < outline->n_contours; n++ ) 1528 for ( n = 0; n < outline->n_contours; n++ )
1546 { 1529 {
1547 int last; /* index of last point in contour */ 1530 int last; /* index of last point in contour */
1548 1531
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
1773 static int 1756 static int
1774 gray_convert_glyph_inner( RAS_ARG ) 1757 gray_convert_glyph_inner( RAS_ARG )
1775 { 1758 {
1776 1759
1777 volatile int error = 0; 1760 volatile int error = 0;
1778 1761
1779 #ifdef FT_CONFIG_OPTION_PIC 1762 #ifdef FT_CONFIG_OPTION_PIC
1780 FT_Outline_Funcs func_interface; 1763 FT_Outline_Funcs func_interface;
1781 Init_Class_func_interface(&func_interface); 1764 Init_Class_func_interface(&func_interface);
1782 #endif 1765 #endif
1783 #ifndef _FX_MANAGED_CODE_ 1766
1784 if ( ft_setjmp( ras.jump_buffer ) == 0 ) 1767 if ( ft_setjmp( ras.jump_buffer ) == 0 )
1785 { 1768 {
1786 #endif
1787 error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras ); 1769 error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
1788 gray_record_cell( RAS_VAR ); 1770 if ( !ras.invalid )
1789 #ifndef _FX_MANAGED_CODE_ 1771 gray_record_cell( RAS_VAR );
1790 » } 1772 }
1791 else 1773 else
1792 error = FT_THROW( Memory_Overflow ); 1774 error = FT_THROW( Memory_Overflow );
1793 #endif 1775
1794 return error; 1776 return error;
1795 } 1777 }
1796 1778
1797 1779
1798 static int 1780 static int
1799 gray_convert_glyph( RAS_ARG ) 1781 gray_convert_glyph( RAS_ARG )
1800 { 1782 {
1801 gray_TBand bands[40]; 1783 gray_TBand bands[40];
1802 gray_TBand* volatile band; 1784 gray_TBand* volatile band;
1803 int volatile n, num_bands; 1785 int volatile n, num_bands;
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
2111 else 2093 else
2112 { 2094 {
2113 rast->buffer = NULL; 2095 rast->buffer = NULL;
2114 rast->buffer_size = 0; 2096 rast->buffer_size = 0;
2115 rast->worker = NULL; 2097 rast->worker = NULL;
2116 } 2098 }
2117 } 2099 }
2118 } 2100 }
2119 2101
2120 2102
2103 static int
2104 gray_raster_set_mode( FT_Raster raster,
2105 unsigned long mode,
2106 void* args )
2107 {
2108 FT_UNUSED( raster );
2109 FT_UNUSED( mode );
2110 FT_UNUSED( args );
2111
2112
2113 return 0; /* nothing to do */
2114 }
2115
2116
2121 FT_DEFINE_RASTER_FUNCS(ft_grays_raster, 2117 FT_DEFINE_RASTER_FUNCS(ft_grays_raster,
2122 FT_GLYPH_FORMAT_OUTLINE, 2118 FT_GLYPH_FORMAT_OUTLINE,
2123 2119
2124 (FT_Raster_New_Func) gray_raster_new, 2120 (FT_Raster_New_Func) gray_raster_new,
2125 (FT_Raster_Reset_Func) gray_raster_reset, 2121 (FT_Raster_Reset_Func) gray_raster_reset,
2126 (FT_Raster_Set_Mode_Func)0, 2122 (FT_Raster_Set_Mode_Func)gray_raster_set_mode,
2127 (FT_Raster_Render_Func) gray_raster_render, 2123 (FT_Raster_Render_Func) gray_raster_render,
2128 (FT_Raster_Done_Func) gray_raster_done 2124 (FT_Raster_Done_Func) gray_raster_done
2129 ) 2125 )
2130 2126
2131 2127
2132 /* END */ 2128 /* END */
2133 2129
2134 2130
2135 /* Local Variables: */ 2131 /* Local Variables: */
2136 /* coding: utf-8 */ 2132 /* coding: utf-8 */
2137 /* End: */ 2133 /* End: */
OLDNEW
« no previous file with comments | « third_party/freetype/src/smooth/ftgrays.h ('k') | third_party/freetype/src/smooth/ftsmerrs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698