Home | History | Annotate | Download | only in skia
      1 /*
      2  * Copyright (c) 2012, Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #ifndef OpaqueRegionSkia_h
     32 #define OpaqueRegionSkia_h
     33 
     34 #include "core/platform/graphics/IntRect.h"
     35 
     36 #include "SkBitmap.h"
     37 #include "SkCanvas.h"
     38 #include "SkPaint.h"
     39 #include "SkPoint.h"
     40 #include "SkRect.h"
     41 
     42 namespace WebCore {
     43 class GraphicsContext;
     44 
     45 // This class is an encapsulation of functionality for GraphicsContext, and its methods are mirrored
     46 // there for the outside world. It tracks paints and computes what area will be opaque.
     47 class OpaqueRegionSkia {
     48 public:
     49     OpaqueRegionSkia();
     50     virtual ~OpaqueRegionSkia();
     51 
     52     // The resulting opaque region as a single rect.
     53     IntRect asRect() const;
     54 
     55     void pushCanvasLayer(const SkPaint*);
     56     void popCanvasLayer(const GraphicsContext*);
     57 
     58     void setImageMask(const SkRect& imageOpaqueRect);
     59 
     60     enum DrawType {
     61         FillOnly,
     62         FillOrStroke
     63     };
     64 
     65     void didDrawRect(const GraphicsContext*, const SkRect&, const SkPaint&, const SkBitmap* sourceBitmap);
     66     void didDrawPath(const GraphicsContext*, const SkPath&, const SkPaint&);
     67     void didDrawPoints(const GraphicsContext*, SkCanvas::PointMode, int numPoints, const SkPoint[], const SkPaint&);
     68     void didDrawBounded(const GraphicsContext*, const SkRect&, const SkPaint&);
     69     void didDrawUnbounded(const GraphicsContext*, const SkPaint&, DrawType);
     70 
     71     struct CanvasLayerState {
     72         CanvasLayerState()
     73             : hasImageMask(false)
     74             , opaqueRect(SkRect::MakeEmpty())
     75         { }
     76 
     77         SkPaint paint;
     78 
     79         // An image mask is being applied to the layer.
     80         bool hasImageMask;
     81         // The opaque area in the image mask.
     82         SkRect imageOpaqueRect;
     83 
     84         SkRect opaqueRect;
     85     };
     86 
     87 private:
     88     void didDraw(const GraphicsContext*, const SkRect&, const SkPaint&, const SkBitmap* sourceBitmap, bool fillsBounds, DrawType);
     89     void applyOpaqueRegionFromLayer(const GraphicsContext*, const SkRect& layerOpaqueRect, const SkPaint&);
     90     void markRectAsOpaque(const SkRect&);
     91     void markRectAsNonOpaque(const SkRect&);
     92     void markAllAsNonOpaque();
     93 
     94     SkRect& currentTrackingOpaqueRect();
     95 
     96     SkRect m_opaqueRect;
     97 
     98     Vector<CanvasLayerState, 3> m_canvasLayerStack;
     99 };
    100 
    101 }
    102 #endif // OpaqueRegionSkia_h
    103