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

Side by Side Diff: Source/core/html/HTMLCanvasElement.cpp

Issue 562583002: Implement image-rendering:pixelated for accelerated 2D canvases. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Sync and rebase Created 6 years 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
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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 RenderObject* HTMLCanvasElement::createRenderer(RenderStyle* style) 141 RenderObject* HTMLCanvasElement::createRenderer(RenderStyle* style)
142 { 142 {
143 LocalFrame* frame = document().frame(); 143 LocalFrame* frame = document().frame();
144 if (frame && frame->script().canExecuteScripts(NotAboutToExecuteScript)) 144 if (frame && frame->script().canExecuteScripts(NotAboutToExecuteScript))
145 return new RenderHTMLCanvas(this); 145 return new RenderHTMLCanvas(this);
146 return HTMLElement::createRenderer(style); 146 return HTMLElement::createRenderer(style);
147 } 147 }
148 148
149 void HTMLCanvasElement::didRecalcStyle(StyleRecalcChange) 149 void HTMLCanvasElement::didRecalcStyle(StyleRecalcChange)
150 { 150 {
151 SkPaint::FilterLevel filterLevel = computedStyle()->imageRendering() == Imag eRenderingPixelated ? SkPaint::kNone_FilterLevel : SkPaint::kLow_FilterLevel; 151 bool pixelated = computedStyle()->imageRendering() == ImageRenderingPixelate d;
152 SkPaint::FilterLevel filterLevel = pixelated ? SkPaint::kNone_FilterLevel : SkPaint::kLow_FilterLevel;
152 if (m_context && m_context->is3d()) { 153 if (m_context && m_context->is3d()) {
153 toWebGLRenderingContext(m_context.get())->setFilterLevel(filterLevel); 154 toWebGLRenderingContext(m_context.get())->setFilterLevel(filterLevel);
154 setNeedsCompositingUpdate(); 155 setNeedsCompositingUpdate();
155 } 156 }
157 if (hasImageBuffer()) {
158 m_imageBuffer->setFilterLevel(filterLevel);
159 m_imageBuffer->context()->setImageInterpolationQuality(pixelated ? Inter polationLow : CanvasDefaultInterpolationQuality);
esprehn 2014/12/17 23:05:19 Did you add a test that this dynamically updates?
jackhou1 2014/12/18 03:48:07 I have layout tests that cover changing the CSS pr
160 }
156 } 161 }
157 162
158 Node::InsertionNotificationRequest HTMLCanvasElement::insertedInto(ContainerNode * node) 163 Node::InsertionNotificationRequest HTMLCanvasElement::insertedInto(ContainerNode * node)
159 { 164 {
160 setIsInCanvasSubtree(true); 165 setIsInCanvasSubtree(true);
161 return HTMLElement::insertedInto(node); 166 return HTMLElement::insertedInto(node);
162 } 167 }
163 168
164 void HTMLCanvasElement::addObserver(CanvasObserver* observer) 169 void HTMLCanvasElement::addObserver(CanvasObserver* observer)
165 { 170 {
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 m_imageBufferIsClear = true; 622 m_imageBufferIsClear = true;
618 623
619 if (!canCreateImageBuffer(size())) 624 if (!canCreateImageBuffer(size()))
620 return; 625 return;
621 626
622 int msaaSampleCount; 627 int msaaSampleCount;
623 OwnPtr<ImageBufferSurface> surface = createImageBufferSurface(size(), &msaaS ampleCount); 628 OwnPtr<ImageBufferSurface> surface = createImageBufferSurface(size(), &msaaS ampleCount);
624 if (!surface->isValid()) 629 if (!surface->isValid())
625 return; 630 return;
626 631
632 document().updateRenderTreeIfNeeded();
633 RenderStyle* style = computedStyle();
634 bool pixelated = style && (style->imageRendering() == ImageRenderingPixelate d || style->imageRendering() == ImageRenderingOptimizeContrast);
635
627 m_imageBuffer = ImageBuffer::create(surface.release()); 636 m_imageBuffer = ImageBuffer::create(surface.release());
628 m_imageBuffer->setClient(this); 637 m_imageBuffer->setClient(this);
638 m_imageBuffer->setFilterLevel(pixelated ? SkPaint::kNone_FilterLevel : SkPai nt::kLow_FilterLevel);
629 639
630 m_didFailToCreateImageBuffer = false; 640 m_didFailToCreateImageBuffer = false;
631 641
632 updateExternallyAllocatedMemory(); 642 updateExternallyAllocatedMemory();
633 643
634 if (is3D()) { 644 if (is3D()) {
635 // Early out for WebGL canvases 645 // Early out for WebGL canvases
636 return; 646 return;
637 } 647 }
638 648
639 m_imageBuffer->setClient(this); 649 m_imageBuffer->setClient(this);
640 m_imageBuffer->context()->setShouldClampToSourceRect(false); 650 m_imageBuffer->context()->setShouldClampToSourceRect(false);
641 m_imageBuffer->context()->disableAntialiasingOptimizationForHairlineImages() ; 651 m_imageBuffer->context()->disableAntialiasingOptimizationForHairlineImages() ;
642 m_imageBuffer->context()->setImageInterpolationQuality(CanvasDefaultInterpol ationQuality); 652 m_imageBuffer->context()->setImageInterpolationQuality(pixelated ? Interpola tionLow : CanvasDefaultInterpolationQuality);
643 // Enabling MSAA overrides a request to disable antialiasing. This is true r egardless of whether the 653 // Enabling MSAA overrides a request to disable antialiasing. This is true r egardless of whether the
644 // rendering mode is accelerated or not. For consistency, we don't want to a pply AA in accelerated 654 // rendering mode is accelerated or not. For consistency, we don't want to a pply AA in accelerated
645 // canvases but not in unaccelerated canvases. 655 // canvases but not in unaccelerated canvases.
646 if (!msaaSampleCount && document().settings() && !document().settings()->ant ialiased2dCanvasEnabled()) 656 if (!msaaSampleCount && document().settings() && !document().settings()->ant ialiased2dCanvasEnabled())
647 m_imageBuffer->context()->setShouldAntialias(false); 657 m_imageBuffer->context()->setShouldAntialias(false);
648 // GraphicsContext's defaults don't always agree with the 2d canvas spec. 658 // GraphicsContext's defaults don't always agree with the 2d canvas spec.
649 // See CanvasRenderingContext2D::State::State() for more information. 659 // See CanvasRenderingContext2D::State::State() for more information.
650 m_imageBuffer->context()->setMiterLimit(10); 660 m_imageBuffer->context()->setMiterLimit(10);
651 m_imageBuffer->context()->setStrokeThickness(1); 661 m_imageBuffer->context()->setStrokeThickness(1);
652 #if ENABLE(ASSERT) 662 #if ENABLE(ASSERT)
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 if (!isPaintable()) { 816 if (!isPaintable()) {
807 *status = InvalidSourceImageStatus; 817 *status = InvalidSourceImageStatus;
808 return nullptr; 818 return nullptr;
809 } 819 }
810 820
811 if (!m_context) { 821 if (!m_context) {
812 *status = NormalSourceImageStatus; 822 *status = NormalSourceImageStatus;
813 return createTransparentImage(size()); 823 return createTransparentImage(size());
814 } 824 }
815 825
826 m_imageBuffer->willAccessPixels();
827
816 if (m_context->is3d()) { 828 if (m_context->is3d()) {
817 m_context->paintRenderingResultsToCanvas(BackBuffer); 829 m_context->paintRenderingResultsToCanvas(BackBuffer);
818 *status = ExternalSourceImageStatus; 830 *status = ExternalSourceImageStatus;
819 831
820 // can't create SkImage from WebGLImageBufferSurface (contains only SkBi tmap) 832 // can't create SkImage from WebGLImageBufferSurface (contains only SkBi tmap)
821 return buffer()->copyImage(DontCopyBackingStore, Unscaled); 833 return buffer()->copyImage(DontCopyBackingStore, Unscaled);
822 } 834 }
823 835
824 RefPtr<SkImage> image = buffer()->newImageSnapshot(); 836 RefPtr<SkImage> image = buffer()->newImageSnapshot();
825 if (image) { 837 if (image) {
826 *status = NormalSourceImageStatus; 838 *status = NormalSourceImageStatus;
827 return StaticBitmapImage::create(image.release()); 839 return StaticBitmapImage::create(image.release());
828 } 840 }
829 841
830 *status = InvalidSourceImageStatus; 842 *status = InvalidSourceImageStatus;
831 return nullptr; 843 return nullptr;
832 } 844 }
833 845
834 bool HTMLCanvasElement::wouldTaintOrigin(SecurityOrigin*) const 846 bool HTMLCanvasElement::wouldTaintOrigin(SecurityOrigin*) const
835 { 847 {
836 return !originClean(); 848 return !originClean();
837 } 849 }
838 850
839 FloatSize HTMLCanvasElement::sourceSize() const 851 FloatSize HTMLCanvasElement::sourceSize() const
840 { 852 {
841 return FloatSize(width(), height()); 853 return FloatSize(width(), height());
842 } 854 }
843 855
844 } 856 }
OLDNEW
« no previous file with comments | « LayoutTests/virtual/gpu/fast/canvas/pixelated-expected.txt ('k') | Source/platform/graphics/Canvas2DImageBufferSurface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698