Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(235)

Side by Side Diff: WebCore/html/HTMLCanvasElement.cpp

Issue 6150004: Merge 75007 - Merge 73927 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/597/
Patch Set: Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « WebCore/html/HTMLCanvasElement.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved. 2 * Copyright (C) 2004, 2006, 2007 Apple Inc. All rights reserved.
3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> 3 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. 4 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 // Firefox limits width/height to 32767 pixels, but slows down dramatically befo re it 64 // Firefox limits width/height to 32767 pixels, but slows down dramatically befo re it
65 // reaches that limit. We limit by area instead, giving us larger maximum dimens ions, 65 // reaches that limit. We limit by area instead, giving us larger maximum dimens ions,
66 // in exchange for a smaller maximum canvas size. 66 // in exchange for a smaller maximum canvas size.
67 static const float MaxCanvasArea = 32768 * 8192; // Maximum canvas area in CSS p ixels 67 static const float MaxCanvasArea = 32768 * 8192; // Maximum canvas area in CSS p ixels
68 68
69 //In Skia, we will also limit width/height to 32767. 69 //In Skia, we will also limit width/height to 32767.
70 static const float MaxSkiaDim = 32767.0F; // Maximum width/height in CSS pixels. 70 static const float MaxSkiaDim = 32767.0F; // Maximum width/height in CSS pixels.
71 71
72 HTMLCanvasElement::HTMLCanvasElement(const QualifiedName& tagName, Document* doc ument) 72 HTMLCanvasElement::HTMLCanvasElement(const QualifiedName& tagName, Document* doc ument)
73 : HTMLElement(tagName, document) 73 : HTMLElement(tagName, document)
74 , m_observer(0)
75 , m_size(DefaultWidth, DefaultHeight) 74 , m_size(DefaultWidth, DefaultHeight)
76 , m_ignoreReset(false) 75 , m_ignoreReset(false)
77 , m_pageScaleFactor(document->frame() ? document->frame()->page()->chrome()- >scaleFactor() : 1) 76 , m_pageScaleFactor(document->frame() ? document->frame()->page()->chrome()- >scaleFactor() : 1)
78 , m_originClean(true) 77 , m_originClean(true)
79 , m_hasCreatedImageBuffer(false) 78 , m_hasCreatedImageBuffer(false)
80 { 79 {
81 ASSERT(hasTagName(canvasTag)); 80 ASSERT(hasTagName(canvasTag));
82 } 81 }
83 82
84 PassRefPtr<HTMLCanvasElement> HTMLCanvasElement::create(Document* document) 83 PassRefPtr<HTMLCanvasElement> HTMLCanvasElement::create(Document* document)
85 { 84 {
86 return adoptRef(new HTMLCanvasElement(canvasTag, document)); 85 return adoptRef(new HTMLCanvasElement(canvasTag, document));
87 } 86 }
88 87
89 PassRefPtr<HTMLCanvasElement> HTMLCanvasElement::create(const QualifiedName& tag Name, Document* document) 88 PassRefPtr<HTMLCanvasElement> HTMLCanvasElement::create(const QualifiedName& tag Name, Document* document)
90 { 89 {
91 return adoptRef(new HTMLCanvasElement(tagName, document)); 90 return adoptRef(new HTMLCanvasElement(tagName, document));
92 } 91 }
93 92
94 HTMLCanvasElement::~HTMLCanvasElement() 93 HTMLCanvasElement::~HTMLCanvasElement()
95 { 94 {
96 if (m_observer) 95 HashSet<CanvasObserver*>::iterator end = m_observers.end();
97 m_observer->canvasDestroyed(this); 96 for (HashSet<CanvasObserver*>::iterator it = m_observers.begin(); it != end; ++it)
97 (*it)->canvasDestroyed(this);
98 } 98 }
99 99
100 void HTMLCanvasElement::parseMappedAttribute(Attribute* attr) 100 void HTMLCanvasElement::parseMappedAttribute(Attribute* attr)
101 { 101 {
102 const QualifiedName& attrName = attr->name(); 102 const QualifiedName& attrName = attr->name();
103 if (attrName == widthAttr || attrName == heightAttr) 103 if (attrName == widthAttr || attrName == heightAttr)
104 reset(); 104 reset();
105 HTMLElement::parseMappedAttribute(attr); 105 HTMLElement::parseMappedAttribute(attr);
106 } 106 }
107 107
108 RenderObject* HTMLCanvasElement::createRenderer(RenderArena* arena, RenderStyle* style) 108 RenderObject* HTMLCanvasElement::createRenderer(RenderArena* arena, RenderStyle* style)
109 { 109 {
110 Frame* frame = document()->frame(); 110 Frame* frame = document()->frame();
111 if (frame && frame->script()->canExecuteScripts(NotAboutToExecuteScript)) { 111 if (frame && frame->script()->canExecuteScripts(NotAboutToExecuteScript)) {
112 m_rendererIsCanvas = true; 112 m_rendererIsCanvas = true;
113 return new (arena) RenderHTMLCanvas(this); 113 return new (arena) RenderHTMLCanvas(this);
114 } 114 }
115 115
116 m_rendererIsCanvas = false; 116 m_rendererIsCanvas = false;
117 return HTMLElement::createRenderer(arena, style); 117 return HTMLElement::createRenderer(arena, style);
118 } 118 }
119 119
120 void HTMLCanvasElement::addObserver(CanvasObserver* observer)
121 {
122 m_observers.add(observer);
123 }
124
125 void HTMLCanvasElement::removeObserver(CanvasObserver* observer)
126 {
127 m_observers.remove(observer);
128 }
129
120 void HTMLCanvasElement::setHeight(int value) 130 void HTMLCanvasElement::setHeight(int value)
121 { 131 {
122 setAttribute(heightAttr, String::number(value)); 132 setAttribute(heightAttr, String::number(value));
123 } 133 }
124 134
125 void HTMLCanvasElement::setWidth(int value) 135 void HTMLCanvasElement::setWidth(int value)
126 { 136 {
127 setAttribute(widthAttr, String::number(value)); 137 setAttribute(widthAttr, String::number(value));
128 } 138 }
129 139
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 FloatRect destRect = ro->contentBoxRect(); 203 FloatRect destRect = ro->contentBoxRect();
194 FloatRect r = mapRect(rect, FloatRect(0, 0, size().width(), size().heigh t()), destRect); 204 FloatRect r = mapRect(rect, FloatRect(0, 0, size().width(), size().heigh t()), destRect);
195 r.intersect(destRect); 205 r.intersect(destRect);
196 if (r.isEmpty() || m_dirtyRect.contains(r)) 206 if (r.isEmpty() || m_dirtyRect.contains(r))
197 return; 207 return;
198 208
199 m_dirtyRect.unite(r); 209 m_dirtyRect.unite(r);
200 ro->repaintRectangle(enclosingIntRect(m_dirtyRect)); 210 ro->repaintRectangle(enclosingIntRect(m_dirtyRect));
201 } 211 }
202 212
203 if (m_observer) 213 HashSet<CanvasObserver*>::iterator end = m_observers.end();
204 m_observer->canvasChanged(this, rect); 214 for (HashSet<CanvasObserver*>::iterator it = m_observers.begin(); it != end; ++it)
215 (*it)->canvasChanged(this, rect);
205 } 216 }
206 217
207 void HTMLCanvasElement::reset() 218 void HTMLCanvasElement::reset()
208 { 219 {
209 if (m_ignoreReset) 220 if (m_ignoreReset)
210 return; 221 return;
211 222
212 bool ok; 223 bool ok;
213 bool hadImageBuffer = hasCreatedImageBuffer(); 224 bool hadImageBuffer = hasCreatedImageBuffer();
214 int w = getAttribute(widthAttr).toInt(&ok); 225 int w = getAttribute(widthAttr).toInt(&ok);
(...skipping 16 matching lines...) Expand all
231 242
232 if (RenderObject* renderer = this->renderer()) { 243 if (RenderObject* renderer = this->renderer()) {
233 if (m_rendererIsCanvas) { 244 if (m_rendererIsCanvas) {
234 if (oldSize != size()) 245 if (oldSize != size())
235 toRenderHTMLCanvas(renderer)->canvasSizeChanged(); 246 toRenderHTMLCanvas(renderer)->canvasSizeChanged();
236 if (hadImageBuffer) 247 if (hadImageBuffer)
237 renderer->repaint(); 248 renderer->repaint();
238 } 249 }
239 } 250 }
240 251
241 if (m_observer) 252 HashSet<CanvasObserver*>::iterator end = m_observers.end();
242 m_observer->canvasResized(this); 253 for (HashSet<CanvasObserver*>::iterator it = m_observers.begin(); it != end; ++it)
254 (*it)->canvasResized(this);
243 } 255 }
244 256
245 void HTMLCanvasElement::paint(GraphicsContext* context, const IntRect& r) 257 void HTMLCanvasElement::paint(GraphicsContext* context, const IntRect& r)
246 { 258 {
247 // Clear the dirty rect 259 // Clear the dirty rect
248 m_dirtyRect = FloatRect(); 260 m_dirtyRect = FloatRect();
249 261
250 if (context->paintingDisabled()) 262 if (context->paintingDisabled())
251 return; 263 return;
252 264
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 FloatSize unscaledSize(width(), height()); 428 FloatSize unscaledSize(width(), height());
417 IntSize size = convertLogicalToDevice(unscaledSize); 429 IntSize size = convertLogicalToDevice(unscaledSize);
418 AffineTransform transform; 430 AffineTransform transform;
419 if (size.width() && size.height()) 431 if (size.width() && size.height())
420 transform.scaleNonUniform(size.width() / unscaledSize.width(), size.heig ht() / unscaledSize.height()); 432 transform.scaleNonUniform(size.width() / unscaledSize.width(), size.heig ht() / unscaledSize.height());
421 transform.multiply(m_imageBuffer->baseTransform()); 433 transform.multiply(m_imageBuffer->baseTransform());
422 return transform; 434 return transform;
423 } 435 }
424 436
425 } 437 }
OLDNEW
« no previous file with comments | « WebCore/html/HTMLCanvasElement.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698