/*
* Copyright 2014 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkAtomics.h"
#include "SkCanvas.h"
#include "SkDrawable.h"
static int32_t next_generation_id() {
static int32_t gCanvasDrawableGenerationID;
// do a loop in case our global wraps around, as we never want to
// return a 0
int32_t genID;
do {
genID = sk_atomic_inc(&gCanvasDrawableGenerationID) + 1;
} while (0 == genID);
return genID;
}
SkDrawable::SkDrawable() : fGenerationID(0) {}
static void draw_bbox(SkCanvas* canvas, const SkRect& r) {
SkPaint paint;
paint.setStyle(SkPaint::kStroke_Style);
paint.setColor(0xFFFF7088);
canvas->drawRect(r, paint);
canvas->drawLine(r.left(), r.top(), r.right(), r.bottom(), paint);
canvas->drawLine(r.left(), r.bottom(), r.right(), r.top(), paint);
}
void SkDrawable::draw(SkCanvas* canvas, const SkMatrix* matrix) {
SkAutoCanvasRestore acr(canvas, true);
if (matrix) {
canvas->concat(*matrix);
}
this->onDraw(canvas);
if (false) {
draw_bbox(canvas, this->getBounds());
}
}
void SkDrawable::draw(SkCanvas* canvas, SkScalar x, SkScalar y) {
SkMatrix matrix = SkMatrix::MakeTrans(x, y);
this->draw(canvas, &matrix);
}
SkPicture* SkDrawable::newPictureSnapshot() {
return this->onNewPictureSnapshot();
}
uint32_t SkDrawable::getGenerationID() {
if (0 == fGenerationID) {
fGenerationID = next_generation_id();
}
return fGenerationID;
}
SkRect SkDrawable::getBounds() {
return this->onGetBounds();
}
void SkDrawable::notifyDrawingChanged() {
fGenerationID = 0;
}
/////////////////////////////////////////////////////////////////////////////////////////
#include "SkPictureRecorder.h"
SkPicture* SkDrawable::onNewPictureSnapshot() {
SkPictureRecorder recorder;
const SkRect bounds = this->getBounds();
SkCanvas* canvas = recorder.beginRecording(bounds, nullptr, 0);
this->draw(canvas);
if (false) {
draw_bbox(canvas, bounds);
}
return recorder.finishRecordingAsPicture().release();
}