colorize-alpha: only recolor if source alpha is > 0 to avoid overpainted background - refs #1371

This commit is contained in:
Dane Springmeyer 2012-08-03 14:48:02 -07:00
parent 9284c6369d
commit b43697fd5d

View file

@ -1468,31 +1468,38 @@ namespace agg
// source rgb // source rgb
unsigned sr, unsigned sg, unsigned sb, unsigned sr, unsigned sg, unsigned sb,
// source alpha and opacity // source alpha and opacity
unsigned sa, unsigned cover) { unsigned sa, unsigned cover)
if (cover < 255) { {
if(cover < 255)
{
sr = (sr * cover + 255) >> 8;
sg = (sg * cover + 255) >> 8;
sb = (sb * cover + 255) >> 8;
sa = (sa * cover + 255) >> 8; sa = (sa * cover + 255) >> 8;
} }
p[Order::R] = (value_type)(((0 + base_mask) >> base_shift)); if (sa > 0)
p[Order::G] = (value_type)(((0 + base_mask) >> base_shift)); {
p[Order::B] = (value_type)(((0 + base_mask) >> base_shift)); p[Order::R] = (value_type)(((0 + base_mask) >> base_shift));
p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift)); p[Order::G] = (value_type)(((0 + base_mask) >> base_shift));
p[Order::B] = (value_type)(((0 + base_mask) >> base_shift));
// http://en.wikipedia.org/wiki/File:HSV-RGB-comparison.svg p[Order::A] = (value_type)(sa + p[Order::A] - ((sa * p[Order::A] + base_mask) >> base_shift));
if (p[Order::A] < 64) { // http://en.wikipedia.org/wiki/File:HSV-RGB-comparison.svg
p[Order::G] = ((p[Order::A] - 64) * 4); if (p[Order::A] < 64) {
p[Order::B] = 255; p[Order::G] = ((p[Order::A] - 64) * 4);
} p[Order::B] = 255;
if (p[Order::A] >= 64 && p[Order::A] < 128) { }
p[Order::G] = 255; if (p[Order::A] >= 64 && p[Order::A] < 128) {
p[Order::B] = 255 - ((p[Order::A] - 64) * 4); p[Order::G] = 255;
} p[Order::B] = 255 - ((p[Order::A] - 64) * 4);
if (p[Order::A] >= 128 && p[Order::A] < 192) { }
p[Order::R] = ((p[Order::A] - 128) * 4); if (p[Order::A] >= 128 && p[Order::A] < 192) {
p[Order::G] = 255; p[Order::R] = ((p[Order::A] - 128) * 4);
} p[Order::G] = 255;
if (p[Order::A] >= 192) { }
p[Order::R] = 255; if (p[Order::A] >= 192) {
p[Order::G] = 255 - ((p[Order::A] - 192) * 4); p[Order::R] = 255;
p[Order::G] = 255 - ((p[Order::A] - 192) * 4);
}
} }
} }
}; };