OLD | NEW |
1 | |
2 /* | 1 /* |
3 * Copyright 2011 Google Inc. | 2 * Copyright 2016 Google Inc. |
4 * | 3 * |
5 * 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 |
6 * found in the LICENSE file. | 5 * found in the LICENSE file. |
7 */ | 6 */ |
8 | 7 |
9 #ifndef SkNWayCanvas_DEFINED | 8 #ifndef SkPipeCanvas_DEFINED |
10 #define SkNWayCanvas_DEFINED | 9 #define SkPipeCanvas_DEFINED |
11 | 10 |
12 #include "../private/SkTDArray.h" | |
13 #include "SkCanvas.h" | 11 #include "SkCanvas.h" |
| 12 #include "SkDeduper.h" |
| 13 #include "SkImage.h" |
| 14 #include "SkTypeface.h" |
| 15 #include "SkWriteBuffer.h" |
14 | 16 |
15 class SK_API SkNWayCanvas : public SkCanvas { | 17 class SkPipeCanvas; |
| 18 class SkPipeWriter; |
| 19 |
| 20 template <typename T> class SkTIndexSet { |
16 public: | 21 public: |
17 SkNWayCanvas(int width, int height); | 22 void reset() { fArray.reset(); } |
18 virtual ~SkNWayCanvas(); | |
19 | 23 |
20 virtual void addCanvas(SkCanvas*); | 24 // returns the found index or 0 |
21 virtual void removeCanvas(SkCanvas*); | 25 int find(const T& key) { |
22 virtual void removeAll(); | 26 const Rec* stop = fArray.end(); |
| 27 for (const Rec* curr = fArray.begin(); curr < stop; ++curr) { |
| 28 if (key == curr->fKey) { |
| 29 return curr->fIndex; |
| 30 } |
| 31 } |
| 32 return 0; |
| 33 } |
23 | 34 |
24 /////////////////////////////////////////////////////////////////////////// | 35 // returns the new index |
25 // These are forwarded to the N canvases we're referencing | 36 int add(const T& key) { |
| 37 Rec* rec = fArray.append(); |
| 38 rec->fKey = key; |
| 39 rec->fIndex = fNextIndex++; |
| 40 return rec->fIndex; |
| 41 } |
26 | 42 |
27 #ifdef SK_SUPPORT_LEGACY_DRAWFILTER | 43 private: |
28 SkDrawFilter* setDrawFilter(SkDrawFilter*) override; | 44 struct Rec { |
29 #endif | 45 T fKey; |
| 46 int fIndex; |
| 47 }; |
| 48 |
| 49 SkTDArray<Rec> fArray; |
| 50 int fNextIndex = 1; |
| 51 }; |
| 52 |
| 53 class SkPipeDeduper : public SkDeduper { |
| 54 public: |
| 55 SkPipeDeduper() : fPipeCanvas(nullptr), fStream(nullptr) {} |
| 56 |
| 57 void resetCaches() { |
| 58 fImages.reset(); |
| 59 fPictures.reset(); |
| 60 fTypefaces.reset(); |
| 61 fFactories.reset(); |
| 62 } |
| 63 |
| 64 void setCanvas(SkPipeCanvas* canvas) { fPipeCanvas = canvas; } |
| 65 void setStream(SkWStream* stream) { fStream = stream; } |
| 66 |
| 67 int findOrDefineImage(SkImage*) override; |
| 68 int findOrDefinePicture(SkPicture*) override; |
| 69 int findOrDefineTypeface(SkTypeface*) override; |
| 70 int findOrDefineFactory(SkFlattenable*) override; |
| 71 |
| 72 private: |
| 73 SkPipeCanvas* fPipeCanvas; |
| 74 SkWStream* fStream; |
| 75 |
| 76 // All our keys (at the moment) are 32bit uniqueIDs |
| 77 SkTIndexSet<uint32_t> fImages; |
| 78 SkTIndexSet<uint32_t> fPictures; |
| 79 SkTIndexSet<uint32_t> fTypefaces; |
| 80 SkTIndexSet<SkFlattenable::Factory> fFactories; |
| 81 }; |
| 82 |
| 83 |
| 84 class SkPipeCanvas : public SkCanvas { |
| 85 public: |
| 86 SkPipeCanvas(const SkRect& cull, SkPipeDeduper*, SkWStream*); |
| 87 ~SkPipeCanvas() override; |
30 | 88 |
31 protected: | 89 protected: |
32 SkTDArray<SkCanvas*> fList; | |
33 | |
34 void willSave() override; | 90 void willSave() override; |
35 SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override; | 91 SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override; |
36 void willRestore() override; | 92 void willRestore() override; |
37 | 93 |
38 void didConcat(const SkMatrix&) override; | 94 void didConcat(const SkMatrix&) override; |
39 void didSetMatrix(const SkMatrix&) override; | 95 void didSetMatrix(const SkMatrix&) override; |
40 | 96 |
41 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; | 97 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; |
42 virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkS
calar y, | 98 virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkS
calar y, |
43 const SkPaint&) override; | 99 const SkPaint&) override; |
(...skipping 13 matching lines...) Expand all Loading... |
57 | 113 |
58 void onDrawPaint(const SkPaint&) override; | 114 void onDrawPaint(const SkPaint&) override; |
59 void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPain
t&) override; | 115 void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPain
t&) override; |
60 void onDrawRect(const SkRect&, const SkPaint&) override; | 116 void onDrawRect(const SkRect&, const SkPaint&) override; |
61 void onDrawOval(const SkRect&, const SkPaint&) override; | 117 void onDrawOval(const SkRect&, const SkPaint&) override; |
62 void onDrawRRect(const SkRRect&, const SkPaint&) override; | 118 void onDrawRRect(const SkRRect&, const SkPaint&) override; |
63 void onDrawPath(const SkPath&, const SkPaint&) override; | 119 void onDrawPath(const SkPath&, const SkPaint&) override; |
64 void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPain
t*) override; | 120 void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPain
t*) override; |
65 void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst,
const SkPaint*, | 121 void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst,
const SkPaint*, |
66 SrcRectConstraint) override; | 122 SrcRectConstraint) override; |
| 123 void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect&
dst, |
| 124 const SkPaint*) override; |
67 void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*
) override; | 125 void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*
) override; |
68 void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, | 126 void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, |
69 const SkPaint*, SrcRectConstraint) override; | 127 const SkPaint*, SrcRectConstraint) override; |
70 void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect&
dst, | 128 void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& ds
t, |
71 const SkPaint*) override; | 129 const SkPaint*) override; |
72 void onDrawVertices(VertexMode vmode, int vertexCount, | 130 void onDrawVertices(VertexMode vmode, int vertexCount, |
73 const SkPoint vertices[], const SkPoint texs[], | 131 const SkPoint vertices[], const SkPoint texs[], |
74 const SkColor colors[], SkXfermode* xmode, | 132 const SkColor colors[], SkXfermode* xmode, |
75 const uint16_t indices[], int indexCount, | 133 const uint16_t indices[], int indexCount, |
76 const SkPaint&) override; | 134 const SkPaint&) override; |
77 | 135 |
78 void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override; | 136 void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override; |
79 void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override; | 137 void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override; |
80 void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override; | 138 void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override; |
81 void onClipRegion(const SkRegion&, SkRegion::Op) override; | 139 void onClipRegion(const SkRegion&, SkRegion::Op) override; |
82 | 140 |
83 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) overri
de; | 141 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) overri
de; |
84 void onDrawAnnotation(const SkRect&, const char[], SkData*) override; | 142 void onDrawAnnotation(const SkRect&, const char[], SkData*) override; |
85 | 143 |
86 class Iter; | 144 private: |
| 145 SkPipeDeduper* fDeduper; |
| 146 SkWStream* fStream; |
87 | 147 |
88 private: | 148 friend class SkPipeWriter; |
| 149 |
89 typedef SkCanvas INHERITED; | 150 typedef SkCanvas INHERITED; |
90 }; | 151 }; |
91 | 152 |
92 | 153 |
93 #endif | 154 #endif |
OLD | NEW |