Home | History | Annotate | Download | only in ext
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef SKIA_EXT_ANALYSIS_CANVAS_H_
      6 #define SKIA_EXT_ANALYSIS_CANVAS_H_
      7 
      8 #include "base/compiler_specific.h"
      9 #include "third_party/skia/include/core/SkBitmapDevice.h"
     10 #include "third_party/skia/include/core/SkCanvas.h"
     11 #include "third_party/skia/include/core/SkPicture.h"
     12 
     13 namespace skia {
     14 
     15 class AnalysisDevice;
     16 
     17 // Does not render anything, but gathers statistics about a region
     18 // (specified as a clip rectangle) of an SkPicture as the picture is
     19 // played back through it.
     20 // To use: create a SkBitmap with kNo_Config, create an AnalysisDevice
     21 // using that bitmap, and create an AnalysisCanvas using the device.
     22 // Play a picture into the canvas, and then check result.
     23 class SK_API AnalysisCanvas : public SkCanvas, public SkDrawPictureCallback {
     24  public:
     25   AnalysisCanvas(AnalysisDevice*);
     26   virtual ~AnalysisCanvas();
     27 
     28   // Returns true when a SkColor can be used to represent result.
     29   bool GetColorIfSolid(SkColor* color) const;
     30   bool HasText() const;
     31 
     32   // SkDrawPictureCallback override.
     33   virtual bool abortDrawing() OVERRIDE;
     34 
     35   // SkCanvas overrides.
     36   virtual bool clipRect(const SkRect& rect,
     37                         SkRegion::Op op = SkRegion::kIntersect_Op,
     38                         bool do_anti_alias = false) OVERRIDE;
     39   virtual bool clipPath(const SkPath& path,
     40                         SkRegion::Op op = SkRegion::kIntersect_Op,
     41                         bool do_anti_alias = false) OVERRIDE;
     42   virtual bool clipRRect(const SkRRect& rrect,
     43                          SkRegion::Op op = SkRegion::kIntersect_Op,
     44                          bool do_anti_alias = false) OVERRIDE;
     45 
     46   virtual int saveLayer(const SkRect* bounds,
     47                         const SkPaint* paint,
     48                         SkCanvas::SaveFlags flags) OVERRIDE;
     49   virtual int save(SaveFlags flags = kMatrixClip_SaveFlag) OVERRIDE;
     50 
     51   virtual void restore() OVERRIDE;
     52 
     53  private:
     54   typedef SkCanvas INHERITED;
     55 
     56   int saved_stack_size_;
     57   int force_not_solid_stack_level_;
     58   int force_not_transparent_stack_level_;
     59 };
     60 
     61 // TODO(robertphillips): Once Skia's SkBaseDevice API is refactored to
     62 // remove the bitmap-specific entry points, it might make sense for this
     63 // to be derived from SkBaseDevice (rather than SkBitmapDevice)
     64 class SK_API AnalysisDevice : public SkBitmapDevice {
     65  public:
     66   AnalysisDevice(const SkBitmap& bitmap);
     67   virtual ~AnalysisDevice();
     68 
     69   bool GetColorIfSolid(SkColor* color) const;
     70   bool HasText() const;
     71 
     72   void SetForceNotSolid(bool flag);
     73   void SetForceNotTransparent(bool flag);
     74 
     75  protected:
     76   // SkBaseDevice overrides.
     77   virtual void clear(SkColor color) OVERRIDE;
     78   virtual void drawPaint(const SkDraw& draw, const SkPaint& paint) OVERRIDE;
     79   virtual void drawPoints(const SkDraw& draw,
     80                           SkCanvas::PointMode mode,
     81                           size_t count,
     82                           const SkPoint points[],
     83                           const SkPaint& paint) OVERRIDE;
     84   virtual void drawRect(const SkDraw& draw,
     85                         const SkRect& rect,
     86                         const SkPaint& paint) OVERRIDE;
     87   virtual void drawRRect(const SkDraw& draw,
     88                          const SkRRect& rr,
     89                          const SkPaint& paint) OVERRIDE;
     90   virtual void drawOval(const SkDraw& draw,
     91                         const SkRect& oval,
     92                         const SkPaint& paint) OVERRIDE;
     93   virtual void drawPath(const SkDraw& draw,
     94                         const SkPath& path,
     95                         const SkPaint& paint,
     96                         const SkMatrix* pre_path_matrix = NULL,
     97                         bool path_is_mutable = false) OVERRIDE;
     98   virtual void drawBitmap(const SkDraw& draw,
     99                           const SkBitmap& bitmap,
    100                           const SkMatrix& matrix,
    101                           const SkPaint& paint) OVERRIDE;
    102   virtual void drawSprite(const SkDraw& draw,
    103                           const SkBitmap& bitmap,
    104                           int x,
    105                           int y,
    106                           const SkPaint& paint) OVERRIDE;
    107   virtual void drawBitmapRect(const SkDraw& draw,
    108                               const SkBitmap& bitmap,
    109                               const SkRect* src_or_null,
    110                               const SkRect& dst,
    111                               const SkPaint& paint,
    112                               SkCanvas::DrawBitmapRectFlags flags) OVERRIDE;
    113   virtual void drawText(const SkDraw& draw,
    114                         const void* text,
    115                         size_t len,
    116                         SkScalar x,
    117                         SkScalar y,
    118                         const SkPaint& paint) OVERRIDE;
    119   virtual void drawPosText(const SkDraw& draw,
    120                            const void* text,
    121                            size_t len,
    122                            const SkScalar pos[],
    123                            SkScalar const_y,
    124                            int scalars_per_pos,
    125                            const SkPaint& paint) OVERRIDE;
    126   virtual void drawTextOnPath(const SkDraw& draw,
    127                               const void* text,
    128                               size_t len,
    129                               const SkPath& path,
    130                               const SkMatrix* matrix,
    131                               const SkPaint& paint) OVERRIDE;
    132 #ifdef SK_BUILD_FOR_ANDROID
    133   virtual void drawPosTextOnPath(const SkDraw& draw,
    134                                  const void* text,
    135                                  size_t len,
    136                                  const SkPoint pos[],
    137                                  const SkPaint& paint,
    138                                  const SkPath& path,
    139                                  const SkMatrix* matrix) OVERRIDE;
    140 #endif
    141   virtual void drawVertices(const SkDraw& draw,
    142                             SkCanvas::VertexMode vertex_mode,
    143                             int vertex_count,
    144                             const SkPoint verts[],
    145                             const SkPoint texs[],
    146                             const SkColor colors[],
    147                             SkXfermode* xmode,
    148                             const uint16_t indices[],
    149                             int index_count,
    150                             const SkPaint& paint) OVERRIDE;
    151   virtual void drawDevice(const SkDraw& draw,
    152                           SkBaseDevice* device,
    153                           int x,
    154                           int y,
    155                           const SkPaint& paint) OVERRIDE;
    156 
    157  private:
    158   typedef SkBitmapDevice INHERITED;
    159 
    160   bool is_forced_not_solid_;
    161   bool is_forced_not_transparent_;
    162   bool is_solid_color_;
    163   SkColor color_;
    164   bool is_transparent_;
    165   bool has_text_;
    166 };
    167 
    168 }  // namespace skia
    169 
    170 #endif  // SKIA_EXT_ANALYSIS_CANVAS_H_
    171 
    172