Index: src/pipe/SkPipeCanvas.h |
diff --git a/include/utils/SkNWayCanvas.h b/src/pipe/SkPipeCanvas.h |
similarity index 61% |
copy from include/utils/SkNWayCanvas.h |
copy to src/pipe/SkPipeCanvas.h |
index a4b9c594122e6d1a51e46c4f77d9db67a245fa5d..a476c0bdb3ca5260c54d4b220724e6ec77c4aa40 100644 |
--- a/include/utils/SkNWayCanvas.h |
+++ b/src/pipe/SkPipeCanvas.h |
@@ -1,36 +1,92 @@ |
- |
/* |
- * Copyright 2011 Google Inc. |
+ * Copyright 2016 Google Inc. |
* |
* Use of this source code is governed by a BSD-style license that can be |
* found in the LICENSE file. |
*/ |
-#ifndef SkNWayCanvas_DEFINED |
-#define SkNWayCanvas_DEFINED |
+#ifndef SkPipeCanvas_DEFINED |
+#define SkPipeCanvas_DEFINED |
-#include "../private/SkTDArray.h" |
#include "SkCanvas.h" |
+#include "SkDeduper.h" |
+#include "SkImage.h" |
+#include "SkTypeface.h" |
+#include "SkWriteBuffer.h" |
+ |
+class SkPipeCanvas; |
+class SkPipeWriter; |
-class SK_API SkNWayCanvas : public SkCanvas { |
+template <typename T> class SkTIndexSet { |
public: |
- SkNWayCanvas(int width, int height); |
- virtual ~SkNWayCanvas(); |
+ void reset() { fArray.reset(); } |
+ |
+ // returns the found index or 0 |
+ int find(const T& key) { |
+ const Rec* stop = fArray.end(); |
+ for (const Rec* curr = fArray.begin(); curr < stop; ++curr) { |
+ if (key == curr->fKey) { |
+ return curr->fIndex; |
+ } |
+ } |
+ return 0; |
+ } |
+ |
+ // returns the new index |
+ int add(const T& key) { |
+ Rec* rec = fArray.append(); |
+ rec->fKey = key; |
+ rec->fIndex = fNextIndex++; |
+ return rec->fIndex; |
+ } |
- virtual void addCanvas(SkCanvas*); |
- virtual void removeCanvas(SkCanvas*); |
- virtual void removeAll(); |
+private: |
+ struct Rec { |
+ T fKey; |
+ int fIndex; |
+ }; |
- /////////////////////////////////////////////////////////////////////////// |
- // These are forwarded to the N canvases we're referencing |
+ SkTDArray<Rec> fArray; |
+ int fNextIndex = 1; |
+}; |
-#ifdef SK_SUPPORT_LEGACY_DRAWFILTER |
- SkDrawFilter* setDrawFilter(SkDrawFilter*) override; |
-#endif |
+class SkPipeDeduper : public SkDeduper { |
+public: |
+ SkPipeDeduper() : fPipeCanvas(nullptr), fStream(nullptr) {} |
-protected: |
- SkTDArray<SkCanvas*> fList; |
+ void resetCaches() { |
+ fImages.reset(); |
+ fPictures.reset(); |
+ fTypefaces.reset(); |
+ fFactories.reset(); |
+ } |
+ |
+ void setCanvas(SkPipeCanvas* canvas) { fPipeCanvas = canvas; } |
+ void setStream(SkWStream* stream) { fStream = stream; } |
+ |
+ int findOrDefineImage(SkImage*) override; |
+ int findOrDefinePicture(SkPicture*) override; |
+ int findOrDefineTypeface(SkTypeface*) override; |
+ int findOrDefineFactory(SkFlattenable*) override; |
+ |
+private: |
+ SkPipeCanvas* fPipeCanvas; |
+ SkWStream* fStream; |
+ |
+ // All our keys (at the moment) are 32bit uniqueIDs |
+ SkTIndexSet<uint32_t> fImages; |
+ SkTIndexSet<uint32_t> fPictures; |
+ SkTIndexSet<uint32_t> fTypefaces; |
+ SkTIndexSet<SkFlattenable::Factory> fFactories; |
+}; |
+ |
+class SkPipeCanvas : public SkCanvas { |
+public: |
+ SkPipeCanvas(const SkRect& cull, SkPipeDeduper*, SkWStream*); |
+ ~SkPipeCanvas() override; |
+ |
+protected: |
void willSave() override; |
SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override; |
void willRestore() override; |
@@ -64,11 +120,13 @@ protected: |
void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override; |
void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*, |
SrcRectConstraint) override; |
+ void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, |
+ const SkPaint*) override; |
void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override; |
void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, |
const SkPaint*, SrcRectConstraint) override; |
- void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, |
- const SkPaint*) override; |
+ void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst, |
+ const SkPaint*) override; |
void onDrawVertices(VertexMode vmode, int vertexCount, |
const SkPoint vertices[], const SkPoint texs[], |
const SkColor colors[], SkXfermode* xmode, |
@@ -83,9 +141,12 @@ protected: |
void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override; |
void onDrawAnnotation(const SkRect&, const char[], SkData*) override; |
- class Iter; |
- |
private: |
+ SkPipeDeduper* fDeduper; |
+ SkWStream* fStream; |
+ |
+ friend class SkPipeWriter; |
+ |
typedef SkCanvas INHERITED; |
}; |