154dc4878b02765efea39e68b218df1e4bfff4b88reed/*
254dc4878b02765efea39e68b218df1e4bfff4b88reed * Copyright 2016 Google Inc.
354dc4878b02765efea39e68b218df1e4bfff4b88reed *
454dc4878b02765efea39e68b218df1e4bfff4b88reed * Use of this source code is governed by a BSD-style license that can be
554dc4878b02765efea39e68b218df1e4bfff4b88reed * found in the LICENSE file.
654dc4878b02765efea39e68b218df1e4bfff4b88reed */
754dc4878b02765efea39e68b218df1e4bfff4b88reed
854dc4878b02765efea39e68b218df1e4bfff4b88reed#ifndef SkPipeCanvas_DEFINED
954dc4878b02765efea39e68b218df1e4bfff4b88reed#define SkPipeCanvas_DEFINED
1054dc4878b02765efea39e68b218df1e4bfff4b88reed
1154dc4878b02765efea39e68b218df1e4bfff4b88reed#include "SkDeduper.h"
1254dc4878b02765efea39e68b218df1e4bfff4b88reed#include "SkImage.h"
13439ace939b6aaa58408ece0e9e89b633353571aeFlorin Malita#include "SkNoDrawCanvas.h"
1454dc4878b02765efea39e68b218df1e4bfff4b88reed#include "SkPipe.h"
1554dc4878b02765efea39e68b218df1e4bfff4b88reed#include "SkTypeface.h"
1654dc4878b02765efea39e68b218df1e4bfff4b88reed#include "SkWriteBuffer.h"
1754dc4878b02765efea39e68b218df1e4bfff4b88reed
1854dc4878b02765efea39e68b218df1e4bfff4b88reedclass SkPipeCanvas;
1954dc4878b02765efea39e68b218df1e4bfff4b88reedclass SkPipeWriter;
2054dc4878b02765efea39e68b218df1e4bfff4b88reed
2154dc4878b02765efea39e68b218df1e4bfff4b88reedtemplate <typename T> class SkTIndexSet {
2254dc4878b02765efea39e68b218df1e4bfff4b88reedpublic:
2354dc4878b02765efea39e68b218df1e4bfff4b88reed    void reset() { fArray.reset(); }
2454dc4878b02765efea39e68b218df1e4bfff4b88reed
2554dc4878b02765efea39e68b218df1e4bfff4b88reed    // returns the found index or 0
267e3ba9f88d64d901243799b61f497319e5970693reed    int find(const T& key) const {
2754dc4878b02765efea39e68b218df1e4bfff4b88reed        const Rec* stop = fArray.end();
2854dc4878b02765efea39e68b218df1e4bfff4b88reed        for (const Rec* curr = fArray.begin(); curr < stop; ++curr) {
2954dc4878b02765efea39e68b218df1e4bfff4b88reed            if (key == curr->fKey) {
3054dc4878b02765efea39e68b218df1e4bfff4b88reed                return curr->fIndex;
3154dc4878b02765efea39e68b218df1e4bfff4b88reed            }
3254dc4878b02765efea39e68b218df1e4bfff4b88reed        }
3354dc4878b02765efea39e68b218df1e4bfff4b88reed        return 0;
3454dc4878b02765efea39e68b218df1e4bfff4b88reed    }
3554dc4878b02765efea39e68b218df1e4bfff4b88reed
3654dc4878b02765efea39e68b218df1e4bfff4b88reed    // returns the new index
3754dc4878b02765efea39e68b218df1e4bfff4b88reed    int add(const T& key) {
3854dc4878b02765efea39e68b218df1e4bfff4b88reed        Rec* rec = fArray.append();
3954dc4878b02765efea39e68b218df1e4bfff4b88reed        rec->fKey = key;
4054dc4878b02765efea39e68b218df1e4bfff4b88reed        rec->fIndex = fNextIndex++;
4154dc4878b02765efea39e68b218df1e4bfff4b88reed        return rec->fIndex;
4254dc4878b02765efea39e68b218df1e4bfff4b88reed    }
4354dc4878b02765efea39e68b218df1e4bfff4b88reed
4454dc4878b02765efea39e68b218df1e4bfff4b88reedprivate:
4554dc4878b02765efea39e68b218df1e4bfff4b88reed    struct Rec {
4654dc4878b02765efea39e68b218df1e4bfff4b88reed        T   fKey;
4754dc4878b02765efea39e68b218df1e4bfff4b88reed        int fIndex;
4854dc4878b02765efea39e68b218df1e4bfff4b88reed    };
4954dc4878b02765efea39e68b218df1e4bfff4b88reed
5054dc4878b02765efea39e68b218df1e4bfff4b88reed    SkTDArray<Rec>  fArray;
5154dc4878b02765efea39e68b218df1e4bfff4b88reed    int fNextIndex = 1;
5254dc4878b02765efea39e68b218df1e4bfff4b88reed};
5354dc4878b02765efea39e68b218df1e4bfff4b88reed
5454dc4878b02765efea39e68b218df1e4bfff4b88reedclass SkPipeDeduper : public SkDeduper {
5554dc4878b02765efea39e68b218df1e4bfff4b88reedpublic:
5654dc4878b02765efea39e68b218df1e4bfff4b88reed    void resetCaches() {
5754dc4878b02765efea39e68b218df1e4bfff4b88reed        fImages.reset();
5854dc4878b02765efea39e68b218df1e4bfff4b88reed        fPictures.reset();
5954dc4878b02765efea39e68b218df1e4bfff4b88reed        fTypefaces.reset();
6054dc4878b02765efea39e68b218df1e4bfff4b88reed        fFactories.reset();
6154dc4878b02765efea39e68b218df1e4bfff4b88reed    }
6254dc4878b02765efea39e68b218df1e4bfff4b88reed
6354dc4878b02765efea39e68b218df1e4bfff4b88reed    void setCanvas(SkPipeCanvas* canvas) { fPipeCanvas = canvas; }
6454dc4878b02765efea39e68b218df1e4bfff4b88reed    void setStream(SkWStream* stream) { fStream = stream; }
6554dc4878b02765efea39e68b218df1e4bfff4b88reed    void setTypefaceSerializer(SkTypefaceSerializer* tfs) { fTFSerializer = tfs; }
663ac64b427af596e4e8341857ce5f214bf0b49efbMike Reed    void setImageSerializer(SkImageSerializer* ims) { fIMSerializer = ims; }
6754dc4878b02765efea39e68b218df1e4bfff4b88reed
687e3ba9f88d64d901243799b61f497319e5970693reed    // returns 0 if not found
697e3ba9f88d64d901243799b61f497319e5970693reed    int findImage(SkImage* image) const { return fImages.find(image->uniqueID()); }
70262052c9261a567f937ae05ade11ea7a3d280f4creed    int findPicture(SkPicture* picture) const { return fPictures.find(picture->uniqueID()); }
717e3ba9f88d64d901243799b61f497319e5970693reed
7254dc4878b02765efea39e68b218df1e4bfff4b88reed    int findOrDefineImage(SkImage*) override;
7354dc4878b02765efea39e68b218df1e4bfff4b88reed    int findOrDefinePicture(SkPicture*) override;
7454dc4878b02765efea39e68b218df1e4bfff4b88reed    int findOrDefineTypeface(SkTypeface*) override;
7554dc4878b02765efea39e68b218df1e4bfff4b88reed    int findOrDefineFactory(SkFlattenable*) override;
7654dc4878b02765efea39e68b218df1e4bfff4b88reed
7754dc4878b02765efea39e68b218df1e4bfff4b88reedprivate:
7854dc4878b02765efea39e68b218df1e4bfff4b88reed    SkPipeCanvas*           fPipeCanvas = nullptr;
7954dc4878b02765efea39e68b218df1e4bfff4b88reed    SkWStream*              fStream = nullptr;
8054dc4878b02765efea39e68b218df1e4bfff4b88reed
8154dc4878b02765efea39e68b218df1e4bfff4b88reed    SkTypefaceSerializer*   fTFSerializer = nullptr;
823ac64b427af596e4e8341857ce5f214bf0b49efbMike Reed    SkImageSerializer*      fIMSerializer = nullptr;
8354dc4878b02765efea39e68b218df1e4bfff4b88reed
8454dc4878b02765efea39e68b218df1e4bfff4b88reed    // All our keys (at the moment) are 32bit uniqueIDs
8554dc4878b02765efea39e68b218df1e4bfff4b88reed    SkTIndexSet<uint32_t>   fImages;
8654dc4878b02765efea39e68b218df1e4bfff4b88reed    SkTIndexSet<uint32_t>   fPictures;
8754dc4878b02765efea39e68b218df1e4bfff4b88reed    SkTIndexSet<uint32_t>   fTypefaces;
8854dc4878b02765efea39e68b218df1e4bfff4b88reed    SkTIndexSet<SkFlattenable::Factory> fFactories;
8954dc4878b02765efea39e68b218df1e4bfff4b88reed};
9054dc4878b02765efea39e68b218df1e4bfff4b88reed
9154dc4878b02765efea39e68b218df1e4bfff4b88reed
92439ace939b6aaa58408ece0e9e89b633353571aeFlorin Malitaclass SkPipeCanvas : public SkNoDrawCanvas {
9354dc4878b02765efea39e68b218df1e4bfff4b88reedpublic:
9454dc4878b02765efea39e68b218df1e4bfff4b88reed    SkPipeCanvas(const SkRect& cull, SkPipeDeduper*, SkWStream*);
9554dc4878b02765efea39e68b218df1e4bfff4b88reed    ~SkPipeCanvas() override;
9654dc4878b02765efea39e68b218df1e4bfff4b88reed
9754dc4878b02765efea39e68b218df1e4bfff4b88reedprotected:
9854dc4878b02765efea39e68b218df1e4bfff4b88reed    void willSave() override;
9954dc4878b02765efea39e68b218df1e4bfff4b88reed    SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override;
10054dc4878b02765efea39e68b218df1e4bfff4b88reed    void willRestore() override;
10154dc4878b02765efea39e68b218df1e4bfff4b88reed
10254dc4878b02765efea39e68b218df1e4bfff4b88reed    void didConcat(const SkMatrix&) override;
10354dc4878b02765efea39e68b218df1e4bfff4b88reed    void didSetMatrix(const SkMatrix&) override;
10454dc4878b02765efea39e68b218df1e4bfff4b88reed
10554dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawArc(const SkRect&, SkScalar startAngle, SkScalar sweepAngle, bool useCenter,
10654dc4878b02765efea39e68b218df1e4bfff4b88reed                   const SkPaint&) override;
10754dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[],
108faba3715b8ddfaa0ce4df79bc8006e9bc7694e5bMike Reed                     int count, SkBlendMode, const SkRect* cull, const SkPaint*) override;
10954dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
11054dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
11154dc4878b02765efea39e68b218df1e4bfff4b88reed                    const SkPaint&) override;
11254dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
11354dc4878b02765efea39e68b218df1e4bfff4b88reed                       const SkPaint&) override;
11454dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
11554dc4878b02765efea39e68b218df1e4bfff4b88reed                        SkScalar constY, const SkPaint&) override;
11654dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath&, const SkMatrix*,
11754dc4878b02765efea39e68b218df1e4bfff4b88reed                          const SkPaint&) override;
11854dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPaint&) override;
11954dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
12054dc4878b02765efea39e68b218df1e4bfff4b88reed                           const SkRect* cull, const SkPaint& paint) override;
12154dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4],
122faba3715b8ddfaa0ce4df79bc8006e9bc7694e5bMike Reed                     SkBlendMode, const SkPaint&) override;
12354dc4878b02765efea39e68b218df1e4bfff4b88reed
12454dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawPaint(const SkPaint&) override;
12554dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
12654dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawRect(const SkRect&, const SkPaint&) override;
12754dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawOval(const SkRect&, const SkPaint&) override;
12854dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawRegion(const SkRegion&, const SkPaint&) override;
12954dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawRRect(const SkRRect&, const SkPaint&) override;
13054dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawPath(const SkPath&, const SkPaint&) override;
13154dc4878b02765efea39e68b218df1e4bfff4b88reed
13254dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override;
13354dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst,
13454dc4878b02765efea39e68b218df1e4bfff4b88reed                         const SkPaint*, SrcRectConstraint) override;
13554dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst,
13654dc4878b02765efea39e68b218df1e4bfff4b88reed                         const SkPaint*) override;
13754dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawImageLattice(const SkImage*, const Lattice& lattice, const SkRect& dst,
13854dc4878b02765efea39e68b218df1e4bfff4b88reed                            const SkPaint*) override;
139fed9cfdc0216152d7fffe6d838ea7281466ffe74Mike Reed    void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override;
14054dc4878b02765efea39e68b218df1e4bfff4b88reed
141c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed    void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override;
142c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed    void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override;
143c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed    void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override;
144c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed    void onClipRegion(const SkRegion&, SkClipOp) override;
14554dc4878b02765efea39e68b218df1e4bfff4b88reed
14654dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override;
14754dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawAnnotation(const SkRect&, const char[], SkData*) override;
14854dc4878b02765efea39e68b218df1e4bfff4b88reed
14954dc4878b02765efea39e68b218df1e4bfff4b88reed    // These we turn into images
15054dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override;
15154dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*,
15254dc4878b02765efea39e68b218df1e4bfff4b88reed                          SrcRectConstraint) override;
15354dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst,
15454dc4878b02765efea39e68b218df1e4bfff4b88reed                          const SkPaint*) override;
15554dc4878b02765efea39e68b218df1e4bfff4b88reed    void onDrawBitmapLattice(const SkBitmap&, const Lattice& lattice, const SkRect& dst,
15654dc4878b02765efea39e68b218df1e4bfff4b88reed                             const SkPaint*) override;
15754dc4878b02765efea39e68b218df1e4bfff4b88reed
15854dc4878b02765efea39e68b218df1e4bfff4b88reedprivate:
15954dc4878b02765efea39e68b218df1e4bfff4b88reed    SkPipeDeduper*  fDeduper;
16054dc4878b02765efea39e68b218df1e4bfff4b88reed    SkWStream*      fStream;
16154dc4878b02765efea39e68b218df1e4bfff4b88reed
16254dc4878b02765efea39e68b218df1e4bfff4b88reed    friend class SkPipeWriter;
16354dc4878b02765efea39e68b218df1e4bfff4b88reed
164439ace939b6aaa58408ece0e9e89b633353571aeFlorin Malita    typedef SkNoDrawCanvas INHERITED;
16554dc4878b02765efea39e68b218df1e4bfff4b88reed};
16654dc4878b02765efea39e68b218df1e4bfff4b88reed
16754dc4878b02765efea39e68b218df1e4bfff4b88reed
16854dc4878b02765efea39e68b218df1e4bfff4b88reed#endif
169