
void CDrawing::FillGradient(int x, int y, int h, int w, DWORD color1, DWORD color2)
{
DWORD a1 = (color1 >> 24) & 0xFF;
DWORD r1 = (color1 >> 16) & 0xFF;
DWORD g1 = (color1 >> 8) & 0xFF;
DWORD b1 = color1 & 0xFF;
DWORD a2 = (color2 >> 24) & 0xFF;
DWORD r2 = (color2 >> 16) & 0xFF;
DWORD g2 = (color2 >> 8) & 0xFF;
DWORD b2 = color2 & 0xFF;
float aDif, rDif, gDif, bDif;
aDif = ((float)a2 - (float)a1) / h;
rDif = ((float)r2 - (float)r1) / h;
gDif = ((float)g2 - (int)g1) / h;
bDif = ((float)b2 - (float)b1) / h;
DWORD DrawCol;
for (int i = 0; i<h; i++)
{
DrawCol = (a1 + (int)(aDif*i) << 24) | (r1 + (int)(rDif * i) << 16) | (g1 + (int)(gDif * i) << 8) | (b1 + (int)(bDif*i));
pDrawing.FillRGBA(x, y + i, w, 1, DrawCol);
}
}
struct Color {
Color(int _r, int _g, int _b, int _a)
{
r = _r;
g = _g;
b = _b;
a = _a;
}
void operator +=(Color &o)
{
r += o.r;
g += o.g;
b += o.b;
a += o.a;
}
Color operator -(Color &o)
{
return Color(r - o.r, g - o.g, b - o.b, a - o.a);
}
char a,r,g,b;
}
void CSkidding::FillGradient(int x, int y, int h, int w, Color c1, Color c2)
{
Color drawStep(c2 - c1); // add division since i am lazy
int i = 0; // fix in edit
while(i++ < h)
{
c1 += drawStep;
this->FillRGBA(x, y + i, w, 1, c1);
}
}
void FillGradient(IDirect3DDevice9 * m_pD3Ddev,int x, int y, int h, int w, DWORD color1, DWORD color2)
{
DWORD a1 = (color1>>24)&0xFF;
DWORD r1 = (color1>>16)&0xFF;
DWORD g1 = (color1>>8)&0xFF;
DWORD b1 = color1&0xFF;
DWORD a2 = (color2>>24)&0xFF;
DWORD r2 = (color2>>16)&0xFF;
DWORD g2 = (color2>>8)&0xFF;
DWORD b2 = color2&0xFF;
float aDif,rDif,gDif,bDif;
aDif = ((float)a2-(float)a1)/h;
rDif = ((float)r2-(float)r1)/h;
gDif = ((float)g2-(int)g1)/h;
bDif = ((float)b2-(float)b1)/h;
DWORD DrawCol;
for(int i = 0;i<h;i++)
{
DrawCol = (a1+(int)(aDif*i) << 24) | (r1+(int)(rDif * i) << 16) | (g1+(int)(gDif * i) << 8) | (b1+(int)(bDif*i));
DrawRect(m_pD3Ddev,x,y+i,w,1,DrawCol);
}
}