From 7d097d692ce1d4388192c2482de71a9fa94cd417 Mon Sep 17 00:00:00 2001 From: Anurag Thakur Date: Wed, 13 Jul 2022 01:06:15 +0530 Subject: [PATCH] Partially move parameters to existing types --- src/dense/ftdense.c | 139 ++++++++++++++++++++++++-------------------- src/dense/ftdense.h | 10 ++-- 2 files changed, 79 insertions(+), 70 deletions(-) diff --git a/src/dense/ftdense.c b/src/dense/ftdense.c index 8cffc20e9..ca176d77b 100644 --- a/src/dense/ftdense.c +++ b/src/dense/ftdense.c @@ -24,7 +24,6 @@ - typedef struct dense_TRaster_ { void* memory; @@ -44,7 +43,7 @@ Lerp( float aT, RasterFP_Point aP0, RasterFP_Point aP1 ) static int dense_move_to( const FT_Vector* to, RasterFP* aRasterFP ) { - FT_Pos x, y; + TPos x, y; x = UPSCALE( to->x ); 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); RasterFP_Point tp = {UPSCALE(to->x), UPSCALE(to->y)}; - RasterFP_Point lp = {aRasterFP->prev_x, aRasterFP->prev_y}; - RasterFP_DrawLine( aRasterFP, lp, tp ); + RasterFP_DrawLine( aRasterFP, tp.m_x, tp.m_y ); dense_move_to( to, aRasterFP ); 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 -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; /* @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_y -= aRasterFP->m_origin_y; - aP0.m_x = TRUNC((int)aP0.m_x ); - aP0.m_y = TRUNC((int)aP0.m_y ); - aP1.m_x = TRUNC((int)aP1.m_x ); - aP1.m_y = TRUNC((int)aP1.m_y ); + from_x = TRUNC((int)from_x ); + from_y = TRUNC((int)from_y ); + to_x = TRUNC((int)to_x ); + to_y = TRUNC((int)to_y ); float dir; - if ( aP0.m_y < aP1.m_y ) + if ( from_y < to_y ) dir = 1; else { dir = -1; - RasterFP_Point temp = aP0; - aP0 = aP1; - aP1 = temp; + swap(&from_x, &to_x); + swap(&from_y, &to_y); } // 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; - float dxdy = ( aP1.m_x - aP0.m_x ) / ( aP1.m_y - aP0.m_y ); - if ( aP0.m_y < 0 ) + float dxdy = ( to_x - from_x ) / (float)( to_y - from_y ); + if ( from_y < 0 ) { - aP0.m_x -= aP0.m_y * dxdy; - aP0.m_y = 0; + from_x -= from_y * dxdy; + 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; - aP1.m_y = (float)aRasterFP->m_h; + to_x -= ( to_y - aRasterFP->m_h ) * dxdy; + 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*/ RasterFP_Point intersect = { 0, 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; } - 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; } - else if ( ( aP0.m_x < 0 ) != ( aP1.m_x < 0 ) ) + else if ( ( from_x < 0 ) != ( to_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; } - 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_y = aP0.m_y + ( aRasterFP->m_w - aP0.m_x ) / dxdy; + intersect.m_y = from_y + ( aRasterFP->m_w - from_x ) / dxdy; recursive = 1; } if ( recursive ) { - aP0.m_x += aRasterFP->m_origin_x; - aP0.m_y += aRasterFP->m_origin_y; - aP1.m_x += aRasterFP->m_origin_x; - aP1.m_y += aRasterFP->m_origin_y; + from_x += aRasterFP->m_origin_x; + from_y += aRasterFP->m_origin_y; + to_x += aRasterFP->m_origin_x; + to_y += aRasterFP->m_origin_y; intersect.m_x += aRasterFP->m_origin_x; intersect.m_y += aRasterFP->m_origin_y; if ( dir == 1 ) { - RasterFP_DrawLine( aRasterFP, aP0, intersect ); - RasterFP_DrawLine( aRasterFP, intersect, aP1 ); + RasterFP_DrawLine( aRasterFP, intersect.m_x, intersect.m_y ); + RasterFP_DrawLine( aRasterFP, to_x, to_y ); } else { - RasterFP_DrawLine( aRasterFP, aP1, intersect ); - RasterFP_DrawLine( aRasterFP, intersect, aP0 ); + RasterFP_DrawLine( aRasterFP, intersect.m_x, intersect.m_y ); + RasterFP_DrawLine( aRasterFP, from_x, from_y ); } return; } /* @QUES: I am still trying to understand this code */ - float x = aP0.m_x; - int y0 = (int)aP0.m_y; - int y_limit = (int)ceil( aP1.m_y ); + float x = from_x; + int y0 = (int)from_y; + int y_limit = (int)ceil( to_y ); float* m_a = aRasterFP->m_a; for ( int y = y0; y < y_limit; y++ ) { 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 d = dy * dir; @@ -236,21 +246,20 @@ dense_conic_to( const FT_Vector* control, const FT_Vector* to, RasterFP* aRasterFP ) { - RasterFP_Point controlP = { UPSCALE(control->x), UPSCALE(control->y) }; - RasterFP_Point toP = { UPSCALE(to->x), UPSCALE(to->y) }; - RasterFP_Point lP = { aRasterFP->prev_x, aRasterFP->prev_y }; - RasterFP_DrawQuadratic( aRasterFP, lP, controlP, toP ); + // RasterFP_Point controlP = { UPSCALE(control->x), UPSCALE(control->y) }; + // RasterFP_Point toP = { UPSCALE(to->x), UPSCALE(to->y) }; + // RasterFP_Point lP = { aRasterFP->prev_x, aRasterFP->prev_y }; + RasterFP_DrawQuadratic( aRasterFP, control, to ); return 0; } void RasterFP_DrawQuadratic( RasterFP* aRasterFP, - RasterFP_Point aP0, - RasterFP_Point aP1, - RasterFP_Point aP2 ) + const FT_Vector* control, + const FT_Vector* to ) { + // assert( aRasterFP ); - /* Calculate devsq as the square of four times the 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. */ + + 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 devy = aP0.m_y - aP1.m_y - aP1.m_y + aP2.m_y; float devsq = devx * devx + devy * devy; + + if ( devsq < 0.333f ) { - RasterFP_DrawLine( aRasterFP, aP0, aP2 ); + RasterFP_DrawLine(aRasterFP, aP2.m_x, aP2.m_y ); return; } @@ -284,18 +300,18 @@ RasterFP_DrawQuadratic( RasterFP* aRasterFP, const float tol = 3.0f; int n = (int)floor( sqrt( sqrt( tol * devsq ) ) ); - RasterFP_Point p = aP0; + // RasterFP_Point p = aP0; float nrecip = 1.0f / ( n + 1.0f ); float t = 0.0f; for ( int i = 0; i < n; i++ ) { t += nrecip; RasterFP_Point next = Lerp( t, Lerp( t, aP0, aP1 ), Lerp( t, aP1, aP2 ) ); - RasterFP_DrawLine( aRasterFP, p, next ); - p = next; + RasterFP_DrawLine(aRasterFP , next.m_x, next.m_y); + //p = next; } - RasterFP_DrawLine( aRasterFP, p, aP2 ); + RasterFP_DrawLine( aRasterFP, aP2.m_x, aP2.m_y); } static int @@ -333,7 +349,7 @@ RasterFP_DrawCubic( RasterFP* aRasterFP, if ( devsq < 0.333f ) { - RasterFP_DrawLine( aRasterFP, aP0, aP3 ); + RasterFP_DrawLine( aRasterFP, aP3.m_x , aP3.m_y); return; } @@ -348,11 +364,11 @@ RasterFP_DrawCubic( RasterFP* aRasterFP, 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 next = Lerp( t, a, b ); - RasterFP_DrawLine( aRasterFP, p, next ); + RasterFP_DrawLine( aRasterFP, next.m_x, next.m_y ); 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 @@ -416,11 +432,6 @@ FT_DEFINE_OUTLINE_FUNCS( dense_decompose_funcs, 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, 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++) { //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); } } diff --git a/src/dense/ftdense.h b/src/dense/ftdense.h index 606e020fc..52fb05c4e 100644 --- a/src/dense/ftdense.h +++ b/src/dense/ftdense.h @@ -85,6 +85,7 @@ extern "C" { #endif + typedef long TPos; typedef struct { float m_x; @@ -113,13 +114,10 @@ extern "C" void RasterFP_Create( RasterFP* aRasterFP ); void RasterFP_Destroy( RasterFP* aRasterFP ); - void RasterFP_DrawLine( RasterFP* aRasterFP, - RasterFP_Point aP0, - RasterFP_Point aP1 ); + void RasterFP_DrawLine( RasterFP* aRasterFP, TPos to_x, TPos to_y ); void RasterFP_DrawQuadratic( RasterFP* aRasterFP, - RasterFP_Point aP0, - RasterFP_Point aP1, - RasterFP_Point aP2 ); + const FT_Vector* control, + const FT_Vector* to ); void RasterFP_DrawCubic( RasterFP* aRasterFP, RasterFP_Point aP0, RasterFP_Point aP1,