OLD | NEW |
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 15 matching lines...) Expand all Loading... |
26 */ | 26 */ |
27 | 27 |
28 #include "sky/engine/config.h" | 28 #include "sky/engine/config.h" |
29 #include "sky/engine/core/html/HTMLCanvasElement.h" | 29 #include "sky/engine/core/html/HTMLCanvasElement.h" |
30 | 30 |
31 #include <math.h> | 31 #include <math.h> |
32 | 32 |
33 #include "base/bind.h" | 33 #include "base/bind.h" |
34 #include "gen/sky/core/HTMLNames.h" | 34 #include "gen/sky/core/HTMLNames.h" |
35 #include "gen/sky/platform/RuntimeEnabledFeatures.h" | 35 #include "gen/sky/platform/RuntimeEnabledFeatures.h" |
36 #include "sky/engine/bindings/core/v8/ExceptionMessages.h" | 36 #include "sky/engine/bindings2/exception_messages.h" |
37 #include "sky/engine/bindings/core/v8/ExceptionState.h" | 37 #include "sky/engine/bindings2/exception_state.h" |
38 #include "sky/engine/bindings/core/v8/ScriptController.h" | |
39 #include "sky/engine/core/dom/Document.h" | 38 #include "sky/engine/core/dom/Document.h" |
40 #include "sky/engine/core/dom/ExceptionCode.h" | 39 #include "sky/engine/core/dom/ExceptionCode.h" |
41 #include "sky/engine/core/dom/Microtask.h" | 40 #include "sky/engine/core/dom/Microtask.h" |
42 #include "sky/engine/core/frame/LocalFrame.h" | 41 #include "sky/engine/core/frame/LocalFrame.h" |
43 #include "sky/engine/core/frame/Settings.h" | 42 #include "sky/engine/core/frame/Settings.h" |
44 #include "sky/engine/core/html/ImageData.h" | 43 #include "sky/engine/core/html/ImageData.h" |
45 #include "sky/engine/core/html/canvas/Canvas2DContextAttributes.h" | 44 #include "sky/engine/core/html/canvas/Canvas2DContextAttributes.h" |
46 #include "sky/engine/core/html/canvas/CanvasRenderingContext2D.h" | 45 #include "sky/engine/core/html/canvas/CanvasRenderingContext2D.h" |
47 #include "sky/engine/core/html/canvas/WebGLContextAttributes.h" | 46 #include "sky/engine/core/html/canvas/WebGLContextAttributes.h" |
48 #include "sky/engine/core/html/canvas/WebGLContextEvent.h" | 47 #include "sky/engine/core/html/canvas/WebGLContextEvent.h" |
49 #include "sky/engine/core/html/canvas/WebGLRenderingContext.h" | 48 #include "sky/engine/core/html/canvas/WebGLRenderingContext.h" |
50 #include "sky/engine/core/rendering/RenderHTMLCanvas.h" | 49 #include "sky/engine/core/rendering/RenderHTMLCanvas.h" |
51 #include "sky/engine/core/rendering/RenderLayer.h" | 50 #include "sky/engine/core/rendering/RenderLayer.h" |
52 #include "sky/engine/platform/MIMETypeRegistry.h" | 51 #include "sky/engine/platform/MIMETypeRegistry.h" |
53 #include "sky/engine/platform/graphics/Canvas2DImageBufferSurface.h" | 52 #include "sky/engine/platform/graphics/Canvas2DImageBufferSurface.h" |
54 #include "sky/engine/platform/graphics/GraphicsContextStateSaver.h" | 53 #include "sky/engine/platform/graphics/GraphicsContextStateSaver.h" |
55 #include "sky/engine/platform/graphics/ImageBuffer.h" | 54 #include "sky/engine/platform/graphics/ImageBuffer.h" |
56 #include "sky/engine/platform/graphics/UnacceleratedImageBufferSurface.h" | 55 #include "sky/engine/platform/graphics/UnacceleratedImageBufferSurface.h" |
57 #include "sky/engine/platform/graphics/gpu/WebGLImageBufferSurface.h" | 56 #include "sky/engine/platform/graphics/gpu/WebGLImageBufferSurface.h" |
58 #include "sky/engine/platform/transforms/AffineTransform.h" | 57 #include "sky/engine/platform/transforms/AffineTransform.h" |
59 #include "sky/engine/public/platform/Platform.h" | 58 #include "sky/engine/public/platform/Platform.h" |
60 #include "v8/include/v8.h" | |
61 | 59 |
62 namespace blink { | 60 namespace blink { |
63 | 61 |
64 // These values come from the WhatWG spec. | 62 // These values come from the WhatWG spec. |
65 static const int DefaultWidth = 300; | 63 static const int DefaultWidth = 300; |
66 static const int DefaultHeight = 150; | 64 static const int DefaultHeight = 150; |
67 | 65 |
68 // Firefox limits width/height to 32767 pixels, but slows down dramatically befo
re it | 66 // Firefox limits width/height to 32767 pixels, but slows down dramatically befo
re it |
69 // reaches that limit. We limit by area instead, giving us larger maximum dimens
ions, | 67 // reaches that limit. We limit by area instead, giving us larger maximum dimens
ions, |
70 // in exchange for a smaller maximum canvas size. | 68 // in exchange for a smaller maximum canvas size. |
(...skipping 13 matching lines...) Expand all Loading... |
84 , m_didFailToCreateImageBuffer(false) | 82 , m_didFailToCreateImageBuffer(false) |
85 , m_didClearImageBuffer(false) | 83 , m_didClearImageBuffer(false) |
86 { | 84 { |
87 } | 85 } |
88 | 86 |
89 DEFINE_NODE_FACTORY(HTMLCanvasElement) | 87 DEFINE_NODE_FACTORY(HTMLCanvasElement) |
90 | 88 |
91 HTMLCanvasElement::~HTMLCanvasElement() | 89 HTMLCanvasElement::~HTMLCanvasElement() |
92 { | 90 { |
93 resetDirtyRect(); | 91 resetDirtyRect(); |
94 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-m_external
lyAllocatedMemory); | |
95 #if !ENABLE(OILPAN) | 92 #if !ENABLE(OILPAN) |
96 HashSet<RawPtr<CanvasObserver> >::iterator end = m_observers.end(); | 93 HashSet<RawPtr<CanvasObserver> >::iterator end = m_observers.end(); |
97 for (HashSet<RawPtr<CanvasObserver> >::iterator it = m_observers.begin(); it
!= end; ++it) | 94 for (HashSet<RawPtr<CanvasObserver> >::iterator it = m_observers.begin(); it
!= end; ++it) |
98 (*it)->canvasDestroyed(this); | 95 (*it)->canvasDestroyed(this); |
99 // Ensure these go away before the ImageBuffer. | 96 // Ensure these go away before the ImageBuffer. |
100 m_contextStateSaver.clear(); | 97 m_contextStateSaver.clear(); |
101 m_context.clear(); | 98 m_context.clear(); |
102 #endif | 99 #endif |
103 } | 100 } |
104 | 101 |
(...skipping 22 matching lines...) Expand all Loading... |
127 void HTMLCanvasElement::setHeight(int value) | 124 void HTMLCanvasElement::setHeight(int value) |
128 { | 125 { |
129 setIntegralAttribute(HTMLNames::heightAttr, value); | 126 setIntegralAttribute(HTMLNames::heightAttr, value); |
130 } | 127 } |
131 | 128 |
132 void HTMLCanvasElement::setWidth(int value) | 129 void HTMLCanvasElement::setWidth(int value) |
133 { | 130 { |
134 setIntegralAttribute(HTMLNames::widthAttr, value); | 131 setIntegralAttribute(HTMLNames::widthAttr, value); |
135 } | 132 } |
136 | 133 |
137 CanvasRenderingContext* HTMLCanvasElement::getContext(const String& type, Canvas
ContextAttributes* attrs) | 134 CanvasRenderingContext2D* HTMLCanvasElement::getContext(const String& type, Canv
asContextAttributes* attrs) |
138 { | 135 { |
139 // A Canvas can either be "2D" or "webgl" but never both. If you request a 2
D canvas and the existing | 136 // A Canvas can either be "2D" or "webgl" but never both. If you request a 2
D canvas and the existing |
140 // context is already 2D, just return that. If the existing context is WebGL
, then destroy it | 137 // context is already 2D, just return that. If the existing context is WebGL
, then destroy it |
141 // before creating a new 2D context. Vice versa when requesting a WebGL canv
as. Requesting a | 138 // before creating a new 2D context. Vice versa when requesting a WebGL canv
as. Requesting a |
142 // context with any other type string will destroy any existing context. | 139 // context with any other type string will destroy any existing context. |
143 enum ContextType { | 140 enum ContextType { |
144 // Do not change assigned numbers of existing items: add new features to
the end of the list. | 141 // Do not change assigned numbers of existing items: add new features to
the end of the list. |
145 Context2d = 0, | 142 Context2d = 0, |
146 ContextExperimentalWebgl = 2, | 143 ContextExperimentalWebgl = 2, |
147 ContextWebgl = 3, | 144 ContextWebgl = 3, |
148 ContextTypeCount, | 145 ContextTypeCount, |
149 }; | 146 }; |
150 | 147 |
151 // FIXME - The code depends on the context not going away once created, to p
revent JS from | 148 // FIXME - The code depends on the context not going away once created, to p
revent JS from |
152 // seeing a dangling pointer. So for now we will disallow the context from b
eing changed | 149 // seeing a dangling pointer. So for now we will disallow the context from b
eing changed |
153 // once it is created. | 150 // once it is created. |
154 if (type == "2d") { | 151 if (type == "2d") { |
155 if (m_context && !m_context->is2d()) | 152 if (m_context && !m_context->is2d()) |
156 return 0; | 153 return 0; |
157 if (!m_context) { | 154 if (!m_context) { |
158 blink::Platform::current()->histogramEnumeration("Canvas.ContextType
", Context2d, ContextTypeCount); | 155 blink::Platform::current()->histogramEnumeration("Canvas.ContextType
", Context2d, ContextTypeCount); |
159 m_context = CanvasRenderingContext2D::create(this, static_cast<Canva
s2DContextAttributes*>(attrs)); | 156 m_context = CanvasRenderingContext2D::create(this, static_cast<Canva
s2DContextAttributes*>(attrs)); |
160 } | 157 } |
161 return m_context.get(); | 158 return static_cast<CanvasRenderingContext2D*>(m_context.get()); |
162 } | 159 } |
163 | 160 |
164 // Accept the the provisional "experimental-webgl" or official "webgl" conte
xt ID. | 161 // Accept the the provisional "experimental-webgl" or official "webgl" conte
xt ID. |
165 if (type == "webgl" || type == "experimental-webgl") { | 162 // if (type == "webgl" || type == "experimental-webgl") { |
166 ContextType contextType = (type == "webgl") ? ContextWebgl : ContextExpe
rimentalWebgl; | 163 // ContextType contextType = (type == "webgl") ? ContextWebgl : ContextE
xperimentalWebgl; |
167 if (!m_context) { | 164 // if (!m_context) { |
168 blink::Platform::current()->histogramEnumeration("Canvas.ContextType
", contextType, ContextTypeCount); | 165 // blink::Platform::current()->histogramEnumeration("Canvas.ContextT
ype", contextType, ContextTypeCount); |
169 m_context = WebGLRenderingContext::create(this, static_cast<WebGLCon
textAttributes*>(attrs)); | 166 // m_context = WebGLRenderingContext::create(this, static_cast<WebGL
ContextAttributes*>(attrs)); |
170 updateExternallyAllocatedMemory(); | 167 // updateExternallyAllocatedMemory(); |
171 } else if (!m_context->is3d()) { | 168 // } else if (!m_context->is3d()) { |
172 dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcontext
creationerror, false, true, "Canvas has an existing, non-WebGL context")); | 169 // dispatchEvent(WebGLContextEvent::create(EventTypeNames::webglcont
extcreationerror, false, true, "Canvas has an existing, non-WebGL context")); |
173 return 0; | 170 // return 0; |
174 } | 171 // } |
175 return m_context.get(); | 172 // return m_context.get(); |
176 } | 173 // } |
177 | 174 |
178 return 0; | 175 return nullptr; |
179 } | 176 } |
180 | 177 |
181 void HTMLCanvasElement::didDraw(const FloatRect& rect) | 178 void HTMLCanvasElement::didDraw(const FloatRect& rect) |
182 { | 179 { |
183 if (rect.isEmpty()) | 180 if (rect.isEmpty()) |
184 return; | 181 return; |
185 clearCopiedImage(); | 182 clearCopiedImage(); |
186 if (m_dirtyRect.isEmpty()) { | 183 if (m_dirtyRect.isEmpty()) { |
187 m_finalizeFrameTask.Reset(base::Bind( | 184 m_finalizeFrameTask.Reset(base::Bind( |
188 &HTMLCanvasElement::finalizeFrameMicrotask, base::Unretained(this)))
; | 185 &HTMLCanvasElement::finalizeFrameMicrotask, base::Unretained(this)))
; |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 bufferCount++; | 524 bufferCount++; |
528 | 525 |
529 Checked<intptr_t, RecordOverflow> checkedExternallyAllocatedMemory = 4 * buf
ferCount; | 526 Checked<intptr_t, RecordOverflow> checkedExternallyAllocatedMemory = 4 * buf
ferCount; |
530 checkedExternallyAllocatedMemory *= width(); | 527 checkedExternallyAllocatedMemory *= width(); |
531 checkedExternallyAllocatedMemory *= height(); | 528 checkedExternallyAllocatedMemory *= height(); |
532 intptr_t externallyAllocatedMemory; | 529 intptr_t externallyAllocatedMemory; |
533 if (checkedExternallyAllocatedMemory.safeGet(externallyAllocatedMemory) == C
heckedState::DidOverflow) | 530 if (checkedExternallyAllocatedMemory.safeGet(externallyAllocatedMemory) == C
heckedState::DidOverflow) |
534 externallyAllocatedMemory = std::numeric_limits<intptr_t>::max(); | 531 externallyAllocatedMemory = std::numeric_limits<intptr_t>::max(); |
535 | 532 |
536 // Subtracting two intptr_t that are known to be positive will never underfl
ow. | 533 // Subtracting two intptr_t that are known to be positive will never underfl
ow. |
537 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(externallyA
llocatedMemory - m_externallyAllocatedMemory); | |
538 m_externallyAllocatedMemory = externallyAllocatedMemory; | 534 m_externallyAllocatedMemory = externallyAllocatedMemory; |
539 } | 535 } |
540 | 536 |
541 GraphicsContext* HTMLCanvasElement::drawingContext() const | 537 GraphicsContext* HTMLCanvasElement::drawingContext() const |
542 { | 538 { |
543 return buffer() ? m_imageBuffer->context() : 0; | 539 return buffer() ? m_imageBuffer->context() : 0; |
544 } | 540 } |
545 | 541 |
546 GraphicsContext* HTMLCanvasElement::existingDrawingContext() const | 542 GraphicsContext* HTMLCanvasElement::existingDrawingContext() const |
547 { | 543 { |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
650 } | 646 } |
651 return m_imageBuffer->copyImage(DontCopyBackingStore, Unscaled); | 647 return m_imageBuffer->copyImage(DontCopyBackingStore, Unscaled); |
652 } | 648 } |
653 | 649 |
654 FloatSize HTMLCanvasElement::sourceSize() const | 650 FloatSize HTMLCanvasElement::sourceSize() const |
655 { | 651 { |
656 return FloatSize(width(), height()); | 652 return FloatSize(width(), height()); |
657 } | 653 } |
658 | 654 |
659 } | 655 } |
OLD | NEW |