Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(451)

Side by Side Diff: src/core/SkXfermode.cpp

Issue 1043413002: experimental speedup some xfermodes with Sk4f (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « bench/XfermodeBench.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « bench/XfermodeBench.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698