Remove remaining PLATFORM(CHROMIUM)-guarded code in WebCore
[WebKit-https.git] / Source / WebCore / html / HTMLCanvasElement.h
1 /*
2  * Copyright (C) 2004, 2006, 2009, 2010 Apple Inc. All rights reserved.
3  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
4  * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
26  */
27
28 #ifndef HTMLCanvasElement_h
29 #define HTMLCanvasElement_h
30
31 #include "FloatRect.h"
32 #include "HTMLElement.h"
33 #include "IntSize.h"
34 #include <wtf/Forward.h>
35
36 #if PLATFORM(QT)
37 #define DefaultInterpolationQuality InterpolationMedium
38 #elif USE(CG)
39 #define DefaultInterpolationQuality InterpolationLow
40 #else
41 #define DefaultInterpolationQuality InterpolationDefault
42 #endif
43
44 namespace WebCore {
45
46 class CanvasContextAttributes;
47 class CanvasRenderingContext;
48 class GraphicsContext;
49 class GraphicsContextStateSaver;
50 class HTMLCanvasElement;
51 class Image;
52 class ImageData;
53 class ImageBuffer;
54 class IntSize;
55
56 class CanvasObserver {
57 public:
58     virtual ~CanvasObserver() { }
59
60     virtual void canvasChanged(HTMLCanvasElement*, const FloatRect& changedRect) = 0;
61     virtual void canvasResized(HTMLCanvasElement*) = 0;
62     virtual void canvasDestroyed(HTMLCanvasElement*) = 0;
63 };
64
65 class HTMLCanvasElement : public HTMLElement {
66 public:
67     static PassRefPtr<HTMLCanvasElement> create(Document*);
68     static PassRefPtr<HTMLCanvasElement> create(const QualifiedName&, Document*);
69     virtual ~HTMLCanvasElement();
70
71     void addObserver(CanvasObserver*);
72     void removeObserver(CanvasObserver*);
73
74     // Attributes and functions exposed to script
75     int width() const { return size().width(); }
76     int height() const { return size().height(); }
77
78     const IntSize& size() const { return m_size; }
79
80     void setWidth(int);
81     void setHeight(int);
82
83     void setSize(const IntSize& newSize)
84     { 
85         if (newSize == size() && targetDeviceScaleFactor() == m_deviceScaleFactor)
86             return;
87         m_ignoreReset = true; 
88         setWidth(newSize.width());
89         setHeight(newSize.height());
90         m_ignoreReset = false;
91         reset();
92     }
93
94     CanvasRenderingContext* getContext(const String&, CanvasContextAttributes* attributes = 0);
95
96     static String toEncodingMimeType(const String& mimeType);
97     String toDataURL(const String& mimeType, const double* quality, ExceptionCode&);
98     String toDataURL(const String& mimeType, ExceptionCode& ec) { return toDataURL(mimeType, 0, ec); }
99
100     // Used for rendering
101     void didDraw(const FloatRect&);
102     void notifyObserversCanvasChanged(const FloatRect&);
103
104     void paint(GraphicsContext*, const LayoutRect&, bool useLowQualityScale = false);
105
106     GraphicsContext* drawingContext() const;
107     GraphicsContext* existingDrawingContext() const;
108
109     CanvasRenderingContext* renderingContext() const { return m_context.get(); }
110
111     ImageBuffer* buffer() const;
112     Image* copiedImage() const;
113     void clearCopiedImage();
114     PassRefPtr<ImageData> getImageData();
115     void makePresentationCopy();
116     void clearPresentationCopy();
117
118     FloatRect convertLogicalToDevice(const FloatRect&) const;
119     FloatSize convertLogicalToDevice(const FloatSize&) const;
120
121     FloatSize convertDeviceToLogical(const FloatSize&) const;
122
123     SecurityOrigin* securityOrigin() const;
124     void setOriginTainted() { m_originClean = false; }
125     bool originClean() const { return m_originClean; }
126
127     StyleResolver* styleResolver();
128
129     AffineTransform baseTransform() const;
130
131 #if ENABLE(WEBGL)    
132     bool is3D() const;
133 #endif
134
135     void makeRenderingResultsAvailable();
136     bool hasCreatedImageBuffer() const { return m_hasCreatedImageBuffer; }
137
138     bool shouldAccelerate(const IntSize&) const;
139
140     float deviceScaleFactor() const { return m_deviceScaleFactor; }
141
142     virtual bool canContainRangeEndPoint() const { return false; }
143
144     virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE;
145
146 private:
147     HTMLCanvasElement(const QualifiedName&, Document*);
148
149     virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
150     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
151     virtual void attach();
152     virtual bool areAuthorShadowsAllowed() const OVERRIDE { return false; }
153
154     void reset();
155
156     float targetDeviceScaleFactor() const;
157
158     void createImageBuffer() const;
159     void clearImageBuffer() const;
160
161     void setSurfaceSize(const IntSize&);
162
163     bool paintsIntoCanvasBuffer() const;
164
165     HashSet<CanvasObserver*> m_observers;
166
167     IntSize m_size;
168
169     OwnPtr<CanvasRenderingContext> m_context;
170
171     bool m_rendererIsCanvas;
172
173     bool m_ignoreReset;
174     FloatRect m_dirtyRect;
175
176     float m_deviceScaleFactor;
177     bool m_originClean;
178
179     // m_createdImageBuffer means we tried to malloc the buffer.  We didn't necessarily get it.
180     mutable bool m_hasCreatedImageBuffer;
181     mutable bool m_didClearImageBuffer;
182     mutable OwnPtr<ImageBuffer> m_imageBuffer;
183     mutable OwnPtr<GraphicsContextStateSaver> m_contextStateSaver;
184     
185     mutable RefPtr<Image> m_presentedImage;
186     mutable RefPtr<Image> m_copiedImage; // FIXME: This is temporary for platforms that have to copy the image buffer to render (and for CSSCanvasValue).
187 };
188
189 } //namespace
190
191 #endif