SkDrawable.cpp revision 4ae9eb7463cf2160723407359608f221c0d5e2a6
1/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkCanvas.h"
9#include "SkDrawable.h"
10#include "SkThread.h"
11
12static int32_t next_generation_id() {
13    static int32_t gCanvasDrawableGenerationID;
14
15    // do a loop in case our global wraps around, as we never want to
16    // return a 0
17    int32_t genID;
18    do {
19        genID = sk_atomic_inc(&gCanvasDrawableGenerationID) + 1;
20    } while (0 == genID);
21    return genID;
22}
23
24SkDrawable::SkDrawable() : fGenerationID(0) {}
25
26static void draw_bbox(SkCanvas* canvas, const SkRect& r) {
27    SkPaint paint;
28    paint.setStyle(SkPaint::kStroke_Style);
29    paint.setColor(0xFFFF7088);
30    canvas->drawRect(r, paint);
31    canvas->drawLine(r.left(), r.top(), r.right(), r.bottom(), paint);
32    canvas->drawLine(r.left(), r.bottom(), r.right(), r.top(), paint);
33}
34
35void SkDrawable::draw(SkCanvas* canvas) {
36    SkAutoCanvasRestore acr(canvas, true);
37    this->onDraw(canvas);
38
39    if (false) {
40        draw_bbox(canvas, this->getBounds());
41    }
42}
43
44SkPicture* SkDrawable::newPictureSnapshot() {
45    return this->onNewPictureSnapshot();
46}
47
48uint32_t SkDrawable::getGenerationID() {
49    if (0 == fGenerationID) {
50        fGenerationID = next_generation_id();
51    }
52    return fGenerationID;
53}
54
55SkRect SkDrawable::getBounds() {
56    return this->onGetBounds();
57}
58
59void SkDrawable::notifyDrawingChanged() {
60    fGenerationID = 0;
61}
62
63/////////////////////////////////////////////////////////////////////////////////////////
64
65#include "SkPictureRecorder.h"
66
67SkPicture* SkDrawable::onNewPictureSnapshot() {
68    SkPictureRecorder recorder;
69
70    const SkRect bounds = this->getBounds();
71    SkCanvas* canvas = recorder.beginRecording(bounds, NULL, 0);
72    this->draw(canvas);
73    if (false) {
74        draw_bbox(canvas, bounds);
75    }
76    return recorder.endRecording();
77}
78