Home | History | Annotate | Download | only in core
      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 #ifndef SkDrawable_DEFINED
      9 #define SkDrawable_DEFINED
     10 
     11 #include "SkRefCnt.h"
     12 
     13 class SkCanvas;
     14 class SkPicture;
     15 struct SkRect;
     16 
     17 /**
     18  *  Base-class for objects that draw into SkCanvas.
     19  *
     20  *  The object has a generation ID, which is guaranteed to be unique across all drawables. To
     21  *  allow for clients of the drawable that may want to cache the results, the drawable must
     22  *  change its generation ID whenever its internal state changes such that it will draw differently.
     23  */
     24 class SkDrawable : public SkRefCnt {
     25 public:
     26     SkDrawable();
     27 
     28     /**
     29      *  Draws into the specified content. The drawing sequence will be balanced upon return
     30      *  (i.e. the saveLevel() on the canvas will match what it was when draw() was called,
     31      *  and the current matrix and clip settings will not be changed.
     32      */
     33     void draw(SkCanvas*, const SkMatrix* = NULL);
     34     void draw(SkCanvas*, SkScalar x, SkScalar y);
     35 
     36     SkPicture* newPictureSnapshot();
     37 
     38     /**
     39      *  Return a unique value for this instance. If two calls to this return the same value,
     40      *  it is presumed that calling the draw() method will render the same thing as well.
     41      *
     42      *  Subclasses that change their state should call notifyDrawingChanged() to ensure that
     43      *  a new value will be returned the next time it is called.
     44      */
     45     uint32_t getGenerationID();
     46 
     47     /**
     48      *  Return the (conservative) bounds of what the drawable will draw. If the drawable can
     49      *  change what it draws (e.g. animation or in response to some external change), then this
     50      *  must return a bounds that is always valid for all possible states.
     51      */
     52     SkRect getBounds();
     53 
     54     /**
     55      *  Calling this invalidates the previous generation ID, and causes a new one to be computed
     56      *  the next time getGenerationID() is called. Typically this is called by the object itself,
     57      *  in response to its internal state changing.
     58      */
     59     void notifyDrawingChanged();
     60 
     61 protected:
     62     virtual SkRect onGetBounds() = 0;
     63     virtual void onDraw(SkCanvas*) = 0;
     64 
     65     /**
     66      *  Default implementation calls onDraw() with a canvas that records into a picture. Subclasses
     67      *  may override if they have a more efficient way to return a picture for the current state
     68      *  of their drawable. Note: this picture must draw the same as what would be drawn from
     69      *  onDraw().
     70      */
     71     virtual SkPicture* onNewPictureSnapshot();
     72 
     73 private:
     74     int32_t fGenerationID;
     75 };
     76 
     77 #endif
     78