diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/image/SkImage_Picture.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/image/SkImage_Picture.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,66 @@ +/* + * 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 playback(SkNEW_ARGS(SkPicture, (*srcPicture))); + + return SkNEW_ARGS(SkImage_Picture, (playback)); +} + +SkPicture* SkPictureImageGetPicture(SkImage* pictureImage) { + return static_cast(pictureImage)->getPicture(); +}