1 /* 2 * Copyright 2012 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 #include "SkSurface_Base.h" 9 #include "SkCanvas.h" 10 #include "SkImagePriv.h" 11 #include "SkPicture.h" 12 13 /** 14 * What does it mean to ask for more than one canvas from a picture? 15 * How do we return an Image and then "continue" recording? 16 */ 17 class SkSurface_Picture : public SkSurface_Base { 18 public: 19 SkSurface_Picture(int width, int height); 20 virtual ~SkSurface_Picture(); 21 22 virtual SkCanvas* onNewCanvas() SK_OVERRIDE; 23 virtual SkSurface* onNewSurface(const SkImageInfo&) SK_OVERRIDE; 24 virtual SkImage* onNewImageSnapshot() SK_OVERRIDE; 25 virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, 26 const SkPaint*) SK_OVERRIDE; 27 virtual void onCopyOnWrite(ContentChangeMode) SK_OVERRIDE; 28 29 private: 30 SkPicture* fPicture; 31 32 typedef SkSurface_Base INHERITED; 33 }; 34 35 /////////////////////////////////////////////////////////////////////////////// 36 37 SkSurface_Picture::SkSurface_Picture(int width, int height) : INHERITED(width, height) { 38 fPicture = NULL; 39 } 40 41 SkSurface_Picture::~SkSurface_Picture() { 42 SkSafeUnref(fPicture); 43 } 44 45 SkCanvas* SkSurface_Picture::onNewCanvas() { 46 if (!fPicture) { 47 fPicture = SkNEW(SkPicture); 48 } 49 SkCanvas* canvas = fPicture->beginRecording(this->width(), this->height()); 50 canvas->ref(); // our caller will call unref() 51 return canvas; 52 } 53 54 SkSurface* SkSurface_Picture::onNewSurface(const SkImageInfo& info) { 55 return SkSurface::NewPicture(info.fWidth, info.fHeight); 56 } 57 58 SkImage* SkSurface_Picture::onNewImageSnapshot() { 59 if (fPicture) { 60 return SkNewImageFromPicture(fPicture); 61 } else { 62 SkImageInfo info; 63 info.fWidth = info.fHeight = 0; 64 info.fColorType = kPMColor_SkColorType; 65 info.fAlphaType = kOpaque_SkAlphaType; 66 return SkImage::NewRasterCopy(info, NULL, 0); 67 } 68 } 69 70 void SkSurface_Picture::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, 71 const SkPaint* paint) { 72 if (!fPicture) { 73 return; 74 } 75 SkImagePrivDrawPicture(canvas, fPicture, x, y, paint); 76 } 77 78 void SkSurface_Picture::onCopyOnWrite(ContentChangeMode /*mode*/) { 79 // We always spawn a copy of the recording picture when we 80 // are asked for a snapshot, so we never need to do anything here. 81 } 82 83 /////////////////////////////////////////////////////////////////////////////// 84 85 86 SkSurface* SkSurface::NewPicture(int width, int height) { 87 if ((width | height) < 0) { 88 return NULL; 89 } 90 91 return SkNEW_ARGS(SkSurface_Picture, (width, height)); 92 } 93