forked from minhngoc25a/freetype2
Partially move parameters to existing types
This commit is contained in:
parent
7996f488e5
commit
7d097d692c
|
@ -24,7 +24,6 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct dense_TRaster_
|
typedef struct dense_TRaster_
|
||||||
{
|
{
|
||||||
void* memory;
|
void* memory;
|
||||||
|
@ -44,7 +43,7 @@ Lerp( float aT, RasterFP_Point aP0, RasterFP_Point aP1 )
|
||||||
static int
|
static int
|
||||||
dense_move_to( const FT_Vector* to, RasterFP* aRasterFP )
|
dense_move_to( const FT_Vector* to, RasterFP* aRasterFP )
|
||||||
{
|
{
|
||||||
FT_Pos x, y;
|
TPos x, y;
|
||||||
|
|
||||||
x = UPSCALE( to->x );
|
x = UPSCALE( to->x );
|
||||||
y = UPSCALE( to->y );
|
y = UPSCALE( to->y );
|
||||||
|
@ -59,16 +58,28 @@ dense_line_to( const FT_Vector* to, RasterFP* aRasterFP )
|
||||||
{
|
{
|
||||||
printf("dense_line_to: %d, %d\n", to->x, to->y);
|
printf("dense_line_to: %d, %d\n", to->x, to->y);
|
||||||
RasterFP_Point tp = {UPSCALE(to->x), UPSCALE(to->y)};
|
RasterFP_Point tp = {UPSCALE(to->x), UPSCALE(to->y)};
|
||||||
RasterFP_Point lp = {aRasterFP->prev_x, aRasterFP->prev_y};
|
RasterFP_DrawLine( aRasterFP, tp.m_x, tp.m_y );
|
||||||
RasterFP_DrawLine( aRasterFP, lp, tp );
|
|
||||||
dense_move_to( to, aRasterFP );
|
dense_move_to( to, aRasterFP );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
void swap(long int *a, long int *b){
|
||||||
|
long int temp = *a;
|
||||||
|
*a = *b;
|
||||||
|
*b = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void swapold(unsigned char *a, unsigned char *b){
|
||||||
|
unsigned char temp = *a;
|
||||||
|
*a = *b;
|
||||||
|
*b = temp;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
RasterFP_DrawLine( RasterFP* aRasterFP, RasterFP_Point aP0, RasterFP_Point aP1 )
|
RasterFP_DrawLine( RasterFP* aRasterFP, TPos to_x, TPos to_y )
|
||||||
{
|
{
|
||||||
if ( aP0.m_y == aP1.m_y )
|
TPos from_x = aRasterFP->prev_x;
|
||||||
|
TPos from_y = aRasterFP->prev_y;
|
||||||
|
if ( from_y == to_y )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* @QUES: What is this code that I commented out, supposed to do?*/
|
/* @QUES: What is this code that I commented out, supposed to do?*/
|
||||||
|
@ -77,36 +88,35 @@ RasterFP_DrawLine( RasterFP* aRasterFP, RasterFP_Point aP0, RasterFP_Point aP1 )
|
||||||
// aP1.m_x -= aRasterFP->m_origin_x;
|
// aP1.m_x -= aRasterFP->m_origin_x;
|
||||||
// aP1.m_y -= aRasterFP->m_origin_y;
|
// aP1.m_y -= aRasterFP->m_origin_y;
|
||||||
|
|
||||||
aP0.m_x = TRUNC((int)aP0.m_x );
|
from_x = TRUNC((int)from_x );
|
||||||
aP0.m_y = TRUNC((int)aP0.m_y );
|
from_y = TRUNC((int)from_y );
|
||||||
aP1.m_x = TRUNC((int)aP1.m_x );
|
to_x = TRUNC((int)to_x );
|
||||||
aP1.m_y = TRUNC((int)aP1.m_y );
|
to_y = TRUNC((int)to_y );
|
||||||
|
|
||||||
float dir;
|
float dir;
|
||||||
if ( aP0.m_y < aP1.m_y )
|
if ( from_y < to_y )
|
||||||
dir = 1;
|
dir = 1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dir = -1;
|
dir = -1;
|
||||||
RasterFP_Point temp = aP0;
|
swap(&from_x, &to_x);
|
||||||
aP0 = aP1;
|
swap(&from_y, &to_y);
|
||||||
aP1 = temp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clip to the height.
|
// Clip to the height.
|
||||||
if ( aP0.m_y >= aRasterFP->m_h || aP1.m_y <= 0 )
|
if ( from_y >= aRasterFP->m_h || to_y <= 0 )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
float dxdy = ( aP1.m_x - aP0.m_x ) / ( aP1.m_y - aP0.m_y );
|
float dxdy = ( to_x - from_x ) / (float)( to_y - from_y );
|
||||||
if ( aP0.m_y < 0 )
|
if ( from_y < 0 )
|
||||||
{
|
{
|
||||||
aP0.m_x -= aP0.m_y * dxdy;
|
from_x -= from_y * dxdy;
|
||||||
aP0.m_y = 0;
|
from_y = 0;
|
||||||
}
|
}
|
||||||
if ( aP1.m_y > aRasterFP->m_h )
|
if ( to_y > aRasterFP->m_h )
|
||||||
{
|
{
|
||||||
aP1.m_x -= ( aP1.m_y - aRasterFP->m_h ) * dxdy;
|
to_x -= ( to_y - aRasterFP->m_h ) * dxdy;
|
||||||
aP1.m_y = (float)aRasterFP->m_h;
|
to_y = (float)aRasterFP->m_h;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -121,60 +131,60 @@ RasterFP_DrawLine( RasterFP* aRasterFP, RasterFP_Point aP0, RasterFP_Point aP1 )
|
||||||
this code a little, removing it doesn't seem to make any difference*/
|
this code a little, removing it doesn't seem to make any difference*/
|
||||||
RasterFP_Point intersect = { 0, 0 };
|
RasterFP_Point intersect = { 0, 0 };
|
||||||
int recursive = 0;
|
int recursive = 0;
|
||||||
if ( aP0.m_x >= aRasterFP->m_w && aP1.m_x >= aRasterFP->m_w )
|
if ( from_x >= aRasterFP->m_w && to_x >= aRasterFP->m_w )
|
||||||
{
|
{
|
||||||
aP0.m_x = aP1.m_x = (float)aRasterFP->m_w;
|
from_x = to_x = (float)aRasterFP->m_w;
|
||||||
dxdy = 0;
|
dxdy = 0;
|
||||||
}
|
}
|
||||||
else if ( aP0.m_x <= 0 && aP1.m_x <= 0 )
|
else if ( from_x <= 0 && to_x <= 0 )
|
||||||
{
|
{
|
||||||
aP0.m_x = aP1.m_x = 0;
|
from_x = to_x = 0;
|
||||||
dxdy = 0;
|
dxdy = 0;
|
||||||
}
|
}
|
||||||
else if ( ( aP0.m_x < 0 ) != ( aP1.m_x < 0 ) )
|
else if ( ( from_x < 0 ) != ( to_x < 0 ) )
|
||||||
{
|
{
|
||||||
intersect.m_x = 0;
|
intersect.m_x = 0;
|
||||||
intersect.m_y = aP1.m_y - aP1.m_x / dxdy;
|
intersect.m_y = to_y - to_x / dxdy;
|
||||||
recursive = 1;
|
recursive = 1;
|
||||||
}
|
}
|
||||||
else if ( ( aP0.m_x > aRasterFP->m_w ) != ( aP1.m_x > aRasterFP->m_w ) )
|
else if ( ( from_x > aRasterFP->m_w ) != ( to_x > aRasterFP->m_w ) )
|
||||||
{
|
{
|
||||||
intersect.m_x = (float)aRasterFP->m_w;
|
intersect.m_x = (float)aRasterFP->m_w;
|
||||||
intersect.m_y = aP0.m_y + ( aRasterFP->m_w - aP0.m_x ) / dxdy;
|
intersect.m_y = from_y + ( aRasterFP->m_w - from_x ) / dxdy;
|
||||||
recursive = 1;
|
recursive = 1;
|
||||||
}
|
}
|
||||||
if ( recursive )
|
if ( recursive )
|
||||||
{
|
{
|
||||||
aP0.m_x += aRasterFP->m_origin_x;
|
from_x += aRasterFP->m_origin_x;
|
||||||
aP0.m_y += aRasterFP->m_origin_y;
|
from_y += aRasterFP->m_origin_y;
|
||||||
aP1.m_x += aRasterFP->m_origin_x;
|
to_x += aRasterFP->m_origin_x;
|
||||||
aP1.m_y += aRasterFP->m_origin_y;
|
to_y += aRasterFP->m_origin_y;
|
||||||
intersect.m_x += aRasterFP->m_origin_x;
|
intersect.m_x += aRasterFP->m_origin_x;
|
||||||
intersect.m_y += aRasterFP->m_origin_y;
|
intersect.m_y += aRasterFP->m_origin_y;
|
||||||
if ( dir == 1 )
|
if ( dir == 1 )
|
||||||
{
|
{
|
||||||
RasterFP_DrawLine( aRasterFP, aP0, intersect );
|
RasterFP_DrawLine( aRasterFP, intersect.m_x, intersect.m_y );
|
||||||
RasterFP_DrawLine( aRasterFP, intersect, aP1 );
|
RasterFP_DrawLine( aRasterFP, to_x, to_y );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
RasterFP_DrawLine( aRasterFP, aP1, intersect );
|
RasterFP_DrawLine( aRasterFP, intersect.m_x, intersect.m_y );
|
||||||
RasterFP_DrawLine( aRasterFP, intersect, aP0 );
|
RasterFP_DrawLine( aRasterFP, from_x, from_y );
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @QUES: I am still trying to understand this code */
|
/* @QUES: I am still trying to understand this code */
|
||||||
float x = aP0.m_x;
|
float x = from_x;
|
||||||
int y0 = (int)aP0.m_y;
|
int y0 = (int)from_y;
|
||||||
int y_limit = (int)ceil( aP1.m_y );
|
int y_limit = (int)ceil( to_y );
|
||||||
float* m_a = aRasterFP->m_a;
|
float* m_a = aRasterFP->m_a;
|
||||||
|
|
||||||
|
|
||||||
for ( int y = y0; y < y_limit; y++ )
|
for ( int y = y0; y < y_limit; y++ )
|
||||||
{
|
{
|
||||||
int linestart = y * aRasterFP->m_w;
|
int linestart = y * aRasterFP->m_w;
|
||||||
float dy = fmin( y + 1.0f, aP1.m_y ) - fmax( (float)y, aP0.m_y );
|
float dy = fmin( y + 1.0f, to_y ) - fmax( (float)y, from_y );
|
||||||
float xnext = x + dxdy * dy;
|
float xnext = x + dxdy * dy;
|
||||||
float d = dy * dir;
|
float d = dy * dir;
|
||||||
|
|
||||||
|
@ -236,21 +246,20 @@ dense_conic_to( const FT_Vector* control,
|
||||||
const FT_Vector* to,
|
const FT_Vector* to,
|
||||||
RasterFP* aRasterFP )
|
RasterFP* aRasterFP )
|
||||||
{
|
{
|
||||||
RasterFP_Point controlP = { UPSCALE(control->x), UPSCALE(control->y) };
|
// RasterFP_Point controlP = { UPSCALE(control->x), UPSCALE(control->y) };
|
||||||
RasterFP_Point toP = { UPSCALE(to->x), UPSCALE(to->y) };
|
// RasterFP_Point toP = { UPSCALE(to->x), UPSCALE(to->y) };
|
||||||
RasterFP_Point lP = { aRasterFP->prev_x, aRasterFP->prev_y };
|
// RasterFP_Point lP = { aRasterFP->prev_x, aRasterFP->prev_y };
|
||||||
RasterFP_DrawQuadratic( aRasterFP, lP, controlP, toP );
|
RasterFP_DrawQuadratic( aRasterFP, control, to );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
RasterFP_DrawQuadratic( RasterFP* aRasterFP,
|
RasterFP_DrawQuadratic( RasterFP* aRasterFP,
|
||||||
RasterFP_Point aP0,
|
const FT_Vector* control,
|
||||||
RasterFP_Point aP1,
|
const FT_Vector* to )
|
||||||
RasterFP_Point aP2 )
|
|
||||||
{
|
{
|
||||||
|
|
||||||
// assert( aRasterFP );
|
// assert( aRasterFP );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Calculate devsq as the square of four times the
|
Calculate devsq as the square of four times the
|
||||||
distance from the control point to the midpoint of the curve.
|
distance from the control point to the midpoint of the curve.
|
||||||
|
@ -262,13 +271,20 @@ RasterFP_DrawQuadratic( RasterFP* aRasterFP,
|
||||||
|
|
||||||
The division by four is omitted to save time.
|
The division by four is omitted to save time.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
RasterFP_Point aP0 = {aRasterFP->prev_x, aRasterFP->prev_y};
|
||||||
|
RasterFP_Point aP1 = {UPSCALE(control->x), UPSCALE(control->y)};
|
||||||
|
RasterFP_Point aP2 = {UPSCALE(to->x), UPSCALE(to->y)};
|
||||||
|
|
||||||
float devx = aP0.m_x - aP1.m_x - aP1.m_x + aP2.m_x;
|
float devx = aP0.m_x - aP1.m_x - aP1.m_x + aP2.m_x;
|
||||||
float devy = aP0.m_y - aP1.m_y - aP1.m_y + aP2.m_y;
|
float devy = aP0.m_y - aP1.m_y - aP1.m_y + aP2.m_y;
|
||||||
float devsq = devx * devx + devy * devy;
|
float devsq = devx * devx + devy * devy;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if ( devsq < 0.333f )
|
if ( devsq < 0.333f )
|
||||||
{
|
{
|
||||||
RasterFP_DrawLine( aRasterFP, aP0, aP2 );
|
RasterFP_DrawLine(aRasterFP, aP2.m_x, aP2.m_y );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,18 +300,18 @@ RasterFP_DrawQuadratic( RasterFP* aRasterFP,
|
||||||
|
|
||||||
const float tol = 3.0f;
|
const float tol = 3.0f;
|
||||||
int n = (int)floor( sqrt( sqrt( tol * devsq ) ) );
|
int n = (int)floor( sqrt( sqrt( tol * devsq ) ) );
|
||||||
RasterFP_Point p = aP0;
|
// RasterFP_Point p = aP0;
|
||||||
float nrecip = 1.0f / ( n + 1.0f );
|
float nrecip = 1.0f / ( n + 1.0f );
|
||||||
float t = 0.0f;
|
float t = 0.0f;
|
||||||
for ( int i = 0; i < n; i++ )
|
for ( int i = 0; i < n; i++ )
|
||||||
{
|
{
|
||||||
t += nrecip;
|
t += nrecip;
|
||||||
RasterFP_Point next = Lerp( t, Lerp( t, aP0, aP1 ), Lerp( t, aP1, aP2 ) );
|
RasterFP_Point next = Lerp( t, Lerp( t, aP0, aP1 ), Lerp( t, aP1, aP2 ) );
|
||||||
RasterFP_DrawLine( aRasterFP, p, next );
|
RasterFP_DrawLine(aRasterFP , next.m_x, next.m_y);
|
||||||
p = next;
|
//p = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
RasterFP_DrawLine( aRasterFP, p, aP2 );
|
RasterFP_DrawLine( aRasterFP, aP2.m_x, aP2.m_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -333,7 +349,7 @@ RasterFP_DrawCubic( RasterFP* aRasterFP,
|
||||||
|
|
||||||
if ( devsq < 0.333f )
|
if ( devsq < 0.333f )
|
||||||
{
|
{
|
||||||
RasterFP_DrawLine( aRasterFP, aP0, aP3 );
|
RasterFP_DrawLine( aRasterFP, aP3.m_x , aP3.m_y);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -348,11 +364,11 @@ RasterFP_DrawCubic( RasterFP* aRasterFP,
|
||||||
RasterFP_Point a = Lerp( t, Lerp( t, aP0, aP1 ), Lerp( t, aP1, aP2 ) );
|
RasterFP_Point a = Lerp( t, Lerp( t, aP0, aP1 ), Lerp( t, aP1, aP2 ) );
|
||||||
RasterFP_Point b = Lerp( t, Lerp( t, aP1, aP2 ), Lerp( t, aP2, aP3 ) );
|
RasterFP_Point b = Lerp( t, Lerp( t, aP1, aP2 ), Lerp( t, aP2, aP3 ) );
|
||||||
RasterFP_Point next = Lerp( t, a, b );
|
RasterFP_Point next = Lerp( t, a, b );
|
||||||
RasterFP_DrawLine( aRasterFP, p, next );
|
RasterFP_DrawLine( aRasterFP, next.m_x, next.m_y );
|
||||||
p = next;
|
p = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
RasterFP_DrawLine( aRasterFP, p, aP3 );
|
RasterFP_DrawLine( aRasterFP, aP3.m_x, aP3.m_y );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @QUES: This is the first method called on the module. I suspect
|
/* @QUES: This is the first method called on the module. I suspect
|
||||||
|
@ -416,11 +432,6 @@ FT_DEFINE_OUTLINE_FUNCS( dense_decompose_funcs,
|
||||||
0 /* delta */
|
0 /* delta */
|
||||||
)
|
)
|
||||||
|
|
||||||
void swap(unsigned char *a, unsigned char *b){
|
|
||||||
unsigned char temp = *a;
|
|
||||||
*a = *b;
|
|
||||||
*b = temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* @QUES: So, this calls FT_Outline_Decompose, that calls the move to,
|
/* @QUES: So, this calls FT_Outline_Decompose, that calls the move to,
|
||||||
line to, conic to, cubic to interface methods. The aRasterFP structure stores the
|
line to, conic to, cubic to interface methods. The aRasterFP structure stores the
|
||||||
|
@ -489,7 +500,7 @@ dense_render_glyph( RasterFP* aRasterFP, const FT_Bitmap* target )
|
||||||
for (int row = 0; row < aRasterFP->m_h/2; row++)
|
for (int row = 0; row < aRasterFP->m_h/2; row++)
|
||||||
{
|
{
|
||||||
//printf("Swapping position: %d, %d with %d, %d with rows = %d, cols = %d",row,col, aRasterFP->m_h-row, col, aRasterFP->m_h, aRasterFP->m_w);
|
//printf("Swapping position: %d, %d with %d, %d with rows = %d, cols = %d",row,col, aRasterFP->m_h-row, col, aRasterFP->m_h, aRasterFP->m_w);
|
||||||
swap(target->buffer + aRasterFP->m_w*row + col, target->buffer + (aRasterFP->m_h-row-1)*aRasterFP->m_w + col);
|
swapold(target->buffer + aRasterFP->m_w*row + col, target->buffer + (aRasterFP->m_h-row-1)*aRasterFP->m_w + col);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,7 @@ extern "C"
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef long TPos;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
float m_x;
|
float m_x;
|
||||||
|
@ -113,13 +114,10 @@ extern "C"
|
||||||
|
|
||||||
void RasterFP_Create( RasterFP* aRasterFP );
|
void RasterFP_Create( RasterFP* aRasterFP );
|
||||||
void RasterFP_Destroy( RasterFP* aRasterFP );
|
void RasterFP_Destroy( RasterFP* aRasterFP );
|
||||||
void RasterFP_DrawLine( RasterFP* aRasterFP,
|
void RasterFP_DrawLine( RasterFP* aRasterFP, TPos to_x, TPos to_y );
|
||||||
RasterFP_Point aP0,
|
|
||||||
RasterFP_Point aP1 );
|
|
||||||
void RasterFP_DrawQuadratic( RasterFP* aRasterFP,
|
void RasterFP_DrawQuadratic( RasterFP* aRasterFP,
|
||||||
RasterFP_Point aP0,
|
const FT_Vector* control,
|
||||||
RasterFP_Point aP1,
|
const FT_Vector* to );
|
||||||
RasterFP_Point aP2 );
|
|
||||||
void RasterFP_DrawCubic( RasterFP* aRasterFP,
|
void RasterFP_DrawCubic( RasterFP* aRasterFP,
|
||||||
RasterFP_Point aP0,
|
RasterFP_Point aP0,
|
||||||
RasterFP_Point aP1,
|
RasterFP_Point aP1,
|
||||||
|
|
Loading…
Reference in New Issue