Changeset 1172


Ignore:
Timestamp:
Oct 1, 2006, 12:47:41 PM (14 years ago)
Author:
Sam Hocevar
Message:
  • Optimised triangle rasteriser. Thanks to Jylam for the hints.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/cucul/triangle.c

    r1036 r1172  
    9292                        int x3, int y3, char const *str)
    9393{
    94     int x, y, xa, xb, xmax, ymax;
     94    int x, y, xmax, ymax;
     95    long int xa, xb, sl21, sl31, sl32;
    9596    uint32_t ch;
    9697
     
    102103        return cucul_fill_triangle(cv, x1, y1, x3, y3, x2, y2, str);
    103104
    104     /* Promote precision */
    105     x1 *= 4;
    106     x2 *= 4;
    107     x3 *= 4;
     105    ch = cucul_utf8_to_utf32(str, NULL);
     106
     107    /* Compute slopes and promote precision */
     108    sl21 = (y2 == y1) ? 0 : (x2 - x1) * 0x1000 / (y2 - y1);
     109    sl31 = (y3 == y1) ? 0 : (x3 - x1) * 0x1000 / (y3 - y1);
     110    sl32 = (y3 == y2) ? 0 : (x3 - x2) * 0x1000 / (y3 - y2);
     111
     112    x1 *= 0x1000;
     113    x2 *= 0x1000;
     114    x3 *= 0x1000;
    108115
    109116    xmax = cv->width - 1;
    110117    ymax = cv->height - 1;
    111118
    112     ch = cucul_utf8_to_utf32(str, NULL);
    113 
    114119    /* Rasterize our triangle */
    115120    for(y = y1 < 0 ? 0 : y1; y <= y3 && y <= ymax; y++)
    116121    {
    117         if(y <= y2)
     122        if(y < y2)
    118123        {
    119             xa = (y1 == y2) ? x2 : x1 + (x2 - x1) * (y - y1) / (y2 - y1);
    120             xb = (y1 == y3) ? x3 : x1 + (x3 - x1) * (y - y1) / (y3 - y1);
     124            xa = x1 + sl21 * (y - y1);
     125            xb = x1 + sl31 * (y - y1);
    121126        }
    122         else
     127        else if(y == y2)
    123128        {
    124             xa = (y3 == y2) ? x2 : x3 + (x2 - x3) * (y - y3) / (y2 - y3);
    125             xb = (y3 == y1) ? x1 : x3 + (x1 - x3) * (y - y3) / (y1 - y3);
     129            xa = x2;
     130            xb = (y1 == y3) ? x3 : x1 + sl31 * (y - y1);
     131        }
     132        else /* (y > y2) */
     133        {
     134            xa = x3 + sl32 * (y - y3);
     135            xb = x3 + sl31 * (y - y3);
    126136        }
    127137
    128138        if(xb < xa)
    129139        {
    130             int tmp = xb;
    131             xb = xa; xa = tmp;
     140            long int tmp = xb; xb = xa; xa = tmp;
    132141        }
    133142
    134143        /* Rescale xa and xb, recentering the division */
    135         xa = (xa + 1) / 4;
    136         xb = (xb + 2) / 4;
     144        xa = (xa + 0x800) / 0x1000;
     145        xb = (xb + 0x801) / 0x1000;
    137146
    138         if(xb < 0) continue;
    139         if(xa > xmax) continue;
    140         if(xa < 0) xa = 0;
    141         if((xb) > xmax) xb = xmax;
    142 
    143         for(x = xa; x <= xb; x++)
     147        for(x = xa < 0 ? 0 : xa; x <= xb && x <= xmax; x++)
    144148            cucul_putchar(cv, x, y, ch);
    145149    }
Note: See TracChangeset for help on using the changeset viewer.