ee2c25090d7eed0ba1cb3419f87a66eb729cf51c
[WebKit-https.git] / WebCore / html / HTMLCanvasElement.h
1 /*
2  * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
3  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25  */
26
27 #ifndef HTMLCanvasElement_h
28 #define HTMLCanvasElement_h
29
30 #include "HTMLElement.h"
31 #include "IntSize.h"
32
33 #if PLATFORM(CG)
34 // FIXME: CG-specific parts need to move to the platform directory.
35 typedef struct CGContext* CGContextRef;
36 typedef struct CGImage* CGImageRef;
37 #elif PLATFORM(QT)
38 QT_BEGIN_NAMESPACE
39 class QPixmap;
40 class QPainter;
41 QT_END_NAMESPACE
42 #elif PLATFORM(CAIRO)
43 typedef struct _cairo_surface cairo_surface_t;
44 #endif
45
46 namespace WebCore {
47
48 class CanvasRenderingContext2D;
49 typedef CanvasRenderingContext2D CanvasRenderingContext;
50 class FloatPoint;
51 class FloatRect;
52 class FloatSize;
53 class GraphicsContext;
54 class HTMLCanvasElement;
55 class ImageBuffer;
56 class IntPoint;
57 class InttRect;
58 class IntSize;
59
60 class CanvasObserver {
61 public:
62     virtual ~CanvasObserver() {};
63
64     virtual void canvasChanged(HTMLCanvasElement* element, const FloatRect& changedRect) = 0;
65     virtual void canvasResized(HTMLCanvasElement* element) = 0;
66 };
67
68 class HTMLCanvasElement : public HTMLElement {
69 public:
70     HTMLCanvasElement(Document*);
71     virtual ~HTMLCanvasElement();
72
73 #if ENABLE(DASHBOARD_SUPPORT)
74     virtual HTMLTagStatus endTagRequirement() const;
75     virtual int tagPriority() const;
76 #endif
77
78     int width() const { return m_size.width(); }
79     int height() const { return m_size.height(); }
80     void setWidth(int);
81     void setHeight(int);
82
83     String toDataURL(const String& mimeType, ExceptionCode&);
84
85     CanvasRenderingContext* getContext(const String&);
86
87     virtual void parseMappedAttribute(MappedAttribute*);
88     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
89
90     IntSize size() const { return m_size; }
91     void setSize(const IntSize& size)
92     { 
93         if (size == m_size)
94             return;
95         m_ignoreReset = true; 
96         setWidth(size.width());
97         setHeight(size.height());
98         m_ignoreReset = false;
99         reset();
100     }
101
102     void willDraw(const FloatRect&);
103
104     void paint(GraphicsContext*, const IntRect&);
105
106     GraphicsContext* drawingContext() const;
107
108     ImageBuffer* buffer() const; 
109 #if PLATFORM(CG)
110     CGImageRef createPlatformImage() const;
111 #elif PLATFORM(QT)
112     QPixmap createPlatformImage() const;
113 #elif PLATFORM(CAIRO)
114     cairo_surface_t* createPlatformImage() const;
115 #endif
116     
117     IntRect convertLogicalToDevice(const FloatRect&) const;
118     IntSize convertLogicalToDevice(const FloatSize&) const;
119     IntPoint convertLogicalToDevice(const FloatPoint&) const;
120
121     void setOriginTainted() { m_originClean = false; } 
122     bool originClean() const { return m_originClean; }
123
124     static const float MaxCanvasArea;
125
126     void setObserver(CanvasObserver* o) { m_observer = o; }
127
128 private:
129     void createImageBuffer() const;
130     void reset();
131
132     bool m_rendererIsCanvas;
133
134     RefPtr<CanvasRenderingContext2D> m_2DContext;
135     IntSize m_size;    
136     CanvasObserver* m_observer;
137
138     bool m_originClean;
139     bool m_ignoreReset;
140
141     // m_createdImageBuffer means we tried to malloc the buffer.  We didn't necessarily get it.
142     mutable bool m_createdImageBuffer;
143     mutable OwnPtr<ImageBuffer> m_imageBuffer;
144 };
145
146 } //namespace
147
148 #endif