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// SkRecorder provides an SkCanvas interface for recording into an SkRecord. 17 18class SkRecorder : public SkCanvas { 19public: 20 // Does not take ownership of the SkRecord. 21 SkRecorder(SkRecord*, int width, int height); 22 23 // Make SkRecorder forget entirely about its SkRecord*; all calls to SkRecorder will fail. 24 void forgetRecord(); 25 26 void clear(SkColor) SK_OVERRIDE; 27 void drawPaint(const SkPaint& paint) SK_OVERRIDE; 28 void drawPoints(PointMode mode, 29 size_t count, 30 const SkPoint pts[], 31 const SkPaint& paint) SK_OVERRIDE; 32 void drawRect(const SkRect& rect, const SkPaint& paint) SK_OVERRIDE; 33 void drawOval(const SkRect& oval, const SkPaint&) SK_OVERRIDE; 34 void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE; 35 void drawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE; 36 void drawBitmap(const SkBitmap& bitmap, 37 SkScalar left, 38 SkScalar top, 39 const SkPaint* paint = NULL) SK_OVERRIDE; 40 void drawBitmapRectToRect(const SkBitmap& bitmap, 41 const SkRect* src, 42 const SkRect& dst, 43 const SkPaint* paint = NULL, 44 DrawBitmapRectFlags flags = kNone_DrawBitmapRectFlag) SK_OVERRIDE; 45 void drawBitmapMatrix(const SkBitmap& bitmap, 46 const SkMatrix& m, 47 const SkPaint* paint = NULL) SK_OVERRIDE; 48 void drawBitmapNine(const SkBitmap& bitmap, 49 const SkIRect& center, 50 const SkRect& dst, 51 const SkPaint* paint = NULL) SK_OVERRIDE; 52 void drawSprite(const SkBitmap& bitmap, 53 int left, 54 int top, 55 const SkPaint* paint = NULL) SK_OVERRIDE; 56 void drawVertices(VertexMode vmode, 57 int vertexCount, 58 const SkPoint vertices[], 59 const SkPoint texs[], 60 const SkColor colors[], 61 SkXfermode* xmode, 62 const uint16_t indices[], 63 int indexCount, 64 const SkPaint& paint) SK_OVERRIDE; 65 66 void willSave() SK_OVERRIDE; 67 SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SkCanvas::SaveFlags) SK_OVERRIDE; 68 void willRestore() SK_OVERRIDE {} 69 void didRestore() SK_OVERRIDE; 70 71 void didConcat(const SkMatrix&) SK_OVERRIDE; 72 void didSetMatrix(const SkMatrix&) SK_OVERRIDE; 73 74 void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE; 75 void onDrawText(const void* text, 76 size_t byteLength, 77 SkScalar x, 78 SkScalar y, 79 const SkPaint& paint) SK_OVERRIDE; 80 void onDrawPosText(const void* text, 81 size_t byteLength, 82 const SkPoint pos[], 83 const SkPaint& paint) SK_OVERRIDE; 84 void onDrawPosTextH(const void* text, 85 size_t byteLength, 86 const SkScalar xpos[], 87 SkScalar constY, 88 const SkPaint& paint) SK_OVERRIDE; 89 void onDrawTextOnPath(const void* text, 90 size_t byteLength, 91 const SkPath& path, 92 const SkMatrix* matrix, 93 const SkPaint& paint) SK_OVERRIDE; 94 void onDrawTextBlob(const SkTextBlob* blob, 95 SkScalar x, 96 SkScalar y, 97 const SkPaint& paint) SK_OVERRIDE; 98 void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], 99 const SkPoint texCoords[4], SkXfermode* xmode, 100 const SkPaint& paint) SK_OVERRIDE; 101 102 void onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) SK_OVERRIDE; 103 void onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) SK_OVERRIDE; 104 void onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) SK_OVERRIDE; 105 void onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) SK_OVERRIDE; 106 107 void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) SK_OVERRIDE; 108 109 void onPushCull(const SkRect& cullRect) SK_OVERRIDE; 110 void onPopCull() SK_OVERRIDE; 111 112 void beginCommentGroup(const char*) SK_OVERRIDE; 113 void addComment(const char*, const char*) SK_OVERRIDE; 114 void endCommentGroup() SK_OVERRIDE; 115 void drawData(const void*, size_t) SK_OVERRIDE; 116 117 bool isDrawingToLayer() const SK_OVERRIDE; 118 SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) SK_OVERRIDE { return NULL; } 119 120private: 121 template <typename T> 122 T* copy(const T*); 123 124 template <typename T> 125 T* copy(const T[], size_t count); 126 127 SkIRect devBounds() const { 128 SkIRect devBounds; 129 this->getClipDeviceBounds(&devBounds); 130 return devBounds; 131 } 132 133 SkRecord* fRecord; 134 135 int fSaveLayerCount; 136 SkTDArray<SkBool8> fSaveIsSaveLayer; 137}; 138 139#endif//SkRecorder_DEFINED 140