freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Git][freetype/freetype][gsoc-anurag-2022-final] [dense] Add optimizatio


From: Anurag Thakur (@AdbhutDev)
Subject: [Git][freetype/freetype][gsoc-anurag-2022-final] [dense] Add optimization for division
Date: Sat, 19 Nov 2022 07:54:22 +0000

Anurag Thakur pushed to branch gsoc-anurag-2022-final at FreeType / FreeType

Commits:

  • 6b161ceb
    by Anurag Thakur at 2022-11-19T13:22:15+05:30
    [dense] Add optimization for division
    
    * src/dense/ftdense.c: FT_UDIV, FT_UDIVPREP macros taken from smooth
    rasterizer, help optimize fixed-point division
    

1 changed file:

Changes:

  • src/dense/ftdense.c
    ... ... @@ -41,6 +41,11 @@
    41 41
     #define FT_MAX( a, b )  ( (a) > (b) ? (a) : (b) )
    
    42 42
     #define FT_ABS( a )     ( (a) < 0 ? -(a) : (a) )
    
    43 43
     
    
    44
    +// TODO: Fix types
    
    45
    +#define FT_UDIVPREP( c, b )                                \
    
    46
    +  FT26D6  b ## _r = c ? (FT26D6)0xFFFFFFFF / ( b ) : 0
    
    47
    +#define FT_UDIV( a, b )                                           \
    
    48
    +  (FT26D6)( ( (FT26D6)( a ) * (FT26D6)( b ## _r ) ) >> 32 )
    
    44 49
     
    
    45 50
     typedef struct dense_TRaster_
    
    46 51
     {
    
    ... ... @@ -114,6 +119,10 @@ dense_render_line( dense_worker* worker, FT_Pos tox, FT_Pos toy )
    114 119
       deltax = to_x - from_x;
    
    115 120
       deltay = to_y - from_y;
    
    116 121
     
    
    122
    +    FT_UDIVPREP(from_x != to_x, deltax);
    
    123
    +
    
    124
    +    FT_UDIVPREP(from_y != to_y, deltay);
    
    125
    +
    
    117 126
       if ( from_y < 0 )
    
    118 127
       {
    
    119 128
         from_x -= from_y * deltax/deltay;
    
    ... ... @@ -164,7 +173,7 @@ dense_render_line( dense_worker* worker, FT_Pos tox, FT_Pos toy )
    164 173
         {
    
    165 174
           int   linestart = y * worker->m_w;
    
    166 175
           FT26D6 dy        = FT_MIN( (y + 1)<<6, to_y ) - FT_MAX( y<<6, from_y );
    
    167
    -      FT26D6 xnext     = x + dy * deltax/deltay;
    
    176
    +      FT26D6 xnext     = x + FT_UDIV((dy*deltax), deltay);
    
    168 177
           FT26D6 d         = dy * dir;
    
    169 178
     
    
    170 179
           FT26D6 x0, x1;
    
    ... ... @@ -197,13 +206,16 @@ dense_render_line( dense_worker* worker, FT_Pos tox, FT_Pos toy )
    197 206
           {
    
    198 207
     
    
    199 208
             FT26D6 oneOverS = x1 - x0;
    
    209
    +
    
    210
    +        FT_UDIVPREP(x1 != x0, oneOverS);
    
    211
    +
    
    200 212
             FT26D6 x0f = x0 - x0floor;
    
    201 213
     
    
    202 214
     
    
    203 215
             FT26D6 oneMinusX0f = (1<<6) - x0f;
    
    204
    -        FT26D6 a0 = ((oneMinusX0f * oneMinusX0f) >> 1) / oneOverS;
    
    216
    +        FT26D6 a0 = FT_UDIV(((oneMinusX0f * oneMinusX0f) >> 1), oneOverS);
    
    205 217
             FT26D6 x1f = x1 - x1ceil + (1<<6);
    
    206
    -        FT26D6 am = ((x1f * x1f) >> 1) / oneOverS;
    
    218
    +        FT26D6 am =  FT_UDIV(((x1f * x1f) >> 1) , oneOverS);
    
    207 219
     
    
    208 220
             m_a[linestart + x0i] += d * a0;
    
    209 221
     
    
    ... ... @@ -211,15 +223,15 @@ dense_render_line( dense_worker* worker, FT_Pos tox, FT_Pos toy )
    211 223
               m_a[linestart + ( x0i + 1 )] += d * ( (1<<6) - a0 - am );
    
    212 224
             else
    
    213 225
             {
    
    214
    -          FT26D6 a1 = (((1<<6) + (1<<5) - x0f) << 6) / oneOverS;
    
    226
    +          FT26D6 a1 =  FT_UDIV((((1<<6) + (1<<5) - x0f) << 6) , oneOverS);
    
    215 227
               m_a[linestart + ( x0i + 1 )] += d * ( a1 - a0 );
    
    216 228
     
    
    217
    -          FT26D6 dTimesS = (d << 12) / oneOverS;
    
    229
    +          FT26D6 dTimesS =  FT_UDIV((d << 12) , oneOverS);
    
    218 230
     
    
    219 231
               for ( FT26D6 xi = x0i + 2; xi < x1i - 1; xi++ )
    
    220 232
                 m_a[linestart + xi] += dTimesS;
    
    221 233
     
    
    222
    -          FT26D6 a2 = a1 + (( x1i - x0i - 3 )<<12)/oneOverS;
    
    234
    +          FT26D6 a2 = a1 +  FT_UDIV((( x1i - x0i - 3 )<<12),oneOverS);
    
    223 235
               m_a[linestart + ( x1i - 1 )] += d * ( (1<<6) - a2 - am );
    
    224 236
             }
    
    225 237
             m_a[linestart + x1i] += d * am;
    


  • reply via email to

    [Prev in Thread] Current Thread [Next in Thread]