173502db10afa184358f2880c9e52906e5abc89c1Chris Craik/*
273502db10afa184358f2880c9e52906e5abc89c1Chris Craik * Copyright (C) 2011 Research In Motion Limited. All rights reserved.
373502db10afa184358f2880c9e52906e5abc89c1Chris Craik *
473502db10afa184358f2880c9e52906e5abc89c1Chris Craik * This library is free software; you can redistribute it and/or
573502db10afa184358f2880c9e52906e5abc89c1Chris Craik * modify it under the terms of the GNU Lesser General Public
673502db10afa184358f2880c9e52906e5abc89c1Chris Craik * License as published by the Free Software Foundation; either
773502db10afa184358f2880c9e52906e5abc89c1Chris Craik * version 2 of the License, or (at your option) any later version.
873502db10afa184358f2880c9e52906e5abc89c1Chris Craik *
973502db10afa184358f2880c9e52906e5abc89c1Chris Craik * This library is distributed in the hope that it will be useful,
1073502db10afa184358f2880c9e52906e5abc89c1Chris Craik * but WITHOUT ANY WARRANTY; without even the implied warranty of
1173502db10afa184358f2880c9e52906e5abc89c1Chris Craik * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1273502db10afa184358f2880c9e52906e5abc89c1Chris Craik * Lesser General Public License for more details.
1373502db10afa184358f2880c9e52906e5abc89c1Chris Craik *
1473502db10afa184358f2880c9e52906e5abc89c1Chris Craik * You should have received a copy of the GNU Lesser General Public
1573502db10afa184358f2880c9e52906e5abc89c1Chris Craik * License along with this library; if not, write to the Free Software
1673502db10afa184358f2880c9e52906e5abc89c1Chris Craik * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
1773502db10afa184358f2880c9e52906e5abc89c1Chris Craik */
1873502db10afa184358f2880c9e52906e5abc89c1Chris Craik
1973502db10afa184358f2880c9e52906e5abc89c1Chris Craik#ifndef InstrumentedPlatformCanvas_h
2073502db10afa184358f2880c9e52906e5abc89c1Chris Craik#define InstrumentedPlatformCanvas_h
2173502db10afa184358f2880c9e52906e5abc89c1Chris Craik
2273502db10afa184358f2880c9e52906e5abc89c1Chris Craik#include "SkCanvas.h"
2373502db10afa184358f2880c9e52906e5abc89c1Chris Craik
2473502db10afa184358f2880c9e52906e5abc89c1Chris Craik#define DEBUG_SKIA_DRAWING 0
2573502db10afa184358f2880c9e52906e5abc89c1Chris Craik#if DEBUG_SKIA_DRAWING
2686d531673b8322996025b5ea70ab370e02dcd659Chris Craik#include "AndroidLog.h" // NOTE: AndroidLog.h normally shouldn't be included in a header
2786d531673b8322996025b5ea70ab370e02dcd659Chris Craik#include "FloatRect.h"
2886d531673b8322996025b5ea70ab370e02dcd659Chris Craik#define WRAPCANVAS_LOG_ENTRY(...) {ALOGD("non-rect %s, m_isSolidColor %d", __FUNCTION__, m_isSolidColor);}
2973502db10afa184358f2880c9e52906e5abc89c1Chris Craik#else
3073502db10afa184358f2880c9e52906e5abc89c1Chris Craik#define WRAPCANVAS_LOG_ENTRY(...) ((void)0)
3173502db10afa184358f2880c9e52906e5abc89c1Chris Craik#endif
3273502db10afa184358f2880c9e52906e5abc89c1Chris Craik
3373502db10afa184358f2880c9e52906e5abc89c1Chris Craiknamespace WebCore {
3473502db10afa184358f2880c9e52906e5abc89c1Chris Craik
3573502db10afa184358f2880c9e52906e5abc89c1Chris Craikclass InstrumentedPlatformCanvas : public SkCanvas {
3673502db10afa184358f2880c9e52906e5abc89c1Chris Craikpublic:
37b7c99a422b6cb00661fd3e81cb0608d4b3034124Chris Craik    InstrumentedPlatformCanvas(int width, int height, Color initialColor)
3873502db10afa184358f2880c9e52906e5abc89c1Chris Craik        : m_size(width, height)
3973502db10afa184358f2880c9e52906e5abc89c1Chris Craik        , m_isSolidColor(true)
40b7c99a422b6cb00661fd3e81cb0608d4b3034124Chris Craik        , m_solidColor(initialColor)
4173502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
4273502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
4373502db10afa184358f2880c9e52906e5abc89c1Chris Craik
4473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual ~InstrumentedPlatformCanvas() { }
4573502db10afa184358f2880c9e52906e5abc89c1Chris Craik
4673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    bool isSolidColor() const { return m_isSolidColor; }
4773502db10afa184358f2880c9e52906e5abc89c1Chris Craik    Color solidColor() const { return m_solidColor; }
4873502db10afa184358f2880c9e52906e5abc89c1Chris Craik
4973502db10afa184358f2880c9e52906e5abc89c1Chris Craik    // overrides from SkCanvas
5073502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual int save(SaveFlags flags = kMatrixClip_SaveFlag)
5173502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
5273502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
5373502db10afa184358f2880c9e52906e5abc89c1Chris Craik        return SkCanvas::save(flags);
5473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
5573502db10afa184358f2880c9e52906e5abc89c1Chris Craik
5673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags)
5773502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
5873502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
5973502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
6073502db10afa184358f2880c9e52906e5abc89c1Chris Craik        return SkCanvas::saveLayer(bounds, paint, flags);
6173502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
6273502db10afa184358f2880c9e52906e5abc89c1Chris Craik
6373502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void restore()
6473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
6573502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
6673502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::restore();
6773502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
6873502db10afa184358f2880c9e52906e5abc89c1Chris Craik
6973502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual bool translate(SkScalar dx, SkScalar dy)
7073502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
7173502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
7273502db10afa184358f2880c9e52906e5abc89c1Chris Craik        return SkCanvas::translate(dx, dy);
7373502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
7473502db10afa184358f2880c9e52906e5abc89c1Chris Craik
7573502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual bool scale(SkScalar sx, SkScalar sy)
7673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
7773502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
7873502db10afa184358f2880c9e52906e5abc89c1Chris Craik        return SkCanvas::scale(sx, sy);
7973502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
8073502db10afa184358f2880c9e52906e5abc89c1Chris Craik
8173502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual bool rotate(SkScalar degrees)
8273502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
8373502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
8473502db10afa184358f2880c9e52906e5abc89c1Chris Craik        return SkCanvas::rotate(degrees);
8573502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
8673502db10afa184358f2880c9e52906e5abc89c1Chris Craik
8773502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual bool skew(SkScalar sx, SkScalar sy)
8873502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
8973502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
9073502db10afa184358f2880c9e52906e5abc89c1Chris Craik        return SkCanvas::skew(sx, sy);
9173502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
9273502db10afa184358f2880c9e52906e5abc89c1Chris Craik
9373502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual bool concat(const SkMatrix& matrix)
9473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
9573502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
9673502db10afa184358f2880c9e52906e5abc89c1Chris Craik        return SkCanvas::concat(matrix);
9773502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
9873502db10afa184358f2880c9e52906e5abc89c1Chris Craik
9973502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void setMatrix(const SkMatrix& matrix)
10073502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
10173502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
10273502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::setMatrix(matrix);
10373502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
10473502db10afa184358f2880c9e52906e5abc89c1Chris Craik
10573502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual bool clipRect(const SkRect& rect, SkRegion::Op op)
10673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
10773502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
10873502db10afa184358f2880c9e52906e5abc89c1Chris Craik        return SkCanvas::clipRect(rect, op);
10973502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
11073502db10afa184358f2880c9e52906e5abc89c1Chris Craik
11173502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual bool clipPath(const SkPath& path, SkRegion::Op op)
11273502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
11373502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
11473502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
11573502db10afa184358f2880c9e52906e5abc89c1Chris Craik        return SkCanvas::clipPath(path, op);
11673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
11773502db10afa184358f2880c9e52906e5abc89c1Chris Craik
11873502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual bool clipRegion(const SkRegion& region, SkRegion::Op op)
11973502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
12073502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
12186d531673b8322996025b5ea70ab370e02dcd659Chris Craik        if (!region.isRect())
12286d531673b8322996025b5ea70ab370e02dcd659Chris Craik            m_isSolidColor = false;
12373502db10afa184358f2880c9e52906e5abc89c1Chris Craik        return SkCanvas::clipRegion(region, op);
12473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
12573502db10afa184358f2880c9e52906e5abc89c1Chris Craik
12673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void clear(SkColor color)
12773502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
12873502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
12973502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = true;
13073502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_solidColor = Color(color);
13173502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::clear(color);
13273502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
13373502db10afa184358f2880c9e52906e5abc89c1Chris Craik
13473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawPaint(const SkPaint& paint)
13573502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
13673502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
13773502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
13873502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawPaint(paint);
13973502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
14073502db10afa184358f2880c9e52906e5abc89c1Chris Craik
14173502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
14273502db10afa184358f2880c9e52906e5abc89c1Chris Craik            const SkPaint& paint)
14373502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
14473502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
14573502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
14673502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawPoints(mode, count, pts, paint);
14773502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
14873502db10afa184358f2880c9e52906e5abc89c1Chris Craik
14986d531673b8322996025b5ea70ab370e02dcd659Chris Craik    bool rectFullyOverlaps(const SkRect& rect)
15073502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
15173502db10afa184358f2880c9e52906e5abc89c1Chris Craik        IntRect canvasRect(IntPoint(), m_size);
15286d531673b8322996025b5ea70ab370e02dcd659Chris Craik        if (getTotalMatrix().rectStaysRect()
15373502db10afa184358f2880c9e52906e5abc89c1Chris Craik            && getTotalClip().contains(canvasRect)) {
15473502db10afa184358f2880c9e52906e5abc89c1Chris Craik            const SkMatrix& matrix = getTotalMatrix();
15573502db10afa184358f2880c9e52906e5abc89c1Chris Craik            SkRect mapped;
15673502db10afa184358f2880c9e52906e5abc89c1Chris Craik            matrix.mapRect(&mapped, rect);
15786d531673b8322996025b5ea70ab370e02dcd659Chris Craik            return mapped.contains(canvasRect);
15886d531673b8322996025b5ea70ab370e02dcd659Chris Craik        }
15986d531673b8322996025b5ea70ab370e02dcd659Chris Craik        return false;
16086d531673b8322996025b5ea70ab370e02dcd659Chris Craik    }
16186d531673b8322996025b5ea70ab370e02dcd659Chris Craik
16286d531673b8322996025b5ea70ab370e02dcd659Chris Craik    virtual void drawRect(const SkRect& rect, const SkPaint& paint)
16386d531673b8322996025b5ea70ab370e02dcd659Chris Craik    {
16486d531673b8322996025b5ea70ab370e02dcd659Chris Craik
16586d531673b8322996025b5ea70ab370e02dcd659Chris Craik#if DEBUG_SKIA_DRAWING
16686d531673b8322996025b5ea70ab370e02dcd659Chris Craik        FloatRect rectToDraw = rect;
16786d531673b8322996025b5ea70ab370e02dcd659Chris Craik        ALOGD("drawrect " FLOAT_RECT_FORMAT ", is solid %d", FLOAT_RECT_ARGS(rectToDraw), m_isSolidColor);
16886d531673b8322996025b5ea70ab370e02dcd659Chris Craik#endif
16986d531673b8322996025b5ea70ab370e02dcd659Chris Craik
17086d531673b8322996025b5ea70ab370e02dcd659Chris Craik        if (m_isSolidColor) {
17186d531673b8322996025b5ea70ab370e02dcd659Chris Craik            Color color = solidColor(paint);
17286d531673b8322996025b5ea70ab370e02dcd659Chris Craik            if (color != m_solidColor) {
17386d531673b8322996025b5ea70ab370e02dcd659Chris Craik                if (color.isValid() && rectFullyOverlaps(rect))
17486d531673b8322996025b5ea70ab370e02dcd659Chris Craik                    m_solidColor = color;
17586d531673b8322996025b5ea70ab370e02dcd659Chris Craik                else
17686d531673b8322996025b5ea70ab370e02dcd659Chris Craik                    m_isSolidColor = false;
17786d531673b8322996025b5ea70ab370e02dcd659Chris Craik            }
17886d531673b8322996025b5ea70ab370e02dcd659Chris Craik        }
17986d531673b8322996025b5ea70ab370e02dcd659Chris Craik
18073502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawRect(rect, paint);
18173502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
18273502db10afa184358f2880c9e52906e5abc89c1Chris Craik
18373502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawPath(const SkPath& path, const SkPaint& paint)
18473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
18573502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
18673502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
18773502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawPath(path, paint);
18873502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
18973502db10afa184358f2880c9e52906e5abc89c1Chris Craik
19073502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left,
19173502db10afa184358f2880c9e52906e5abc89c1Chris Craik            SkScalar top, const SkPaint* paint)
19273502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
19373502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
19473502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
19573502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawBitmap(bitmap, left, top, paint);
19673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
19773502db10afa184358f2880c9e52906e5abc89c1Chris Craik
198b6dd8e8e8d87d6f7816929bce8c04c0aac59c0baDerek Sollenberger    virtual void drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
19973502db10afa184358f2880c9e52906e5abc89c1Chris Craik            const SkRect& dst, const SkPaint* paint)
20073502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
20173502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
20273502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
203b6dd8e8e8d87d6f7816929bce8c04c0aac59c0baDerek Sollenberger        SkCanvas::drawBitmapRectToRect(bitmap, src, dst, paint);
20473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
20573502db10afa184358f2880c9e52906e5abc89c1Chris Craik
20673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawBitmapMatrix(const SkBitmap& bitmap,
20773502db10afa184358f2880c9e52906e5abc89c1Chris Craik            const SkMatrix& matrix, const SkPaint* paint)
20873502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
20973502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
21073502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
21173502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawBitmapMatrix(bitmap, matrix, paint);
21273502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
21373502db10afa184358f2880c9e52906e5abc89c1Chris Craik
21473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
21573502db10afa184358f2880c9e52906e5abc89c1Chris Craik                                const SkRect& dst, const SkPaint* paint = 0)
21673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
21773502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
21873502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
21973502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawBitmapNine(bitmap, center, dst, paint);
22073502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
22173502db10afa184358f2880c9e52906e5abc89c1Chris Craik
22273502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
22373502db10afa184358f2880c9e52906e5abc89c1Chris Craik            const SkPaint* paint)
22473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
22573502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
22673502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
22773502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawSprite(bitmap, left, top, paint);
22873502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
22973502db10afa184358f2880c9e52906e5abc89c1Chris Craik
23073502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
23173502db10afa184358f2880c9e52906e5abc89c1Chris Craik            SkScalar y, const SkPaint& paint)
23273502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
23373502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
23473502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
23573502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawText(text, byteLength, x, y, paint);
23673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
23773502db10afa184358f2880c9e52906e5abc89c1Chris Craik
23873502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawPosText(const void* text, size_t byteLength,
23973502db10afa184358f2880c9e52906e5abc89c1Chris Craik            const SkPoint pos[], const SkPaint& paint)
24073502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
24173502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
24273502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
24373502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawPosText(text, byteLength, pos, paint);
24473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
24573502db10afa184358f2880c9e52906e5abc89c1Chris Craik
24673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawPosTextH(const void* text, size_t byteLength,
24773502db10afa184358f2880c9e52906e5abc89c1Chris Craik            const SkScalar xpos[], SkScalar constY, const SkPaint& paint)
24873502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
24973502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
25073502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
25173502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawPosTextH(text, byteLength, xpos, constY, paint);
25273502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
25373502db10afa184358f2880c9e52906e5abc89c1Chris Craik
25473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawTextOnPath(const void* text, size_t byteLength,
25573502db10afa184358f2880c9e52906e5abc89c1Chris Craik            const SkPath& path, const SkMatrix* matrix, const SkPaint& paint)
25673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
25773502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
25873502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
25973502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawTextOnPath(text, byteLength, path, matrix, paint);
26073502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
26173502db10afa184358f2880c9e52906e5abc89c1Chris Craik
26273502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawPicture(SkPicture& picture)
26373502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
26473502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
26573502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
26673502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawPicture(picture);
26773502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
26873502db10afa184358f2880c9e52906e5abc89c1Chris Craik
26973502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawVertices(VertexMode mode, int vertexCount,
27073502db10afa184358f2880c9e52906e5abc89c1Chris Craik            const SkPoint vertices[], const SkPoint texs[],
27173502db10afa184358f2880c9e52906e5abc89c1Chris Craik            const SkColor colors[], SkXfermode* xfermode,
27273502db10afa184358f2880c9e52906e5abc89c1Chris Craik            const uint16_t indices[], int indexCount, const SkPaint& paint)
27373502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
27473502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
27573502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
27673502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawVertices(mode, vertexCount, vertices, texs,
27773502db10afa184358f2880c9e52906e5abc89c1Chris Craik                               colors, xfermode, indices, indexCount, paint);
27873502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
27973502db10afa184358f2880c9e52906e5abc89c1Chris Craik
28073502db10afa184358f2880c9e52906e5abc89c1Chris Craik    virtual void drawData(const void* data, size_t size)
28173502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
28273502db10afa184358f2880c9e52906e5abc89c1Chris Craik        WRAPCANVAS_LOG_ENTRY("");
28373502db10afa184358f2880c9e52906e5abc89c1Chris Craik        m_isSolidColor = false;
28473502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkCanvas::drawData(data, size);
28573502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
28673502db10afa184358f2880c9e52906e5abc89c1Chris Craik
28773502db10afa184358f2880c9e52906e5abc89c1Chris Craikprivate:
28873502db10afa184358f2880c9e52906e5abc89c1Chris Craik    Color solidColor(const SkPaint& paint)
28973502db10afa184358f2880c9e52906e5abc89c1Chris Craik    {
29073502db10afa184358f2880c9e52906e5abc89c1Chris Craik        if (paint.getStyle() != SkPaint::kFill_Style)
29173502db10afa184358f2880c9e52906e5abc89c1Chris Craik            return Color();
29273502db10afa184358f2880c9e52906e5abc89c1Chris Craik        if (paint.getLooper() || paint.getShader())
29373502db10afa184358f2880c9e52906e5abc89c1Chris Craik            return Color();
29473502db10afa184358f2880c9e52906e5abc89c1Chris Craik
29573502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkXfermode::Mode mode;
29673502db10afa184358f2880c9e52906e5abc89c1Chris Craik        SkXfermode::AsMode(paint.getXfermode(), &mode);
29773502db10afa184358f2880c9e52906e5abc89c1Chris Craik        if (mode == SkXfermode::kClear_Mode)
29873502db10afa184358f2880c9e52906e5abc89c1Chris Craik            return Color(0, 0, 0, 0);
29973502db10afa184358f2880c9e52906e5abc89c1Chris Craik
30073502db10afa184358f2880c9e52906e5abc89c1Chris Craik        if ((mode == SkXfermode::kSrcOver_Mode && paint.getAlpha() == 255)
30173502db10afa184358f2880c9e52906e5abc89c1Chris Craik            || mode == SkXfermode::kSrc_Mode)
30273502db10afa184358f2880c9e52906e5abc89c1Chris Craik            return Color(paint.getColor());
30373502db10afa184358f2880c9e52906e5abc89c1Chris Craik        return Color();
30473502db10afa184358f2880c9e52906e5abc89c1Chris Craik    }
30573502db10afa184358f2880c9e52906e5abc89c1Chris Craik
30673502db10afa184358f2880c9e52906e5abc89c1Chris Craik    IntSize m_size;
30773502db10afa184358f2880c9e52906e5abc89c1Chris Craik    bool m_isSolidColor;
30873502db10afa184358f2880c9e52906e5abc89c1Chris Craik    Color m_solidColor;
30973502db10afa184358f2880c9e52906e5abc89c1Chris Craik    SkPaint m_solidPaint;
31073502db10afa184358f2880c9e52906e5abc89c1Chris Craik};
31173502db10afa184358f2880c9e52906e5abc89c1Chris Craik
31273502db10afa184358f2880c9e52906e5abc89c1Chris Craik} // namespace WebCore
31373502db10afa184358f2880c9e52906e5abc89c1Chris Craik
31473502db10afa184358f2880c9e52906e5abc89c1Chris Craik#endif // InstrumentedPlatformCanvas_h
315