Chromium Code Reviews| 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 "SkPDFDevice.h" | 8 #include "SkPDFDevice.h" |
| 9 | 9 |
| 10 #include "SkAnnotationKeys.h" | 10 #include "SkAnnotationKeys.h" |
| (...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 585 SkISize size = SkISize::Make(cinfo.fInfo.width(), cinfo.fInfo.height()); | 585 SkISize size = SkISize::Make(cinfo.fInfo.width(), cinfo.fInfo.height()); |
| 586 return SkPDFDevice::Create(size, fRasterDpi, fDocument); | 586 return SkPDFDevice::Create(size, fRasterDpi, fDocument); |
| 587 } | 587 } |
| 588 | 588 |
| 589 SkPDFCanon* SkPDFDevice::getCanon() const { return fDocument->canon(); } | 589 SkPDFCanon* SkPDFDevice::getCanon() const { return fDocument->canon(); } |
| 590 | 590 |
| 591 | 591 |
| 592 struct ContentEntry { | 592 struct ContentEntry { |
| 593 GraphicStateEntry fState; | 593 GraphicStateEntry fState; |
| 594 SkDynamicMemoryWStream fContent; | 594 SkDynamicMemoryWStream fContent; |
| 595 SkAutoTDelete<ContentEntry> fNext; | 595 std::unique_ptr<ContentEntry> fNext; |
|
bungeman-skia
2016/03/25 19:54:22
Hopefully this doesn't break the Android NDK build
hal.canary
2016/03/28 14:23:32
I'll hold off on these. This should be a linked l
| |
| 596 | 596 |
| 597 // If the stack is too deep we could get Stack Overflow. | 597 // If the stack is too deep we could get Stack Overflow. |
| 598 // So we manually destruct the object. | 598 // So we manually destruct the object. |
| 599 ~ContentEntry() { | 599 ~ContentEntry() { |
| 600 ContentEntry* val = fNext.release(); | 600 ContentEntry* val = fNext.release(); |
| 601 while (val != nullptr) { | 601 while (val != nullptr) { |
| 602 ContentEntry* valNext = val->fNext.release(); | 602 ContentEntry* valNext = val->fNext.release(); |
| 603 // When the destructor is called, fNext is nullptr and exits. | 603 // When the destructor is called, fNext is nullptr and exits. |
| 604 delete val; | 604 delete val; |
| 605 val = valNext; | 605 val = valNext; |
| (...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1410 } | 1410 } |
| 1411 | 1411 |
| 1412 ContentEntry* SkPDFDevice::getLastContentEntry() { | 1412 ContentEntry* SkPDFDevice::getLastContentEntry() { |
| 1413 if (fDrawingArea == kContent_DrawingArea) { | 1413 if (fDrawingArea == kContent_DrawingArea) { |
| 1414 return fLastContentEntry; | 1414 return fLastContentEntry; |
| 1415 } else { | 1415 } else { |
| 1416 return fLastMarginContentEntry; | 1416 return fLastMarginContentEntry; |
| 1417 } | 1417 } |
| 1418 } | 1418 } |
| 1419 | 1419 |
| 1420 SkAutoTDelete<ContentEntry>* SkPDFDevice::getContentEntries() { | 1420 std::unique_ptr<ContentEntry>* SkPDFDevice::getContentEntries() { |
| 1421 if (fDrawingArea == kContent_DrawingArea) { | 1421 if (fDrawingArea == kContent_DrawingArea) { |
| 1422 return &fContentEntries; | 1422 return &fContentEntries; |
| 1423 } else { | 1423 } else { |
| 1424 return &fMarginContentEntries; | 1424 return &fMarginContentEntries; |
| 1425 } | 1425 } |
| 1426 } | 1426 } |
| 1427 | 1427 |
| 1428 void SkPDFDevice::setLastContentEntry(ContentEntry* contentEntry) { | 1428 void SkPDFDevice::setLastContentEntry(ContentEntry* contentEntry) { |
| 1429 if (fDrawingArea == kContent_DrawingArea) { | 1429 if (fDrawingArea == kContent_DrawingArea) { |
| 1430 fLastContentEntry = contentEntry; | 1430 fLastContentEntry = contentEntry; |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1755 } | 1755 } |
| 1756 // TODO(vandebo): Figure out how/if we can handle the following modes: | 1756 // TODO(vandebo): Figure out how/if we can handle the following modes: |
| 1757 // Xor, Plus. | 1757 // Xor, Plus. |
| 1758 | 1758 |
| 1759 // Dst xfer mode doesn't draw source at all. | 1759 // Dst xfer mode doesn't draw source at all. |
| 1760 if (xfermode == SkXfermode::kDst_Mode) { | 1760 if (xfermode == SkXfermode::kDst_Mode) { |
| 1761 return nullptr; | 1761 return nullptr; |
| 1762 } | 1762 } |
| 1763 | 1763 |
| 1764 ContentEntry* entry; | 1764 ContentEntry* entry; |
| 1765 SkAutoTDelete<ContentEntry> newEntry; | 1765 std::unique_ptr<ContentEntry> newEntry; |
| 1766 | 1766 |
| 1767 ContentEntry* lastContentEntry = getLastContentEntry(); | 1767 ContentEntry* lastContentEntry = getLastContentEntry(); |
| 1768 if (lastContentEntry && lastContentEntry->fContent.getOffset() == 0) { | 1768 if (lastContentEntry && lastContentEntry->fContent.getOffset() == 0) { |
| 1769 entry = lastContentEntry; | 1769 entry = lastContentEntry; |
| 1770 } else { | 1770 } else { |
| 1771 newEntry.reset(new ContentEntry); | 1771 newEntry.reset(new ContentEntry); |
| 1772 entry = newEntry.get(); | 1772 entry = newEntry.get(); |
| 1773 } | 1773 } |
| 1774 | 1774 |
| 1775 populateGraphicStateEntryFromPaint(matrix, *clipStack, clipRegion, paint, | 1775 populateGraphicStateEntryFromPaint(matrix, *clipStack, clipRegion, paint, |
| 1776 hasText, &entry->fState); | 1776 hasText, &entry->fState); |
| 1777 if (lastContentEntry && xfermode != SkXfermode::kDstOver_Mode && | 1777 if (lastContentEntry && xfermode != SkXfermode::kDstOver_Mode && |
| 1778 entry->fState.compareInitialState(lastContentEntry->fState)) { | 1778 entry->fState.compareInitialState(lastContentEntry->fState)) { |
| 1779 return lastContentEntry; | 1779 return lastContentEntry; |
| 1780 } | 1780 } |
| 1781 | 1781 |
| 1782 SkAutoTDelete<ContentEntry>* contentEntries = getContentEntries(); | 1782 std::unique_ptr<ContentEntry>* contentEntries = getContentEntries(); |
| 1783 if (!lastContentEntry) { | 1783 if (!lastContentEntry) { |
| 1784 contentEntries->reset(entry); | 1784 contentEntries->reset(entry); |
| 1785 setLastContentEntry(entry); | 1785 setLastContentEntry(entry); |
| 1786 } else if (xfermode == SkXfermode::kDstOver_Mode) { | 1786 } else if (xfermode == SkXfermode::kDstOver_Mode) { |
| 1787 entry->fNext.reset(contentEntries->release()); | 1787 entry->fNext.reset(contentEntries->release()); |
| 1788 contentEntries->reset(entry); | 1788 contentEntries->reset(entry); |
| 1789 } else { | 1789 } else { |
| 1790 lastContentEntry->fNext.reset(entry); | 1790 lastContentEntry->fNext.reset(entry); |
| 1791 setLastContentEntry(entry); | 1791 setLastContentEntry(entry); |
| 1792 } | 1792 } |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 1810 SkASSERT(!dst); | 1810 SkASSERT(!dst); |
| 1811 return; | 1811 return; |
| 1812 } | 1812 } |
| 1813 if (xfermode == SkXfermode::kDstOver_Mode) { | 1813 if (xfermode == SkXfermode::kDstOver_Mode) { |
| 1814 SkASSERT(!dst); | 1814 SkASSERT(!dst); |
| 1815 ContentEntry* firstContentEntry = getContentEntries()->get(); | 1815 ContentEntry* firstContentEntry = getContentEntries()->get(); |
| 1816 if (firstContentEntry->fContent.getOffset() == 0) { | 1816 if (firstContentEntry->fContent.getOffset() == 0) { |
| 1817 // For DstOver, an empty content entry was inserted before the rest | 1817 // For DstOver, an empty content entry was inserted before the rest |
| 1818 // of the content entries. If nothing was drawn, it needs to be | 1818 // of the content entries. If nothing was drawn, it needs to be |
| 1819 // removed. | 1819 // removed. |
| 1820 SkAutoTDelete<ContentEntry>* contentEntries = getContentEntries(); | 1820 std::unique_ptr<ContentEntry>* contentEntries = getContentEntries(); |
| 1821 contentEntries->reset(firstContentEntry->fNext.release()); | 1821 contentEntries->reset(firstContentEntry->fNext.release()); |
| 1822 } | 1822 } |
| 1823 return; | 1823 return; |
| 1824 } | 1824 } |
| 1825 if (!dst) { | 1825 if (!dst) { |
| 1826 SkASSERT(xfermode == SkXfermode::kSrc_Mode || | 1826 SkASSERT(xfermode == SkXfermode::kSrc_Mode || |
| 1827 xfermode == SkXfermode::kSrcOut_Mode); | 1827 xfermode == SkXfermode::kSrcOut_Mode); |
| 1828 return; | 1828 return; |
| 1829 } | 1829 } |
| 1830 | 1830 |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2260 if (!pdfimage) { | 2260 if (!pdfimage) { |
| 2261 return; | 2261 return; |
| 2262 } | 2262 } |
| 2263 fDocument->serialize(pdfimage); // serialize images early. | 2263 fDocument->serialize(pdfimage); // serialize images early. |
| 2264 fDocument->canon()->addPDFBitmap(key, pdfimage); | 2264 fDocument->canon()->addPDFBitmap(key, pdfimage); |
| 2265 } | 2265 } |
| 2266 // TODO(halcanary): addXObjectResource() should take a sk_sp<SkPDFObject> | 2266 // TODO(halcanary): addXObjectResource() should take a sk_sp<SkPDFObject> |
| 2267 SkPDFUtils::DrawFormXObject(this->addXObjectResource(pdfimage.get()), | 2267 SkPDFUtils::DrawFormXObject(this->addXObjectResource(pdfimage.get()), |
| 2268 &content.entry()->fContent); | 2268 &content.entry()->fContent); |
| 2269 } | 2269 } |
| OLD | NEW |