Use "= default" to denote default constructor or destructor
[WebKit-https.git] / Source / WebCore / html / HTMLCanvasElement.h
1 /*
2  * Copyright (C) 2004-2017 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 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 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 #pragma once
29
30 #include "FloatRect.h"
31 #include "HTMLElement.h"
32 #include "IntSize.h"
33 #include <memory>
34 #include <wtf/Forward.h>
35 #include <wtf/HashSet.h>
36
37 #if ENABLE(WEBGL)
38 #include "WebGLContextAttributes.h"
39 #endif
40
41 namespace WebCore {
42
43 class BlobCallback;
44 class CanvasRenderingContext2D;
45 class CanvasRenderingContext;
46 class GraphicsContext;
47 class GraphicsContextStateSaver;
48 class HTMLCanvasElement;
49 class Image;
50 class ImageBuffer;
51 class ImageData;
52 class MediaSample;
53 class MediaStream;
54 class WebGLRenderingContextBase;
55 class WebGPURenderingContext;
56 struct UncachedString;
57
58 namespace DisplayList {
59 using AsTextFlags = unsigned;
60 }
61
62 class CanvasObserver {
63 public:
64     virtual ~CanvasObserver() = default;
65
66     virtual bool isCanvasObserverProxy() const { return false; }
67
68     virtual void canvasChanged(HTMLCanvasElement&, const FloatRect& changedRect) = 0;
69     virtual void canvasResized(HTMLCanvasElement&) = 0;
70     virtual void canvasDestroyed(HTMLCanvasElement&) = 0;
71 };
72
73 class HTMLCanvasElement final : public HTMLElement {
74 public:
75     static Ref<HTMLCanvasElement> create(Document&);
76     static Ref<HTMLCanvasElement> create(const QualifiedName&, Document&);
77     virtual ~HTMLCanvasElement();
78
79     void addObserver(CanvasObserver&);
80     void removeObserver(CanvasObserver&);
81     HashSet<Element*> cssCanvasClients() const;
82
83     unsigned width() const { return size().width(); }
84     unsigned height() const { return size().height(); }
85
86     WEBCORE_EXPORT ExceptionOr<void> setWidth(unsigned);
87     WEBCORE_EXPORT ExceptionOr<void> setHeight(unsigned);
88
89     const IntSize& size() const { return m_size; }
90
91     void setSize(const IntSize& newSize)
92     { 
93         if (newSize == size())
94             return;
95         m_ignoreReset = true; 
96         setWidth(newSize.width());
97         setHeight(newSize.height());
98         m_ignoreReset = false;
99         reset();
100     }
101
102     ExceptionOr<std::optional<RenderingContext>> getContext(JSC::ExecState&, const String& contextId, Vector<JSC::Strong<JSC::Unknown>>&& arguments);
103
104     CanvasRenderingContext* getContext(const String&);
105
106     static bool is2dType(const String&);
107     CanvasRenderingContext2D* createContext2d(const String& type);
108     CanvasRenderingContext2D* getContext2d(const String&);
109
110 #if ENABLE(WEBGL)
111     static bool isWebGLType(const String&);
112     WebGLRenderingContextBase* createContextWebGL(const String&, WebGLContextAttributes&& = { });
113     WebGLRenderingContextBase* getContextWebGL(const String&, WebGLContextAttributes&& = { });
114 #endif
115 #if ENABLE(WEBGPU)
116     static bool isWebGPUType(const String&);
117     WebGPURenderingContext* createContextWebGPU(const String&);
118     WebGPURenderingContext* getContextWebGPU(const String&);
119 #endif
120
121     static bool isBitmapRendererType(const String&);
122     ImageBitmapRenderingContext* createContextBitmapRenderer(const String&);
123     ImageBitmapRenderingContext* getContextBitmapRenderer(const String&);
124
125     WEBCORE_EXPORT ExceptionOr<UncachedString> toDataURL(const String& mimeType, JSC::JSValue quality);
126     WEBCORE_EXPORT ExceptionOr<UncachedString> toDataURL(const String& mimeType);
127     ExceptionOr<void> toBlob(ScriptExecutionContext&, Ref<BlobCallback>&&, const String& mimeType, JSC::JSValue quality);
128
129     // Used for rendering
130     void didDraw(const FloatRect&);
131     void notifyObserversCanvasChanged(const FloatRect&);
132
133     void paint(GraphicsContext&, const LayoutRect&);
134
135     GraphicsContext* drawingContext() const;
136     GraphicsContext* existingDrawingContext() const;
137
138     CanvasRenderingContext* renderingContext() const { return m_context.get(); }
139
140 #if ENABLE(MEDIA_STREAM)
141     RefPtr<MediaSample> toMediaSample();
142     ExceptionOr<Ref<MediaStream>> captureStream(ScriptExecutionContext&, std::optional<double>&& frameRequestRate);
143 #endif
144
145     ImageBuffer* buffer() const;
146     Image* copiedImage() const;
147     void clearCopiedImage();
148     RefPtr<ImageData> getImageData();
149     void makePresentationCopy();
150     void clearPresentationCopy();
151
152     SecurityOrigin* securityOrigin() const;
153     void setOriginTainted() { m_originClean = false; }
154     bool originClean() const { return m_originClean; }
155
156     AffineTransform baseTransform() const;
157
158     void makeRenderingResultsAvailable();
159     bool hasCreatedImageBuffer() const { return m_hasCreatedImageBuffer; }
160
161     bool shouldAccelerate(const IntSize&) const;
162
163     WEBCORE_EXPORT void setUsesDisplayListDrawing(bool);
164     WEBCORE_EXPORT void setTracksDisplayListReplay(bool);
165     WEBCORE_EXPORT String displayListAsText(DisplayList::AsTextFlags) const;
166     WEBCORE_EXPORT String replayDisplayListAsText(DisplayList::AsTextFlags) const;
167
168     size_t memoryCost() const;
169     size_t externalMemoryCost() const;
170
171 private:
172     HTMLCanvasElement(const QualifiedName&, Document&);
173
174     void parseAttribute(const QualifiedName&, const AtomicString&) final;
175     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
176
177     bool canContainRangeEndPoint() const final;
178     bool canStartSelection() const final;
179
180     void reset();
181
182     void createImageBuffer() const;
183     void clearImageBuffer() const;
184
185     void setSurfaceSize(const IntSize&);
186     void setImageBuffer(std::unique_ptr<ImageBuffer>) const;
187     void releaseImageBufferAndContext();
188
189     bool paintsIntoCanvasBuffer() const;
190
191     bool isGPUBased() const;
192
193     HashSet<CanvasObserver*> m_observers;
194     std::unique_ptr<CanvasRenderingContext> m_context;
195
196     FloatRect m_dirtyRect;
197     IntSize m_size;
198
199     bool m_originClean { true };
200     bool m_ignoreReset { false };
201
202     bool m_usesDisplayListDrawing { false };
203     bool m_tracksDisplayListReplay { false };
204
205     mutable Lock m_imageBufferAssignmentLock;
206     
207     // m_createdImageBuffer means we tried to malloc the buffer.  We didn't necessarily get it.
208     mutable bool m_hasCreatedImageBuffer { false };
209     mutable bool m_didClearImageBuffer { false };
210     mutable std::unique_ptr<ImageBuffer> m_imageBuffer;
211     mutable std::unique_ptr<GraphicsContextStateSaver> m_contextStateSaver;
212     
213     mutable RefPtr<Image> m_presentedImage;
214     mutable RefPtr<Image> m_copiedImage; // FIXME: This is temporary for platforms that have to copy the image buffer to render (and for CSSCanvasValue).
215 };
216
217 } // namespace WebCore