| /* |
| * Copyright 2012 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "SkSurface_Base.h" |
| #include "SkCanvas.h" |
| #include "SkImagePriv.h" |
| #include "SkPicture.h" |
| |
| /** |
| * What does it mean to ask for more than one canvas from a picture? |
| * How do we return an Image and then "continue" recording? |
| */ |
| class SkSurface_Picture : public SkSurface_Base { |
| public: |
| SkSurface_Picture(int width, int height); |
| virtual ~SkSurface_Picture(); |
| |
| virtual SkCanvas* onNewCanvas() SK_OVERRIDE; |
| virtual SkSurface* onNewSurface(const SkImage::Info&) SK_OVERRIDE; |
| virtual SkImage* onNewImageShapshot() SK_OVERRIDE; |
| virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, |
| const SkPaint*) SK_OVERRIDE; |
| virtual void onCopyOnWrite(SkImage*, SkCanvas*) SK_OVERRIDE; |
| |
| private: |
| SkPicture* fPicture; |
| SkPicture* fRecordingPicture; |
| |
| typedef SkSurface_Base INHERITED; |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| SkSurface_Picture::SkSurface_Picture(int width, int height) : INHERITED(width, height) { |
| fPicture = NULL; |
| } |
| |
| SkSurface_Picture::~SkSurface_Picture() { |
| SkSafeUnref(fPicture); |
| } |
| |
| SkCanvas* SkSurface_Picture::onNewCanvas() { |
| if (!fPicture) { |
| fPicture = SkNEW(SkPicture); |
| } |
| SkCanvas* canvas = fPicture->beginRecording(this->width(), this->height()); |
| canvas->ref(); // our caller will call unref() |
| return canvas; |
| } |
| |
| SkSurface* SkSurface_Picture::onNewSurface(const SkImage::Info& info) { |
| return SkSurface::NewPicture(info.fWidth, info.fHeight); |
| } |
| |
| SkImage* SkSurface_Picture::onNewImageShapshot() { |
| if (fPicture) { |
| return SkNewImageFromPicture(fPicture); |
| } else { |
| SkImage::Info info; |
| info.fWidth = info.fHeight = 0; |
| info.fColorType = SkImage::kPMColor_ColorType; |
| info.fAlphaType = SkImage::kOpaque_AlphaType; |
| return SkImage::NewRasterCopy(info, NULL, 0); |
| } |
| } |
| |
| void SkSurface_Picture::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, |
| const SkPaint* paint) { |
| if (!fPicture) { |
| return; |
| } |
| SkImagePrivDrawPicture(canvas, fPicture, x, y, paint); |
| } |
| |
| void SkSurface_Picture::onCopyOnWrite(SkImage* cachedImage, SkCanvas*) { |
| // We always spawn a copy of the recording picture when we |
| // are asked for a snapshot, so we never need to do anything here. |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| |
| SkSurface* SkSurface::NewPicture(int width, int height) { |
| if ((width | height) < 0) { |
| return NULL; |
| } |
| |
| return SkNEW_ARGS(SkSurface_Picture, (width, height)); |
| } |