Index: src/raster/ftraster.c |
diff --git a/src/raster/ftraster.c b/src/raster/ftraster.c |
index f85845ec63a9502f77ab5406a1818bfee0fd40b6..4865994778d229fcc4ede0375d53de36579684eb 100644 |
--- a/src/raster/ftraster.c |
+++ b/src/raster/ftraster.c |
@@ -4,7 +4,7 @@ |
/* */ |
/* The FreeType glyph rasterizer (body). */ |
/* */ |
-/* Copyright 1996-2003, 2005, 2007-2012 by */ |
+/* Copyright 1996-2003, 2005, 2007-2013 by */ |
/* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
/* */ |
/* This file is part of the FreeType project, and may only be used, */ |
@@ -60,7 +60,7 @@ |
#include <ft2build.h> |
#include "ftraster.h" |
-#include FT_INTERNAL_CALC_H /* for FT_MulDiv only */ |
+#include FT_INTERNAL_CALC_H /* for FT_MulDiv and FT_MulDiv_No_Round */ |
#include "rastpic.h" |
@@ -179,6 +179,9 @@ |
#ifdef _STANDALONE_ |
+ /* Auxiliary macros for token concatenation. */ |
+#define FT_ERR_XCAT( x, y ) x ## y |
+#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) |
/* This macro is used to indicate that a function parameter is unused. */ |
/* Its purpose is simply to reduce compiler warnings. Note also that */ |
@@ -187,7 +190,7 @@ |
#define FT_UNUSED( x ) (x) = (x) |
/* Disable the tracing mechanism for simplicity -- developers can */ |
- /* activate it easily by redefining these two macros. */ |
+ /* activate it easily by redefining these macros. */ |
#ifndef FT_ERROR |
#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ |
#endif |
@@ -198,6 +201,10 @@ |
#define FT_TRACE6( x ) do { } while ( 0 ) /* nothing */ |
#endif |
+#ifndef FT_THROW |
+#define FT_THROW( e ) FT_ERR_CAT( Raster_Err_, e ) |
+#endif |
+ |
#define Raster_Err_None 0 |
#define Raster_Err_Not_Ini -1 |
#define Raster_Err_Overflow -2 |
@@ -224,11 +231,11 @@ |
#include FT_INTERNAL_OBJECTS_H |
-#include FT_INTERNAL_DEBUG_H /* for FT_TRACE() and FT_ERROR() */ |
+#include FT_INTERNAL_DEBUG_H /* for FT_TRACE, FT_ERROR, and FT_THROW */ |
#include "rasterrs.h" |
-#define Raster_Err_None Raster_Err_Ok |
+#define Raster_Err_None FT_Err_Ok |
#define Raster_Err_Not_Ini Raster_Err_Raster_Uninitialized |
#define Raster_Err_Overflow Raster_Err_Raster_Overflow |
#define Raster_Err_Neg_Height Raster_Err_Raster_Negative_Height |
@@ -255,7 +262,8 @@ |
/* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */ |
/* for clipping computations. It simply uses the FT_MulDiv() function */ |
/* defined in `ftcalc.h'. */ |
-#define SMulDiv FT_MulDiv |
+#define SMulDiv FT_MulDiv |
+#define SMulDiv_No_Round FT_MulDiv_No_Round |
/* The rasterizer is a very general purpose component; please leave */ |
/* the following redefinitions there (you never know your target */ |
@@ -302,6 +310,7 @@ |
typedef short Short; |
typedef unsigned short UShort, *PUShort; |
typedef long Long, *PLong; |
+ typedef unsigned long ULong; |
typedef unsigned char Byte, *PByte; |
typedef char Bool; |
@@ -440,9 +449,9 @@ |
#define FLOOR( x ) ( (x) & -ras.precision ) |
#define CEILING( x ) ( ( (x) + ras.precision - 1 ) & -ras.precision ) |
-#define TRUNC( x ) ( (signed long)(x) >> ras.precision_bits ) |
+#define TRUNC( x ) ( (Long)(x) >> ras.precision_bits ) |
#define FRAC( x ) ( (x) & ( ras.precision - 1 ) ) |
-#define SCALED( x ) ( ( (x) << ras.scale_shift ) - ras.precision_half ) |
+#define SCALED( x ) ( ( (ULong)(x) << ras.scale_shift ) - ras.precision_half ) |
#define IS_BOTTOM_OVERSHOOT( x ) ( CEILING( x ) - x >= ras.precision_half ) |
#define IS_TOP_OVERSHOOT( x ) ( x - FLOOR( x ) >= ras.precision_half ) |
@@ -654,7 +663,7 @@ |
/* Set precision variables according to param flag. */ |
/* */ |
/* <Input> */ |
- /* High :: Set to True for high precision (typically for ppem < 18), */ |
+ /* High :: Set to True for high precision (typically for ppem < 24), */ |
/* false otherwise. */ |
/* */ |
static void |
@@ -734,7 +743,7 @@ |
if ( ras.top >= ras.maxBuff ) |
{ |
- ras.error = Raster_Err_Overflow; |
+ ras.error = FT_THROW( Overflow ); |
return FAILURE; |
} |
@@ -764,7 +773,7 @@ |
default: |
FT_ERROR(( "New_Profile: invalid profile direction\n" )); |
- ras.error = Raster_Err_Invalid; |
+ ras.error = FT_THROW( Invalid ); |
return FAILURE; |
} |
@@ -797,8 +806,7 @@ |
static Bool |
End_Profile( RAS_ARGS Bool overshoot ) |
{ |
- Long h; |
- PProfile oldProfile; |
+ Long h; |
h = (Long)( ras.top - ras.cProfile->offset ); |
@@ -806,12 +814,15 @@ |
if ( h < 0 ) |
{ |
FT_ERROR(( "End_Profile: negative height encountered\n" )); |
- ras.error = Raster_Err_Neg_Height; |
+ ras.error = FT_THROW( Neg_Height ); |
return FAILURE; |
} |
if ( h > 0 ) |
{ |
+ PProfile oldProfile; |
+ |
+ |
FT_TRACE6(( "Ending profile %p, start = %ld, height = %ld\n", |
ras.cProfile, ras.cProfile->start, h )); |
@@ -839,7 +850,7 @@ |
if ( ras.top >= ras.maxBuff ) |
{ |
FT_TRACE1(( "overflow in End_Profile\n" )); |
- ras.error = Raster_Err_Overflow; |
+ ras.error = FT_THROW( Overflow ); |
return FAILURE; |
} |
@@ -868,7 +879,7 @@ |
Insert_Y_Turn( RAS_ARGS Int y ) |
{ |
PLong y_turns; |
- Int y2, n; |
+ Int n; |
n = ras.numTurns - 1; |
@@ -882,7 +893,9 @@ |
if ( n >= 0 && y > y_turns[n] ) |
while ( n >= 0 ) |
{ |
- y2 = (Int)y_turns[n]; |
+ Int y2 = (Int)y_turns[n]; |
+ |
+ |
y_turns[n] = y; |
y = y2; |
n--; |
@@ -893,7 +906,7 @@ |
ras.maxBuff--; |
if ( ras.maxBuff <= ras.top ) |
{ |
- ras.error = Raster_Err_Overflow; |
+ ras.error = FT_THROW( Overflow ); |
return FAILURE; |
} |
ras.numTurns++; |
@@ -918,7 +931,6 @@ |
static Bool |
Finalize_Profile_Table( RAS_ARG ) |
{ |
- Int bottom, top; |
UShort n; |
PProfile p; |
@@ -930,6 +942,9 @@ |
{ |
while ( n > 0 ) |
{ |
+ Int bottom, top; |
+ |
+ |
if ( n > 1 ) |
p->link = (PProfile)( p->offset + p->height ); |
else |
@@ -1144,20 +1159,20 @@ |
size = e2 - e1 + 1; |
if ( ras.top + size >= ras.maxBuff ) |
{ |
- ras.error = Raster_Err_Overflow; |
+ ras.error = FT_THROW( Overflow ); |
return FAILURE; |
} |
if ( Dx > 0 ) |
{ |
- Ix = SMulDiv( ras.precision, Dx, Dy); |
+ Ix = SMulDiv_No_Round( ras.precision, Dx, Dy ); |
Rx = ( ras.precision * Dx ) % Dy; |
Dx = 1; |
} |
else |
{ |
- Ix = SMulDiv( ras.precision, -Dx, Dy) * -1; |
- Rx = ( ras.precision * -Dx ) % Dy; |
+ Ix = -SMulDiv_No_Round( ras.precision, -Dx, Dy ); |
+ Rx = ( ras.precision * -Dx ) % Dy; |
Dx = -1; |
} |
@@ -1319,7 +1334,7 @@ |
if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff ) |
{ |
ras.top = top; |
- ras.error = Raster_Err_Overflow; |
+ ras.error = FT_THROW( Overflow ); |
return FAILURE; |
} |
@@ -1994,7 +2009,7 @@ |
return SUCCESS; |
Invalid_Outline: |
- ras.error = Raster_Err_Invalid; |
+ ras.error = FT_THROW( Invalid ); |
Fail: |
return FAILURE; |
@@ -2023,8 +2038,6 @@ |
int i; |
unsigned start; |
- PProfile lastProfile; |
- |
ras.fProfile = NULL; |
ras.joint = FALSE; |
@@ -2042,7 +2055,8 @@ |
for ( i = 0; i < ras.outline.n_contours; i++ ) |
{ |
- Bool o; |
+ PProfile lastProfile; |
+ Bool o; |
ras.state = Unknown_State; |
@@ -2266,8 +2280,6 @@ |
PProfile right ) |
{ |
Long e1, e2; |
- int c1, c2; |
- Byte f1, f2; |
Byte* target; |
FT_UNUSED( y ); |
@@ -2286,6 +2298,10 @@ |
if ( e2 >= 0 && e1 < ras.bWidth ) |
{ |
+ int c1, c2; |
+ Byte f1, f2; |
+ |
+ |
if ( e1 < 0 ) |
e1 = 0; |
if ( e2 >= ras.bWidth ) |
@@ -2509,21 +2525,24 @@ |
PProfile left, |
PProfile right ) |
{ |
- Long e1, e2; |
- PByte bits; |
- Byte f1; |
- |
FT_UNUSED( left ); |
FT_UNUSED( right ); |
if ( x2 - x1 < ras.precision ) |
{ |
+ Long e1, e2; |
+ |
+ |
e1 = CEILING( x1 ); |
e2 = FLOOR ( x2 ); |
if ( e1 == e2 ) |
{ |
+ Byte f1; |
+ PByte bits; |
+ |
+ |
bits = ras.bTarget + ( y >> 3 ); |
f1 = (Byte)( 0x80 >> ( y & 7 ) ); |
@@ -2720,8 +2739,6 @@ |
static void |
Vertical_Gray_Sweep_Step( RAS_ARG ) |
{ |
- Int c1, c2; |
- PByte pix, bit, bit2; |
short* count = (short*)count_table; |
Byte* grays; |
@@ -2730,6 +2747,9 @@ |
if ( ras.traceOfs > ras.gray_width ) |
{ |
+ PByte pix; |
+ |
+ |
pix = ras.gTarget + ras.traceG + ras.gray_min_x * 4; |
grays = ras.grays; |
@@ -2740,6 +2760,9 @@ |
Int last_bit = last_pixel & 3; |
Bool over = 0; |
+ Int c1, c2; |
+ PByte bit, bit2; |
+ |
if ( ras.gray_max_x >= last_cell && last_bit != 3 ) |
{ |
@@ -2832,7 +2855,6 @@ |
{ |
Long e1, e2; |
PByte pixel; |
- Byte color; |
/* During the horizontal sweep, we only take care of drop-outs */ |
@@ -2886,6 +2908,9 @@ |
if ( e1 >= 0 ) |
{ |
+ Byte color; |
+ |
+ |
if ( x2 - x1 >= ras.precision_half ) |
color = ras.grays[2]; |
else |
@@ -2963,7 +2988,7 @@ |
/* check the Y-turns */ |
if ( ras.numTurns == 0 ) |
{ |
- ras.error = Raster_Err_Invalid; |
+ ras.error = FT_THROW( Invalid ); |
return FAILURE; |
} |
@@ -3204,7 +3229,7 @@ |
if ( ras.band_top >= 7 || k < i ) |
{ |
ras.band_top = 0; |
- ras.error = Raster_Err_Invalid; |
+ ras.error = FT_THROW( Invalid ); |
return ras.error; |
} |
@@ -3393,7 +3418,7 @@ |
{ |
FT_UNUSED_RASTER; |
- return Raster_Err_Unsupported; |
+ return FT_THROW( Unsupported ); |
} |
#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */ |
@@ -3498,7 +3523,8 @@ |
raster->buffer = pool_base + ( ( sizeof ( *worker ) + 7 ) & ~7 ); |
- raster->buffer_size = pool_base + pool_size - (char*)raster->buffer; |
+ raster->buffer_size = (long)( pool_base + pool_size - |
+ (char*)raster->buffer ); |
raster->worker = worker; |
} |
else |
@@ -3548,37 +3574,37 @@ |
if ( !raster || !raster->buffer || !raster->buffer_size ) |
- return Raster_Err_Not_Ini; |
+ return FT_THROW( Not_Ini ); |
if ( !outline ) |
- return Raster_Err_Invalid; |
+ return FT_THROW( Invalid ); |
/* return immediately if the outline is empty */ |
if ( outline->n_points == 0 || outline->n_contours <= 0 ) |
return Raster_Err_None; |
if ( !outline->contours || !outline->points ) |
- return Raster_Err_Invalid; |
+ return FT_THROW( Invalid ); |
if ( outline->n_points != |
outline->contours[outline->n_contours - 1] + 1 ) |
- return Raster_Err_Invalid; |
+ return FT_THROW( Invalid ); |
worker = raster->worker; |
/* this version of the raster does not support direct rendering, sorry */ |
if ( params->flags & FT_RASTER_FLAG_DIRECT ) |
- return Raster_Err_Unsupported; |
+ return FT_THROW( Unsupported ); |
if ( !target_map ) |
- return Raster_Err_Invalid; |
+ return FT_THROW( Invalid ); |
/* nothing to do */ |
if ( !target_map->width || !target_map->rows ) |
return Raster_Err_None; |
if ( !target_map->buffer ) |
- return Raster_Err_Invalid; |
+ return FT_THROW( Invalid ); |
ras.outline = *outline; |
ras.target = *target_map; |