mirror of
https://github.com/aseprite/aseprite.git
synced 2024-10-03 21:46:20 +00:00
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:
parent
1297a42933
commit
38127f9d9c
@ -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<>
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user