• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "platform/PlatformExport.h"
35 #include "platform/geometry/IntRect.h"
36 
37 #include "SkBitmap.h"
38 #include "SkCanvas.h"
39 #include "SkPaint.h"
40 #include "SkPoint.h"
41 #include "SkRect.h"
42 
43 namespace WebCore {
44 class GraphicsContext;
45 
46 // This class is an encapsulation of functionality for GraphicsContext, and its methods are mirrored
47 // there for the outside world. It tracks paints and computes what area will be opaque.
48 class PLATFORM_EXPORT OpaqueRegionSkia FINAL {
49 public:
50     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 {
CanvasLayerStateCanvasLayerState72         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