Index: src/pdf/SkPDFDevice.h |
diff --git a/src/pdf/SkPDFDevice.h b/src/pdf/SkPDFDevice.h |
index d1afee218e7a7140940222b2ce8e5db5f2e61bd6..9e97f67f4e464665481f2e7d1549396ae158253f 100644 |
--- a/src/pdf/SkPDFDevice.h |
+++ b/src/pdf/SkPDFDevice.h |
@@ -23,6 +23,8 @@ |
#include "SkTDArray.h" |
#include "SkTemplates.h" |
+#include "SkSinglyLinkedList.h" |
+ |
class SkPDFArray; |
class SkPDFCanon; |
class SkPDFDevice; |
@@ -37,10 +39,6 @@ class SkPDFShader; |
class SkPDFStream; |
class SkRRect; |
-// Private classes. |
-struct ContentEntry; |
-struct GraphicStateEntry; |
- |
/** \class SkPDFDevice |
The drawing context for the PDF backend. |
@@ -175,6 +173,38 @@ public: |
SkPDFCanon* getCanon() const; |
+ // It is important to not confuse GraphicStateEntry with SkPDFGraphicState, the |
+ // later being our representation of an object in the PDF file. |
+ struct GraphicStateEntry { |
+ GraphicStateEntry(); |
+ |
+ // Compare the fields we care about when setting up a new content entry. |
+ bool compareInitialState(const GraphicStateEntry& b); |
+ |
+ SkMatrix fMatrix; |
+ // We can't do set operations on Paths, though PDF natively supports |
+ // intersect. If the clip stack does anything other than intersect, |
+ // we have to fall back to the region. Treat fClipStack as authoritative. |
+ // See https://bugs.skia.org/221 |
+ SkClipStack fClipStack; |
+ SkRegion fClipRegion; |
+ |
+ // When emitting the content entry, we will ensure the graphic state |
+ // is set to these values first. |
+ SkColor fColor; |
+ SkScalar fTextScaleX; // Zero means we don't care what the value is. |
+ SkPaint::Style fTextFill; // Only if TextScaleX is non-zero. |
+ int fShaderIndex; |
+ int fGraphicStateIndex; |
+ |
+ // We may change the font (i.e. for Type1 support) within a |
+ // ContentEntry. This is the one currently in effect, or nullptr if none. |
+ SkPDFFont* fFont; |
+ // In PDF, text size has no default value. It is only valid if fFont is |
+ // not nullptr. |
+ SkScalar fTextSize; |
+ }; |
+ |
protected: |
const SkBitmap& onAccessBitmap() override { |
return fLegacyBitmap; |
@@ -232,8 +262,11 @@ private: |
SkTDArray<SkPDFFont*> fFontResources; |
SkTDArray<SkPDFObject*> fShaderResources; |
- std::unique_ptr<ContentEntry> fContentEntries; |
- ContentEntry* fLastContentEntry; |
+ struct ContentEntry { |
+ GraphicStateEntry fState; |
+ SkDynamicMemoryWStream fContent; |
+ }; |
+ SkSinglyLinkedList<ContentEntry> fContentEntries; |
const SkClipStack* fClipStack; |
@@ -300,11 +333,6 @@ private: |
SkImageBitmap imageBitmap, |
const SkPaint& paint); |
- /** Helper method for copyContentToData. It is responsible for copying the |
- * list of content entries |entry| to |data|. |
- */ |
- void copyContentEntriesToData(ContentEntry* entry, SkWStream* data) const; |
- |
bool handleInversePath(const SkDraw& d, const SkPath& origPath, |
const SkPaint& paint, bool pathIsMutable, |
const SkMatrix* prePathMatrix = nullptr); |