f3ec75ad2619075a683ad8ec9d753924d84b95f5
[WebKit-https.git] / WebCore / html / HTMLCanvasElement.cpp
1 /*
2  * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "HTMLCanvasElement.h"
28
29 #include "CanvasGradient.h"
30 #include "CanvasPattern.h"
31 #include "CanvasRenderingContext2D.h"
32 #include "CanvasStyle.h"
33 #include "HTMLNames.h"
34 #include "RenderHTMLCanvas.h"
35
36 namespace WebCore {
37
38 using namespace HTMLNames;
39
40 HTMLCanvasElement::HTMLCanvasElement(Document *doc)
41     : HTMLImageElement(canvasTag, doc), m_2DContext(0)
42 {
43 }
44
45 HTMLCanvasElement::~HTMLCanvasElement()
46 {
47     if (m_2DContext)
48         m_2DContext->detachCanvas();
49 }
50
51 bool HTMLCanvasElement::mapToEntry(const QualifiedName& attrName, MappedAttributeEntry& result) const
52 {
53     if (attrName != srcAttr) // Ignore the src attribute
54         return HTMLImageElement::mapToEntry(attrName, result);
55     return false;
56 }
57
58 void HTMLCanvasElement::parseMappedAttribute(MappedAttribute *attr)
59 {
60     if (attr->name() != srcAttr) // Canvas ignores the src attribute
61         HTMLImageElement::parseMappedAttribute(attr);
62 }
63
64 RenderObject *HTMLCanvasElement::createRenderer(RenderArena *arena, RenderStyle *style)
65 {
66 #if __APPLE__
67     return new (arena) RenderHTMLCanvas(this);
68 #else
69     return 0;
70 #endif
71 }
72
73 void HTMLCanvasElement::attach()
74 {
75     // Don't want to call image's attach().
76     HTMLElement::attach();
77 }
78
79 void HTMLCanvasElement::detach()
80 {
81     // Don't want to call image's detach().
82     HTMLElement::detach();
83
84     if (m_2DContext)
85         m_2DContext->reset();
86 }
87
88 bool HTMLCanvasElement::isURLAttribute(Attribute *attr) const
89 {
90     return ((attr->name() == usemapAttr && attr->value().domString()[0] != '#'));
91 }
92
93 CanvasRenderingContext* HTMLCanvasElement::getContext(const String& type)
94 {
95     // FIXME: Web Applications 1.0 says "2d" only, but the code here matches historical behavior of WebKit.
96     if (type.isNull() || type == "2d" || type == "2D") {
97         if (!m_2DContext)
98             m_2DContext = new CanvasRenderingContext2D(this);
99         return m_2DContext.get();
100     }
101     return 0;
102 }
103
104 IntSize HTMLCanvasElement::size() const
105 {
106     RenderHTMLCanvas* canvasRenderer = static_cast<RenderHTMLCanvas*>(renderer());
107     if (!canvasRenderer)
108         return IntSize();
109 #if __APPLE__
110     if (CGContextRef context = canvasRenderer->drawingContext())
111         return IntSize(CGBitmapContextGetWidth(context), CGBitmapContextGetHeight(context));
112 #endif
113     return IntSize();
114 }
115
116 #if __APPLE__
117
118 CGImageRef HTMLCanvasElement::createPlatformImage() const
119 {
120     RenderHTMLCanvas* canvasRenderer = static_cast<RenderHTMLCanvas*>(renderer());
121     if (!canvasRenderer)
122         return 0;
123     CGContextRef context = canvasRenderer->drawingContext();
124     if (!context)
125         return 0;
126     return CGBitmapContextCreateImage(context);
127 }
128
129 #endif
130
131 }