1 /* 2 * Copyright 2014 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkRecorder_DEFINED 9 #define SkRecorder_DEFINED 10 11 #include "SkCanvas.h" 12 #include "SkRecord.h" 13 #include "SkRecords.h" 14 #include "SkTDArray.h" 15 16 class SkBBHFactory; 17 18 class SkDrawableList : SkNoncopyable { 19 public: 20 ~SkDrawableList(); 21 count()22 int count() const { return fArray.count(); } begin()23 SkDrawable* const* begin() const { return fArray.begin(); } 24 25 void append(SkDrawable* drawable); 26 27 // Return a new or ref'd array of pictures that were snapped from our drawables. 28 SkPicture::SnapshotArray* newDrawableSnapshot(); 29 30 private: 31 SkTDArray<SkDrawable*> fArray; 32 }; 33 34 // SkRecorder provides an SkCanvas interface for recording into an SkRecord. 35 36 class SkRecorder : public SkCanvas { 37 public: 38 // Does not take ownership of the SkRecord. 39 SkRecorder(SkRecord*, int width, int height); // legacy version 40 SkRecorder(SkRecord*, const SkRect& bounds); 41 42 void reset(SkRecord*, const SkRect& bounds); 43 approxBytesUsedBySubPictures()44 size_t approxBytesUsedBySubPictures() const { return fApproxBytesUsedBySubPictures; } 45 getDrawableList()46 SkDrawableList* getDrawableList() const { return fDrawableList.get(); } detachDrawableList()47 SkDrawableList* detachDrawableList() { return fDrawableList.detach(); } 48 49 // Make SkRecorder forget entirely about its SkRecord*; all calls to SkRecorder will fail. 50 void forgetRecord(); 51 52 void willSave() override; 53 SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SkCanvas::SaveFlags) override; willRestore()54 void willRestore() override {} 55 void didRestore() override; 56 57 void didConcat(const SkMatrix&) override; 58 void didSetMatrix(const SkMatrix&) override; 59 60 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override; 61 void onDrawDrawable(SkDrawable*) override; 62 void onDrawText(const void* text, 63 size_t byteLength, 64 SkScalar x, 65 SkScalar y, 66 const SkPaint& paint) override; 67 void onDrawPosText(const void* text, 68 size_t byteLength, 69 const SkPoint pos[], 70 const SkPaint& paint) override; 71 void onDrawPosTextH(const void* text, 72 size_t byteLength, 73 const SkScalar xpos[], 74 SkScalar constY, 75 const SkPaint& paint) override; 76 void onDrawTextOnPath(const void* text, 77 size_t byteLength, 78 const SkPath& path, 79 const SkMatrix* matrix, 80 const SkPaint& paint) override; 81 void onDrawTextBlob(const SkTextBlob* blob, 82 SkScalar x, 83 SkScalar y, 84 const SkPaint& paint) override; 85 void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], 86 const SkPoint texCoords[4], SkXfermode* xmode, 87 const SkPaint& paint) override; 88 89 void onDrawPaint(const SkPaint&) override; 90 void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override; 91 void onDrawRect(const SkRect&, const SkPaint&) override; 92 void onDrawOval(const SkRect&, const SkPaint&) override; 93 void onDrawRRect(const SkRRect&, const SkPaint&) override; 94 void onDrawPath(const SkPath&, const SkPaint&) override; 95 void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override; 96 void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*, 97 DrawBitmapRectFlags flags) override; 98 void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override; 99 void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst, 100 const SkPaint*) override; 101 void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst, 102 const SkPaint*) override; 103 void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) override; 104 void onDrawVertices(VertexMode vmode, int vertexCount, 105 const SkPoint vertices[], const SkPoint texs[], 106 const SkColor colors[], SkXfermode* xmode, 107 const uint16_t indices[], int indexCount, 108 const SkPaint&) override; 109 110 void onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) override; 111 void onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) override; 112 void onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) override; 113 void onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) override; 114 115 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override; 116 117 void beginCommentGroup(const char*) override; 118 void addComment(const char*, const char*) override; 119 void endCommentGroup() override; 120 onNewSurface(const SkImageInfo &,const SkSurfaceProps &)121 SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) override { return NULL; } 122 123 private: 124 template <typename T> 125 T* copy(const T*); 126 127 template <typename T> 128 T* copy(const T[], size_t count); 129 devBounds()130 SkIRect devBounds() const { 131 SkIRect devBounds; 132 this->getClipDeviceBounds(&devBounds); 133 return devBounds; 134 } 135 136 size_t fApproxBytesUsedBySubPictures; 137 SkRecord* fRecord; 138 SkAutoTDelete<SkDrawableList> fDrawableList; 139 }; 140 141 #endif//SkRecorder_DEFINED 142