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 16 matching lines...) Expand all Loading... | |
27 | 27 |
28 #include "config.h" | 28 #include "config.h" |
29 #include "core/html/HTMLCanvasElement.h" | 29 #include "core/html/HTMLCanvasElement.h" |
30 | 30 |
31 #include "bindings/core/v8/ExceptionMessages.h" | 31 #include "bindings/core/v8/ExceptionMessages.h" |
32 #include "bindings/core/v8/ExceptionState.h" | 32 #include "bindings/core/v8/ExceptionState.h" |
33 #include "bindings/core/v8/ScriptController.h" | 33 #include "bindings/core/v8/ScriptController.h" |
34 #include "core/HTMLNames.h" | 34 #include "core/HTMLNames.h" |
35 #include "core/dom/Document.h" | 35 #include "core/dom/Document.h" |
36 #include "core/dom/ExceptionCode.h" | 36 #include "core/dom/ExceptionCode.h" |
37 #include "core/dom/NodeRenderStyle.h" | |
37 #include "core/frame/LocalFrame.h" | 38 #include "core/frame/LocalFrame.h" |
38 #include "core/frame/Settings.h" | 39 #include "core/frame/Settings.h" |
39 #include "core/html/ImageData.h" | 40 #include "core/html/ImageData.h" |
40 #include "core/html/canvas/Canvas2DContextAttributes.h" | 41 #include "core/html/canvas/Canvas2DContextAttributes.h" |
41 #include "core/html/canvas/CanvasRenderingContext2D.h" | 42 #include "core/html/canvas/CanvasRenderingContext2D.h" |
42 #include "core/html/canvas/WebGLContextAttributes.h" | 43 #include "core/html/canvas/WebGLContextAttributes.h" |
43 #include "core/html/canvas/WebGLContextEvent.h" | 44 #include "core/html/canvas/WebGLContextEvent.h" |
44 #include "core/html/canvas/WebGLRenderingContext.h" | 45 #include "core/html/canvas/WebGLRenderingContext.h" |
45 #include "core/rendering/RenderHTMLCanvas.h" | 46 #include "core/rendering/RenderHTMLCanvas.h" |
46 #include "core/rendering/RenderLayer.h" | 47 #include "core/rendering/RenderLayer.h" |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
105 : HTMLElement(canvasTag, document) | 106 : HTMLElement(canvasTag, document) |
106 , DocumentVisibilityObserver(document) | 107 , DocumentVisibilityObserver(document) |
107 , m_size(DefaultWidth, DefaultHeight) | 108 , m_size(DefaultWidth, DefaultHeight) |
108 , m_ignoreReset(false) | 109 , m_ignoreReset(false) |
109 , m_accelerationDisabled(false) | 110 , m_accelerationDisabled(false) |
110 , m_externallyAllocatedMemory(0) | 111 , m_externallyAllocatedMemory(0) |
111 , m_originClean(true) | 112 , m_originClean(true) |
112 , m_didFailToCreateImageBuffer(false) | 113 , m_didFailToCreateImageBuffer(false) |
113 , m_imageBufferIsClear(false) | 114 , m_imageBufferIsClear(false) |
114 { | 115 { |
116 setHasCustomStyleCallbacks(); | |
115 } | 117 } |
116 | 118 |
117 DEFINE_NODE_FACTORY(HTMLCanvasElement) | 119 DEFINE_NODE_FACTORY(HTMLCanvasElement) |
118 | 120 |
119 HTMLCanvasElement::~HTMLCanvasElement() | 121 HTMLCanvasElement::~HTMLCanvasElement() |
120 { | 122 { |
121 resetDirtyRect(); | 123 resetDirtyRect(); |
122 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-m_external lyAllocatedMemory); | 124 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-m_external lyAllocatedMemory); |
123 #if !ENABLE(OILPAN) | 125 #if !ENABLE(OILPAN) |
124 for (CanvasObserver* canvasObserver : m_observers) | 126 for (CanvasObserver* canvasObserver : m_observers) |
125 canvasObserver->canvasDestroyed(this); | 127 canvasObserver->canvasDestroyed(this); |
126 // Ensure these go away before the ImageBuffer. | 128 // Ensure these go away before the ImageBuffer. |
127 m_contextStateSaver.clear(); | 129 m_contextStateSaver.clear(); |
128 m_context.clear(); | 130 m_context.clear(); |
129 #endif | 131 #endif |
130 } | 132 } |
131 | 133 |
132 void HTMLCanvasElement::parseAttribute(const QualifiedName& name, const AtomicSt ring& value) | 134 void HTMLCanvasElement::parseAttribute(const QualifiedName& name, const AtomicSt ring& value) |
133 { | 135 { |
134 if (name == widthAttr || name == heightAttr) | 136 if (name == widthAttr || name == heightAttr) |
135 reset(); | 137 reset(); |
136 HTMLElement::parseAttribute(name, value); | 138 HTMLElement::parseAttribute(name, value); |
137 } | 139 } |
138 | 140 |
139 RenderObject* HTMLCanvasElement::createRenderer(RenderStyle* style) | 141 RenderObject* HTMLCanvasElement::createRenderer(RenderStyle* style) |
140 { | 142 { |
143 if (hasImageBuffer()) | |
144 m_imageBuffer->setFilterLevel(style->imageRendering() == ImageRenderingP ixelated ? SkPaint::kNone_FilterLevel : SkPaint::kLow_FilterLevel); | |
141 LocalFrame* frame = document().frame(); | 145 LocalFrame* frame = document().frame(); |
142 if (frame && frame->script().canExecuteScripts(NotAboutToExecuteScript)) | 146 if (frame && frame->script().canExecuteScripts(NotAboutToExecuteScript)) |
143 return new RenderHTMLCanvas(this); | 147 return new RenderHTMLCanvas(this); |
144 return HTMLElement::createRenderer(style); | 148 return HTMLElement::createRenderer(style); |
145 } | 149 } |
146 | 150 |
151 void HTMLCanvasElement::didRecalcStyle(StyleRecalcChange) | |
152 { | |
153 if (!hasImageBuffer()) | |
154 return; | |
155 m_imageBuffer->setFilterLevel(renderStyle()->imageRendering() == ImageRender ingPixelated ? SkPaint::kNone_FilterLevel : SkPaint::kLow_FilterLevel); | |
Justin Novosad
2014/12/04 15:27:07
This seems wrong to me. We should always use the c
jackhou1
2014/12/05 02:00:58
Done.
| |
156 } | |
157 | |
147 Node::InsertionNotificationRequest HTMLCanvasElement::insertedInto(ContainerNode * node) | 158 Node::InsertionNotificationRequest HTMLCanvasElement::insertedInto(ContainerNode * node) |
148 { | 159 { |
149 setIsInCanvasSubtree(true); | 160 setIsInCanvasSubtree(true); |
150 return HTMLElement::insertedInto(node); | 161 return HTMLElement::insertedInto(node); |
151 } | 162 } |
152 | 163 |
153 void HTMLCanvasElement::addObserver(CanvasObserver* observer) | 164 void HTMLCanvasElement::addObserver(CanvasObserver* observer) |
154 { | 165 { |
155 m_observers.add(observer); | 166 m_observers.add(observer); |
156 } | 167 } |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
586 m_imageBufferIsClear = true; | 597 m_imageBufferIsClear = true; |
587 | 598 |
588 if (!canCreateImageBuffer(size())) | 599 if (!canCreateImageBuffer(size())) |
589 return; | 600 return; |
590 | 601 |
591 int msaaSampleCount; | 602 int msaaSampleCount; |
592 OwnPtr<ImageBufferSurface> surface = createImageBufferSurface(size(), &msaaS ampleCount); | 603 OwnPtr<ImageBufferSurface> surface = createImageBufferSurface(size(), &msaaS ampleCount); |
593 if (!surface->isValid()) | 604 if (!surface->isValid()) |
594 return; | 605 return; |
595 | 606 |
607 RenderStyle* style = renderStyle(); | |
Justin Novosad
2014/12/04 15:27:07
Same thing here
jackhou1
2014/12/05 02:00:58
Done.
| |
608 bool pixelated = style && (style->imageRendering() == ImageRenderingPixelate d || style->imageRendering() == ImageRenderingOptimizeContrast); | |
609 | |
596 m_imageBuffer = ImageBuffer::create(surface.release()); | 610 m_imageBuffer = ImageBuffer::create(surface.release()); |
597 m_imageBuffer->setClient(this); | 611 m_imageBuffer->setClient(this); |
612 m_imageBuffer->setFilterLevel(pixelated ? SkPaint::kNone_FilterLevel : SkPai nt::kLow_FilterLevel); | |
598 | 613 |
599 m_didFailToCreateImageBuffer = false; | 614 m_didFailToCreateImageBuffer = false; |
600 | 615 |
601 updateExternallyAllocatedMemory(); | 616 updateExternallyAllocatedMemory(); |
602 | 617 |
603 if (is3D()) { | 618 if (is3D()) { |
604 // Early out for WebGL canvases | 619 // Early out for WebGL canvases |
605 return; | 620 return; |
606 } | 621 } |
607 | 622 |
608 m_imageBuffer->setClient(this); | 623 m_imageBuffer->setClient(this); |
609 m_imageBuffer->context()->setShouldClampToSourceRect(false); | 624 m_imageBuffer->context()->setShouldClampToSourceRect(false); |
610 m_imageBuffer->context()->disableAntialiasingOptimizationForHairlineImages() ; | 625 m_imageBuffer->context()->disableAntialiasingOptimizationForHairlineImages() ; |
611 m_imageBuffer->context()->setImageInterpolationQuality(CanvasDefaultInterpol ationQuality); | 626 m_imageBuffer->context()->setImageInterpolationQuality(pixelated ? Interpola tionLow : CanvasDefaultInterpolationQuality); |
612 // Enabling MSAA overrides a request to disable antialiasing. This is true r egardless of whether the | 627 // Enabling MSAA overrides a request to disable antialiasing. This is true r egardless of whether the |
613 // rendering mode is accelerated or not. For consistency, we don't want to a pply AA in accelerated | 628 // rendering mode is accelerated or not. For consistency, we don't want to a pply AA in accelerated |
614 // canvases but not in unaccelerated canvases. | 629 // canvases but not in unaccelerated canvases. |
615 if (!msaaSampleCount && document().settings() && !document().settings()->ant ialiased2dCanvasEnabled()) | 630 if (!msaaSampleCount && document().settings() && !document().settings()->ant ialiased2dCanvasEnabled()) |
616 m_imageBuffer->context()->setShouldAntialias(false); | 631 m_imageBuffer->context()->setShouldAntialias(false); |
617 // GraphicsContext's defaults don't always agree with the 2d canvas spec. | 632 // GraphicsContext's defaults don't always agree with the 2d canvas spec. |
618 // See CanvasRenderingContext2D::State::State() for more information. | 633 // See CanvasRenderingContext2D::State::State() for more information. |
619 m_imageBuffer->context()->setMiterLimit(10); | 634 m_imageBuffer->context()->setMiterLimit(10); |
620 m_imageBuffer->context()->setStrokeThickness(1); | 635 m_imageBuffer->context()->setStrokeThickness(1); |
621 #if ENABLE(ASSERT) | 636 #if ENABLE(ASSERT) |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
772 if (!isPaintable()) { | 787 if (!isPaintable()) { |
773 *status = InvalidSourceImageStatus; | 788 *status = InvalidSourceImageStatus; |
774 return nullptr; | 789 return nullptr; |
775 } | 790 } |
776 | 791 |
777 if (!m_context) { | 792 if (!m_context) { |
778 *status = NormalSourceImageStatus; | 793 *status = NormalSourceImageStatus; |
779 return createTransparentImage(size()); | 794 return createTransparentImage(size()); |
780 } | 795 } |
781 | 796 |
797 m_imageBuffer->willAccessPixels(); | |
798 | |
782 if (m_context->is3d()) { | 799 if (m_context->is3d()) { |
783 m_context->paintRenderingResultsToCanvas(BackBuffer); | 800 m_context->paintRenderingResultsToCanvas(BackBuffer); |
784 *status = ExternalSourceImageStatus; | 801 *status = ExternalSourceImageStatus; |
785 | 802 |
786 // can't create SkImage from WebGLImageBufferSurface (contains only SkBi tmap) | 803 // can't create SkImage from WebGLImageBufferSurface (contains only SkBi tmap) |
787 return buffer()->copyImage(DontCopyBackingStore, Unscaled); | 804 return buffer()->copyImage(DontCopyBackingStore, Unscaled); |
788 } | 805 } |
789 | 806 |
790 RefPtr<SkImage> image = buffer()->newImageSnapshot(); | 807 RefPtr<SkImage> image = buffer()->newImageSnapshot(); |
791 if (image) { | 808 if (image) { |
792 *status = NormalSourceImageStatus; | 809 *status = NormalSourceImageStatus; |
793 return StaticBitmapImage::create(image.release()); | 810 return StaticBitmapImage::create(image.release()); |
794 } | 811 } |
795 | 812 |
796 *status = InvalidSourceImageStatus; | 813 *status = InvalidSourceImageStatus; |
797 return nullptr; | 814 return nullptr; |
798 } | 815 } |
799 | 816 |
800 bool HTMLCanvasElement::wouldTaintOrigin(SecurityOrigin*) const | 817 bool HTMLCanvasElement::wouldTaintOrigin(SecurityOrigin*) const |
801 { | 818 { |
802 return !originClean(); | 819 return !originClean(); |
803 } | 820 } |
804 | 821 |
805 FloatSize HTMLCanvasElement::sourceSize() const | 822 FloatSize HTMLCanvasElement::sourceSize() const |
806 { | 823 { |
807 return FloatSize(width(), height()); | 824 return FloatSize(width(), height()); |
808 } | 825 } |
809 | 826 |
810 } | 827 } |
OLD | NEW |