15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008-2009 Torch Mobile, Inc.
453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef GraphicsContext_h
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define GraphicsContext_h
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/PlatformExport.h"
32a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/Font.h"
331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatRect.h"
34f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/graphics/DashArray.h"
35d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/graphics/DrawLooperBuilder.h"
36a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/ImageBufferSurface.h"
379e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "platform/graphics/ImageFilter.h"
381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/graphics/ImageOrientation.h"
39a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContextAnnotation.h"
40a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContextState.h"
41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "platform/graphics/RegionTracker.h"
427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/graphics/skia/SkiaUtils.h"
43e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/FastAllocBase.h"
44e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Forward.h"
45e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Noncopyable.h"
46e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/PassOwnPtr.h"
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochclass SkBitmap;
49591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochclass SkPaint;
50591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochclass SkPath;
51591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochclass SkRRect;
527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass SkTextBlob;
53591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstruct SkRect;
54591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
55c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)class DisplayList;
5881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)class ImageBuffer;
5981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)class KURL;
6081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
61a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT GraphicsContext {
6281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    WTF_MAKE_NONCOPYABLE(GraphicsContext); WTF_MAKE_FAST_ALLOCATED;
6381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)public:
6481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    enum AntiAliasingMode {
6581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        NotAntiAliased,
6681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        AntiAliased
6781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    };
6881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    enum AccessMode {
6981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        ReadOnly,
7081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        ReadWrite
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
73323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    enum DisabledMode {
74323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        NothingDisabled = 0, // Run as normal.
75e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        FullyDisabled = 1 // Do absolutely minimal work to remove the cost of the context from performance tests.
76323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    };
77323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // A 0 canvas is allowed, but in such cases the context must only have canvas
797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // related commands called when within a beginRecording/endRecording block.
807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Furthermore, save/restore calls must be balanced any time the canvas is 0.
81323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    explicit GraphicsContext(SkCanvas*, DisabledMode = NothingDisabled);
827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
8381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    ~GraphicsContext();
8481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
8510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // Returns the canvas used for painting. Must not be called if painting is disabled.
8681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // Accessing the backing canvas this way flushes all queued save ops,
8781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // so it should be avoided. Use the corresponding draw/matrix/clip methods instead.
8881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    SkCanvas* canvas()
8981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    {
9081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        // Flush any pending saves.
9107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        realizeCanvasSave();
9281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
9381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        return m_canvas;
9481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    }
9510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    const SkCanvas* canvas() const
9610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    {
9710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return m_canvas;
9810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
99c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
100c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void resetCanvas(SkCanvas*);
101c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
102323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    bool contextDisabled() const { return m_disabledState; }
10381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
10493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // ---------- State management methods -----------------
10593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void save();
10693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void restore();
107f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    unsigned saveCount() { return m_canvasStateStack.size(); }
108197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
109f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    void disableDestructionChecks() { m_disableDestructionChecks = true; }
110f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#endif
11193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
11207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void saveLayer(const SkRect* bounds, const SkPaint*);
11393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void restoreLayer();
11493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
115197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool hasStroke() const { return strokeStyle() != NoStroke && strokeThickness() > 0; }
116197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
117d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    float strokeThickness() const { return immutableState()->strokeData().thickness(); }
118d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setStrokeThickness(float thickness) { mutableState()->setStrokeThickness(thickness); }
11993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    StrokeStyle strokeStyle() const { return immutableState()->strokeData().style(); }
121d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setStrokeStyle(StrokeStyle style) { mutableState()->setStrokeStyle(style); }
12293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
1237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Color strokeColor() const { return immutableState()->strokeColor(); }
124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setStrokeColor(const Color& color) { mutableState()->setStrokeColor(color); }
125d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    SkColor effectiveStrokeColor() const { return immutableState()->effectiveStrokeColor(); }
12681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
1277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Pattern* strokePattern() const { return immutableState()->strokePattern(); }
12881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void setStrokePattern(PassRefPtr<Pattern>);
12981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Gradient* strokeGradient() const { return immutableState()->strokeGradient(); }
13181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void setStrokeGradient(PassRefPtr<Gradient>);
13281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
133d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setLineCap(LineCap cap) { mutableState()->setLineCap(cap); }
134d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setLineDash(const DashArray& dashes, float dashOffset) { mutableState()->setLineDash(dashes, dashOffset); }
135d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setLineJoin(LineJoin join) { mutableState()->setLineJoin(join); }
136d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setMiterLimit(float limit) { mutableState()->setMiterLimit(limit); }
13793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
138d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WindRule fillRule() const { return immutableState()->fillRule(); }
139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setFillRule(WindRule fillRule) { mutableState()->setFillRule(fillRule); }
14093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
141d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Color fillColor() const { return immutableState()->fillColor(); }
142d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setFillColor(const Color& color) { mutableState()->setFillColor(color); }
143d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    SkColor effectiveFillColor() const { return immutableState()->effectiveFillColor(); }
14481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
14581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void setFillPattern(PassRefPtr<Pattern>);
146d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Pattern* fillPattern() const { return immutableState()->fillPattern(); }
14781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
14881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void setFillGradient(PassRefPtr<Gradient>);
149d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Gradient* fillGradient() const { return immutableState()->fillGradient(); }
150e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
151d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    SkDrawLooper* drawLooper() const { return immutableState()->drawLooper(); }
15281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
15306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    bool getTransformedClipBounds(FloatRect* bounds) const;
15451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    SkMatrix getTotalMatrix() const;
15581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setShouldAntialias(bool antialias) { mutableState()->setShouldAntialias(antialias); }
157d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool shouldAntialias() const { return immutableState()->shouldAntialias(); }
15881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
159aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    // Disable the anti-aliasing optimization for scales/multiple-of-90-degrees
160aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    // rotations of thin ("hairline") images.
161aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    // Note: This will only be reliable when the device pixel scale/ratio is
162aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    // fixed (e.g. when drawing to context backed by an ImageBuffer).
163aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    void disableAntialiasingOptimizationForHairlineImages() { ASSERT(!isRecording()); m_antialiasHairlineImages = true; }
164aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    bool shouldAntialiasHairlineImages() const { return m_antialiasHairlineImages; }
165aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
166d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setShouldClampToSourceRect(bool clampToSourceRect) { mutableState()->setShouldClampToSourceRect(clampToSourceRect); }
167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool shouldClampToSourceRect() const { return immutableState()->shouldClampToSourceRect(); }
1689bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1699e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // FIXME: the setter is only used once, at construction time; convert to a constructor param,
1709e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    // and possibly consolidate with other flags (paintDisabled, isPrinting, ...)
1719e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    void setShouldSmoothFonts(bool smoothFonts) { m_shouldSmoothFonts = smoothFonts; }
1729e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    bool shouldSmoothFonts() const { return m_shouldSmoothFonts; }
17381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
17493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Turn off LCD text for the paint if not supported on this context.
1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void adjustTextRenderMode(SkPaint*) const;
1767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    bool couldUseLCDRenderedText() const;
17781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
178d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setTextDrawingMode(TextDrawingModeFlags mode) { mutableState()->setTextDrawingMode(mode); }
179d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    TextDrawingModeFlags textDrawingMode() const { return immutableState()->textDrawingMode(); }
18081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
181d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setAlphaAsFloat(float alpha) { mutableState()->setAlphaAsFloat(alpha);}
182d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    int getNormalizedAlpha() const
183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    {
184d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        int alpha = immutableState()->alpha();
185d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return alpha > 255 ? 255 : alpha;
186d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
18781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
188d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setImageInterpolationQuality(InterpolationQuality quality) { mutableState()->setInterpolationQuality(quality); }
189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    InterpolationQuality imageInterpolationQuality() const { return immutableState()->interpolationQuality(); }
19081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
191e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    void setCompositeOperation(CompositeOperator, WebBlendMode = WebBlendModeNormal);
192d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    CompositeOperator compositeOperation() const { return immutableState()->compositeOperator(); }
193e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebBlendMode blendModeOperation() const { return immutableState()->blendMode(); }
19481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
195c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // Speicy the device scale factor which may change the way document markers
196c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // and fonts are rendered.
197c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void setDeviceScaleFactor(float factor) { m_deviceScaleFactor = factor; }
198c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    float deviceScaleFactor() const { return m_deviceScaleFactor; }
19981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
20081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // If true we are (most likely) rendering to a web page and the
20181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // canvas has been prepared with an opaque background. If false,
20209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // the canvas may have transparency (as is the case when rendering
20381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // to a canvas object).
20481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void setCertainlyOpaque(bool isOpaque) { m_isCertainlyOpaque = isOpaque; }
20581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    bool isCertainlyOpaque() const { return m_isCertainlyOpaque; }
20681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
20781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // Returns if the context is a printing context instead of a display
20881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // context. Bitmap shouldn't be resampled when printing to keep the best
20981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // possible quality.
21081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    bool printing() const { return m_printing; }
21181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void setPrinting(bool printing) { m_printing = printing; }
21281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
21381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    bool isAccelerated() const { return m_accelerated; }
21481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void setAccelerated(bool accelerated) { m_accelerated = accelerated; }
21581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
21681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // The opaque region is empty until tracking is turned on.
21781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // It is never clerared by the context.
218c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    enum RegionTrackingMode {
219c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        RegionTrackingDisabled = 0,
220c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        RegionTrackingOpaque,
221c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        RegionTrackingOverwrite
222c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    };
223c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void setRegionTrackingMode(RegionTrackingMode);
224c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    bool regionTrackingEnabled() { return m_regionTrackingMode != RegionTrackingDisabled; }
225c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    const RegionTracker& opaqueRegion() const { return m_trackedRegion; }
22681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
22793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // The text region is empty until tracking is turned on.
22893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // It is never clerared by the context.
22993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void setTrackTextRegion(bool track) { m_trackTextRegion = track; }
23093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    const SkRect& textRegion() const { return m_textRegion; }
23181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
2325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    AnnotationModeFlags annotationMode() const { return m_annotationMode; }
2335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void setAnnotationMode(const AnnotationModeFlags mode) { m_annotationMode = mode; }
234c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
235c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    SkColorFilter* colorFilter() const;
2361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    void setColorFilter(ColorFilter);
23793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // ---------- End state management methods -----------------
23881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
23993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Get the contents of the image buffer
24007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool readPixels(const SkImageInfo&, void* pixels, size_t rowBytes, int x, int y);
24181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
2425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Get the current fill style.
2435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    const SkPaint& fillPaint() const { return immutableState()->fillPaint(); }
24481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
2455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Get the current stroke style.
2465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    const SkPaint& strokePaint() const { return immutableState()->strokePaint(); }
24781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
24881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // These draw methods will do both stroking and filling.
24981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // FIXME: ...except drawRect(), which fills properly but always strokes
25081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // using a 1-pixel stroke inset from the rect borders (of the correct
25181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // stroke color).
25281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void drawRect(const IntRect&);
25381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void drawLine(const IntPoint&, const IntPoint&);
25481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void drawConvexPolygon(size_t numPoints, const FloatPoint*, bool shouldAntialias = false);
25581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
25681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void fillPath(const Path&);
25781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void strokePath(const Path&);
25881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
25981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void fillEllipse(const FloatRect&);
26081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void strokeEllipse(const FloatRect&);
26181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
26281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void fillRect(const FloatRect&);
2635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void fillRect(const FloatRect&, const Color&);
2645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void fillRect(const FloatRect&, const Color&, CompositeOperator);
2655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void fillRoundedRect(const IntRect&, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight, const Color&);
2665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void fillRoundedRect(const RoundedRect&, const Color&);
26781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
26881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void clearRect(const FloatRect&);
26981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
2706f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    void strokeRect(const FloatRect&);
27181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void strokeRect(const FloatRect&, float lineWidth);
27281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
273d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void fillBetweenRoundedRects(const IntRect&, const IntSize& outerTopLeft, const IntSize& outerTopRight, const IntSize& outerBottomLeft, const IntSize& outerBottomRight,
274d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        const IntRect&, const IntSize& innerTopLeft, const IntSize& innerTopRight, const IntSize& innerBottomLeft, const IntSize& innerBottomRight, const Color&);
275d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void fillBetweenRoundedRects(const RoundedRect&, const RoundedRect&, const Color&);
276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
27719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    void drawDisplayList(DisplayList*);
27819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
2795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void drawImage(Image*, const IntPoint&, CompositeOperator = CompositeSourceOver, RespectImageOrientationEnum = DoNotRespectImageOrientation);
28043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    void drawImage(Image*, const IntRect&, CompositeOperator = CompositeSourceOver, RespectImageOrientationEnum = DoNotRespectImageOrientation);
2815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void drawImage(Image*, const FloatRect& destRect);
28243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    void drawImage(Image*, const FloatRect& destRect, const FloatRect& srcRect, CompositeOperator = CompositeSourceOver, RespectImageOrientationEnum = DoNotRespectImageOrientation);
283e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    void drawImage(Image*, const FloatRect& destRect, const FloatRect& srcRect, CompositeOperator, WebBlendMode, RespectImageOrientationEnum = DoNotRespectImageOrientation);
28481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
2855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void drawTiledImage(Image*, const IntRect& destRect, const IntPoint& srcPoint, const IntSize& tileSize,
286e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        CompositeOperator = CompositeSourceOver, WebBlendMode = WebBlendModeNormal, const IntSize& repeatSpacing = IntSize());
2875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void drawTiledImage(Image*, const IntRect& destRect, const IntRect& srcRect,
28881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        const FloatSize& tileScaleFactor, Image::TileRule hRule = Image::StretchTile, Image::TileRule vRule = Image::StretchTile,
28943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        CompositeOperator = CompositeSourceOver);
29081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
291c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void drawImageBuffer(ImageBuffer*, const FloatRect& destRect, const FloatRect* srcRect = 0, CompositeOperator = CompositeSourceOver, WebBlendMode = WebBlendModeNormal);
292c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
293e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    void drawPicture(PassRefPtr<SkPicture>, const FloatRect& dest, const FloatRect& src, CompositeOperator, WebBlendMode);
29481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
29581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // These methods write to the canvas and modify the opaque region, if tracked.
29681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // Also drawLine(const IntPoint& point1, const IntPoint& point2) and fillRoundedRect
297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void writePixels(const SkImageInfo&, const void* pixels, size_t rowBytes, int x, int y);
298d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void writePixels(const SkBitmap&, int x, int y);
29981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void drawBitmap(const SkBitmap&, SkScalar, SkScalar, const SkPaint* = 0);
3005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void drawBitmapRect(const SkBitmap&, const SkRect*, const SkRect&, const SkPaint* = 0);
30181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void drawOval(const SkRect&, const SkPaint&);
30281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void drawPath(const SkPath&, const SkPaint&);
30381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // After drawing directly to the context's canvas, use this function to notify the context so
30481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // it can track the opaque region.
30581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // FIXME: this is still needed only because ImageSkia::paintSkBitmap() may need to notify for a
30681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    //        smaller rect than the one drawn to, due to its clipping logic.
30781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void didDrawRect(const SkRect&, const SkPaint&, const SkBitmap* = 0);
30881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void drawRect(const SkRect&, const SkPaint&);
30993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void drawPosText(const void* text, size_t byteLength, const SkPoint pos[], const SkRect& textRect, const SkPaint&);
310197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void drawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], SkScalar constY, const SkRect& textRect, const SkPaint&);
3117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void drawTextBlob(const SkTextBlob*, const SkPoint& origin, const SkPaint&);
31281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
313d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void clip(const IntRect& rect) { clipRect(rect); }
31493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void clip(const FloatRect& rect) { clipRect(rect); }
315d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void clipRoundedRect(const RoundedRect&, SkRegion::Op = SkRegion::kIntersect_Op);
31693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void clipOut(const IntRect& rect) { clipRect(rect, NotAntiAliased, SkRegion::kDifference_Op); }
3177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void clipOut(const Path&);
31881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void clipOutRoundedRect(const RoundedRect&);
31993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void clipPath(const Path&, WindRule = RULE_EVENODD);
32081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void clipConvexPolygon(size_t numPoints, const FloatPoint*, bool antialias = true);
321d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void clipRect(const SkRect&, AntiAliasingMode = NotAntiAliased, SkRegion::Op = SkRegion::kIntersect_Op);
3227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // This clip function is used only by <canvas> code. It allows
3237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // implementations to handle clipping on the canvas differently since
3247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // the discipline is different.
3257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void canvasClip(const Path&, WindRule = RULE_EVENODD);
32681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
32793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void drawText(const Font&, const TextRunPaintInfo&, const FloatPoint&);
32893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void drawEmphasisMarks(const Font&, const TextRunPaintInfo&, const AtomicString& mark, const FloatPoint&);
32993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void drawBidiText(const Font&, const TextRunPaintInfo&, const FloatPoint&, Font::CustomFontNotReadyAction = Font::DoNotPaintIfFontNotReady);
3305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void drawHighlightForText(const Font&, const TextRun&, const FloatPoint&, int h, const Color& backgroundColor, int from = 0, int to = -1);
33181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
33281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void drawLineForText(const FloatPoint&, float width, bool printing);
33381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    enum DocumentMarkerLineStyle {
33481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        DocumentMarkerSpellingLineStyle,
335e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        DocumentMarkerGrammarLineStyle
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
33781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void drawLineForDocumentMarker(const FloatPoint&, float width, DocumentMarkerLineStyle);
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
339c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    void beginTransparencyLayer(float opacity, const FloatRect* = 0);
34009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void beginLayer(float opacity, CompositeOperator, const FloatRect* = 0, ColorFilter = ColorFilterNone, ImageFilter* = 0);
341c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    void endLayer();
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
34307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void beginCull(const FloatRect&);
34407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void endCull();
34507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
34619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    // Instead of being dispatched to the active canvas, draw commands following beginRecording()
3477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // are stored in a display list that can be replayed at a later time. Pass in the bounding
3487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // rectangle for the content in the list.
3497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void beginRecording(const FloatRect&, uint32_t = 0);
35019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    PassRefPtr<DisplayList> endRecording();
35119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
35281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    bool hasShadow() const;
35393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void setShadow(const FloatSize& offset, float blur, const Color&,
354d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        DrawLooperBuilder::ShadowTransformMode = DrawLooperBuilder::ShadowRespectsTransforms,
355d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        DrawLooperBuilder::ShadowAlphaMode = DrawLooperBuilder::ShadowRespectsAlpha);
35693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void clearShadow() { clearDrawLooper(); }
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // It is assumed that this draw looper is used only for shadows
35993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // (i.e. a draw looper is set if and only if there is a shadow).
360d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // The builder passed into this method will be destroyed.
361d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void setDrawLooper(PassOwnPtr<DrawLooperBuilder>);
36293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void clearDrawLooper();
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void drawFocusRing(const Vector<IntRect>&, int width, int offset, const Color&);
36581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void drawFocusRing(const Path&, int width, int offset, const Color&);
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
367591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    enum Edge {
368591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        NoEdge = 0,
369591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        TopEdge = 1 << 1,
370591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        RightEdge = 1 << 2,
371591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        BottomEdge = 1 << 3,
372591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        LeftEdge = 1 << 4
373591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    };
374591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    typedef unsigned Edges;
375591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void drawInnerShadow(const RoundedRect&, const Color& shadowColor, const IntSize shadowOffset, int shadowBlur, int shadowSpread, Edges clippedEdges = NoEdge);
376591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
37793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // ---------- Transformation methods -----------------
3785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // Note that the getCTM method returns only the current transform from Blink's perspective,
3795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // which is not the final transform used to place content on screen. It cannot be relied upon
3805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    // for testing where a point will appear on screen or how large it will be.
3815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    AffineTransform getCTM() const;
3821e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    void concatCTM(const AffineTransform& affine) { concat(affineTransformToSkMatrix(affine)); }
3831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    void setCTM(const AffineTransform& affine) { setMatrix(affineTransformToSkMatrix(affine)); }
38493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void setMatrix(const SkMatrix&);
38593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
3865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void scale(float x, float y);
38781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void rotate(float angleInRadians);
38881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void translate(float x, float y);
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // This function applies the device scale factor to the context, making the context capable of
39193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // acting as a base-level context for a HiDPI environment.
3925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    void applyDeviceScaleFactor(float deviceScaleFactor) { scale(deviceScaleFactor, deviceScaleFactor); }
39393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // ---------- End transformation methods -----------------
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
39593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // URL drawing
39693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void setURLForRect(const KURL&, const IntRect&);
39781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void setURLFragmentForRect(const String& name, const IntRect&);
39881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    void addURLTargetAtPoint(const String& name, const IntPoint&);
39953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
40081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // Create an image buffer compatible with this context, with suitable resolution
40181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // for drawing into the buffer and then into this context.
402c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    PassOwnPtr<ImageBuffer> createRasterBuffer(const IntSize&, OpacityMode = NonOpaque) const;
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    static void adjustLineToPixelBoundaries(FloatPoint& p1, FloatPoint& p2, float strokeWidth, StrokeStyle);
40581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
406197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void beginAnnotation(const AnnotationList&);
4075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    void endAnnotation();
4085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
409c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void preparePaintForDrawRectToRect(
410c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        SkPaint*,
411c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        const SkRect& srcRect,
412c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        const SkRect& destRect,
413c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        CompositeOperator,
414e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        WebBlendMode,
415c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        bool isLazyDecoded = false,
416c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        bool isDataComplete = true) const;
417c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
418c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static int focusRingOutsetExtent(int offset, int width)
419c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
420c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return focusRingOutset(offset) + (focusRingWidth(width) + 1) / 2;
421c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
422c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
42381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)private:
42409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    const GraphicsContextState* immutableState() const { return m_paintState; }
42509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
42609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    GraphicsContextState* mutableState()
42709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
42809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        realizePaintSave();
42909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return m_paintState;
43009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
43109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
43281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    static void setPathFromConvexPoints(SkPath*, size_t, const FloatPoint*);
43381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    static void setRadii(SkVector*, IntSize, IntSize, IntSize, IntSize);
43481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
4351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    static PassRefPtr<SkColorFilter> WebCoreColorFilterToSkiaColorFilter(ColorFilter);
4361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
4378abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
438c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static inline int focusRingOutset(int offset) { return offset + 2; }
439c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static inline int focusRingWidth(int width) { return width; }
44081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#else
441c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static inline int focusRingOutset(int offset) { return 0; }
442c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static inline int focusRingWidth(int width) { return 1; }
4437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static SkPMColor lineColors(int);
4447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static SkPMColor antiColors1(int);
4457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static SkPMColor antiColors2(int);
44681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    static void draw1xMarker(SkBitmap*, int);
44781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    static void draw2xMarker(SkBitmap*, int);
44881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#endif
44981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
45081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // Helpers for drawing a focus ring (drawFocusRing)
451c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    float prepareFocusRingPaint(SkPaint&, const Color&, int width) const;
452c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void drawFocusRingPath(const SkPath&, const Color&, int width);
453c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void drawFocusRingRect(const SkRect&, const Color&, int width);
454c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
45581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // SkCanvas wrappers.
456d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void clipPath(const SkPath&, AntiAliasingMode = NotAntiAliased, SkRegion::Op = SkRegion::kIntersect_Op);
457d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void clipRRect(const SkRRect&, AntiAliasingMode = NotAntiAliased, SkRegion::Op = SkRegion::kIntersect_Op);
458d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void concat(const SkMatrix&);
459c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void drawRRect(const SkRRect&, const SkPaint&);
46081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
46109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Apply deferred paint state saves
46209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void realizePaintSave()
46381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    {
464323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (contextDisabled())
465323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            return;
466323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
467d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (m_paintState->saveCount()) {
468d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_paintState->decrementSaveCount();
46909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            ++m_paintStateIndex;
4705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            if (m_paintStateStack.size() == m_paintStateIndex) {
4715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                m_paintStateStack.append(GraphicsContextState::createAndCopy(*m_paintState));
4725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                m_paintState = m_paintStateStack[m_paintStateIndex].get();
4735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            } else {
4745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                GraphicsContextState* priorPaintState = m_paintState;
4755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                m_paintState = m_paintStateStack[m_paintStateIndex].get();
4765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                m_paintState->copy(*priorPaintState);
4775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            }
47809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
47909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
48009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
48109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Apply deferred canvas state saves
48207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void realizeCanvasSave()
48309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
484323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        if (!m_pendingCanvasSave || contextDisabled())
48507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            return;
48607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
4877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(m_canvas); // m_pendingCanvasSave should never be true when no canvas.
48807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_canvas->save();
48907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_pendingCanvasSave = false;
49081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    }
49181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
49293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    void didDrawTextInRect(const SkRect& textRect);
49393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
494591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void fillRectWithRoundedHole(const IntRect&, const RoundedRect& roundedHoleRect, const Color&);
495591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
49651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool isRecording() const;
49751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
498323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    // null indicates painting is contextDisabled. Never delete this object.
49981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    SkCanvas* m_canvas;
50081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
50109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Paint states stack. Enables local drawing state change with save()/restore() calls.
50209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // This state controls the appearance of drawn content.
50309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // We do not delete from this stack to avoid memory churn.
50409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Vector<OwnPtr<GraphicsContextState> > m_paintStateStack;
50509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Current index on the stack. May not be the last thing on the stack.
50609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unsigned m_paintStateIndex;
50709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Raw pointer to the current state.
50809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    GraphicsContextState* m_paintState;
50909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
51009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Currently pending save flags for Skia Canvas state.
51109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Canvas state includes the canavs, it's matrix and clips. Think of it as _where_
51209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // the draw operations will happen.
51309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    struct CanvasSaveState;
51409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Vector<CanvasSaveState> m_canvasStateStack;
51507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool m_pendingCanvasSave;
51681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
5175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    AnnotationModeFlags m_annotationMode;
5185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
51919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    struct RecordingState;
52019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    Vector<RecordingState> m_recordingStateStack;
52119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
522197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
5235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    unsigned m_annotationCount;
524c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    unsigned m_layerCount;
525f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    bool m_disableDestructionChecks;
52681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#endif
52781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    // Tracks the region painted opaque via the GraphicsContext.
528c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RegionTracker m_trackedRegion;
52981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
53093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Tracks the region where text is painted via the GraphicsContext.
53193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    SkRect m_textRegion;
53293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
533323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    unsigned m_disabledState;
534323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
535c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    float m_deviceScaleFactor;
536c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
537323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    // Activation for the above region tracking features
538c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    unsigned m_regionTrackingMode : 2;
539323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    bool m_trackTextRegion : 1;
540323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
541e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    bool m_accelerated : 1;
542e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    bool m_isCertainlyOpaque : 1;
543e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    bool m_printing : 1;
544aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    bool m_antialiasHairlineImages : 1;
5459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    bool m_shouldSmoothFonts : 1;
54681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)};
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
548c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // GraphicsContext_h
551