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 vertical lines
Date: Sat, 19 Nov 2022 07:46:24 +0000

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

Commits:

  • 5d683228
    by Anurag Thakur at 2022-11-19T13:14:51+05:30
    [dense] Add optimization for vertical lines
    
    * src/dense/ftdense.c: Optimize line drawing when a vertical line is encountered
    

1 changed file:

Changes:

  • src/dense/ftdense.c
    ... ... @@ -126,77 +126,106 @@ dense_render_line( dense_worker* worker, FT_Pos tox, FT_Pos toy )
    126 126
         to_y = worker->m_h<<6;
    
    127 127
       }
    
    128 128
     
    
    129
    -  int    x       = from_x;
    
    130
    -  int    y0      = from_y>>6;
    
    131
    -  int    y_limit = (to_y + 0x3f)>>6;
    
    132 129
     
    
    133
    -  FT20D12* m_a     = worker->m_a;
    
    130
    +  if(deltax == 0){
    
    131
    +    FT26D6 x       = from_x;
    
    132
    +    int   x0i    = x>>6;
    
    133
    +    FT26D6 x0floor = x0i<<6;
    
    134 134
     
    
    135
    -  for ( int y = y0; y < y_limit; y++ )
    
    136
    -  {
    
    137
    -    int   linestart = y * worker->m_w;
    
    138
    -    FT26D6 dy        = FT_MIN( (y + 1)<<6, to_y ) - FT_MAX( y<<6, from_y );
    
    139
    -    FT26D6 xnext     = x + dy * deltax/deltay;
    
    140
    -    FT26D6 d         = dy * dir;
    
    135
    +    // y-coordinate of first pixel of line
    
    136
    +    int    y0      = from_y>>6;
    
    141 137
     
    
    142
    -    FT26D6 x0, x1;
    
    143
    -    if ( x < xnext )
    
    144
    -    {
    
    145
    -      x0 = x;
    
    146
    -      x1 = xnext;
    
    147
    -    }
    
    148
    -    else
    
    149
    -    {
    
    150
    -      x0 = xnext;
    
    151
    -      x1 = x;
    
    152
    -    }
    
    138
    +    // y-coordinate of last pixel of line
    
    139
    +    int    y_limit = (to_y + 0x3f)>>6;
    
    140
    +    FT20D12* m_a   = worker->m_a;
    
    153 141
     
    
    154 142
     
    
    155
    -    int   x0i    = x0>>6;
    
    156
    -    FT26D6 x0floor = x0i<<6;
    
    157 143
     
    
    144
    +    for ( int y = y0; y < y_limit; y++ )
    
    145
    +    {
    
    146
    +      int linestart = y * worker->m_w;
    
    158 147
     
    
    159
    -    int   x1i    = (x1+0x3f)>>6;
    
    160
    -    FT26D6 x1ceil =  x1i <<6;
    
    148
    +     FT26D6 dy   = min( (y + 1)<<6, to_y ) - max( y<<6, from_y );
    
    149
    +
    
    150
    +      m_a[linestart + x0i] += dir*dy*(64 - x + x0floor);
    
    151
    +      m_a[linestart + ( x0i + 1 )] += dir*dy*(x-x0floor);
    
    161 152
     
    
    162
    -    if ( x1i <= x0i + 1 )
    
    163
    -    {
    
    164
    -      FT26D6 xmf = ( ( x + xnext )>>1) - x0floor;
    
    165
    -      m_a[linestart + x0i] += d * ((1<<6) - xmf);
    
    166
    -      m_a[linestart + ( x0i + 1 )] += d * xmf;
    
    167 153
         }
    
    168
    -    else
    
    154
    +  }
    
    155
    +  else
    
    156
    +  {
    
    157
    +    int    x       = from_x;
    
    158
    +    int    y0      = from_y>>6;
    
    159
    +    int    y_limit = (to_y + 0x3f)>>6;
    
    160
    +
    
    161
    +    FT20D12* m_a     = worker->m_a;
    
    162
    +
    
    163
    +    for ( int y = y0; y < y_limit; y++ )
    
    169 164
         {
    
    165
    +      int   linestart = y * worker->m_w;
    
    166
    +      FT26D6 dy        = FT_MIN( (y + 1)<<6, to_y ) - FT_MAX( y<<6, from_y );
    
    167
    +      FT26D6 xnext     = x + dy * deltax/deltay;
    
    168
    +      FT26D6 d         = dy * dir;
    
    169
    +
    
    170
    +      FT26D6 x0, x1;
    
    171
    +      if ( x < xnext )
    
    172
    +      {
    
    173
    +        x0 = x;
    
    174
    +        x1 = xnext;
    
    175
    +      }
    
    176
    +      else
    
    177
    +      {
    
    178
    +        x0 = xnext;
    
    179
    +        x1 = x;
    
    180
    +      }
    
    170 181
     
    
    171
    -      FT26D6 oneOverS = x1 - x0;
    
    172
    -      FT26D6 x0f = x0 - x0floor;
    
    173 182
     
    
    183
    +      int   x0i    = x0>>6;
    
    184
    +      FT26D6 x0floor = x0i<<6;
    
    174 185
     
    
    175
    -      FT26D6 oneMinusX0f = (1<<6) - x0f;
    
    176
    -      FT26D6 a0 = ((oneMinusX0f * oneMinusX0f) >> 1) / oneOverS;
    
    177
    -      FT26D6 x1f = x1 - x1ceil + (1<<6);
    
    178
    -      FT26D6 am = ((x1f * x1f) >> 1) / oneOverS;
    
    179 186
     
    
    180
    -      m_a[linestart + x0i] += d * a0;
    
    187
    +      int   x1i    = (x1+0x3f)>>6;
    
    188
    +      FT26D6 x1ceil =  x1i <<6;
    
    181 189
     
    
    182
    -      if ( x1i == x0i + 2 )
    
    183
    -        m_a[linestart + ( x0i + 1 )] += d * ( (1<<6) - a0 - am );
    
    190
    +      if ( x1i <= x0i + 1 )
    
    191
    +      {
    
    192
    +        FT26D6 xmf = ( ( x + xnext )>>1) - x0floor;
    
    193
    +        m_a[linestart + x0i] += d * ((1<<6) - xmf);
    
    194
    +        m_a[linestart + ( x0i + 1 )] += d * xmf;
    
    195
    +      }
    
    184 196
           else
    
    185 197
           {
    
    186
    -        FT26D6 a1 = (((1<<6) + (1<<5) - x0f) << 6) / oneOverS;
    
    187
    -        m_a[linestart + ( x0i + 1 )] += d * ( a1 - a0 );
    
    188 198
     
    
    189
    -        FT26D6 dTimesS = (d << 12) / oneOverS;
    
    199
    +        FT26D6 oneOverS = x1 - x0;
    
    200
    +        FT26D6 x0f = x0 - x0floor;
    
    201
    +
    
    202
    +
    
    203
    +        FT26D6 oneMinusX0f = (1<<6) - x0f;
    
    204
    +        FT26D6 a0 = ((oneMinusX0f * oneMinusX0f) >> 1) / oneOverS;
    
    205
    +        FT26D6 x1f = x1 - x1ceil + (1<<6);
    
    206
    +        FT26D6 am = ((x1f * x1f) >> 1) / oneOverS;
    
    207
    +
    
    208
    +        m_a[linestart + x0i] += d * a0;
    
    209
    +
    
    210
    +        if ( x1i == x0i + 2 )
    
    211
    +          m_a[linestart + ( x0i + 1 )] += d * ( (1<<6) - a0 - am );
    
    212
    +        else
    
    213
    +        {
    
    214
    +          FT26D6 a1 = (((1<<6) + (1<<5) - x0f) << 6) / oneOverS;
    
    215
    +          m_a[linestart + ( x0i + 1 )] += d * ( a1 - a0 );
    
    216
    +
    
    217
    +          FT26D6 dTimesS = (d << 12) / oneOverS;
    
    190 218
     
    
    191
    -        for ( FT26D6 xi = x0i + 2; xi < x1i - 1; xi++ )
    
    192
    -          m_a[linestart + xi] += dTimesS;
    
    219
    +          for ( FT26D6 xi = x0i + 2; xi < x1i - 1; xi++ )
    
    220
    +            m_a[linestart + xi] += dTimesS;
    
    193 221
     
    
    194
    -        FT26D6 a2 = a1 + (( x1i - x0i - 3 )<<12)/oneOverS;
    
    195
    -        m_a[linestart + ( x1i - 1 )] += d * ( (1<<6) - a2 - am );
    
    222
    +          FT26D6 a2 = a1 + (( x1i - x0i - 3 )<<12)/oneOverS;
    
    223
    +          m_a[linestart + ( x1i - 1 )] += d * ( (1<<6) - a2 - am );
    
    224
    +        }
    
    225
    +        m_a[linestart + x1i] += d * am;
    
    196 226
           }
    
    197
    -      m_a[linestart + x1i] += d * am;
    
    227
    +      x = xnext;
    
    198 228
         }
    
    199
    -    x = xnext;
    
    200 229
       }
    
    201 230
     }
    
    202 231
     
    


  • reply via email to

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