OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkPictureRecord.h" | 8 #include "SkPictureRecord.h" |
9 #include "SkTSearch.h" | 9 #include "SkTSearch.h" |
10 #include "SkPixelRef.h" | 10 #include "SkPixelRef.h" |
(...skipping 1462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1473 fWriter.writePad(indices, indexCount * sizeof(uint16_t)); | 1473 fWriter.writePad(indices, indexCount * sizeof(uint16_t)); |
1474 } | 1474 } |
1475 if (flags & DRAW_VERTICES_HAS_XFER) { | 1475 if (flags & DRAW_VERTICES_HAS_XFER) { |
1476 SkXfermode::Mode mode = SkXfermode::kModulate_Mode; | 1476 SkXfermode::Mode mode = SkXfermode::kModulate_Mode; |
1477 (void)xfer->asMode(&mode); | 1477 (void)xfer->asMode(&mode); |
1478 this->addInt(mode); | 1478 this->addInt(mode); |
1479 } | 1479 } |
1480 this->validate(initialOffset, size); | 1480 this->validate(initialOffset, size); |
1481 } | 1481 } |
1482 | 1482 |
1483 void SkPictureRecord::drawPatch(const SkPatch& patch, const SkPaint& paint) { | 1483 void SkPictureRecord::drawPatch(const SkPoint cubics[12], const SkColor colors[4
], |
| 1484 const SkPoint texCoords[4], SkXfermode* xmode, |
| 1485 const SkPaint& paint) { |
| 1486 if (NULL == cubics) { |
| 1487 return; |
| 1488 } |
| 1489 |
1484 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1490 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
1485 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1491 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
1486 #endif | 1492 #endif |
1487 | 1493 |
1488 // op + paint index + patch 12 control points + patch 4 colors | 1494 // op + paint index + patch 12 control points + flag + patch 4 colors + 4 te
xture coordinates |
1489 size_t size = 2 * kUInt32Size + SkPatch::kNumCtrlPts * sizeof(SkPoint) + | 1495 size_t size = 2 * kUInt32Size + SkPatch::kNumCtrlPts * sizeof(SkPoint) + kUI
nt32Size; |
1490 SkPatch::kNumColors * sizeof(SkColor); | 1496 uint32_t flag = 0; |
| 1497 if (NULL != colors) { |
| 1498 flag |= DRAW_VERTICES_HAS_COLORS; |
| 1499 size += SkPatch::kNumCorners * sizeof(SkColor); |
| 1500 } |
| 1501 if (NULL != texCoords) { |
| 1502 flag |= DRAW_VERTICES_HAS_TEXS; |
| 1503 size += SkPatch::kNumCorners * sizeof(SkPoint); |
| 1504 } |
| 1505 if (NULL != xmode) { |
| 1506 SkXfermode::Mode mode; |
| 1507 if (xmode->asMode(&mode) && SkXfermode::kModulate_Mode != mode) { |
| 1508 flag |= DRAW_VERTICES_HAS_XFER; |
| 1509 size += kUInt32Size; |
| 1510 } |
| 1511 } |
| 1512 |
1491 size_t initialOffset = this->addDraw(DRAW_PATCH, &size); | 1513 size_t initialOffset = this->addDraw(DRAW_PATCH, &size); |
1492 SkASSERT(initialOffset+getPaintOffset(DRAW_PATCH, size) == fWriter.bytesWrit
ten()); | 1514 SkASSERT(initialOffset+getPaintOffset(DRAW_PATCH, size) == fWriter.bytesWrit
ten()); |
1493 this->addPaint(paint); | 1515 this->addPaint(paint); |
1494 this->addPatch(patch); | 1516 this->addPatch(cubics); |
| 1517 this->addInt(flag); |
| 1518 |
| 1519 // write optional parameters |
| 1520 if (NULL != colors) { |
| 1521 fWriter.write(colors, SkPatch::kNumCorners * sizeof(SkColor)); |
| 1522 } |
| 1523 if (NULL != texCoords) { |
| 1524 fWriter.write(texCoords, SkPatch::kNumCorners * sizeof(SkPoint)); |
| 1525 } |
| 1526 if (flag & DRAW_VERTICES_HAS_XFER) { |
| 1527 SkXfermode::Mode mode = SkXfermode::kModulate_Mode; |
| 1528 xmode->asMode(&mode); |
| 1529 this->addInt(mode); |
| 1530 } |
1495 this->validate(initialOffset, size); | 1531 this->validate(initialOffset, size); |
1496 } | 1532 } |
1497 | 1533 |
1498 void SkPictureRecord::drawData(const void* data, size_t length) { | 1534 void SkPictureRecord::drawData(const void* data, size_t length) { |
1499 | 1535 |
1500 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE | 1536 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE |
1501 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); | 1537 fMCMgr.call(SkMatrixClipStateMgr::kOther_CallType); |
1502 #endif | 1538 #endif |
1503 | 1539 |
1504 // op + length + 'length' worth of data | 1540 // op + length + 'length' worth of data |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1619 return fPathHeap->insert(path); | 1655 return fPathHeap->insert(path); |
1620 #else | 1656 #else |
1621 return fPathHeap->append(path); | 1657 return fPathHeap->append(path); |
1622 #endif | 1658 #endif |
1623 } | 1659 } |
1624 | 1660 |
1625 void SkPictureRecord::addPath(const SkPath& path) { | 1661 void SkPictureRecord::addPath(const SkPath& path) { |
1626 this->addInt(this->addPathToHeap(path)); | 1662 this->addInt(this->addPathToHeap(path)); |
1627 } | 1663 } |
1628 | 1664 |
1629 void SkPictureRecord::addPatch(const SkPatch& patch) { | 1665 void SkPictureRecord::addPatch(const SkPoint cubics[12]) { |
1630 fWriter.writePatch(patch); | 1666 fWriter.write(cubics, SkPatch::kNumCtrlPts * sizeof(SkPoint)); |
1631 } | 1667 } |
1632 | 1668 |
1633 void SkPictureRecord::addPicture(const SkPicture* picture) { | 1669 void SkPictureRecord::addPicture(const SkPicture* picture) { |
1634 int index = fPictureRefs.find(picture); | 1670 int index = fPictureRefs.find(picture); |
1635 if (index < 0) { // not found | 1671 if (index < 0) { // not found |
1636 index = fPictureRefs.count(); | 1672 index = fPictureRefs.count(); |
1637 *fPictureRefs.append() = picture; | 1673 *fPictureRefs.append() = picture; |
1638 picture->ref(); | 1674 picture->ref(); |
1639 } | 1675 } |
1640 // follow the convention of recording a 1-based index | 1676 // follow the convention of recording a 1-based index |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1839 void SkPictureRecord::validateRegions() const { | 1875 void SkPictureRecord::validateRegions() const { |
1840 int count = fRegions.count(); | 1876 int count = fRegions.count(); |
1841 SkASSERT((unsigned) count < 0x1000); | 1877 SkASSERT((unsigned) count < 0x1000); |
1842 for (int index = 0; index < count; index++) { | 1878 for (int index = 0; index < count; index++) { |
1843 const SkFlatData* region = fRegions[index]; | 1879 const SkFlatData* region = fRegions[index]; |
1844 SkASSERT(region); | 1880 SkASSERT(region); |
1845 // region->validate(); | 1881 // region->validate(); |
1846 } | 1882 } |
1847 } | 1883 } |
1848 #endif | 1884 #endif |
OLD | NEW |