1629ff107dc561b1ce9ae2879b3996d5908e8186
[WebKit-https.git] / Source / WebCore / platform / graphics / blackberry / InstrumentedPlatformCanvas.h
1 /*
2  * Copyright (C) 2011 Research In Motion Limited. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #ifndef InstrumentedPlatformCanvas_h
20 #define InstrumentedPlatformCanvas_h
21
22 #include <skia/ext/platform_canvas.h>
23
24 #define DEBUG_SKIA_DRAWING 0
25 #if DEBUG_SKIA_DRAWING
26 #define WRAPCANVAS_LOG_ENTRY(...) do { \
27     fprintf(stderr, "%s ", __FUNCTION__); \
28     fprintf(stderr, __VA_ARGS__); \
29     fprintf(stderr, "\n"); \
30 } while (0)
31 #else
32 #define WRAPCANVAS_LOG_ENTRY(...) ((void)0)
33 #endif
34
35 namespace WebCore {
36
37 class InstrumentedPlatformCanvas : public skia::PlatformCanvas {
38 public:
39     InstrumentedPlatformCanvas(int width, int height, bool is_opaque, SkDeviceFactory* factory)
40         : skia::PlatformCanvas(width, height, is_opaque, factory)
41         , m_size(width, height)
42         , m_isSolidColor(true)
43         , m_solidColor(0, 0, 0, 0)
44     {
45     }
46
47     virtual ~InstrumentedPlatformCanvas() { }
48
49     bool isSolidColor() const { return m_isSolidColor; }
50     Color solidColor() const { return m_solidColor; }
51
52     // overrides from SkCanvas
53     virtual int save(SaveFlags flags)
54     {
55         WRAPCANVAS_LOG_ENTRY("");
56         return skia::PlatformCanvas::save(flags);
57     }
58
59     virtual int saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags)
60     {
61         WRAPCANVAS_LOG_ENTRY("");
62         m_isSolidColor = false;
63         return skia::PlatformCanvas::saveLayer(bounds, paint, flags);
64     }
65
66     virtual void restore()
67     {
68         WRAPCANVAS_LOG_ENTRY("");
69         skia::PlatformCanvas::restore();
70     }
71
72     virtual bool translate(SkScalar dx, SkScalar dy)
73     {
74         WRAPCANVAS_LOG_ENTRY("");
75         return skia::PlatformCanvas::translate(dx, dy);
76     }
77
78     virtual bool scale(SkScalar sx, SkScalar sy)
79     {
80         WRAPCANVAS_LOG_ENTRY("");
81         return skia::PlatformCanvas::scale(sx, sy);
82     }
83
84     virtual bool rotate(SkScalar degrees)
85     {
86         WRAPCANVAS_LOG_ENTRY("");
87         return skia::PlatformCanvas::rotate(degrees);
88     }
89
90     virtual bool skew(SkScalar sx, SkScalar sy)
91     {
92         WRAPCANVAS_LOG_ENTRY("");
93         return skia::PlatformCanvas::skew(sx, sy);
94     }
95
96     virtual bool concat(const SkMatrix& matrix)
97     {
98         WRAPCANVAS_LOG_ENTRY("");
99         return skia::PlatformCanvas::concat(matrix);
100     }
101
102     virtual void setMatrix(const SkMatrix& matrix)
103     {
104         WRAPCANVAS_LOG_ENTRY("");
105         skia::PlatformCanvas::setMatrix(matrix);
106     }
107
108     virtual bool clipRect(const SkRect& rect, SkRegion::Op op)
109     {
110         WRAPCANVAS_LOG_ENTRY("");
111         return skia::PlatformCanvas::clipRect(rect, op);
112     }
113
114     virtual bool clipPath(const SkPath& path, SkRegion::Op op) 
115     {
116         WRAPCANVAS_LOG_ENTRY("");
117         m_isSolidColor = false;
118         return skia::PlatformCanvas::clipPath(path, op);
119     }
120
121     virtual bool clipRegion(const SkRegion& region, SkRegion::Op op)
122     {
123         WRAPCANVAS_LOG_ENTRY("");
124         m_isSolidColor = false;
125         return skia::PlatformCanvas::clipRegion(region, op);
126     }
127
128     virtual void clear(SkColor color)
129     {
130         WRAPCANVAS_LOG_ENTRY("");
131         m_isSolidColor = true;
132         m_solidColor = Color(color);
133         skia::PlatformCanvas::clear(color);
134     }
135
136     virtual void drawPaint(const SkPaint& paint)
137     {
138         WRAPCANVAS_LOG_ENTRY("");
139         m_isSolidColor = false;
140         skia::PlatformCanvas::drawPaint(paint);
141     }
142
143     virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
144             const SkPaint& paint)
145     {
146         WRAPCANVAS_LOG_ENTRY("");
147         m_isSolidColor = false;
148         skia::PlatformCanvas::drawPoints(mode, count, pts, paint);
149     }
150
151     virtual void drawRect(const SkRect& rect, const SkPaint& paint)
152     {
153         IntRect rectToDraw(rect);
154         WRAPCANVAS_LOG_ENTRY("rect = (x=%d,y=%d,width=%d,height=%d)", rectToDraw.x(), rectToDraw.y(), rectToDraw.width(), rectToDraw.height());
155         IntRect canvasRect(IntPoint(), m_size);
156         if (m_isSolidColor && getTotalMatrix().rectStaysRect() && getTotalClip().contains(canvasRect)) {
157             const SkMatrix& matrix = getTotalMatrix();
158             SkRect mapped;
159             matrix.mapRect(&mapped, rect);
160             if (mapped.contains(canvasRect)) {
161                 Color color = solidColor(paint);
162                 m_isSolidColor = color.isValid();
163                 m_solidColor = color;
164              } else
165                  m_isSolidColor = false;
166         } else
167             m_isSolidColor = false;
168         skia::PlatformCanvas::drawRect(rect, paint);
169     }
170
171     virtual void drawPath(const SkPath& path, const SkPaint& paint)
172     {
173         WRAPCANVAS_LOG_ENTRY("");
174         m_isSolidColor = false;
175         skia::PlatformCanvas::drawPath(path, paint);
176     }
177
178     virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left,
179             SkScalar top, const SkPaint* paint)
180     {
181         WRAPCANVAS_LOG_ENTRY("");
182         m_isSolidColor = false;
183         skia::PlatformCanvas::drawBitmap(bitmap, left, top, paint);
184     }
185
186     virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
187             const SkRect& dst, const SkPaint* paint)
188     {
189         WRAPCANVAS_LOG_ENTRY("");
190         m_isSolidColor = false;
191         skia::PlatformCanvas::drawBitmapRect(bitmap, src, dst, paint);
192     }
193
194     virtual void drawBitmapMatrix(const SkBitmap& bitmap,
195             const SkMatrix& matrix, const SkPaint* paint)
196     {
197         WRAPCANVAS_LOG_ENTRY("");
198         m_isSolidColor = false;
199         skia::PlatformCanvas::drawBitmapMatrix(bitmap, matrix, paint);
200     }
201
202     virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
203             const SkPaint* paint)
204     {
205         WRAPCANVAS_LOG_ENTRY("");
206         m_isSolidColor = false;
207         skia::PlatformCanvas::drawSprite(bitmap, left, top, paint);
208     }
209
210     virtual void drawText(const void* text, size_t byteLength, SkScalar x,
211             SkScalar y, const SkPaint& paint)
212     {
213         WRAPCANVAS_LOG_ENTRY("");
214         m_isSolidColor = false;
215         skia::PlatformCanvas::drawText(text, byteLength, x, y, paint);
216     }
217
218     virtual void drawPosText(const void* text, size_t byteLength,
219             const SkPoint pos[], const SkPaint& paint)
220     {
221         WRAPCANVAS_LOG_ENTRY("");
222         m_isSolidColor = false;
223         skia::PlatformCanvas::drawPosText(text, byteLength, pos, paint);
224     }
225
226     virtual void drawPosTextH(const void* text, size_t byteLength,
227             const SkScalar xpos[], SkScalar constY, const SkPaint& paint)
228     {
229         WRAPCANVAS_LOG_ENTRY("");
230         m_isSolidColor = false;
231         skia::PlatformCanvas::drawPosTextH(text, byteLength, xpos, constY, paint);
232     }
233
234     virtual void drawTextOnPath(const void* text, size_t byteLength,
235             const SkPath& path, const SkMatrix* matrix, const SkPaint& paint)
236     {
237         WRAPCANVAS_LOG_ENTRY("");
238         m_isSolidColor = false;
239         skia::PlatformCanvas::drawTextOnPath(text, byteLength, path, matrix, paint);
240     }
241
242     virtual void drawPicture(SkPicture& picture)
243     {
244         WRAPCANVAS_LOG_ENTRY("");
245         m_isSolidColor = false;
246         skia::PlatformCanvas::drawPicture(picture);
247     }
248
249     virtual void drawVertices(VertexMode mode, int vertexCount,
250             const SkPoint vertices[], const SkPoint texs[],
251             const SkColor colors[], SkXfermode* xfermode,
252             const uint16_t indices[], int indexCount, const SkPaint& paint)
253     {
254         WRAPCANVAS_LOG_ENTRY("");
255         m_isSolidColor = false;
256         skia::PlatformCanvas::drawVertices(mode, vertexCount, vertices, texs, colors, xfermode, indices, indexCount, paint);
257     }
258
259     virtual void drawData(const void* data, size_t size)
260     {
261         WRAPCANVAS_LOG_ENTRY("");
262         m_isSolidColor = false;
263         skia::PlatformCanvas::drawData(data, size);
264     }
265
266 private:
267     Color solidColor(const SkPaint& paint)
268     {
269         if (paint.getStyle() != SkPaint::kFill_Style)
270             return Color();
271         if (paint.getLooper() || paint.getShader())
272             return Color();
273
274         SkXfermode::Mode mode;
275         SkXfermode::AsMode(paint.getXfermode(), &mode);
276         if (mode == SkXfermode::kClear_Mode)
277             return Color(0, 0, 0, 0);
278
279         if ((mode == SkXfermode::kSrcOver_Mode && paint.getAlpha() == 255) || mode == SkXfermode::kSrc_Mode)
280             return Color(paint.getColor());
281         return Color();
282     }
283
284     IntSize m_size;
285     bool m_isSolidColor;
286     Color m_solidColor;
287     SkPaint m_solidPaint;
288 };
289
290 } // namespace WebCore
291
292 #endif // InstrumentedPlatformCanvas_h