diff --git "a/win32ss/gdi/eng/gradient.c" "b/win32ss/gdi/eng/gradient.c" index 3fb80c19e35..0deccb93f94 100644 --- "a/win32ss/gdi/eng/gradient.c" +++ "b/win32ss/gdi/eng/gradient.c" @@ -18,9 +18,12 @@ const LONG LINC[2] = {-1, 1}; #define VERTEX(n) (pVertex + gt->n) #define COMPAREVERTEX(a, b) ((a)->x == (b)->x && (a)->y == (b)->y) -#define VCMPCLR(a,b,c,color) (a->color != b->color || a->color != c->color) +/* Check if all three vectors are the same color, either R, G, or B */ +#define VCMPCLR(a,b,c,color) (a->color == b->color && a->color == c->color) +/* Check if all three vectors have the same colors for R, G, and B, then + * NOT the results because we want to check for not using solid color logic */ #define VCMPCLRS(a,b,c) \ - !(!VCMPCLR(a,b,c,Red) || !VCMPCLR(a,b,c,Green) || !VCMPCLR(a,b,c,Blue)) + !(VCMPCLR(a,b,c,Red) && VCMPCLR(a,b,c,Green) && VCMPCLR(a,b,c,Blue)) /* Horizontal/Vertical gradients */ #define HVINITCOL(Col, id) \ @@ -225,7 +228,7 @@ IntEngGradientFillRect( #define STEPCOL(a,b,line,col,id) \ ec[line][id] += dc[line][id]; \ - while(ec[line][id] > 0) \ + while(ec[line][id] > 0 && dy[line] != 0) \ { \ c[line][id] += ic[line][id]; \ ec[line][id] -= dy[line]; \ @@ -286,7 +289,7 @@ IntEngGradientFillRect( x[line] = a->x; \ sx[line] = a->x + pptlDitherOrg->x; \ dx[line] = abs(b->x - a->x); \ - dy[line] = max(abs(b->y - a->y),1); \ + dy[line] = abs(b->y - a->y); \ incx[line] = LINC[b->x > a->x]; \ ex[line] = -(dy[line]>>1); \ destx[line] = b->x @@ -332,6 +335,10 @@ IntEngGradientFillTriangle( LONG c[NLINES][3], dc[NLINES][3], ec[NLINES][3], ic[NLINES][3]; /* colors on lines */ LONG g, gx, gxi, gc[3], gd[3], ge[3], gi[3]; /* colors in triangle */ LONG sy, y, bt; + static int warn_once; + + if (!warn_once++) + DPRINT1("FIXME: IntEngGradientFillTriangle is broken\n"); v1 = (pVertex + gTriangle->Vertex1); v2 = (pVertex + gTriangle->Vertex2); @@ -355,14 +362,17 @@ IntEngGradientFillTriangle( } DPRINT("Triangle: (%i,%i) (%i,%i) (%i,%i)\n", v1->x, v1->y, v2->x, v2->y, v3->x, v3->y); - /* FIXME: commented out because of an endless loop - fix triangles first */ - DPRINT("FIXME: IntEngGradientFillTriangle is broken\n"); if (!IntEngEnter(&EnterLeave, psoDest, &FillRect, FALSE, &Translate, &psoOutput)) { return FALSE; } + DPRINT("VCMPCLR for Red is %d\n", VCMPCLR(v1, v2, v3,Red)); + DPRINT("VCMPCLR for Green is %d\n", VCMPCLR(v1, v2, v3,Green)); + DPRINT("VCMPCLR for Blue is %d\n", VCMPCLR(v1, v2, v3,Blue)); + DPRINT("VCMPCLRS is %d\n", VCMPCLRS(v1,v2,v3)); + if (VCMPCLRS(v1, v2, v3)) { CLIPOBJ_cEnumStart(pco, FALSE, CT_RECTANGLES, CD_RIGHTDOWN, 0); @@ -411,6 +421,7 @@ IntEngGradientFillTriangle( } /* fill triangle with one solid color */ + DPRINT("Using Solid Color Logic\n"); Color = XLATEOBJ_iXlate(pxlo, RGB(v1->Red >> 8, v1->Green >> 8, v1->Blue >> 8)); CLIPOBJ_cEnumStart(pco, FALSE, CT_RECTANGLES, CD_RIGHTDOWN, 0);