Chromium Code Reviews| 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" |
| 11 #include "SkXfermode_proccoeff.h" | 11 #include "SkXfermode_proccoeff.h" |
| 12 #include "SkColorPriv.h" | 12 #include "SkColorPriv.h" |
| 13 #include "SkLazyPtr.h" | 13 #include "SkLazyPtr.h" |
| 14 #include "SkMathPriv.h" | 14 #include "SkMathPriv.h" |
| 15 #include "SkPMFloat.h" | |
| 15 #include "SkReadBuffer.h" | 16 #include "SkReadBuffer.h" |
| 16 #include "SkString.h" | 17 #include "SkString.h" |
| 17 #include "SkUtilsArm.h" | 18 #include "SkUtilsArm.h" |
| 18 #include "SkWriteBuffer.h" | 19 #include "SkWriteBuffer.h" |
| 19 | 20 |
| 20 #if !SK_ARM_NEON_IS_NONE | 21 #if !SK_ARM_NEON_IS_NONE |
| 21 #include "SkXfermode_opts_arm_neon.h" | 22 #include "SkXfermode_opts_arm_neon.h" |
| 22 #endif | 23 #endif |
| 23 | 24 |
| 24 #define SkAlphaMulAlpha(a, b) SkMulDiv255Round(a, b) | 25 #define SkAlphaMulAlpha(a, b) SkMulDiv255Round(a, b) |
| (...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1179 } | 1180 } |
| 1180 | 1181 |
| 1181 #ifndef SK_IGNORE_TO_STRING | 1182 #ifndef SK_IGNORE_TO_STRING |
| 1182 void SkDstInXfermode::toString(SkString* str) const { | 1183 void SkDstInXfermode::toString(SkString* str) const { |
| 1183 this->INHERITED::toString(str); | 1184 this->INHERITED::toString(str); |
| 1184 } | 1185 } |
| 1185 #endif | 1186 #endif |
| 1186 | 1187 |
| 1187 /////////////////////////////////////////////////////////////////////////////// | 1188 /////////////////////////////////////////////////////////////////////////////// |
| 1188 | 1189 |
| 1190 static const float gInv255 = 0.0039215683f; // (1.0f / 255) - ULP == SkBits2Flo at(0x3B808080) | |
| 1191 | |
| 1192 static Sk4f ramp(const Sk4f& v0, const Sk4f& v1, const Sk4f& t) { | |
| 1193 return v0 + (v1 - v0) * t; | |
| 1194 } | |
| 1195 | |
| 1196 // kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc] | |
|
mtklein
2015/04/01 19:33:55
I suspect that this formulation of src-atop has tr
| |
| 1197 static inline SkPMFloat srcatop(const SkPMFloat& src, const SkPMFloat& dst) { | |
| 1198 const Sk4f inv255(gInv255); | |
| 1199 Sk4f s4 = src; | |
| 1200 Sk4f d4 = dst; | |
| 1201 SkPMFloat res = d4 + (s4 * Sk4f(dst.a()) - d4 * Sk4f(src.a())) * inv255; | |
| 1202 SkPMFloat res2 = SkPMFloat::FromARGB(dst.a(), res.r(), res.g(), res.b()); | |
| 1203 SkASSERT(res2.isValid()); | |
| 1204 return res2; | |
| 1205 } | |
| 1206 | |
| 1207 class SkSrcATopXfermode : public SkProcCoeffXfermode { | |
| 1208 public: | |
| 1209 static SkXfermode* Create(const ProcCoeff& rec) { | |
| 1210 return SkNEW_ARGS(SkSrcATopXfermode, (rec)); | |
| 1211 } | |
| 1212 | |
| 1213 void xfer32(SkPMColor dst[], const SkPMColor src[], int n, const SkAlpha aa[ ]) const override { | |
| 1214 if (NULL == aa) { | |
| 1215 while (n & 3) { | |
| 1216 *dst = srcatop(SkPMFloat(*src++), SkPMFloat(*dst)).get(); | |
| 1217 dst++; | |
| 1218 n -= 1; | |
| 1219 } | |
| 1220 n >>= 2; | |
| 1221 for (int i = 0; i < n; ++i) { | |
| 1222 SkPMFloat s0, s1, s2, s3; | |
| 1223 SkPMFloat::From4PMColors(src, &s0, &s1, &s2, &s3); | |
| 1224 SkPMFloat d0, d1, d2, d3; | |
| 1225 SkPMFloat::From4PMColors(dst, &d0, &d1, &d2, &d3); | |
| 1226 SkPMFloat::To4PMColors(srcatop(s0, d0), srcatop(s1, d1), | |
| 1227 srcatop(s2, d2), srcatop(s3, d3), dst); | |
| 1228 src += 4; | |
| 1229 dst += 4; | |
| 1230 } | |
| 1231 } else { | |
| 1232 for (int i = 0; i < n; ++i) { | |
| 1233 SkPMFloat dstF(dst[i]); | |
| 1234 SkPMFloat resF = srcatop(SkPMFloat(src[i]), dstF); | |
| 1235 dst[i] = SkPMFloat(ramp(dstF, resF, Sk4f(aa[i] * gInv255))).get( ); | |
| 1236 } | |
| 1237 } | |
| 1238 } | |
| 1239 | |
| 1240 // SK_TO_STRING_OVERRIDE() | |
| 1241 | |
| 1242 private: | |
| 1243 SkSrcATopXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kSrcATop_ Mode) {} | |
| 1244 | |
| 1245 typedef SkProcCoeffXfermode INHERITED; | |
| 1246 }; | |
| 1247 | |
| 1248 /////////////////////////////////////////////////////////////////////////////// | |
| 1249 | |
| 1189 class SkDstOutXfermode : public SkProcCoeffXfermode { | 1250 class SkDstOutXfermode : public SkProcCoeffXfermode { |
| 1190 public: | 1251 public: |
| 1191 static SkDstOutXfermode* Create(const ProcCoeff& rec) { | 1252 static SkDstOutXfermode* Create(const ProcCoeff& rec) { |
| 1192 return SkNEW_ARGS(SkDstOutXfermode, (rec)); | 1253 return SkNEW_ARGS(SkDstOutXfermode, (rec)); |
| 1193 } | 1254 } |
| 1194 | 1255 |
| 1195 void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const overrid e; | 1256 void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const overrid e; |
| 1196 | 1257 |
| 1197 SK_TO_STRING_OVERRIDE() | 1258 SK_TO_STRING_OVERRIDE() |
| 1198 | 1259 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1240 | 1301 |
| 1241 ProcCoeff rec = gProcCoeffs[mode]; | 1302 ProcCoeff rec = gProcCoeffs[mode]; |
| 1242 SkXfermodeProc pp = SkPlatformXfermodeProcFactory(mode); | 1303 SkXfermodeProc pp = SkPlatformXfermodeProcFactory(mode); |
| 1243 if (pp != NULL) { | 1304 if (pp != NULL) { |
| 1244 rec.fProc = pp; | 1305 rec.fProc = pp; |
| 1245 } | 1306 } |
| 1246 | 1307 |
| 1247 SkXfermode* xfer = NULL; | 1308 SkXfermode* xfer = NULL; |
| 1248 // check if we have a platform optim for that | 1309 // check if we have a platform optim for that |
| 1249 SkProcCoeffXfermode* xfm = SkPlatformXfermodeFactory(rec, mode); | 1310 SkProcCoeffXfermode* xfm = SkPlatformXfermodeFactory(rec, mode); |
| 1311 #if 1 | |
| 1312 xfm = NULL; | |
| 1313 #endif | |
| 1250 if (xfm != NULL) { | 1314 if (xfm != NULL) { |
| 1251 xfer = xfm; | 1315 xfer = xfm; |
| 1252 } else { | 1316 } else { |
| 1253 // All modes can in theory be represented by the ProcCoeff rec, since | 1317 // All modes can in theory be represented by the ProcCoeff rec, since |
| 1254 // it contains function ptrs. However, a few modes are both simple and | 1318 // it contains function ptrs. However, a few modes are both simple and |
| 1255 // commonly used, so we call those out for their own subclasses here. | 1319 // commonly used, so we call those out for their own subclasses here. |
| 1256 switch (mode) { | 1320 switch (mode) { |
| 1257 case SkXfermode::kClear_Mode: | 1321 case SkXfermode::kClear_Mode: |
| 1258 xfer = SkClearXfermode::Create(rec); | 1322 xfer = SkClearXfermode::Create(rec); |
| 1259 break; | 1323 break; |
| 1260 case SkXfermode::kSrc_Mode: | 1324 case SkXfermode::kSrc_Mode: |
| 1261 xfer = SkSrcXfermode::Create(rec); | 1325 xfer = SkSrcXfermode::Create(rec); |
| 1262 break; | 1326 break; |
| 1263 case SkXfermode::kSrcOver_Mode: | 1327 case SkXfermode::kSrcOver_Mode: |
| 1264 SkASSERT(false); // should not land here | 1328 SkASSERT(false); // should not land here |
| 1265 break; | 1329 break; |
| 1266 case SkXfermode::kDstIn_Mode: | 1330 case SkXfermode::kDstIn_Mode: |
| 1267 xfer = SkDstInXfermode::Create(rec); | 1331 xfer = SkDstInXfermode::Create(rec); |
| 1268 break; | 1332 break; |
| 1269 case SkXfermode::kDstOut_Mode: | 1333 case SkXfermode::kDstOut_Mode: |
| 1270 xfer = SkDstOutXfermode::Create(rec); | 1334 xfer = SkDstOutXfermode::Create(rec); |
| 1271 break; | 1335 break; |
| 1336 case SkXfermode::kSrcATop_Mode: | |
| 1337 xfer = SkSrcATopXfermode::Create(rec); | |
| 1338 break; | |
| 1272 default: | 1339 default: |
| 1273 // no special-case, just rely in the rec and its function-ptrs | 1340 // no special-case, just rely in the rec and its function-ptrs |
| 1274 xfer = SkNEW_ARGS(SkProcCoeffXfermode, (rec, mode)); | 1341 xfer = SkNEW_ARGS(SkProcCoeffXfermode, (rec, mode)); |
| 1275 break; | 1342 break; |
| 1276 } | 1343 } |
| 1277 } | 1344 } |
| 1278 return xfer; | 1345 return xfer; |
| 1279 } | 1346 } |
| 1280 } // namespace | 1347 } // namespace |
| 1281 | 1348 |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1536 } else { | 1603 } else { |
| 1537 proc16 = rec.fProc16_General; | 1604 proc16 = rec.fProc16_General; |
| 1538 } | 1605 } |
| 1539 } | 1606 } |
| 1540 return proc16; | 1607 return proc16; |
| 1541 } | 1608 } |
| 1542 | 1609 |
| 1543 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) | 1610 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkXfermode) |
| 1544 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) | 1611 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkProcCoeffXfermode) |
| 1545 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1612 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
| OLD | NEW |