OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 #ifndef SkPDFCanon_DEFINED | 7 #ifndef SkPDFCanon_DEFINED |
8 #define SkPDFCanon_DEFINED | 8 #define SkPDFCanon_DEFINED |
9 | 9 |
| 10 #include "SkBitmap.h" |
10 #include "SkPDFGraphicState.h" | 11 #include "SkPDFGraphicState.h" |
11 #include "SkPDFShader.h" | 12 #include "SkPDFShader.h" |
12 #include "SkTDArray.h" | 13 #include "SkTDArray.h" |
13 #include "SkTHash.h" | 14 #include "SkTHash.h" |
14 | 15 |
15 class SkBitmap; | |
16 class SkPDFFont; | 16 class SkPDFFont; |
17 class SkPDFBitmap; | |
18 class SkPaint; | 17 class SkPaint; |
| 18 class SkImage; |
| 19 |
| 20 class SkBitmapKey { |
| 21 public: |
| 22 SkBitmapKey() : fSubset(SkIRect::MakeEmpty()), fGenID(0) {} |
| 23 explicit SkBitmapKey(const SkBitmap& bm) |
| 24 : fSubset(bm.getSubset()), fGenID(bm.getGenerationID()) {} |
| 25 bool operator==(const SkBitmapKey& rhs) const { |
| 26 return fGenID == rhs.fGenID && fSubset == rhs.fSubset; |
| 27 } |
| 28 |
| 29 private: |
| 30 SkIRect fSubset; |
| 31 uint32_t fGenID; |
| 32 }; |
19 | 33 |
20 /** | 34 /** |
21 * The SkPDFCanon canonicalizes objects across PDF pages(SkPDFDevices). | 35 * The SkPDFCanon canonicalizes objects across PDF pages(SkPDFDevices). |
22 * | 36 * |
23 * The PDF backend works correctly if: | 37 * The PDF backend works correctly if: |
24 * - There is no more than one SkPDFCanon for each thread. | 38 * - There is no more than one SkPDFCanon for each thread. |
25 * - Every SkPDFDevice is given a pointer to a SkPDFCanon on creation. | 39 * - Every SkPDFDevice is given a pointer to a SkPDFCanon on creation. |
26 * - All SkPDFDevices in a document share the same SkPDFCanon. | 40 * - All SkPDFDevices in a document share the same SkPDFCanon. |
27 * The SkDocument_PDF class makes this happen by owning a single | 41 * The SkDocument_PDF class makes this happen by owning a single |
28 * SkPDFCanon. | 42 * SkPDFCanon. |
(...skipping 24 matching lines...) Expand all Loading... |
53 | 67 |
54 SkPDFAlphaFunctionShader* findAlphaShader(const SkPDFShader::State&) const; | 68 SkPDFAlphaFunctionShader* findAlphaShader(const SkPDFShader::State&) const; |
55 void addAlphaShader(SkPDFAlphaFunctionShader*); | 69 void addAlphaShader(SkPDFAlphaFunctionShader*); |
56 | 70 |
57 SkPDFImageShader* findImageShader(const SkPDFShader::State&) const; | 71 SkPDFImageShader* findImageShader(const SkPDFShader::State&) const; |
58 void addImageShader(SkPDFImageShader*); | 72 void addImageShader(SkPDFImageShader*); |
59 | 73 |
60 const SkPDFGraphicState* findGraphicState(const SkPDFGraphicState&) const; | 74 const SkPDFGraphicState* findGraphicState(const SkPDFGraphicState&) const; |
61 void addGraphicState(const SkPDFGraphicState*); | 75 void addGraphicState(const SkPDFGraphicState*); |
62 | 76 |
63 SkPDFBitmap* findBitmap(const SkBitmap&) const; | 77 SkPDFObject* findPDFBitmap(const SkImage* image) const; |
64 void addBitmap(SkPDFBitmap*); | 78 void addPDFBitmap(uint32_t imageUniqueID, SkPDFObject*); |
| 79 const SkImage* bitmapToImage(const SkBitmap&); |
65 | 80 |
66 private: | 81 private: |
67 struct FontRec { | 82 struct FontRec { |
68 SkPDFFont* fFont; | 83 SkPDFFont* fFont; |
69 uint32_t fFontID; | 84 uint32_t fFontID; |
70 uint16_t fGlyphID; | 85 uint16_t fGlyphID; |
71 }; | 86 }; |
72 SkTDArray<FontRec> fFontRecords; | 87 SkTDArray<FontRec> fFontRecords; |
73 | 88 |
74 SkTDArray<SkPDFFunctionShader*> fFunctionShaderRecords; | 89 SkTDArray<SkPDFFunctionShader*> fFunctionShaderRecords; |
(...skipping 10 matching lines...) Expand all Loading... |
85 SkASSERT(rhs.fPtr); | 100 SkASSERT(rhs.fPtr); |
86 return *fPtr == *rhs.fPtr; | 101 return *fPtr == *rhs.fPtr; |
87 } | 102 } |
88 static uint32_t Hash(const WrapGS& w) { | 103 static uint32_t Hash(const WrapGS& w) { |
89 SkASSERT(w.fPtr); | 104 SkASSERT(w.fPtr); |
90 return w.fPtr->hash(); | 105 return w.fPtr->hash(); |
91 } | 106 } |
92 }; | 107 }; |
93 SkTHashSet<WrapGS, WrapGS::Hash> fGraphicStateRecords; | 108 SkTHashSet<WrapGS, WrapGS::Hash> fGraphicStateRecords; |
94 | 109 |
95 SkTDArray<SkPDFBitmap*> fBitmapRecords; | 110 SkTHashMap<SkBitmapKey, const SkImage*> fBitmapToImageMap; |
| 111 SkTHashMap<uint32_t /*ImageUniqueID*/, SkPDFObject*> fPDFBitmapMap; |
96 }; | 112 }; |
97 #endif // SkPDFCanon_DEFINED | 113 #endif // SkPDFCanon_DEFINED |
OLD | NEW |