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