164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard/*
264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * Copyright 2012, The Android Open Source Project
364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard *
464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * Redistribution and use in source and binary forms, with or without
564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * modification, are permitted provided that the following conditions
664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * are met:
764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard *  * Redistributions of source code must retain the above copyright
864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard *    notice, this list of conditions and the following disclaimer.
964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard *  * Redistributions in binary form must reproduce the above copyright
1064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard *    notice, this list of conditions and the following disclaimer in the
1164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard *    documentation and/or other materials provided with the distribution.
1264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard *
1364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
1464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
1764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
1864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
1964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
2164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard */
2564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
2664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#ifndef platform_graphics_context_skia_h
2764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#define platform_graphics_context_skia_h
2864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
2964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include "PlatformGraphicsContext.h"
3064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
3164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardnamespace WebCore {
3264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
3364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass PlatformGraphicsContextSkia : public PlatformGraphicsContext {
3464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
3564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    PlatformGraphicsContextSkia(SkCanvas* canvas, bool takeCanvasOwnership = false);
3664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual ~PlatformGraphicsContextSkia();
3764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual bool isPaintingDisabled();
383718b58e4da76b7025aa5316a51264c5e38f2569John Reck    SkCanvas* canvas() { return mCanvas; }
3964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
4064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual ContextType type() { return PaintingContext; }
4164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual SkCanvas* recordingCanvas() { return mCanvas; }
4285fb59060a0fdfcff93ae1c70dd49e0f93e55ab6Chris Craik    virtual void setTextOffset(FloatSize offset) {}
4364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
4464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    // FIXME: This is used by ImageBufferAndroid, which should really be
4564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    //        managing the canvas lifecycle itself
4664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
4764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual bool deleteUs() const { return m_deleteCanvas; }
4864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
4964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    // State management
5064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void beginTransparencyLayer(float opacity);
5164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void endTransparencyLayer();
5264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void save();
5364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void restore();
5464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
5564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    // Matrix operations
5664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void concatCTM(const AffineTransform& affine);
5764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void rotate(float angleInRadians);
5864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void scale(const FloatSize& size);
5964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void translate(float x, float y);
6064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual const SkMatrix& getTotalMatrix();
6164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
6264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    // Clipping
6364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void addInnerRoundedRectClip(const IntRect& rect, int thickness);
6464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void canvasClip(const Path& path);
6522ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck    virtual bool clip(const FloatRect& rect);
6622ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck    virtual bool clip(const Path& path);
6722ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck    virtual bool clipConvexPolygon(size_t numPoints, const FloatPoint*, bool antialias);
6822ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck    virtual bool clipOut(const IntRect& r);
6922ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck    virtual bool clipOut(const Path& p);
7022ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck    virtual bool clipPath(const Path& pathToClip, WindRule clipRule);
713718b58e4da76b7025aa5316a51264c5e38f2569John Reck    virtual SkIRect getTotalClipBounds() { return mCanvas->getTotalClip().getBounds(); }
7264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
7364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    // Drawing
7464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void clearRect(const FloatRect& rect);
7564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void drawBitmapPattern(const SkBitmap& bitmap, const SkMatrix& matrix,
7664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                           CompositeOperator compositeOp, const FloatRect& destRect);
7764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
783718b58e4da76b7025aa5316a51264c5e38f2569John Reck                        const SkRect& dst, CompositeOperator op = CompositeSourceOver);
7964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void drawConvexPolygon(size_t numPoints, const FloatPoint* points,
8064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                           bool shouldAntialias);
8164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void drawEllipse(const IntRect& rect);
8264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void drawFocusRing(const Vector<IntRect>& rects, int /* width */,
8364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                       int /* offset */, const Color& color);
8464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void drawHighlightForText(const Font& font, const TextRun& run,
8564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                              const FloatPoint& point, int h,
8664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                              const Color& backgroundColor, ColorSpace colorSpace,
8764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                              int from, int to, bool isActive);
8864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void drawLine(const IntPoint& point1, const IntPoint& point2);
8964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void drawLineForText(const FloatPoint& pt, float width);
9064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void drawLineForTextChecking(const FloatPoint& pt, float width,
91675402ef4358583f64a2476927a548db4841c856John Reck                                         GraphicsContext::TextCheckingLineStyle);
9264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void drawRect(const IntRect& rect);
9364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void fillPath(const Path& pathToFill, WindRule fillRule);
9464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void fillRect(const FloatRect& rect);
9564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void fillRect(const FloatRect& rect, const Color& color);
9664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void fillRoundedRect(const IntRect& rect, const IntSize& topLeft,
9764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                         const IntSize& topRight, const IntSize& bottomLeft,
9864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                         const IntSize& bottomRight, const Color& color);
9964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void strokeArc(const IntRect& r, int startAngle, int angleSpan);
10064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void strokePath(const Path& pathToStroke);
10164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual void strokeRect(const FloatRect& rect, float lineWidth);
1023718b58e4da76b7025aa5316a51264c5e38f2569John Reck    virtual void drawPosText(const void* text, size_t byteLength,
1033718b58e4da76b7025aa5316a51264c5e38f2569John Reck                             const SkPoint pos[], const SkPaint& paint);
1043718b58e4da76b7025aa5316a51264c5e38f2569John Reck    virtual void drawMediaButton(const IntRect& rect, RenderSkinMediaButton::MediaButton buttonType,
1053718b58e4da76b7025aa5316a51264c5e38f2569John Reck                                 bool translucent = false, bool drawBackground = true,
1063718b58e4da76b7025aa5316a51264c5e38f2569John Reck                                 const IntRect& thumb = IntRect());
10764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
10864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
10964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
11064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    // shadowsIgnoreTransforms is only true for canvas's ImageBuffer, which will
11164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    // have a GraphicsContext
11264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    virtual bool shadowsIgnoreTransforms() const {
11364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        return m_gc && m_gc->shadowsIgnoreTransforms();
11464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
11564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
11664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    SkCanvas* mCanvas;
11764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    bool m_deleteCanvas;
11864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
11964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
12064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard}
12164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#endif
122