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 GraphicsOperation_h
2764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#define GraphicsOperation_h
2864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
2964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include "Color.h"
3064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include "FloatRect.h"
3164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include "GlyphBuffer.h"
3264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include "Font.h"
3364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include "IntRect.h"
3464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include "PlatformGraphicsContext.h"
3564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include "PlatformGraphicsContextSkia.h"
3664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include "SkCanvas.h"
3764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include "SkShader.h"
3864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include "SkRefCnt.h"
3964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
4064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include <utils/threads.h>
4164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#include <wtf/text/CString.h>
4264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
4364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#define TYPE_CASE(type) case type: return #type;
4464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
4574d16a7661fcde10787bc62b4c62e202c9cc2495John Reck#define DEBUG_GRAPHICS_OPERATIONS false
4674d16a7661fcde10787bc62b4c62e202c9cc2495John Reck
4774d16a7661fcde10787bc62b4c62e202c9cc2495John Reck#if DEBUG_GRAPHICS_OPERATIONS
4874d16a7661fcde10787bc62b4c62e202c9cc2495John Reck#define TYPE(x) virtual OperationType type() { return x; }
4974d16a7661fcde10787bc62b4c62e202c9cc2495John Reck#else
5074d16a7661fcde10787bc62b4c62e202c9cc2495John Reck#define TYPE(x)
5174d16a7661fcde10787bc62b4c62e202c9cc2495John Reck#endif
5274d16a7661fcde10787bc62b4c62e202c9cc2495John Reck
53a2c5f805f838b31fbbeb248aa021e0cf0c758d7bChris Craiknamespace android {
54a2c5f805f838b31fbbeb248aa021e0cf0c758d7bChris Craikclass LinearAllocator;
55a2c5f805f838b31fbbeb248aa021e0cf0c758d7bChris Craik}
56a2c5f805f838b31fbbeb248aa021e0cf0c758d7bChris Craik
5764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardnamespace WebCore {
5864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
5977d974918eff4b56050e9f1c3a78becab1244a04John Reckclass CanvasState;
6077d974918eff4b56050e9f1c3a78becab1244a04John Reck
6164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardnamespace GraphicsOperation {
6264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
631fcb8aa079de156851042d8e041254b7abeecc77John Reckclass Operation {
6464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
6574d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    Operation()
6674d16a7661fcde10787bc62b4c62e202c9cc2495John Reck        : m_state(0)
6774d16a7661fcde10787bc62b4c62e202c9cc2495John Reck        , m_canvasState(0)
6874d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    {}
6974d16a7661fcde10787bc62b4c62e202c9cc2495John Reck
70a2c5f805f838b31fbbeb248aa021e0cf0c758d7bChris Craik    void* operator new(size_t size, android::LinearAllocator* allocator);
7174d16a7661fcde10787bc62b4c62e202c9cc2495John Reck
7274d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    // Purposely not implemented - use a LinearAllocator please
7374d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    void* operator new(size_t size);
7474d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    void operator delete(void* ptr);
7574d16a7661fcde10787bc62b4c62e202c9cc2495John Reck
7674d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    // This m_state is applied by ourselves
7774d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    PlatformGraphicsContext::State* m_state;
7874d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    // This is the canvas state that this operation needs
7974d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    // Only used for drawing operations, state operations will be undefined
8074d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    CanvasState* m_canvasState;
8174d16a7661fcde10787bc62b4c62e202c9cc2495John Reck
8274d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    bool apply(PlatformGraphicsContext* context) {
8374d16a7661fcde10787bc62b4c62e202c9cc2495John Reck        if (m_state)
8474d16a7661fcde10787bc62b4c62e202c9cc2495John Reck            context->setRawState(m_state);
8574d16a7661fcde10787bc62b4c62e202c9cc2495John Reck        return applyImpl(context);
8674d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    }
8774d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) = 0;
8874d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    virtual ~Operation() {}
8974d16a7661fcde10787bc62b4c62e202c9cc2495John Reck
90286b2d175d354558d172f30ca702dc0e05c7602fChris Craik    virtual const IntRect*  opaqueRect() { return 0; }
91286b2d175d354558d172f30ca702dc0e05c7602fChris Craik    virtual bool isOpaque() { return false; }
92286b2d175d354558d172f30ca702dc0e05c7602fChris Craik    virtual void setOpaqueRect(const IntRect& bounds) {}
93286b2d175d354558d172f30ca702dc0e05c7602fChris Craik
9474d16a7661fcde10787bc62b4c62e202c9cc2495John Reck#if DEBUG_GRAPHICS_OPERATIONS
9564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    typedef enum { UndefinedOperation
9664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  // Matrix operations
9764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , ConcatCTMOperation
9864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , ScaleOperation
9964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , RotateOperation
10064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , TranslateOperation
10164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  // Clipping
10264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , InnerRoundedRectClipOperation
10364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , ClipOperation
10464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , ClipPathOperation
10564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , ClipOutOperation
10664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , ClearRectOperation
10764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  // Drawing
10864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , DrawBitmapPatternOperation
10964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , DrawBitmapRectOperation
110839203b35a55ec16675b15767cb242038b9a5132John Reck                  , DrawConvexPolygonQuadOperation
11164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , DrawEllipseOperation
112839203b35a55ec16675b15767cb242038b9a5132John Reck                  , DrawFocusRingOperation
11364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , DrawLineOperation
11464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , DrawLineForTextOperation
11564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , DrawLineForTextCheckingOperation
11664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , DrawRectOperation
11764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , FillPathOperation
11864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , FillRectOperation
11964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , FillRoundedRectOperation
12064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , StrokeArcOperation
12164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , StrokePathOperation
12264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  , StrokeRectOperation
1233718b58e4da76b7025aa5316a51264c5e38f2569John Reck                  , DrawMediaButtonOperation
12464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                  // Text
125b9f38925d3cdae56548c3c18300c2964d207ed4eJohn Reck                  , DrawPosTextOperation
12664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    } OperationType;
12764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
12853f84f58d9ffe86a4932c979b9863acadb5769efJohn Reck    const char* name()
12964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    {
13064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        switch (type()) {
13164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(UndefinedOperation)
13264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            // Matrix operations
13364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(ConcatCTMOperation)
13464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(ScaleOperation)
13564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(RotateOperation)
13664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(TranslateOperation)
13764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            // Clipping
13864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(InnerRoundedRectClipOperation)
13964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(ClipOperation)
14064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(ClipPathOperation)
14164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(ClipOutOperation)
14264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(ClearRectOperation)
14364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            // Drawing
14464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(DrawBitmapPatternOperation)
14564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(DrawBitmapRectOperation)
146839203b35a55ec16675b15767cb242038b9a5132John Reck            TYPE_CASE(DrawConvexPolygonQuadOperation)
14764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(DrawEllipseOperation)
148839203b35a55ec16675b15767cb242038b9a5132John Reck            TYPE_CASE(DrawFocusRingOperation)
14964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(DrawLineOperation)
15064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(DrawLineForTextOperation)
15164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(DrawLineForTextCheckingOperation)
15264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(DrawRectOperation)
15364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(FillPathOperation)
15464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(FillRectOperation)
15564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(FillRoundedRectOperation)
15664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(StrokeArcOperation)
15764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(StrokePathOperation)
15864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            TYPE_CASE(StrokeRectOperation)
1593718b58e4da76b7025aa5316a51264c5e38f2569John Reck            TYPE_CASE(DrawMediaButtonOperation)
16064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard            // Text
161b9f38925d3cdae56548c3c18300c2964d207ed4eJohn Reck            TYPE_CASE(DrawPosTextOperation)
16264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        }
16364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        return "Undefined";
16464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
16574d16a7661fcde10787bc62b4c62e202c9cc2495John Reck#endif
16674d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(UndefinedOperation)
16764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
16864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
169286b2d175d354558d172f30ca702dc0e05c7602fChris Craikclass PossiblyOpaqueOperation : public Operation {
170286b2d175d354558d172f30ca702dc0e05c7602fChris Craikpublic:
171286b2d175d354558d172f30ca702dc0e05c7602fChris Craik    virtual const IntRect* opaqueRect() { return &m_absoluteOpaqueRect; }
172286b2d175d354558d172f30ca702dc0e05c7602fChris Craik    virtual void setOpaqueRect(const IntRect& bounds) { m_absoluteOpaqueRect = bounds; }
173286b2d175d354558d172f30ca702dc0e05c7602fChris Craik
174286b2d175d354558d172f30ca702dc0e05c7602fChris Craikprivate:
175286b2d175d354558d172f30ca702dc0e05c7602fChris Craik    IntRect m_absoluteOpaqueRect;
176286b2d175d354558d172f30ca702dc0e05c7602fChris Craik};
177286b2d175d354558d172f30ca702dc0e05c7602fChris Craik
17864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard//**************************************
17964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard// Matrix operations
18064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard//**************************************
18164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
18264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass ConcatCTM : public Operation {
18364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
18464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    ConcatCTM(const AffineTransform& affine) : m_matrix(affine) {}
185675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
18664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->concatCTM(m_matrix);
18722ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
18864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
18974d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(ConcatCTMOperation)
19064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
19164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    AffineTransform m_matrix;
19264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
19364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
19464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass Rotate : public Operation {
19564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
19664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    Rotate(float angleInRadians) : m_angle(angleInRadians) {}
197675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
19864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->rotate(m_angle);
19922ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
20064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
20174d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(RotateOperation)
20264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
20364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    float m_angle;
20464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
20564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
20664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass Scale : public Operation {
20764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
20864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    Scale(const FloatSize& size) : m_scale(size) {}
209675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
21064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->scale(m_scale);
21122ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
21264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
21374d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(ScaleOperation)
21464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
21564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    FloatSize m_scale;
21664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
21764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
21864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass Translate : public Operation {
21964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
22064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    Translate(float x, float y) : m_x(x), m_y(y) {}
221675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
22264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->translate(m_x, m_y);
22322ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
22464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
22574d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(TranslateOperation)
22664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
22764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    float m_x;
22864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    float m_y;
22964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
23064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
23164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard//**************************************
23264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard// Clipping
23364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard//**************************************
23464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
23564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass InnerRoundedRectClip : public Operation {
23664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
23764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    InnerRoundedRectClip(const IntRect& rect, int thickness)
23864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        : m_rect(rect), m_thickness(thickness) {}
239675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
24064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->addInnerRoundedRectClip(m_rect, m_thickness);
24122ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
24264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
24374d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(InnerRoundedRectClipOperation)
24464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
24564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    IntRect m_rect;
24664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    int m_thickness;
24764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
24864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
24964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass Clip : public Operation {
25064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
25164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    Clip(const FloatRect& rect) : m_rect(rect) {}
252675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
25322ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return context->clip(m_rect);
25464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
25574d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(ClipOperation)
25664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
25764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    const FloatRect m_rect;
25864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
25964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
26064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass ClipPath : public Operation {
26164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
26264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    ClipPath(const Path& path, bool clipout = false)
26364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        : m_path(path), m_clipOut(clipout), m_hasWindRule(false) {}
26464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    void setWindRule(WindRule rule) { m_windRule = rule; m_hasWindRule = true; }
265675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
26664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        if (m_hasWindRule) {
26722ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck            return context->clipPath(m_path, m_windRule);
26864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        }
26964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        if (m_clipOut)
27022ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck            return context->clipOut(m_path);
27164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        else
27222ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck            return context->clip(m_path);
27364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
27474d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(ClipPathOperation)
27564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
27664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    const Path m_path;
27764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    bool m_clipOut;
27864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    WindRule m_windRule;
27964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    bool m_hasWindRule;
28064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
28164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
28264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass ClipOut : public Operation {
28364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
28464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    ClipOut(const IntRect& rect) : m_rect(rect) {}
285675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
28622ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return context->clipOut(m_rect);
28764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
28874d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(ClipOutOperation)
28964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
29064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    const IntRect m_rect;
29164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
29264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
29364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass ClearRect : public Operation {
29464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
29564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    ClearRect(const FloatRect& rect) : m_rect(rect) {}
296675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
29764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->clearRect(m_rect);
29822ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
29964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
30074d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(ClearRectOperation)
30164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
30264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    FloatRect m_rect;
30364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
30464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
30564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard//**************************************
30664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard// Drawing
30764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard//**************************************
30864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
309286b2d175d354558d172f30ca702dc0e05c7602fChris Craikclass DrawBitmapPattern : public PossiblyOpaqueOperation {
31064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
31164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    DrawBitmapPattern(const SkBitmap& bitmap, const SkMatrix& matrix,
31264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                      CompositeOperator op, const FloatRect& destRect)
31364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        : m_bitmap(bitmap), m_matrix(matrix), m_operator(op), m_destRect(destRect) {}
314675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
31564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->drawBitmapPattern(m_bitmap, m_matrix, m_operator, m_destRect);
31622ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
31764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
318286b2d175d354558d172f30ca702dc0e05c7602fChris Craik    virtual bool isOpaque() { return m_bitmap.isOpaque(); }
31974d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(DrawBitmapPatternOperation)
320286b2d175d354558d172f30ca702dc0e05c7602fChris Craik
32164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
32277d974918eff4b56050e9f1c3a78becab1244a04John Reck    SkBitmap m_bitmap;
32364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    SkMatrix m_matrix;
32464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    CompositeOperator m_operator;
32564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    FloatRect m_destRect;
32664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
32764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
328286b2d175d354558d172f30ca702dc0e05c7602fChris Craikclass DrawBitmapRect : public PossiblyOpaqueOperation {
32964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
33064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    DrawBitmapRect(const SkBitmap& bitmap, const SkIRect& srcR,
33164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                   const SkRect& dstR, CompositeOperator op)
33264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        : m_bitmap(bitmap), m_srcR(srcR), m_dstR(dstR), m_operator(op) {}
333675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
33464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->drawBitmapRect(m_bitmap, &m_srcR, m_dstR, m_operator);
33522ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
33664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
337286b2d175d354558d172f30ca702dc0e05c7602fChris Craik    virtual bool isOpaque() { return m_bitmap.isOpaque(); }
33874d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(DrawBitmapRectOperation)
33964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
34077d974918eff4b56050e9f1c3a78becab1244a04John Reck    SkBitmap m_bitmap;
34164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    SkIRect m_srcR;
34264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    SkRect m_dstR;
34364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    CompositeOperator m_operator;
34464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
34564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
346839203b35a55ec16675b15767cb242038b9a5132John Reckclass DrawConvexPolygonQuad : public Operation {
347839203b35a55ec16675b15767cb242038b9a5132John Reckpublic:
348839203b35a55ec16675b15767cb242038b9a5132John Reck    DrawConvexPolygonQuad(const FloatPoint* points, bool shouldAntiAlias)
349839203b35a55ec16675b15767cb242038b9a5132John Reck        : m_shouldAntiAlias(shouldAntiAlias)
350839203b35a55ec16675b15767cb242038b9a5132John Reck    {
351839203b35a55ec16675b15767cb242038b9a5132John Reck        memcpy(m_points, points, 4 * sizeof(FloatPoint));
352839203b35a55ec16675b15767cb242038b9a5132John Reck    }
353839203b35a55ec16675b15767cb242038b9a5132John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
354839203b35a55ec16675b15767cb242038b9a5132John Reck        context->drawConvexPolygon(4, m_points, m_shouldAntiAlias);
355839203b35a55ec16675b15767cb242038b9a5132John Reck        return true;
356839203b35a55ec16675b15767cb242038b9a5132John Reck    }
35774d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(DrawConvexPolygonQuadOperation)
358839203b35a55ec16675b15767cb242038b9a5132John Reckprivate:
359839203b35a55ec16675b15767cb242038b9a5132John Reck    bool m_shouldAntiAlias;
360839203b35a55ec16675b15767cb242038b9a5132John Reck    FloatPoint m_points[4];
361839203b35a55ec16675b15767cb242038b9a5132John Reck};
362839203b35a55ec16675b15767cb242038b9a5132John Reck
36364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass DrawEllipse : public Operation {
36464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
36564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    DrawEllipse(const IntRect& rect) : m_rect(rect) {}
366675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
36764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->drawEllipse(m_rect);
36822ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
36964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
37074d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(DrawEllipseOperation)
37164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
37264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    IntRect m_rect;
37364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
37464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
375839203b35a55ec16675b15767cb242038b9a5132John Reckclass DrawFocusRing : public Operation {
376839203b35a55ec16675b15767cb242038b9a5132John Reckpublic:
377839203b35a55ec16675b15767cb242038b9a5132John Reck    DrawFocusRing(const Vector<IntRect>& rects, int width, int offset, const Color& color)
378839203b35a55ec16675b15767cb242038b9a5132John Reck        : m_rects(rects)
379839203b35a55ec16675b15767cb242038b9a5132John Reck        , m_width(width)
380839203b35a55ec16675b15767cb242038b9a5132John Reck        , m_offset(offset)
381839203b35a55ec16675b15767cb242038b9a5132John Reck        , m_color(color)
382839203b35a55ec16675b15767cb242038b9a5132John Reck    {}
383839203b35a55ec16675b15767cb242038b9a5132John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
384839203b35a55ec16675b15767cb242038b9a5132John Reck        context->drawFocusRing(m_rects, m_width, m_offset, m_color);
385839203b35a55ec16675b15767cb242038b9a5132John Reck        return true;
386839203b35a55ec16675b15767cb242038b9a5132John Reck    }
38774d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(DrawFocusRingOperation)
388839203b35a55ec16675b15767cb242038b9a5132John Reckprivate:
389839203b35a55ec16675b15767cb242038b9a5132John Reck    Vector<IntRect> m_rects;
390839203b35a55ec16675b15767cb242038b9a5132John Reck    int m_width;
391839203b35a55ec16675b15767cb242038b9a5132John Reck    int m_offset;
392839203b35a55ec16675b15767cb242038b9a5132John Reck    Color m_color;
393839203b35a55ec16675b15767cb242038b9a5132John Reck};
394839203b35a55ec16675b15767cb242038b9a5132John Reck
39564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass DrawLine : public Operation {
39664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
39764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    DrawLine(const IntPoint& point1, const IntPoint& point2)
39864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        : m_point1(point1), m_point2(point2) {}
399675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
40064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->drawLine(m_point1, m_point2);
40122ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
40264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
40374d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(DrawLineOperation)
40464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
40564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    IntPoint m_point1;
40664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    IntPoint m_point2;
40764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
40864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
40964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass DrawLineForText : public Operation {
41064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
41164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    DrawLineForText(const FloatPoint& pt, float width)
41264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        : m_point(pt), m_width(width) {}
413675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
41464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->drawLineForText(m_point, m_width);
41522ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
41664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
41774d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(DrawLineForTextOperation)
41864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
41964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    FloatPoint m_point;
42064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    float m_width;
42164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
42264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
42364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass DrawLineForTextChecking : public Operation {
42464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
42564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    DrawLineForTextChecking(const FloatPoint& pt, float width,
42664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                            GraphicsContext::TextCheckingLineStyle lineStyle)
42764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        : m_point(pt), m_width(width), m_lineStyle(lineStyle) {}
428675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
42964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->drawLineForTextChecking(m_point, m_width, m_lineStyle);
43022ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
43164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
43274d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(DrawLineForTextCheckingOperation)
43364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
43464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    FloatPoint m_point;
43564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    float m_width;
43664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    GraphicsContext::TextCheckingLineStyle m_lineStyle;
43764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
43864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
43964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass DrawRect : public Operation {
44064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
44164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    DrawRect(const IntRect& rect) : m_rect(rect) {}
442675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
44364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->drawRect(m_rect);
44422ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
44564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
44674d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(DrawRectOperation)
44764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
44864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    IntRect m_rect;
44964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
45064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
45164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass FillPath : public Operation {
45264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
45364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    FillPath(const Path& pathToFill, WindRule fillRule)
45464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        : m_path(pathToFill), m_fillRule(fillRule) {}
455675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
45664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->fillPath(m_path, m_fillRule);
45722ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
45864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
45974d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(FillPathOperation)
46064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
46164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    Path m_path;
46264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    WindRule m_fillRule;
46364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
46464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
465286b2d175d354558d172f30ca702dc0e05c7602fChris Craikclass FillRect : public PossiblyOpaqueOperation {
46664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
46764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    FillRect(const FloatRect& rect) : m_rect(rect), m_hasColor(false) {}
46864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    void setColor(Color c) { m_color = c; m_hasColor = true; }
469675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
47064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        if (m_hasColor)
47164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard             context->fillRect(m_rect, m_color);
47264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        else
47364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard             context->fillRect(m_rect);
47422ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
47564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
476286b2d175d354558d172f30ca702dc0e05c7602fChris Craik    virtual bool isOpaque() { return (m_hasColor && !m_color.hasAlpha())
477286b2d175d354558d172f30ca702dc0e05c7602fChris Craik            || (!m_hasColor && SkColorGetA(m_state->fillColor) == 0xFF); }
47874d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(FillRectOperation)
47964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
48064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    FloatRect m_rect;
48164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    Color m_color;
48264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    bool m_hasColor;
48364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
48464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
48564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass FillRoundedRect : public Operation {
48664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
48764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    FillRoundedRect(const IntRect& rect,
48864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                    const IntSize& topLeft,
48964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                    const IntSize& topRight,
49064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                    const IntSize& bottomLeft,
49164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                    const IntSize& bottomRight,
49264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                    const Color& color)
49364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        : m_rect(rect)
49464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        , m_topLeft(topLeft)
49564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        , m_topRight(topRight)
49664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        , m_bottomLeft(bottomLeft)
49764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        , m_bottomRight(bottomRight)
49864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        , m_color(color)
49964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    {}
500675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
50164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->fillRoundedRect(m_rect, m_topLeft, m_topRight,
50264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                                 m_bottomLeft, m_bottomRight,
50364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard                                 m_color);
50422ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
50564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
50674d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(FillRoundedRectOperation)
50764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
50864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    IntRect m_rect;
50964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    IntSize m_topLeft;
51064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    IntSize m_topRight;
51164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    IntSize m_bottomLeft;
51264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    IntSize m_bottomRight;
51364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    Color m_color;
51464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
51564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
51664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass StrokeArc : public Operation {
51764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
51864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    StrokeArc(const IntRect& r, int startAngle, int angleSpan)
51964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        : m_rect(r)
52064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        , m_startAngle(startAngle)
52164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        , m_angleSpan(angleSpan)
52264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    {}
523675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
52464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->strokeArc(m_rect, m_startAngle, m_angleSpan);
52522ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
52664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
52774d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(StrokeArcOperation)
52864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
52964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    IntRect m_rect;
53064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    int m_startAngle;
53164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    int m_angleSpan;
53264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
53364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
53464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass StrokePath : public Operation {
53564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
53664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    StrokePath(const Path& path) : m_path(path) {}
537675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
53864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->strokePath(m_path);
53922ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
54064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
54174d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(StrokePathOperation)
54264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
54364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    Path m_path;
54464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
54564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
54664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
54764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardclass StrokeRect : public Operation {
54864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
54964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    StrokeRect(const FloatRect& rect, float lineWidth)
55064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        : m_rect(rect), m_lineWidth(lineWidth) {}
551675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
55264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard        context->strokeRect(m_rect, m_lineWidth);
55322ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
55464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
55574d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(StrokeRectOperation)
55664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
55764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    FloatRect m_rect;
55864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    float m_lineWidth;
55964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
56064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
5613718b58e4da76b7025aa5316a51264c5e38f2569John Reckclass DrawMediaButton : public Operation {
5623718b58e4da76b7025aa5316a51264c5e38f2569John Reckpublic:
5633718b58e4da76b7025aa5316a51264c5e38f2569John Reck    DrawMediaButton(const IntRect& rect, RenderSkinMediaButton::MediaButton buttonType,
5643718b58e4da76b7025aa5316a51264c5e38f2569John Reck                    bool translucent, bool drawBackground,
5653718b58e4da76b7025aa5316a51264c5e38f2569John Reck                    const IntRect& thumb)
5663718b58e4da76b7025aa5316a51264c5e38f2569John Reck        : m_rect(rect)
5673718b58e4da76b7025aa5316a51264c5e38f2569John Reck        , m_thumb(thumb)
5683718b58e4da76b7025aa5316a51264c5e38f2569John Reck        , m_buttonType(buttonType)
5693718b58e4da76b7025aa5316a51264c5e38f2569John Reck        , m_translucent(translucent)
5703718b58e4da76b7025aa5316a51264c5e38f2569John Reck        , m_drawBackground(drawBackground)
5713718b58e4da76b7025aa5316a51264c5e38f2569John Reck    {}
5723718b58e4da76b7025aa5316a51264c5e38f2569John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
5733718b58e4da76b7025aa5316a51264c5e38f2569John Reck        context->drawMediaButton(m_rect, m_buttonType, m_translucent, m_drawBackground, m_thumb);
5743718b58e4da76b7025aa5316a51264c5e38f2569John Reck        return true;
5753718b58e4da76b7025aa5316a51264c5e38f2569John Reck    }
5763718b58e4da76b7025aa5316a51264c5e38f2569John Reck    TYPE(DrawMediaButtonOperation)
5773718b58e4da76b7025aa5316a51264c5e38f2569John Reckprivate:
5783718b58e4da76b7025aa5316a51264c5e38f2569John Reck    IntRect m_rect;
5793718b58e4da76b7025aa5316a51264c5e38f2569John Reck    IntRect m_thumb;
5803718b58e4da76b7025aa5316a51264c5e38f2569John Reck    RenderSkinMediaButton::MediaButton m_buttonType;
5813718b58e4da76b7025aa5316a51264c5e38f2569John Reck    bool m_translucent : 1;
5823718b58e4da76b7025aa5316a51264c5e38f2569John Reck    bool m_drawBackground : 1;
5833718b58e4da76b7025aa5316a51264c5e38f2569John Reck};
5843718b58e4da76b7025aa5316a51264c5e38f2569John Reck
58564e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard//**************************************
58664e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard// Text
58764e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard//**************************************
58864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
589b9f38925d3cdae56548c3c18300c2964d207ed4eJohn Reckclass DrawPosText : public Operation {
59064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardpublic:
591b9f38925d3cdae56548c3c18300c2964d207ed4eJohn Reck    DrawPosText(const void* text, size_t byteLength,
592b0a56fa335e9435238de5f2cde15076488057c52John Reck                const SkPoint pos[], const SkPaint* paint)
593682a85cb3ff0b200d4fe0f7ef41a4e1c57dea233John Reck        : m_text(text)
594682a85cb3ff0b200d4fe0f7ef41a4e1c57dea233John Reck        , m_byteLength(byteLength)
595682a85cb3ff0b200d4fe0f7ef41a4e1c57dea233John Reck        , m_pos(pos)
596b9f38925d3cdae56548c3c18300c2964d207ed4eJohn Reck        , m_paint(paint)
597682a85cb3ff0b200d4fe0f7ef41a4e1c57dea233John Reck    {}
598675402ef4358583f64a2476927a548db4841c856John Reck    virtual bool applyImpl(PlatformGraphicsContext* context) {
599b0a56fa335e9435238de5f2cde15076488057c52John Reck        context->drawPosText(m_text, m_byteLength, m_pos, *m_paint);
60022ddc4a8f76077593fba14c8cafffc74f9170dabJohn Reck        return true;
60164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard    }
60274d16a7661fcde10787bc62b4c62e202c9cc2495John Reck    TYPE(DrawPosTextOperation)
60364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roardprivate:
604682a85cb3ff0b200d4fe0f7ef41a4e1c57dea233John Reck    const void* m_text;
605b9f38925d3cdae56548c3c18300c2964d207ed4eJohn Reck    size_t m_byteLength;
606682a85cb3ff0b200d4fe0f7ef41a4e1c57dea233John Reck    const SkPoint* m_pos;
607b0a56fa335e9435238de5f2cde15076488057c52John Reck    const SkPaint* m_paint;
60864e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard};
60964e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
61064e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard}
61164e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
61264e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard}
61364e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard
61464e4b265f84573b97d408f7d3e5aa99a647be057Nicolas Roard#endif // GraphicsOperation_h
615