Index: src/core/SkXfermode.cpp |
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp |
index 22881c6cfe94d63d3a5a5e6b3f95f9ad82a5481e..8b28f1b5150a8e03811c6863e2ef277b23952d1c 100644 |
--- a/src/core/SkXfermode.cpp |
+++ b/src/core/SkXfermode.cpp |
@@ -320,8 +320,10 @@ static Sk4f color_4f(const Sk4f& s, const Sk4f& d) { |
float Sb = sb; |
SetLum(&Sr, &Sg, &Sb, sa * da, Lum(dr, dg, db) * sa); |
- return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr, Sg, Sb), |
- sa + da - sa * da); |
+ Sk4f res = color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Sr, Sg, Sb), |
+ sa + da - sa * da); |
+ // Can return tiny negative values ... |
+ return Sk4f::Max(res, Sk4f(0)); |
} |
static Sk4f luminosity_4f(const Sk4f& s, const Sk4f& d) { |
@@ -340,8 +342,10 @@ static Sk4f luminosity_4f(const Sk4f& s, const Sk4f& d) { |
float Db = db; |
SetLum(&Dr, &Dg, &Db, sa * da, Lum(sr, sg, sb) * da); |
- return color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr, Dg, Db), |
- sa + da - sa * da); |
+ Sk4f res = color_alpha(s * inv_alpha(d) + d * inv_alpha(s) + set_argb(0, Dr, Dg, Db), |
+ sa + da - sa * da); |
+ // Can return tiny negative values ... |
+ return Sk4f::Max(res, Sk4f(0)); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -921,8 +925,7 @@ static Sk4f as_4f(const SkPM4f& pm4) { |
return Sk4f::Load(pm4.fVec); |
} |
-template <Sk4f (blend)(const Sk4f&, const Sk4f&)> SkPM4f proc_4f(const SkPM4f& s, const SkPM4f& d) { |
- SkPM4f r = as_pm4f(blend(as_4f(s), as_4f(d))); |
+static void assert_unit(const SkPM4f& r) { |
#ifdef SK_DEBUG |
const float min = 0; |
const float max = 1; |
@@ -930,6 +933,13 @@ template <Sk4f (blend)(const Sk4f&, const Sk4f&)> SkPM4f proc_4f(const SkPM4f& s |
SkASSERT(r.fVec[i] >= min && r.fVec[i] <= max); |
} |
#endif |
+} |
+ |
+template <Sk4f (blend)(const Sk4f&, const Sk4f&)> SkPM4f proc_4f(const SkPM4f& s, const SkPM4f& d) { |
+ assert_unit(s); |
+ assert_unit(d); |
+ SkPM4f r = as_pm4f(blend(as_4f(s), as_4f(d))); |
+ assert_unit(r); |
return r; |
} |