mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-10 03:44:16 +00:00
Fix dynamics + gradient + no dithering + fg or bg is mask color results in an opaque stroke.
Before this fix, dynamic + gradient (pressure or velocity) + no dithering + fg or bg = mask color results in an opaque stroke.
This commit is contained in:
parent
4ff4274deb
commit
022c0c38df
@ -98,20 +98,39 @@ public:
|
||||
color_t b = m_primaryColor;
|
||||
const float t = pt.gradient;
|
||||
const float ti = 1.0f - pt.gradient;
|
||||
|
||||
auto rgbaGradient = [t, ti](color_t a, color_t b) -> color_t {
|
||||
if (rgba_geta(a) == 0)
|
||||
return doc::rgba(rgba_getr(b),
|
||||
rgba_getg(b),
|
||||
rgba_getb(b),
|
||||
int(t*rgba_geta(b)));
|
||||
else if (rgba_geta(b) == 0)
|
||||
return doc::rgba(rgba_getr(a),
|
||||
rgba_getg(a),
|
||||
rgba_getb(a),
|
||||
int(ti*rgba_geta(a)));
|
||||
else
|
||||
return doc::rgba(int(ti*rgba_getr(a) + t*rgba_getr(b)),
|
||||
int(ti*rgba_getg(a) + t*rgba_getg(b)),
|
||||
int(ti*rgba_getb(a) + t*rgba_getb(b)),
|
||||
int(ti*rgba_geta(a) + t*rgba_geta(b)));
|
||||
};
|
||||
|
||||
switch (loop->sprite()->pixelFormat()) {
|
||||
case IMAGE_RGB:
|
||||
if (rgba_geta(a) == 0) a = b;
|
||||
else if (rgba_geta(b) == 0) b = a;
|
||||
a = doc::rgba(int(ti*rgba_getr(a) + t*rgba_getr(b)),
|
||||
int(ti*rgba_getg(a) + t*rgba_getg(b)),
|
||||
int(ti*rgba_getb(a) + t*rgba_getb(b)),
|
||||
int(ti*rgba_geta(a) + t*rgba_geta(b)));
|
||||
a = rgbaGradient(a, b);
|
||||
break;
|
||||
case IMAGE_GRAYSCALE:
|
||||
if (graya_geta(a) == 0) a = b;
|
||||
else if (graya_geta(b) == 0) b = a;
|
||||
a = doc::graya(int(ti*graya_getv(a) + t*graya_getv(b)),
|
||||
int(ti*graya_geta(a) + t*graya_geta(b)));
|
||||
if (graya_geta(a) == 0)
|
||||
a = doc::graya(graya_getv(b),
|
||||
int(t*graya_geta(b)));
|
||||
else if (graya_geta(b) == 0)
|
||||
a = doc::graya(graya_getv(a),
|
||||
int(ti*graya_geta(a)));
|
||||
else
|
||||
a = doc::graya(int(ti*graya_getv(a) + t*graya_getv(b)),
|
||||
int(ti*graya_geta(a) + t*graya_geta(b)));
|
||||
break;
|
||||
case IMAGE_INDEXED: {
|
||||
int maskIndex = (loop->getLayer()->isBackground() ? -1: loop->sprite()->transparentColor());
|
||||
@ -121,12 +140,7 @@ public:
|
||||
if (b == maskIndex) b = 0;
|
||||
else b = loop->getPalette()->getEntry(b);
|
||||
// Same as in RGBA gradient
|
||||
if (rgba_geta(a) == 0) a = b;
|
||||
else if (rgba_geta(b) == 0) b = a;
|
||||
a = doc::rgba(int(ti*rgba_getr(a) + t*rgba_getr(b)),
|
||||
int(ti*rgba_getg(a) + t*rgba_getg(b)),
|
||||
int(ti*rgba_getb(a) + t*rgba_getb(b)),
|
||||
int(ti*rgba_geta(a) + t*rgba_geta(b)));
|
||||
a = rgbaGradient(a, b);
|
||||
// Convert RGBA to index
|
||||
a = loop->getRgbMap()->mapColor(rgba_getr(a),
|
||||
rgba_getg(a),
|
||||
|
Loading…
x
Reference in New Issue
Block a user