/*
* Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef CanvasRenderingContext2D_h
#define CanvasRenderingContext2D_h
#include "AffineTransform.h"
#include "CanvasRenderingContext.h"
#include "Color.h"
#include "FloatSize.h"
#include "Font.h"
#include "GraphicsTypes.h"
#include "Path.h"
#include "PlatformString.h"
#include <wtf/Vector.h>
#if USE(CG)
#include <ApplicationServices/ApplicationServices.h>
#endif
#if USE(ACCELERATED_COMPOSITING)
#include "GraphicsLayer.h"
#endif
namespace WebCore {
class CanvasGradient;
class CanvasPattern;
class CanvasStyle;
class FloatRect;
class GraphicsContext;
class HTMLCanvasElement;
class HTMLImageElement;
class HTMLVideoElement;
class ImageData;
class TextMetrics;
#if ENABLE(ACCELERATED_2D_CANVAS)
class DrawingBuffer;
class SharedGraphicsContext3D;
#endif
typedef int ExceptionCode;
class CanvasRenderingContext2D : public CanvasRenderingContext {
public:
CanvasRenderingContext2D(HTMLCanvasElement*, bool usesCSSCompatibilityParseMode, bool usesDashboardCompatibilityMode);
virtual ~CanvasRenderingContext2D();
virtual bool is2d() const { return true; }
virtual bool isAccelerated() const;
virtual bool paintsIntoCanvasBuffer() const;
CanvasStyle* strokeStyle() const;
void setStrokeStyle(PassRefPtr<CanvasStyle>);
CanvasStyle* fillStyle() const;
void setFillStyle(PassRefPtr<CanvasStyle>);
float lineWidth() const;
void setLineWidth(float);
String lineCap() const;
void setLineCap(const String&);
String lineJoin() const;
void setLineJoin(const String&);
float miterLimit() const;
void setMiterLimit(float);
float shadowOffsetX() const;
void setShadowOffsetX(float);
float shadowOffsetY() const;
void setShadowOffsetY(float);
float shadowBlur() const;
void setShadowBlur(float);
String shadowColor() const;
void setShadowColor(const String&);
float globalAlpha() const;
void setGlobalAlpha(float);
String globalCompositeOperation() const;
void setGlobalCompositeOperation(const String&);
void save();
void restore();
void setAllAttributesToDefault();
void scale(float sx, float sy);
void rotate(float angleInRadians);
void translate(float tx, float ty);
void transform(float m11, float m12, float m21, float m22, float dx, float dy);
void setTransform(float m11, float m12, float m21, float m22, float dx, float dy);
void setStrokeColor(const String& color);
void setStrokeColor(float grayLevel);
void setStrokeColor(const String& color, float alpha);
void setStrokeColor(float grayLevel, float alpha);
void setStrokeColor(float r, float g, float b, float a);
void setStrokeColor(float c, float m, float y, float k, float a);
void setFillColor(const String& color);
void setFillColor(float grayLevel);
void setFillColor(const String& color, float alpha);
void setFillColor(float grayLevel, float alpha);
void setFillColor(float r, float g, float b, float a);
void setFillColor(float c, float m, float y, float k, float a);
void beginPath();
void closePath();
void moveTo(float x, float y);
void lineTo(float x, float y);
void quadraticCurveTo(float cpx, float cpy, float x, float y);
void bezierCurveTo(float cp1x, float cp1y, float cp2x, float cp2y, float x, float y);
void arcTo(float x0, float y0, float x1, float y1, float radius, ExceptionCode&);
void arc(float x, float y, float r, float sa, float ea, bool clockwise, ExceptionCode&);
void rect(float x, float y, float width, float height);
void fill();
void stroke();
void clip();
bool isPointInPath(const float x, const float y);
void clearRect(float x, float y, float width, float height);
void fillRect(float x, float y, float width, float height);
void strokeRect(float x, float y, float width, float height);
void strokeRect(float x, float y, float width, float height, float lineWidth);
void setShadow(float width, float height, float blur);
void setShadow(float width, float height, float blur, const String& color);
void setShadow(float width, float height, float blur, float grayLevel);
void setShadow(float width, float height, float blur, const String& color, float alpha);
void setShadow(float width, float height, float blur, float grayLevel, float alpha);
void setShadow(float width, float height, float blur, float r, float g, float b, float a);
void setShadow(float width, float height, float blur, float c, float m, float y, float k, float a);
void clearShadow();
void drawImage(HTMLImageElement*, float x, float y, ExceptionCode&);
void drawImage(HTMLImageElement*, float x, float y, float width, float height, ExceptionCode&);
void drawImage(HTMLImageElement*, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh, ExceptionCode&);
void drawImage(HTMLImageElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
void drawImage(HTMLCanvasElement*, float x, float y, ExceptionCode&);
void drawImage(HTMLCanvasElement*, float x, float y, float width, float height, ExceptionCode&);
void drawImage(HTMLCanvasElement*, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh, ExceptionCode&);
void drawImage(HTMLCanvasElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
void drawImage(HTMLImageElement*, const FloatRect& srcRect, const FloatRect& dstRect, const CompositeOperator&, ExceptionCode&);
#if ENABLE(VIDEO)
void drawImage(HTMLVideoElement*, float x, float y, ExceptionCode&);
void drawImage(HTMLVideoElement*, float x, float y, float width, float height, ExceptionCode&);
void drawImage(HTMLVideoElement*, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh, ExceptionCode&);
void drawImage(HTMLVideoElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
#endif
void drawImageFromRect(HTMLImageElement*, float sx, float sy, float sw, float sh,
float dx, float dy, float dw, float dh, const String& compositeOperation);
void setAlpha(float);
void setCompositeOperation(const String&);
PassRefPtr<CanvasGradient> createLinearGradient(float x0, float y0, float x1, float y1, ExceptionCode&);
PassRefPtr<CanvasGradient> createRadialGradient(float x0, float y0, float r0, float x1, float y1, float r1, ExceptionCode&);
PassRefPtr<CanvasPattern> createPattern(HTMLImageElement*, const String& repetitionType, ExceptionCode&);
PassRefPtr<CanvasPattern> createPattern(HTMLCanvasElement*, const String& repetitionType, ExceptionCode&);
PassRefPtr<ImageData> createImageData(PassRefPtr<ImageData>, ExceptionCode&) const;
PassRefPtr<ImageData> createImageData(float width, float height, ExceptionCode&) const;
PassRefPtr<ImageData> getImageData(float sx, float sy, float sw, float sh, ExceptionCode&) const;
void putImageData(ImageData*, float dx, float dy, ExceptionCode&);
void putImageData(ImageData*, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight, ExceptionCode&);
void reset();
String font() const;
void setFont(const String&);
String textAlign() const;
void setTextAlign(const String&);
String textBaseline() const;
void setTextBaseline(const String&);
void fillText(const String& text, float x, float y);
void fillText(const String& text, float x, float y, float maxWidth);
void strokeText(const String& text, float x, float y);
void strokeText(const String& text, float x, float y, float maxWidth);
PassRefPtr<TextMetrics> measureText(const String& text);
LineCap getLineCap() const { return state().m_lineCap; }
LineJoin getLineJoin() const { return state().m_lineJoin; }
virtual void paintRenderingResultsToCanvas();
#if ENABLE(ACCELERATED_2D_CANVAS) && USE(ACCELERATED_COMPOSITING)
virtual PlatformLayer* platformLayer() const;
#endif
private:
struct State : FontSelectorClient {
State();
virtual ~State();
State(const State&);
State& operator=(const State&);
virtual void fontsNeedUpdate(FontSelector*);
String m_unparsedStrokeColor;
String m_unparsedFillColor;
RefPtr<CanvasStyle> m_strokeStyle;
RefPtr<CanvasStyle> m_fillStyle;
float m_lineWidth;
LineCap m_lineCap;
LineJoin m_lineJoin;
float m_miterLimit;
FloatSize m_shadowOffset;
float m_shadowBlur;
RGBA32 m_shadowColor;
float m_globalAlpha;
CompositeOperator m_globalComposite;
AffineTransform m_transform;
bool m_invertibleCTM;
// Text state.
TextAlign m_textAlign;
TextBaseline m_textBaseline;
String m_unparsedFont;
Font m_font;
bool m_realizedFont;
};
Path m_path;
State& state() { return m_stateStack.last(); }
const State& state() const { return m_stateStack.last(); }
void applyShadow();
enum CanvasDidDrawOption {
CanvasDidDrawApplyNone = 0,
CanvasDidDrawApplyTransform = 1,
CanvasDidDrawApplyShadow = 1 << 1,
CanvasDidDrawApplyClip = 1 << 2,
CanvasDidDrawApplyAll = 0xffffffff
};
void didDraw(const FloatRect&, unsigned options = CanvasDidDrawApplyAll);
GraphicsContext* drawingContext() const;
void applyStrokePattern();
void applyFillPattern();
void drawTextInternal(const String& text, float x, float y, bool fill, float maxWidth = 0, bool useMaxWidth = false);
const Font& accessFont();
#if ENABLE(DASHBOARD_SUPPORT)
void clearPathForDashboardBackwardCompatibilityMode();
#endif
void prepareGradientForDashboard(CanvasGradient* gradient) const;
Vector<State, 1> m_stateStack;
bool m_usesCSSCompatibilityParseMode;
#if ENABLE(DASHBOARD_SUPPORT)
bool m_usesDashboardCompatibilityMode;
#endif
#if ENABLE(ACCELERATED_2D_CANVAS)
RefPtr<DrawingBuffer> m_drawingBuffer;
RefPtr<SharedGraphicsContext3D> m_context3D;
#endif
};
} // namespace WebCore
#endif