| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "SkXfermode.h" | 9 #include "SkXfermode.h" |
| 10 #include "SkXfermode_opts_SSE2.h" | 10 #include "SkXfermode_opts_SSE2.h" |
| (...skipping 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1194 } | 1194 } |
| 1195 | 1195 |
| 1196 static Sk4f clamp_255(const Sk4f& value) { | 1196 static Sk4f clamp_255(const Sk4f& value) { |
| 1197 return Sk4f::Min(Sk4f(255), value); | 1197 return Sk4f::Min(Sk4f(255), value); |
| 1198 } | 1198 } |
| 1199 | 1199 |
| 1200 static Sk4f clamp_0_255(const Sk4f& value) { | 1200 static Sk4f clamp_0_255(const Sk4f& value) { |
| 1201 return Sk4f::Max(Sk4f(0), Sk4f::Min(Sk4f(255), value)); | 1201 return Sk4f::Max(Sk4f(0), Sk4f::Min(Sk4f(255), value)); |
| 1202 } | 1202 } |
| 1203 | 1203 |
| 1204 // return a swizzle of a | rgb | |
| 1205 static Sk4f set_a_rgb(const Sk4f& a, const Sk4f& rgb) { | |
| 1206 SkPMFloat pma = a; | |
| 1207 SkPMFloat pmc = rgb; | |
| 1208 return SkPMFloat(pma.a(), pmc.r(), pmc.g(), pmc.b()); | |
| 1209 } | |
| 1210 | |
| 1211 /** | 1204 /** |
| 1212 * Some modes can, due to very slight numerical error, generate "invalid" pmcol
ors... | 1205 * Some modes can, due to very slight numerical error, generate "invalid" pmcol
ors... |
| 1213 * | 1206 * |
| 1214 * e.g. | 1207 * e.g. |
| 1215 * alpha = 100.9999 | 1208 * alpha = 100.9999 |
| 1216 * red = 101 | 1209 * red = 101 |
| 1217 * | 1210 * |
| 1218 * or | 1211 * or |
| 1219 * alpha = 255.0001 | 1212 * alpha = 255.0001 |
| 1220 * | 1213 * |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1308 | 1301 |
| 1309 struct Difference4f { | 1302 struct Difference4f { |
| 1310 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { | 1303 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { |
| 1311 const Sk4f inv255(gInv255); | 1304 const Sk4f inv255(gInv255); |
| 1312 Sk4f sa = Sk4f(src.a()); | 1305 Sk4f sa = Sk4f(src.a()); |
| 1313 Sk4f da = Sk4f(dst.a()); | 1306 Sk4f da = Sk4f(dst.a()); |
| 1314 Sk4f sc = src; | 1307 Sk4f sc = src; |
| 1315 Sk4f dc = dst; | 1308 Sk4f dc = dst; |
| 1316 Sk4f min = Sk4f::Min(sc * da, dc * sa) * inv255; | 1309 Sk4f min = Sk4f::Min(sc * da, dc * sa) * inv255; |
| 1317 Sk4f ra = sc + dc - min; | 1310 Sk4f ra = sc + dc - min; |
| 1318 return check_as_pmfloat(set_a_rgb(ra, ra - min)); | 1311 return check_as_pmfloat(ra - min * SkPMFloat(0, 1, 1, 1)); |
| 1319 } | 1312 } |
| 1320 static const bool kFoldCoverageIntoSrcAlpha = false; | 1313 static const bool kFoldCoverageIntoSrcAlpha = false; |
| 1321 static const SkXfermode::Mode kMode = SkXfermode::kDifference_Mode; | 1314 static const SkXfermode::Mode kMode = SkXfermode::kDifference_Mode; |
| 1322 }; | 1315 }; |
| 1323 | 1316 |
| 1324 struct Exclusion4f { | 1317 struct Exclusion4f { |
| 1325 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { | 1318 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { |
| 1326 const Sk4f inv255(gInv255); | 1319 const Sk4f inv255(gInv255); |
| 1327 Sk4f sc = src; | 1320 Sk4f sc = src; |
| 1328 Sk4f dc = dst; | 1321 Sk4f dc = dst; |
| 1329 Sk4f prod = sc * dc * inv255; | 1322 Sk4f prod = sc * dc * inv255; |
| 1330 Sk4f ra = sc + dc - prod; | 1323 Sk4f ra = sc + dc - prod; |
| 1331 return check_as_pmfloat(set_a_rgb(ra, ra - prod)); | 1324 return check_as_pmfloat(ra - prod * SkPMFloat(0, 1, 1, 1)); |
| 1332 } | 1325 } |
| 1333 static const bool kFoldCoverageIntoSrcAlpha = false; | 1326 static const bool kFoldCoverageIntoSrcAlpha = false; |
| 1334 static const SkXfermode::Mode kMode = SkXfermode::kExclusion_Mode; | 1327 static const SkXfermode::Mode kMode = SkXfermode::kExclusion_Mode; |
| 1335 }; | 1328 }; |
| 1336 | 1329 |
| 1337 template <typename ProcType> | 1330 template <typename ProcType> |
| 1338 class SkT4fXfermode : public SkProcCoeffXfermode { | 1331 class SkT4fXfermode : public SkProcCoeffXfermode { |
| 1339 public: | 1332 public: |
| 1340 static SkXfermode* Create(const ProcCoeff& rec) { | 1333 static SkXfermode* Create(const ProcCoeff& rec) { |
| 1341 return SkNEW_ARGS(SkT4fXfermode, (rec)); | 1334 return SkNEW_ARGS(SkT4fXfermode, (rec)); |
| 1342 } | 1335 } |
| 1343 | 1336 |
| 1344 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[
]) const override { | 1337 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[
]) const override { |
| 1345 if (NULL == aa) { | 1338 if (NULL == aa) { |
| 1346 while (n & 3) { | |
| 1347 *dst = ProcType::Xfer(SkPMFloat(*src++), SkPMFloat(*dst)).round(
); | |
| 1348 dst++; | |
| 1349 n -= 1; | |
| 1350 } | |
| 1351 n >>= 2; | |
| 1352 for (int i = 0; i < n; ++i) { | 1339 for (int i = 0; i < n; ++i) { |
| 1353 SkPMFloat s0, s1, s2, s3; | 1340 dst[i] = ProcType::Xfer(SkPMFloat(src[i]), SkPMFloat(dst[i])).ro
und(); |
| 1354 SkPMFloat::From4PMColors(src, &s0, &s1, &s2, &s3); | |
| 1355 SkPMFloat d0, d1, d2, d3; | |
| 1356 SkPMFloat::From4PMColors(dst, &d0, &d1, &d2, &d3); | |
| 1357 SkPMFloat::RoundTo4PMColors(ProcType::Xfer(s0, d0), ProcType::Xf
er(s1, d1), | |
| 1358 ProcType::Xfer(s2, d2), ProcType::Xf
er(s3, d3), dst); | |
| 1359 src += 4; | |
| 1360 dst += 4; | |
| 1361 } | 1341 } |
| 1362 } else { | 1342 } else { |
| 1363 for (int i = 0; i < n; ++i) { | 1343 for (int i = 0; i < n; ++i) { |
| 1364 const Sk4f aa4 = Sk4f(aa[i] * gInv255); | 1344 const Sk4f aa4 = Sk4f(aa[i] * gInv255); |
| 1365 SkPMFloat dstF(dst[i]); | 1345 SkPMFloat dstF(dst[i]); |
| 1366 SkPMFloat srcF(src[i]); | 1346 SkPMFloat srcF(src[i]); |
| 1367 Sk4f res; | 1347 Sk4f res; |
| 1368 if (ProcType::kFoldCoverageIntoSrcAlpha) { | 1348 if (ProcType::kFoldCoverageIntoSrcAlpha) { |
| 1369 Sk4f src4 = srcF; | 1349 Sk4f src4 = srcF; |
| 1370 res = ProcType::Xfer(src4 * aa4, dstF); | 1350 res = ProcType::Xfer(src4 * aa4, dstF); |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1773 } else { | 1753 } else { |
| 1774 proc16 = rec.fProc16_General; | 1754 proc16 = rec.fProc16_General; |
| 1775 } | 1755 } |
| 1776 } | 1756 } |
| 1777 return proc16; | 1757 return proc16; |
| 1778 } | 1758 } |
| 1779 | 1759 |
| 1780 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1760 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
| 1781 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1761 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
| 1782 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1762 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |