Fix xor B/W mode for transparent images

This is not the best solution at the moment, but's quite acceptable.
This commit is contained in:
David Capello 2014-08-27 10:14:19 -03:00
parent 1297a42933
commit 38127f9d9c
2 changed files with 18 additions and 7 deletions

View File

@ -655,20 +655,25 @@ private:
template<typename ImageTraits>
class XorInkProcessing : public DoubleInkProcessing<XorInkProcessing<ImageTraits>, ImageTraits> {
public:
XorInkProcessing(ToolLoop* loop) { }
XorInkProcessing(ToolLoop* loop) {
m_color = loop->getPrimaryColor();
}
void processPixel(int x, int y) {
// Do nothing
}
private:
color_t m_color;
};
template<>
void XorInkProcessing<RgbTraits>::processPixel(int x, int y) {
*m_dstAddress = rgba_blend_blackandwhite(*m_srcAddress, 0, 255);
*m_dstAddress = rgba_blend_blackandwhite(*m_srcAddress, m_color, 255);
}
template<>
void XorInkProcessing<GrayscaleTraits>::processPixel(int x, int y) {
*m_dstAddress = graya_blend_blackandwhite(*m_srcAddress, 0, 255);
*m_dstAddress = graya_blend_blackandwhite(*m_srcAddress, m_color, 255);
}
template<>

View File

@ -202,17 +202,20 @@ int rgba_blend_blackandwhite(int back, int front, int opacity)
int B_r, B_g, B_b, B_a;
int D_v;
B_a = rgba_geta(back);
if (B_a == 0)
return front;
B_r = rgba_getr(back);
B_g = rgba_getg(back);
B_b = rgba_getb(back);
B_a = rgba_geta(back);
if ((B_r*30 + B_g*59 + B_b*11)/100 < 128)
D_v = 255;
else
D_v = 0;
return rgba(D_v, D_v, D_v, B_a);
return rgba(D_v, D_v, D_v, 255);
}
/**********************************************************************/
@ -297,15 +300,18 @@ int graya_blend_blackandwhite(int back, int front, int opacity)
int B_k, B_a;
int D_k;
B_k = graya_getv(back);
B_a = graya_geta(back);
if (B_a == 0)
return front;
B_k = graya_getv(back);
if (B_k < 128)
D_k = 255;
else
D_k = 0;
return graya(D_k, B_a);
return graya(D_k, 255);
}
} // namespace raster