Home | History | Annotate | Download | only in core
      1 
      2 /*
      3  * Copyright 2012 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 #ifndef SkBBoxRecord_DEFINED
     10 #define SkBBoxRecord_DEFINED
     11 
     12 #include "SkPictureRecord.h"
     13 
     14 /**
     15   * This is an abstract SkPictureRecord subclass that intercepts draw calls and computes an
     16   * axis-aligned bounding box for each draw that it sees, subclasses implement handleBBox()
     17   * which will be called every time we get a new bounding box.
     18   */
     19 class SkBBoxRecord : public SkPictureRecord {
     20 public:
     21 
     22     SkBBoxRecord(uint32_t recordFlags, SkDevice* device)
     23             : INHERITED(recordFlags, device) { }
     24     virtual ~SkBBoxRecord() { }
     25 
     26     /**
     27      * This is called each time we get a bounding box, it will be axis-aligned,
     28      * in device coordinates, and expanded to include stroking, shadows, etc.
     29      */
     30     virtual void handleBBox(const SkRect& bbox) = 0;
     31 
     32     virtual void drawOval(const SkRect& rect, const SkPaint& paint) SK_OVERRIDE;
     33     virtual void drawRRect(const SkRRect& rrect, const SkPaint& paint) SK_OVERRIDE;
     34     virtual void drawRect(const SkRect& rect, const SkPaint& paint) SK_OVERRIDE;
     35     virtual void drawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
     36     virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
     37                             const SkPaint& paint) SK_OVERRIDE;
     38     virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
     39     virtual void clear(SkColor) SK_OVERRIDE;
     40     virtual void drawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
     41                           const SkPaint& paint) SK_OVERRIDE;
     42     virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
     43                             const SkPaint* paint = NULL) SK_OVERRIDE;
     44     virtual void drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
     45                                 const SkRect& dst, const SkPaint* paint) SK_OVERRIDE;
     46     virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& mat,
     47                                   const SkPaint* paint) SK_OVERRIDE;
     48     virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
     49                                 const SkRect& dst, const SkPaint* paint) SK_OVERRIDE;
     50     virtual void drawPosText(const void* text, size_t byteLength,
     51                              const SkPoint pos[], const SkPaint& paint) SK_OVERRIDE;
     52     virtual void drawPosTextH(const void* text, size_t byteLength,
     53                               const SkScalar xpos[], SkScalar constY,
     54                               const SkPaint& paint) SK_OVERRIDE;
     55     virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
     56                             const SkPaint* paint) SK_OVERRIDE;
     57     virtual void drawTextOnPath(const void* text, size_t byteLength,
     58                                 const SkPath& path, const SkMatrix* matrix,
     59                                 const SkPaint& paint) SK_OVERRIDE;
     60     virtual void drawVertices(VertexMode mode, int vertexCount,
     61                               const SkPoint vertices[], const SkPoint texs[],
     62                               const SkColor colors[], SkXfermode* xfer,
     63                               const uint16_t indices[], int indexCount,
     64                               const SkPaint& paint) SK_OVERRIDE;
     65     virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
     66 
     67 private:
     68     /**
     69      * Takes a bounding box in current canvas view space, accounts for stroking and effects, and
     70      * computes an axis-aligned bounding box in device coordinates, then passes it to handleBBox()
     71      * returns false if the draw is completely clipped out, and may safely be ignored.
     72      **/
     73     bool transformBounds(const SkRect& bounds, const SkPaint* paint);
     74 
     75     typedef SkPictureRecord INHERITED;
     76 };
     77 
     78 #endif
     79