| 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;
|
| };
|
|
|
|
|