/*
|
* 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 "SkCanvas.h"
|
#include "SkDrawable.h"
|
#include <atomic>
|
|
static int32_t next_generation_id() {
|
static std::atomic<int32_t> nextID{1};
|
|
int32_t id;
|
do {
|
id = nextID++;
|
} while (id == 0);
|
return id;
|
}
|
|
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();
|
}
|