| Index: src/pipe/SkPipeCanvas.h
|
| diff --git a/src/pipe/SkPipeCanvas.h b/src/pipe/SkPipeCanvas.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..25353c922fd9e9d68a16a5c254773fdf4293764c
|
| --- /dev/null
|
| +++ b/src/pipe/SkPipeCanvas.h
|
| @@ -0,0 +1,166 @@
|
| +/*
|
| + * 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 SkPipeCanvas_DEFINED
|
| +#define SkPipeCanvas_DEFINED
|
| +
|
| +#include "SkCanvas.h"
|
| +#include "SkDeduper.h"
|
| +#include "SkImage.h"
|
| +#include "SkPipe.h"
|
| +#include "SkTypeface.h"
|
| +#include "SkWriteBuffer.h"
|
| +
|
| +class SkPipeCanvas;
|
| +class SkPipeWriter;
|
| +
|
| +template <typename T> class SkTIndexSet {
|
| +public:
|
| + 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;
|
| + }
|
| +
|
| +private:
|
| + struct Rec {
|
| + T fKey;
|
| + int fIndex;
|
| + };
|
| +
|
| + SkTDArray<Rec> fArray;
|
| + int fNextIndex = 1;
|
| +};
|
| +
|
| +class SkPipeDeduper : public SkDeduper {
|
| +public:
|
| + void resetCaches() {
|
| + fImages.reset();
|
| + fPictures.reset();
|
| + fTypefaces.reset();
|
| + fFactories.reset();
|
| + }
|
| +
|
| + void setCanvas(SkPipeCanvas* canvas) { fPipeCanvas = canvas; }
|
| + void setStream(SkWStream* stream) { fStream = stream; }
|
| + void setTypefaceSerializer(SkTypefaceSerializer* tfs) { fTFSerializer = tfs; }
|
| +
|
| + int findOrDefineImage(SkImage*) override;
|
| + int findOrDefinePicture(SkPicture*) override;
|
| + int findOrDefineTypeface(SkTypeface*) override;
|
| + int findOrDefineFactory(SkFlattenable*) override;
|
| +
|
| +private:
|
| + SkPipeCanvas* fPipeCanvas = nullptr;
|
| + SkWStream* fStream = nullptr;
|
| +
|
| + SkTypefaceSerializer* fTFSerializer = nullptr;
|
| +
|
| + // 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;
|
| +
|
| + void didConcat(const SkMatrix&) override;
|
| + void didSetMatrix(const SkMatrix&) override;
|
| +
|
| + void onDrawArc(const SkRect&, SkScalar startAngle, SkScalar sweepAngle, bool useCenter,
|
| + const SkPaint&) override;
|
| + void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[],
|
| + int count, SkXfermode::Mode, const SkRect* cull, const SkPaint*) override;
|
| + void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
|
| + void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
|
| + const SkPaint&) override;
|
| + void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
|
| + const SkPaint&) override;
|
| + void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
|
| + SkScalar constY, const SkPaint&) override;
|
| + void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath&, const SkMatrix*,
|
| + const SkPaint&) override;
|
| + void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPaint&) override;
|
| + void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
|
| + const SkRect* cull, const SkPaint& paint) override;
|
| + void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4],
|
| + SkXfermode*, const SkPaint&) override;
|
| +
|
| + void onDrawPaint(const SkPaint&) override;
|
| + void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
|
| + void onDrawRect(const SkRect&, const SkPaint&) override;
|
| + void onDrawOval(const SkRect&, const SkPaint&) override;
|
| + void onDrawRegion(const SkRegion&, const SkPaint&) override;
|
| + void onDrawRRect(const SkRRect&, const SkPaint&) override;
|
| + void onDrawPath(const SkPath&, 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 onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst,
|
| + const SkPaint*) override;
|
| + void onDrawImageLattice(const SkImage*, const Lattice& lattice, const SkRect& dst,
|
| + const SkPaint*) override;
|
| + void onDrawVertices(VertexMode vmode, int vertexCount,
|
| + const SkPoint vertices[], const SkPoint texs[],
|
| + const SkColor colors[], SkXfermode* xmode,
|
| + const uint16_t indices[], int indexCount,
|
| + const SkPaint&) override;
|
| +
|
| + void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override;
|
| + void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override;
|
| + void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override;
|
| + void onClipRegion(const SkRegion&, SkRegion::Op) override;
|
| +
|
| + void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override;
|
| + void onDrawAnnotation(const SkRect&, const char[], SkData*) override;
|
| +
|
| + // These we turn into images
|
| + 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 onDrawBitmapLattice(const SkBitmap&, const Lattice& lattice, const SkRect& dst,
|
| + const SkPaint*) override;
|
| +
|
| +private:
|
| + SkPipeDeduper* fDeduper;
|
| + SkWStream* fStream;
|
| +
|
| + friend class SkPipeWriter;
|
| +
|
| + typedef SkCanvas INHERITED;
|
| +};
|
| +
|
| +
|
| +#endif
|
|
|