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