1c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed/*
2c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed * Copyright 2014 Google Inc.
3c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed *
4c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed * Use of this source code is governed by a BSD-style license that can be
5c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed * found in the LICENSE file.
6c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed */
7c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed
8b906daf112416c1698a79cf51aa70fe11aa19d0aherb#include "SkAtomics.h"
9c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed#include "SkCanvas.h"
103cb3840c9af6f70896cf5565a38d4ee03c02d767reed#include "SkDrawable.h"
11c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed
12c536942dc93d81aeb5df8a62f81582b0bdaa4f54reedstatic int32_t next_generation_id() {
13c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    static int32_t gCanvasDrawableGenerationID;
14c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed
15c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    // do a loop in case our global wraps around, as we never want to
16c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    // return a 0
17c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    int32_t genID;
18c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    do {
19c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed        genID = sk_atomic_inc(&gCanvasDrawableGenerationID) + 1;
20c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    } while (0 == genID);
21c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    return genID;
22c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed}
23c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed
243cb3840c9af6f70896cf5565a38d4ee03c02d767reedSkDrawable::SkDrawable() : fGenerationID(0) {}
25c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed
2678e276889795454891cbba48ab11927968114953reedstatic void draw_bbox(SkCanvas* canvas, const SkRect& r) {
2778e276889795454891cbba48ab11927968114953reed    SkPaint paint;
2878e276889795454891cbba48ab11927968114953reed    paint.setStyle(SkPaint::kStroke_Style);
2978e276889795454891cbba48ab11927968114953reed    paint.setColor(0xFFFF7088);
3078e276889795454891cbba48ab11927968114953reed    canvas->drawRect(r, paint);
3178e276889795454891cbba48ab11927968114953reed    canvas->drawLine(r.left(), r.top(), r.right(), r.bottom(), paint);
3278e276889795454891cbba48ab11927968114953reed    canvas->drawLine(r.left(), r.bottom(), r.right(), r.top(), paint);
3378e276889795454891cbba48ab11927968114953reed}
3478e276889795454891cbba48ab11927968114953reed
35a8db72864a43ad1fbba3c2892cf5cd88060a43efreedvoid SkDrawable::draw(SkCanvas* canvas, const SkMatrix* matrix) {
36c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    SkAutoCanvasRestore acr(canvas, true);
37a8db72864a43ad1fbba3c2892cf5cd88060a43efreed    if (matrix) {
38a8db72864a43ad1fbba3c2892cf5cd88060a43efreed        canvas->concat(*matrix);
39a8db72864a43ad1fbba3c2892cf5cd88060a43efreed    }
40c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    this->onDraw(canvas);
4178e276889795454891cbba48ab11927968114953reed
4278e276889795454891cbba48ab11927968114953reed    if (false) {
4378e276889795454891cbba48ab11927968114953reed        draw_bbox(canvas, this->getBounds());
4478e276889795454891cbba48ab11927968114953reed    }
45c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed}
46c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed
47a8db72864a43ad1fbba3c2892cf5cd88060a43efreedvoid SkDrawable::draw(SkCanvas* canvas, SkScalar x, SkScalar y) {
48a8db72864a43ad1fbba3c2892cf5cd88060a43efreed    SkMatrix matrix = SkMatrix::MakeTrans(x, y);
49a8db72864a43ad1fbba3c2892cf5cd88060a43efreed    this->draw(canvas, &matrix);
50a8db72864a43ad1fbba3c2892cf5cd88060a43efreed}
51a8db72864a43ad1fbba3c2892cf5cd88060a43efreed
523cb3840c9af6f70896cf5565a38d4ee03c02d767reedSkPicture* SkDrawable::newPictureSnapshot() {
531bdfd3f4f09e47364f76d3f08177b1ce844ac786reed    return this->onNewPictureSnapshot();
546be2aa9a251bf6022570a03140f956655b3ef1dareed}
556be2aa9a251bf6022570a03140f956655b3ef1dareed
563cb3840c9af6f70896cf5565a38d4ee03c02d767reeduint32_t SkDrawable::getGenerationID() {
57c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    if (0 == fGenerationID) {
58c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed        fGenerationID = next_generation_id();
59c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    }
60c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    return fGenerationID;
61c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed}
62c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed
633cb3840c9af6f70896cf5565a38d4ee03c02d767reedSkRect SkDrawable::getBounds() {
646be2aa9a251bf6022570a03140f956655b3ef1dareed    return this->onGetBounds();
65c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed}
66c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed
673cb3840c9af6f70896cf5565a38d4ee03c02d767reedvoid SkDrawable::notifyDrawingChanged() {
68c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed    fGenerationID = 0;
69c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed}
70c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed
716be2aa9a251bf6022570a03140f956655b3ef1dareed/////////////////////////////////////////////////////////////////////////////////////////
72c536942dc93d81aeb5df8a62f81582b0bdaa4f54reed
736be2aa9a251bf6022570a03140f956655b3ef1dareed#include "SkPictureRecorder.h"
746be2aa9a251bf6022570a03140f956655b3ef1dareed
753cb3840c9af6f70896cf5565a38d4ee03c02d767reedSkPicture* SkDrawable::onNewPictureSnapshot() {
767c4cdd2c5b7b6c71fa0e7612594f7885f2dbf264reed    SkPictureRecorder recorder;
7778e276889795454891cbba48ab11927968114953reed
7878e276889795454891cbba48ab11927968114953reed    const SkRect bounds = this->getBounds();
792880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    SkCanvas* canvas = recorder.beginRecording(bounds, nullptr, 0);
8078e276889795454891cbba48ab11927968114953reed    this->draw(canvas);
8178e276889795454891cbba48ab11927968114953reed    if (false) {
8278e276889795454891cbba48ab11927968114953reed        draw_bbox(canvas, bounds);
8378e276889795454891cbba48ab11927968114953reed    }
846be2aa9a251bf6022570a03140f956655b3ef1dareed    return recorder.endRecording();
856be2aa9a251bf6022570a03140f956655b3ef1dareed}
86