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...) 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...) 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 32 matching lines...) Loading... |
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...) Loading... |
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...) Loading... |
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...) Loading... |
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...) Loading... |
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...) Loading... |
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 |
OLD | NEW |