|
|
@ -3386,18 +3386,48 @@ Color ColorAlpha(Color color, float alpha) |
|
|
|
// Returns src alpha-blended into dst color with tint |
|
|
|
Color ColorAlphaBlend(Color dst, Color src, Color tint) |
|
|
|
{ |
|
|
|
Vector4 fdst = ColorNormalize(dst); |
|
|
|
Vector4 fsrc = ColorNormalize(src); |
|
|
|
Vector4 ftint = ColorNormalize(tint); |
|
|
|
Vector4 fout = { 0.0f }; |
|
|
|
|
|
|
|
// Apply color tint to source image |
|
|
|
fsrc.x *= ftint.x; fsrc.y *= ftint.y; fsrc.z *= ftint.z; fsrc.w *= ftint.w; |
|
|
|
Color out = WHITE; |
|
|
|
|
|
|
|
// TODO: Compute tint color over source properly (before alpha blending) |
|
|
|
|
|
|
|
if (fsrc.w <= 0.0f) fout = fdst; |
|
|
|
else if (fsrc.w >= 1.0f) fout = fsrc; |
|
|
|
//#define COLORALPHABLEND_FLOAT |
|
|
|
#define COLORALPHABLEND_INTEGERS |
|
|
|
#if defined(COLORALPHABLEND_INTEGERS) |
|
|
|
// Apply color tint to source color |
|
|
|
// NOTE: Some problems when aplying source tinting |
|
|
|
//src.r = (unsigned char)(((unsigned int)src.r*(unsigned int)tint.r) >> 8); |
|
|
|
//src.g = (unsigned char)(((unsigned int)src.g*(unsigned int)tint.g) >> 8); |
|
|
|
//src.b = (unsigned char)(((unsigned int)src.b*(unsigned int)tint.b) >> 8); |
|
|
|
//src.a = (unsigned char)(((unsigned int)src.a*255 + (unsigned int)tint.a*(255 - src.a)) >> 8); |
|
|
|
|
|
|
|
if (src.a == 0) out = dst; |
|
|
|
else if (src.a == 255) out = src; |
|
|
|
else |
|
|
|
{ |
|
|
|
unsigned int alpha = (unsigned int)src.a + 1; // We are shifting by 8 (dividing by 256), so we need to take that excess into account |
|
|
|
out.a = (unsigned char)(((unsigned int)alpha*256 + (unsigned int)dst.a*(256 - alpha)) >> 8); |
|
|
|
|
|
|
|
if (out.a > 0) |
|
|
|
{ |
|
|
|
out.r = (unsigned char)((((unsigned int)src.r*alpha*256 + (unsigned int)dst.r*(unsigned int)dst.a*(256 - alpha))/out.a) >> 8); |
|
|
|
out.g = (unsigned char)((((unsigned int)src.g*alpha*256 + (unsigned int)dst.g*(unsigned int)dst.a*(256 - alpha))/out.a) >> 8); |
|
|
|
out.b = (unsigned char)((((unsigned int)src.b*alpha*256 + (unsigned int)dst.b*(unsigned int)dst.a*(256 - alpha))/out.a) >> 8); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#if defined(COLORALPHABLEND_FLOAT) |
|
|
|
// Apply color tint to source color |
|
|
|
//fsrc.x *= ftint.x; fsrc.y *= ftint.y; fsrc.z *= ftint.z; fsrc.w *= ftint.w; |
|
|
|
|
|
|
|
if (src.a == 0) out = dst; |
|
|
|
else if (src.a == 255) out = src; |
|
|
|
else |
|
|
|
{ |
|
|
|
Vector4 fdst = ColorNormalize(dst); |
|
|
|
Vector4 fsrc = ColorNormalize(src); |
|
|
|
Vector4 ftint = ColorNormalize(tint); |
|
|
|
Vector4 fout = { 0.0f }; |
|
|
|
|
|
|
|
fout.w = fsrc.w + fdst.w*(1.0f - fsrc.w); |
|
|
|
|
|
|
|
if (fout.w > 0.0f) |
|
|
@ -3406,9 +3436,10 @@ Color ColorAlphaBlend(Color dst, Color src, Color tint) |
|
|
|
fout.y = (fsrc.y*fsrc.w + fdst.y*fdst.w*(1 - fsrc.w))/fout.w; |
|
|
|
fout.z = (fsrc.z*fsrc.w + fdst.z*fdst.w*(1 - fsrc.w))/fout.w; |
|
|
|
} |
|
|
|
|
|
|
|
out = (Color){ (unsigned char)(fout.x*255.0f), (unsigned char)(fout.y*255.0f), (unsigned char)(fout.z*255.0f), (unsigned char)(fout.w*255.0f) }; |
|
|
|
} |
|
|
|
|
|
|
|
Color out = { (unsigned char)(fout.x*255.0f), (unsigned char)(fout.y*255.0f), (unsigned char)(fout.z*255.0f), (unsigned char)(fout.w*255.0f) }; |
|
|
|
#endif |
|
|
|
|
|
|
|
return out; |
|
|
|
} |
|
|
|