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