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

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: Created 6 years, 4 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
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...) Expand 10 before | Expand all | Expand 10 after
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...) Expand 10 before | Expand all | Expand 10 after
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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
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) 1445 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkClearXfermode)
1437 1446
1438 private: 1447 private:
1439 SkClearXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kClear_Mode ) {} 1448 SkClearXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kClear_Mode ) {}
1440 SkClearXfermode(SkReadBuffer& buffer) 1449 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
1441 : SkProcCoeffXfermode(buffer) {} 1450 SkClearXfermode(SkReadBuffer& buffer) : SkProcCoeffXfermode(buffer) {}
1451 #endif
1452 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE {}
1442 1453
1443 typedef SkProcCoeffXfermode INHERITED; 1454 typedef SkProcCoeffXfermode INHERITED;
1444 }; 1455 };
1445 1456
1457 SkFlattenable* SkClearXfermode::CreateProc(SkReadBuffer& buffer) {
1458 return SkXfermode::Create(kClear_Mode);
1459 }
1460
1446 void SkClearXfermode::xfer32(SkPMColor* SK_RESTRICT dst, 1461 void SkClearXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
1447 const SkPMColor* SK_RESTRICT, int count, 1462 const SkPMColor* SK_RESTRICT, int count,
1448 const SkAlpha* SK_RESTRICT aa) const { 1463 const SkAlpha* SK_RESTRICT aa) const {
1449 SkASSERT(dst && count >= 0); 1464 SkASSERT(dst && count >= 0);
1450 1465
1451 if (NULL == aa) { 1466 if (NULL == aa) {
1452 memset(dst, 0, count << 2); 1467 memset(dst, 0, count << 2);
1453 } else { 1468 } else {
1454 for (int i = count - 1; i >= 0; --i) { 1469 for (int i = count - 1; i >= 0; --i) {
1455 unsigned a = aa[i]; 1470 unsigned a = aa[i];
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1495 } 1510 }
1496 1511
1497 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; 1512 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; 1513 virtual void xferA8(SkAlpha*, const SkPMColor*, int, const SkAlpha*) const S K_OVERRIDE;
1499 1514
1500 SK_TO_STRING_OVERRIDE() 1515 SK_TO_STRING_OVERRIDE()
1501 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSrcXfermode) 1516 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkSrcXfermode)
1502 1517
1503 private: 1518 private:
1504 SkSrcXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kSrc_Mode) {} 1519 SkSrcXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kSrc_Mode) {}
1505 SkSrcXfermode(SkReadBuffer& buffer) 1520 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
1506 : SkProcCoeffXfermode(buffer) {} 1521 SkSrcXfermode(SkReadBuffer& buffer) : SkProcCoeffXfermode(buffer) {}
1522 #endif
1523 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE {}
1507 1524
1508 typedef SkProcCoeffXfermode INHERITED; 1525 typedef SkProcCoeffXfermode INHERITED;
1509 }; 1526 };
1510 1527
1528 SkFlattenable* SkSrcXfermode::CreateProc(SkReadBuffer& buffer) {
1529 return SkXfermode::Create(kSrc_Mode);
1530 }
1531
1511 void SkSrcXfermode::xfer32(SkPMColor* SK_RESTRICT dst, 1532 void SkSrcXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
1512 const SkPMColor* SK_RESTRICT src, int count, 1533 const SkPMColor* SK_RESTRICT src, int count,
1513 const SkAlpha* SK_RESTRICT aa) const { 1534 const SkAlpha* SK_RESTRICT aa) const {
1514 SkASSERT(dst && src && count >= 0); 1535 SkASSERT(dst && src && count >= 0);
1515 1536
1516 if (NULL == aa) { 1537 if (NULL == aa) {
1517 memcpy(dst, src, count << 2); 1538 memcpy(dst, src, count << 2);
1518 } else { 1539 } else {
1519 for (int i = count - 1; i >= 0; --i) { 1540 for (int i = count - 1; i >= 0; --i) {
1520 unsigned a = aa[i]; 1541 unsigned a = aa[i];
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1564 return SkNEW_ARGS(SkDstInXfermode, (rec)); 1585 return SkNEW_ARGS(SkDstInXfermode, (rec));
1565 } 1586 }
1566 1587
1567 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; 1588 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE;
1568 1589
1569 SK_TO_STRING_OVERRIDE() 1590 SK_TO_STRING_OVERRIDE()
1570 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstInXfermode) 1591 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstInXfermode)
1571 1592
1572 private: 1593 private:
1573 SkDstInXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstIn_Mode ) {} 1594 SkDstInXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstIn_Mode ) {}
1595 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
1574 SkDstInXfermode(SkReadBuffer& buffer) : INHERITED(buffer) {} 1596 SkDstInXfermode(SkReadBuffer& buffer) : INHERITED(buffer) {}
1597 #endif
1598 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE {}
1575 1599
1576 typedef SkProcCoeffXfermode INHERITED; 1600 typedef SkProcCoeffXfermode INHERITED;
1577 }; 1601 };
1578 1602
1603 SkFlattenable* SkDstInXfermode::CreateProc(SkReadBuffer&) {
1604 return SkXfermode::Create(kDstIn_Mode);
1605 }
1606
1579 void SkDstInXfermode::xfer32(SkPMColor* SK_RESTRICT dst, 1607 void SkDstInXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
1580 const SkPMColor* SK_RESTRICT src, int count, 1608 const SkPMColor* SK_RESTRICT src, int count,
1581 const SkAlpha* SK_RESTRICT aa) const { 1609 const SkAlpha* SK_RESTRICT aa) const {
1582 SkASSERT(dst && src); 1610 SkASSERT(dst && src);
1583 1611
1584 if (count <= 0) { 1612 if (count <= 0) {
1585 return; 1613 return;
1586 } 1614 }
1587 if (NULL != aa) { 1615 if (NULL != aa) {
1588 return this->INHERITED::xfer32(dst, src, count, aa); 1616 return this->INHERITED::xfer32(dst, src, count, aa);
(...skipping 21 matching lines...) Expand all
1610 return SkNEW_ARGS(SkDstOutXfermode, (rec)); 1638 return SkNEW_ARGS(SkDstOutXfermode, (rec));
1611 } 1639 }
1612 1640
1613 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE; 1641 virtual void xfer32(SkPMColor*, const SkPMColor*, int, const SkAlpha*) const SK_OVERRIDE;
1614 1642
1615 SK_TO_STRING_OVERRIDE() 1643 SK_TO_STRING_OVERRIDE()
1616 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstOutXfermode) 1644 SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkDstOutXfermode)
1617 1645
1618 private: 1646 private:
1619 SkDstOutXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstOut_Mo de) {} 1647 SkDstOutXfermode(const ProcCoeff& rec) : SkProcCoeffXfermode(rec, kDstOut_Mo de) {}
1620 SkDstOutXfermode(SkReadBuffer& buffer) 1648 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
1621 : INHERITED(buffer) {} 1649 SkDstOutXfermode(SkReadBuffer& buffer) : INHERITED(buffer) {}
1650 #endif
1651 virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE {}
1622 1652
1623 typedef SkProcCoeffXfermode INHERITED; 1653 typedef SkProcCoeffXfermode INHERITED;
1624 }; 1654 };
1625 1655
1656 SkFlattenable* SkDstOutXfermode::CreateProc(SkReadBuffer&) {
1657 return SkXfermode::Create(kDstOut_Mode);
1658 }
1659
1626 void SkDstOutXfermode::xfer32(SkPMColor* SK_RESTRICT dst, 1660 void SkDstOutXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
1627 const SkPMColor* SK_RESTRICT src, int count, 1661 const SkPMColor* SK_RESTRICT src, int count,
1628 const SkAlpha* SK_RESTRICT aa) const { 1662 const SkAlpha* SK_RESTRICT aa) const {
1629 SkASSERT(dst && src); 1663 SkASSERT(dst && src);
1630 1664
1631 if (count <= 0) { 1665 if (count <= 0) {
1632 return; 1666 return;
1633 } 1667 }
1634 if (NULL != aa) { 1668 if (NULL != aa) {
1635 return this->INHERITED::xfer32(dst, src, count, aa); 1669 return this->INHERITED::xfer32(dst, src, count, aa);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1685 SkASSERT(false); // should not land here 1719 SkASSERT(false); // should not land here
1686 break; 1720 break;
1687 case SkXfermode::kDstIn_Mode: 1721 case SkXfermode::kDstIn_Mode:
1688 xfer = SkDstInXfermode::Create(rec); 1722 xfer = SkDstInXfermode::Create(rec);
1689 break; 1723 break;
1690 case SkXfermode::kDstOut_Mode: 1724 case SkXfermode::kDstOut_Mode:
1691 xfer = SkDstOutXfermode::Create(rec); 1725 xfer = SkDstOutXfermode::Create(rec);
1692 break; 1726 break;
1693 default: 1727 default:
1694 // no special-case, just rely in the rec and its function-ptrs 1728 // no special-case, just rely in the rec and its function-ptrs
1695 xfer = SkProcCoeffXfermode::Create(rec, mode); 1729 xfer = SkNEW_ARGS(SkProcCoeffXfermode, (rec, mode));
1696 break; 1730 break;
1697 } 1731 }
1698 } 1732 }
1699 return xfer; 1733 return xfer;
1700 } 1734 }
1701 } // namespace 1735 } // namespace
1702 1736
1703 1737
1704 SkXfermode* SkXfermode::Create(Mode mode) { 1738 SkXfermode* SkXfermode::Create(Mode mode) {
1705 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount); 1739 SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
1956 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode) 1990 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSrcXfermode)
1957 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode) 1991 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstInXfermode)
1958 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode) 1992 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDstOutXfermode)
1959 #if !SK_ARM_NEON_IS_NONE 1993 #if !SK_ARM_NEON_IS_NONE
1960 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkNEONProcCoeffXfermode) 1994 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkNEONProcCoeffXfermode)
1961 #endif 1995 #endif
1962 #if defined(SK_CPU_X86) && !defined(SK_BUILD_FOR_IOS) 1996 #if defined(SK_CPU_X86) && !defined(SK_BUILD_FOR_IOS)
1963 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSSE2ProcCoeffXfermode) 1997 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSSE2ProcCoeffXfermode)
1964 #endif 1998 #endif
1965 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1999 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698