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