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 798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
809 return true; | 809 return true; |
810 default: | 810 default: |
811 return false; | 811 return false; |
812 } | 812 } |
813 } | 813 } |
814 | 814 |
815 bool SkProcCoeffXfermode::isOpaque(SkXfermode::SrcColorOpacity opacityType) cons
t { | 815 bool SkProcCoeffXfermode::isOpaque(SkXfermode::SrcColorOpacity opacityType) cons
t { |
816 if (CANNOT_USE_COEFF == fSrcCoeff) { | 816 if (CANNOT_USE_COEFF == fSrcCoeff) { |
817 return false; | 817 return false; |
818 } | 818 } |
819 | 819 |
820 if (SkXfermode::kDA_Coeff == fSrcCoeff || SkXfermode::kDC_Coeff == fSrcCoeff
|| | 820 if (SkXfermode::kDA_Coeff == fSrcCoeff || SkXfermode::kDC_Coeff == fSrcCoeff
|| |
821 SkXfermode::kIDA_Coeff == fSrcCoeff || SkXfermode::kIDC_Coeff == fSrcCoe
ff) { | 821 SkXfermode::kIDA_Coeff == fSrcCoeff || SkXfermode::kIDC_Coeff == fSrcCoe
ff) { |
822 return false; | 822 return false; |
823 } | 823 } |
824 | 824 |
825 switch (fDstCoeff) { | 825 switch (fDstCoeff) { |
826 case SkXfermode::kZero_Coeff: | 826 case SkXfermode::kZero_Coeff: |
827 return true; | 827 return true; |
828 case SkXfermode::kISA_Coeff: | 828 case SkXfermode::kISA_Coeff: |
829 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; | 829 return SkXfermode::kOpaque_SrcColorOpacity == opacityType; |
830 case SkXfermode::kSA_Coeff: | 830 case SkXfermode::kSA_Coeff: |
831 return SkXfermode::kTransparentBlack_SrcColorOpacity == opacityType
|| | 831 return SkXfermode::kTransparentBlack_SrcColorOpacity == opacityType
|| |
832 SkXfermode::kTransparentAlpha_SrcColorOpacity == opacityType; | 832 SkXfermode::kTransparentAlpha_SrcColorOpacity == opacityType; |
833 case SkXfermode::kSC_Coeff: | 833 case SkXfermode::kSC_Coeff: |
834 return SkXfermode::kTransparentBlack_SrcColorOpacity == opacityType; | 834 return SkXfermode::kTransparentBlack_SrcColorOpacity == opacityType; |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1209 * | 1209 * |
1210 * If we know we're going to write-out the values as bytes, we can relax these
somewhat, | 1210 * If we know we're going to write-out the values as bytes, we can relax these
somewhat, |
1211 * since we only really need to enforce that the bytes are valid premul... | 1211 * since we only really need to enforce that the bytes are valid premul... |
1212 * | 1212 * |
1213 * To that end, this method asserts that the resulting pmcolor will be valid, b
ut does not call | 1213 * To that end, this method asserts that the resulting pmcolor will be valid, b
ut does not call |
1214 * SkPMFloat::isValid(), as that would fire sometimes, but not result in a bad
pixel. | 1214 * SkPMFloat::isValid(), as that would fire sometimes, but not result in a bad
pixel. |
1215 */ | 1215 */ |
1216 static inline SkPMFloat check_as_pmfloat(const Sk4f& value) { | 1216 static inline SkPMFloat check_as_pmfloat(const Sk4f& value) { |
1217 SkPMFloat pm = value; | 1217 SkPMFloat pm = value; |
1218 #ifdef SK_DEBUG | 1218 #ifdef SK_DEBUG |
1219 (void)pm.get(); | 1219 (void)pm.round(); |
1220 #endif | 1220 #endif |
1221 return pm; | 1221 return pm; |
1222 } | 1222 } |
1223 | 1223 |
1224 // kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] | 1224 // kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] |
1225 struct SrcATop4f { | 1225 struct SrcATop4f { |
1226 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { | 1226 static SkPMFloat Xfer(const SkPMFloat& src, const SkPMFloat& dst) { |
1227 const Sk4f inv255(gInv255); | 1227 const Sk4f inv255(gInv255); |
1228 Sk4f s4 = src; | 1228 Sk4f s4 = src; |
1229 Sk4f d4 = dst; | 1229 Sk4f d4 = dst; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 static const bool kFoldCoverageIntoSrcAlpha = true; | 1291 static const bool kFoldCoverageIntoSrcAlpha = true; |
1292 static const SkXfermode::Mode kMode = SkXfermode::kScreen_Mode; | 1292 static const SkXfermode::Mode kMode = SkXfermode::kScreen_Mode; |
1293 }; | 1293 }; |
1294 | 1294 |
1295 template <typename ProcType> | 1295 template <typename ProcType> |
1296 class SkT4fXfermode : public SkProcCoeffXfermode { | 1296 class SkT4fXfermode : public SkProcCoeffXfermode { |
1297 public: | 1297 public: |
1298 static SkXfermode* Create(const ProcCoeff& rec) { | 1298 static SkXfermode* Create(const ProcCoeff& rec) { |
1299 return SkNEW_ARGS(SkT4fXfermode, (rec)); | 1299 return SkNEW_ARGS(SkT4fXfermode, (rec)); |
1300 } | 1300 } |
1301 | 1301 |
1302 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[
]) const override { | 1302 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[
]) const override { |
1303 if (NULL == aa) { | 1303 if (NULL == aa) { |
1304 while (n & 3) { | 1304 while (n & 3) { |
1305 *dst = ProcType::Xfer(SkPMFloat(*src++), SkPMFloat(*dst)).get(); | 1305 *dst = ProcType::Xfer(SkPMFloat(*src++), SkPMFloat(*dst)).round(
); |
1306 dst++; | 1306 dst++; |
1307 n -= 1; | 1307 n -= 1; |
1308 } | 1308 } |
1309 n >>= 2; | 1309 n >>= 2; |
1310 for (int i = 0; i < n; ++i) { | 1310 for (int i = 0; i < n; ++i) { |
1311 SkPMFloat s0, s1, s2, s3; | 1311 SkPMFloat s0, s1, s2, s3; |
1312 SkPMFloat::From4PMColors(src, &s0, &s1, &s2, &s3); | 1312 SkPMFloat::From4PMColors(src, &s0, &s1, &s2, &s3); |
1313 SkPMFloat d0, d1, d2, d3; | 1313 SkPMFloat d0, d1, d2, d3; |
1314 SkPMFloat::From4PMColors(dst, &d0, &d1, &d2, &d3); | 1314 SkPMFloat::From4PMColors(dst, &d0, &d1, &d2, &d3); |
1315 SkPMFloat::To4PMColors(ProcType::Xfer(s0, d0), ProcType::Xfer(s1
, d1), | 1315 SkPMFloat::RoundTo4PMColors(ProcType::Xfer(s0, d0), ProcType::Xf
er(s1, d1), |
1316 ProcType::Xfer(s2, d2), ProcType::Xfer(s3
, d3), dst); | 1316 ProcType::Xfer(s2, d2), ProcType::Xf
er(s3, d3), dst); |
1317 src += 4; | 1317 src += 4; |
1318 dst += 4; | 1318 dst += 4; |
1319 } | 1319 } |
1320 } else { | 1320 } else { |
1321 for (int i = 0; i < n; ++i) { | 1321 for (int i = 0; i < n; ++i) { |
1322 const Sk4f aa4 = Sk4f(aa[i] * gInv255); | 1322 const Sk4f aa4 = Sk4f(aa[i] * gInv255); |
1323 SkPMFloat dstF(dst[i]); | 1323 SkPMFloat dstF(dst[i]); |
1324 SkPMFloat srcF(src[i]); | 1324 SkPMFloat srcF(src[i]); |
1325 Sk4f res; | 1325 Sk4f res; |
1326 if (ProcType::kFoldCoverageIntoSrcAlpha) { | 1326 if (ProcType::kFoldCoverageIntoSrcAlpha) { |
1327 Sk4f src4 = srcF; | 1327 Sk4f src4 = srcF; |
1328 res = ProcType::Xfer(src4 * aa4, dstF); | 1328 res = ProcType::Xfer(src4 * aa4, dstF); |
1329 } else { | 1329 } else { |
1330 res = ramp(dstF, ProcType::Xfer(srcF, dstF), aa4); | 1330 res = ramp(dstF, ProcType::Xfer(srcF, dstF), aa4); |
1331 } | 1331 } |
1332 dst[i] = SkPMFloat(res).get(); | 1332 dst[i] = SkPMFloat(res).round(); |
1333 } | 1333 } |
1334 } | 1334 } |
1335 } | 1335 } |
1336 | 1336 |
1337 private: | 1337 private: |
1338 SkT4fXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, ProcType::kMo
de) {} | 1338 SkT4fXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, ProcType::kMo
de) {} |
1339 | 1339 |
1340 typedef SkProcCoeffXfermode INHERITED; | 1340 typedef SkProcCoeffXfermode INHERITED; |
1341 }; | 1341 }; |
1342 #endif | 1342 #endif |
1343 | 1343 |
1344 /////////////////////////////////////////////////////////////////////////////// | 1344 /////////////////////////////////////////////////////////////////////////////// |
1345 | 1345 |
1346 class SkDstOutXfermode : public SkProcCoeffXfermode { | 1346 class SkDstOutXfermode : public SkProcCoeffXfermode { |
1347 public: | 1347 public: |
1348 static SkDstOutXfermode* Create(const ProcCoeff& rec) { | 1348 static SkDstOutXfermode* Create(const ProcCoeff& rec) { |
1349 return SkNEW_ARGS(SkDstOutXfermode, (rec)); | 1349 return SkNEW_ARGS(SkDstOutXfermode, (rec)); |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1722 } else { | 1722 } else { |
1723 proc16 = rec.fProc16_General; | 1723 proc16 = rec.fProc16_General; |
1724 } | 1724 } |
1725 } | 1725 } |
1726 return proc16; | 1726 return proc16; |
1727 } | 1727 } |
1728 | 1728 |
1729 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1729 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
1730 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1730 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
1731 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1731 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |