Chromium Code Reviews

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

Issue 395603002: Simplify flattening to just write enough to call the factory (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: simplify xfermodes, fix SkLayerDrawLooper Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
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 9
10 #include "SkXfermode.h" 10 #include "SkXfermode.h"
(...skipping 1222 matching lines...)
1233 int mode = rand->nextRangeU(SkXfermode::kLastCoeffMode + 1, SkXfermode::kLas tSeparableMode); 1233 int mode = rand->nextRangeU(SkXfermode::kLastCoeffMode + 1, SkXfermode::kLas tSeparableMode);
1234 1234
1235 return SkNEW_ARGS(XferEffect, (static_cast<SkXfermode::Mode>(mode), NULL)); 1235 return SkNEW_ARGS(XferEffect, (static_cast<SkXfermode::Mode>(mode), NULL));
1236 } 1236 }
1237 1237
1238 #endif 1238 #endif
1239 1239
1240 /////////////////////////////////////////////////////////////////////////////// 1240 ///////////////////////////////////////////////////////////////////////////////
1241 /////////////////////////////////////////////////////////////////////////////// 1241 ///////////////////////////////////////////////////////////////////////////////
1242 1242
1243 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
1243 SkProcCoeffXfermode::SkProcCoeffXfermode(SkReadBuffer& buffer) : INHERITED(buffe r) { 1244 SkProcCoeffXfermode::SkProcCoeffXfermode(SkReadBuffer& buffer) : INHERITED(buffe r) {
1244 uint32_t mode32 = buffer.read32() % SK_ARRAY_COUNT(gProcCoeffs); 1245 uint32_t mode32 = buffer.read32() % SK_ARRAY_COUNT(gProcCoeffs);
1245 if (mode32 >= SK_ARRAY_COUNT(gProcCoeffs)) { 1246 if (mode32 >= SK_ARRAY_COUNT(gProcCoeffs)) {
1246 // out of range, just set to something harmless 1247 // out of range, just set to something harmless
1247 mode32 = SkXfermode::kSrcOut_Mode; 1248 mode32 = SkXfermode::kSrcOut_Mode;
1248 } 1249 }
1249 fMode = (SkXfermode::Mode)mode32; 1250 fMode = (SkXfermode::Mode)mode32;
1250 1251
1251 const ProcCoeff& rec = gProcCoeffs[fMode]; 1252 const ProcCoeff& rec = gProcCoeffs[fMode];
1252 fProc = rec.fProc; 1253 fProc = rec.fProc;
1253 // these may be valid, or may be CANNOT_USE_COEFF 1254 // these may be valid, or may be CANNOT_USE_COEFF
1254 fSrcCoeff = rec.fSC; 1255 fSrcCoeff = rec.fSC;
1255 fDstCoeff = rec.fDC; 1256 fDstCoeff = rec.fDC;
1256 } 1257 }
1258 #endif
1259
1260 SkFlattenable* SkProcCoeffXfermode::CreateProc(SkReadBuffer& buffer) {
1261 uint32_t mode32 = buffer.read32();
1262 if (!buffer.validate(mode32 >= SK_ARRAY_COUNT(gProcCoeffs))) {
1263 return NULL;
1264 }
1265 return SkXfermode::Create((SkXfermode::Mode)mode32);
1266 }
1267
1268 void SkProcCoeffXfermode::flatten(SkWriteBuffer& buffer) const {
1269 buffer.write32(fMode);
1270 }
1257 1271
1258 bool SkProcCoeffXfermode::asMode(Mode* mode) const { 1272 bool SkProcCoeffXfermode::asMode(Mode* mode) const {
1259 if (mode) { 1273 if (mode) {
1260 *mode = fMode; 1274 *mode = fMode;
1261 } 1275 }
1262 return true; 1276 return true;
1263 } 1277 }
1264 1278
1265 bool SkProcCoeffXfermode::asCoeff(Coeff* sc, Coeff* dc) const { 1279 bool SkProcCoeffXfermode::asCoeff(Coeff* sc, Coeff* dc) const {
1266 if (CANNOT_USE_COEFF == fSrcCoeff) { 1280 if (CANNOT_USE_COEFF == fSrcCoeff) {
(...skipping 102 matching lines...)
1369 if (NULL != effect) { 1383 if (NULL != effect) {
1370 *effect = XferEffect::Create(fMode, background); 1384 *effect = XferEffect::Create(fMode, background);
1371 SkASSERT(NULL != *effect); 1385 SkASSERT(NULL != *effect);
1372 } 1386 }
1373 return true; 1387 return true;
1374 } 1388 }
1375 return false; 1389 return false;
1376 } 1390 }
1377 #endif 1391 #endif
1378 1392
1379 void SkProcCoeffXfermode::flatten(SkWriteBuffer& buffer) const {
1380 this->INHERITED::flatten(buffer);
1381 buffer.write32(fMode);
1382 }
1383
1384 const char* SkXfermode::ModeName(Mode mode) { 1393 const char* SkXfermode::ModeName(Mode mode) {
1385 SkASSERT((unsigned) mode <= (unsigned)kLastMode); 1394 SkASSERT((unsigned) mode <= (unsigned)kLastMode);
1386 const char* gModeStrings[] = { 1395 const char* gModeStrings[] = {
1387 "Clear", "Src", "Dst", "SrcOver", "DstOver", "SrcIn", "DstIn", 1396 "Clear", "Src", "Dst", "SrcOver", "DstOver", "SrcIn", "DstIn",
1388 "SrcOut", "DstOut", "SrcATop", "DstATop", "Xor", "Plus", 1397 "SrcOut", "DstOut", "SrcATop", "DstATop", "Xor", "Plus",
1389 "Modulate", "Screen", "Overlay", "Darken", "Lighten", "ColorDodge", 1398 "Modulate", "Screen", "Overlay", "Darken", "Lighten", "ColorDodge",
1390 "ColorBurn", "HardLight", "SoftLight", "Difference", "Exclusion", 1399 "ColorBurn", "HardLight", "SoftLight", "Difference", "Exclusion",
1391 "Multiply", "Hue", "Saturation", "Color", "Luminosity" 1400 "Multiply", "Hue", "Saturation", "Color", "Luminosity"
1392 }; 1401 };
1393 return gModeStrings[mode]; 1402 return gModeStrings[mode];
(...skipping 32 matching lines...)
1426 class SkClearXfermode : public SkProcCoeffXfermode { 1435 class SkClearXfermode : public SkProcCoeffXfermode {
1427 public: 1436 public:
1428 static SkClearXfermode* Create(const ProcCoeff& rec) { 1437 static SkClearXfermode* Create(const ProcCoeff& rec) {
1429 return SkNEW_ARGS(SkClearXfermode, (rec)); 1438 return SkNEW_ARGS(SkClearXfermode, (rec));
1430 } 1439 }
1431 1440
1432 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; 1441 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE;
1433 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S K_OVERRIDE; 1442 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S K_OVERRIDE;
1434 1443
1435 SK_TO_STRING_OVERRIDE() 1444 SK_TO_STRING_OVERRIDE()
1436 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkClearXfermode)
1437 1445
1438 private: 1446 private:
1439 SkClearXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kClear_Mode ) {} 1447 SkClearXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kClear_Mode ) {}
1440 SkClearXfermode(SkReadBuffer& buffer) 1448 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
1441 : SkProcCoeffXfermode(buffer) {} 1449 SkClearXfermode(SkReadBuffer& buffer) : SkProcCoeffXfermode(buffer) {}
1450 #endif
1442 1451
1443 typedef SkProcCoeffXfermode INHERITED; 1452 typedef SkProcCoeffXfermode INHERITED;
1444 }; 1453 };
1445 1454
1446 void SkClearXfermode::xfer32(SkPMColor* SK_RESTRICT dst, 1455 void SkClearXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
1447 const SkPMColor* SK_RESTRICT, int count, 1456 const SkPMColor* SK_RESTRICT, int count,
1448 const SkAlpha* SK_RESTRICT aa) const { 1457 const SkAlpha* SK_RESTRICT aa) const {
1449 SkASSERT(dst && count >= 0); 1458 SkASSERT(dst && count >= 0);
1450 1459
1451 if (NULL == aa) { 1460 if (NULL == aa) {
(...skipping 39 matching lines...)
1491 class SkSrcXfermode : public SkProcCoeffXfermode { 1500 class SkSrcXfermode : public SkProcCoeffXfermode {
1492 public: 1501 public:
1493 static SkSrcXfermode* Create(const ProcCoeff& rec) { 1502 static SkSrcXfermode* Create(const ProcCoeff& rec) {
1494 return SkNEW_ARGS(SkSrcXfermode, (rec)); 1503 return SkNEW_ARGS(SkSrcXfermode, (rec));
1495 } 1504 }
1496 1505
1497 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; 1506 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE;
1498 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S K_OVERRIDE; 1507 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S K_OVERRIDE;
1499 1508
1500 SK_TO_STRING_OVERRIDE() 1509 SK_TO_STRING_OVERRIDE()
1501 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSrcXfermode)
1502 1510
1503 private: 1511 private:
1504 SkSrcXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kSrc_Mode) {} 1512 SkSrcXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kSrc_Mode) {}
1505 SkSrcXfermode(SkReadBuffer& buffer) 1513 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
1506 : SkProcCoeffXfermode(buffer) {} 1514 SkSrcXfermode(SkReadBuffer& buffer) : SkProcCoeffXfermode(buffer) {}
1507 1515 #endif
1508 typedef SkProcCoeffXfermode INHERITED; 1516 typedef SkProcCoeffXfermode INHERITED;
1509 }; 1517 };
1510 1518
1511 void SkSrcXfermode::xfer32(SkPMColor* SK_RESTRICT dst, 1519 void SkSrcXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
1512 const SkPMColor* SK_RESTRICT src, int count, 1520 const SkPMColor* SK_RESTRICT src, int count,
1513 const SkAlpha* SK_RESTRICT aa) const { 1521 const SkAlpha* SK_RESTRICT aa) const {
1514 SkASSERT(dst && src && count >= 0); 1522 SkASSERT(dst && src && count >= 0);
1515 1523
1516 if (NULL == aa) { 1524 if (NULL == aa) {
1517 memcpy(dst, src, count << 2); 1525 memcpy(dst, src, count << 2);
(...skipping 42 matching lines...)
1560 1568
1561 class SkDstInXfermode : public SkProcCoeffXfermode { 1569 class SkDstInXfermode : public SkProcCoeffXfermode {
1562 public: 1570 public:
1563 static SkDstInXfermode* Create(const ProcCoeff& rec) { 1571 static SkDstInXfermode* Create(const ProcCoeff& rec) {
1564 return SkNEW_ARGS(SkDstInXfermode, (rec)); 1572 return SkNEW_ARGS(SkDstInXfermode, (rec));
1565 } 1573 }
1566 1574
1567 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; 1575 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE;
1568 1576
1569 SK_TO_STRING_OVERRIDE() 1577 SK_TO_STRING_OVERRIDE()
1570 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstInXfermode)
1571 1578
1572 private: 1579 private:
1573 SkDstInXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstIn_Mode ) {} 1580 SkDstInXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstIn_Mode ) {}
1581 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
1574 SkDstInXfermode(SkReadBuffer& buffer) : INHERITED(buffer) {} 1582 SkDstInXfermode(SkReadBuffer& buffer) : INHERITED(buffer) {}
1583 #endif
1575 1584
1576 typedef SkProcCoeffXfermode INHERITED; 1585 typedef SkProcCoeffXfermode INHERITED;
1577 }; 1586 };
1578 1587
1579 void SkDstInXfermode::xfer32(SkPMColor* SK_RESTRICT dst, 1588 void SkDstInXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
1580 const SkPMColor* SK_RESTRICT src, int count, 1589 const SkPMColor* SK_RESTRICT src, int count,
1581 const SkAlpha* SK_RESTRICT aa) const { 1590 const SkAlpha* SK_RESTRICT aa) const {
1582 SkASSERT(dst && src); 1591 SkASSERT(dst && src);
1583 1592
1584 if (count <= 0) { 1593 if (count <= 0) {
(...skipping 21 matching lines...)
1606 1615
1607 class SkDstOutXfermode : public SkProcCoeffXfermode { 1616 class SkDstOutXfermode : public SkProcCoeffXfermode {
1608 public: 1617 public:
1609 static SkDstOutXfermode* Create(const ProcCoeff& rec) { 1618 static SkDstOutXfermode* Create(const ProcCoeff& rec) {
1610 return SkNEW_ARGS(SkDstOutXfermode, (rec)); 1619 return SkNEW_ARGS(SkDstOutXfermode, (rec));
1611 } 1620 }
1612 1621
1613 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; 1622 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE;
1614 1623
1615 SK_TO_STRING_OVERRIDE() 1624 SK_TO_STRING_OVERRIDE()
1616 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstOutXfermode)
1617 1625
1618 private: 1626 private:
1619 SkDstOutXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstOut_Mo de) {} 1627 SkDstOutXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstOut_Mo de) {}
1620 SkDstOutXfermode(SkReadBuffer& buffer) 1628 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
1621 : INHERITED(buffer) {} 1629 SkDstOutXfermode(SkReadBuffer& buffer) : INHERITED(buffer) {}
1630 #endif
1622 1631
1623 typedef SkProcCoeffXfermode INHERITED; 1632 typedef SkProcCoeffXfermode INHERITED;
1624 }; 1633 };
1625 1634
1626 void SkDstOutXfermode::xfer32(SkPMColor* SK_RESTRICT dst, 1635 void SkDstOutXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
1627 const SkPMColor* SK_RESTRICT src, int count, 1636 const SkPMColor* SK_RESTRICT src, int count,
1628 const SkAlpha* SK_RESTRICT aa) const { 1637 const SkAlpha* SK_RESTRICT aa) const {
1629 SkASSERT(dst && src); 1638 SkASSERT(dst && src);
1630 1639
1631 if (count <= 0) { 1640 if (count <= 0) {
(...skipping 53 matching lines...)
1685 SkASSERT(false); // should not land here 1694 SkASSERT(false); // should not land here
1686 break; 1695 break;
1687 case SkXfermode::kDstIn_Mode: 1696 case SkXfermode::kDstIn_Mode:
1688 xfer = SkDstInXfermode::Create(rec); 1697 xfer = SkDstInXfermode::Create(rec);
1689 break; 1698 break;
1690 case SkXfermode::kDstOut_Mode: 1699 case SkXfermode::kDstOut_Mode:
1691 xfer = SkDstOutXfermode::Create(rec); 1700 xfer = SkDstOutXfermode::Create(rec);
1692 break; 1701 break;
1693 default: 1702 default:
1694 // no special-case, just rely in the rec and its function-ptrs 1703 // no special-case, just rely in the rec and its function-ptrs
1695 xfer = SkProcCoeffXfermode::Create(rec, mode); 1704 xfer = SkNEW_ARGS(SkProcCoeffXfermode, (rec, mode));
1696 break; 1705 break;
1697 } 1706 }
1698 } 1707 }
1699 return xfer; 1708 return xfer;
1700 } 1709 }
1701 } // namespace 1710 } // namespace
1702 1711
1703 1712
1704 SkXfermode* SkXfermode::Create(Mode mode) { 1713 SkXfermode* SkXfermode::Create(Mode mode) {
1705 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); 1714 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
(...skipping 250 matching lines...)
1956 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) 1965 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode)
1957 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) 1966 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode)
1958 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) 1967 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode)
1959 #if !SK_ARM_NEON_IS_NONE 1968 #if !SK_ARM_NEON_IS_NONE
1960 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkNEONProcCoeffXfermode) 1969 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkNEONProcCoeffXfermode)
1961 #endif 1970 #endif
1962 #if defined(SK_CPU_X86) && !defined(SK_BUILD_FOR_IOS) 1971 #if defined(SK_CPU_X86) && !defined(SK_BUILD_FOR_IOS)
1963 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSSE2ProcCoeffXfermode) 1972 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSSE2ProcCoeffXfermode)
1964 #endif 1973 #endif
1965 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1974 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW

Powered by Google App Engine