I'm trying to blend two colors that are coded as integers. Here is my little function:
int blend (int a, int b, float ratio) {
if (ratio > 1f) {
ratio = 1f;
} else if (ratio < 0f) {
ratio = 0f;
}
float iRatio = 1.0f - ratio;
int aA = (a >> 24 & 0xff);
int aR = ((a & 0xff0000) >> 16);
int aG = ((a & 0xff00) >> 8);
int aB = (a & 0xff);
int bA = (b >> 24 & 0xff);
int bR = ((b & 0xff0000) >> 16);
int bG = ((b & 0xff00) >> 8);
int bB = (b & 0xff);
int A = ((int)(aA * iRatio) + (int)(bA * ratio));
int R = ((int)(aR * iRatio) + (int)(bR * ratio));
int G = ((int)(aG * iRatio) + (int)(bG * ratio));
int B = ((int)(aB * iRatio) + (int)(bB * ratio));
return A << 24 | R << 16 | G << 8 | B;
}
Everything seems to work fine, but certain arguments produce wrong colors. For example:
int a = 0xbbccdd;
int b = 0xbbccdd;
int c = blend(a, b, 0.5f); // gives 0xbaccdc, although it should be 0xbbccdd
My guess is that either multiplication by float ratios or casting are to blame here, but I can't figure out what's wrong with them...
So what's the correct way to blend two colors in java?
My guess is that the casting to int should be done after the addition. Like this
int a = (int)((aA * iRatio) + (bA * ratio));
I would also suggest using Java naming conventions when using variables. Only constants should be caps.