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 | 9 |
10 #include "SkXfermode.h" | 10 #include "SkXfermode.h" |
(...skipping 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |