/* * 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 "SkImage_Base.h" #include "SkImagePriv.h" #include "SkPicture.h" class SkImage_Picture : public SkImage_Base { public: SkImage_Picture(SkPicture*); virtual ~SkImage_Picture(); virtual void onDraw(SkCanvas*, SkScalar, SkScalar, const SkPaint*) SK_OVERRIDE; virtual void onDrawRectToRect(SkCanvas*, const SkRect*, const SkRect&, const SkPaint*) SK_OVERRIDE; SkPicture* getPicture() { return fPicture; } private: SkPicture* fPicture; typedef SkImage_Base INHERITED; }; /////////////////////////////////////////////////////////////////////////////// SkImage_Picture::SkImage_Picture(SkPicture* pict) : INHERITED(pict->width(), pict->height()) { pict->endRecording(); pict->ref(); fPicture = pict; } SkImage_Picture::~SkImage_Picture() { fPicture->unref(); } void SkImage_Picture::onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) { SkImagePrivDrawPicture(canvas, fPicture, x, y, paint); } void SkImage_Picture::onDrawRectToRect(SkCanvas* canvas, const SkRect* src, const SkRect& dst, const SkPaint* paint) { SkImagePrivDrawPicture(canvas, fPicture, src, dst, paint); } SkImage* SkNewImageFromPicture(const SkPicture* srcPicture) { /** * We want to snapshot the playback status of the picture, w/o affecting * its ability to continue recording (if needed). * * Optimally this will shared as much data/buffers as it can with * srcPicture, and srcPicture will perform a copy-on-write as needed if it * needs to mutate them later on. */ SkAutoTUnref<SkPicture> playback(SkNEW_ARGS(SkPicture, (*srcPicture))); return SkNEW_ARGS(SkImage_Picture, (playback)); } SkPicture* SkPictureImageGetPicture(SkImage* pictureImage) { return static_cast<SkImage_Picture*>(pictureImage)->getPicture(); }