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

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. Remove test expectations. 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 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 SkPaint::FilterLevel filterLevel = computedStyle()->imageRendering() == Imag eRenderingPixelated ? SkPaint::kNone_FilterLevel : SkPaint::kLow_FilterLevel;
152 if (m_context && m_context->is3d()) { 152 if (m_context && m_context->is3d()) {
153 toWebGLRenderingContext(m_context.get())->setFilterLevel(filterLevel); 153 toWebGLRenderingContext(m_context.get())->setFilterLevel(filterLevel);
154 setNeedsCompositingUpdate(); 154 setNeedsCompositingUpdate();
155 } 155 }
156 if (hasImageBuffer())
157 m_imageBuffer->setFilterLevel(filterLevel);
156 } 158 }
157 159
158 Node::InsertionNotificationRequest HTMLCanvasElement::insertedInto(ContainerNode * node) 160 Node::InsertionNotificationRequest HTMLCanvasElement::insertedInto(ContainerNode * node)
159 { 161 {
160 setIsInCanvasSubtree(true); 162 setIsInCanvasSubtree(true);
161 return HTMLElement::insertedInto(node); 163 return HTMLElement::insertedInto(node);
162 } 164 }
163 165
164 void HTMLCanvasElement::addObserver(CanvasObserver* observer) 166 void HTMLCanvasElement::addObserver(CanvasObserver* observer)
165 { 167 {
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 m_imageBufferIsClear = true; 619 m_imageBufferIsClear = true;
618 620
619 if (!canCreateImageBuffer(size())) 621 if (!canCreateImageBuffer(size()))
620 return; 622 return;
621 623
622 int msaaSampleCount; 624 int msaaSampleCount;
623 OwnPtr<ImageBufferSurface> surface = createImageBufferSurface(size(), &msaaS ampleCount); 625 OwnPtr<ImageBufferSurface> surface = createImageBufferSurface(size(), &msaaS ampleCount);
624 if (!surface->isValid()) 626 if (!surface->isValid())
625 return; 627 return;
626 628
629 document().updateRenderTreeIfNeeded();
630 RenderStyle* style = computedStyle();
631 bool pixelated = style && (style->imageRendering() == ImageRenderingPixelate d || style->imageRendering() == ImageRenderingOptimizeContrast);
632
627 m_imageBuffer = ImageBuffer::create(surface.release()); 633 m_imageBuffer = ImageBuffer::create(surface.release());
628 m_imageBuffer->setClient(this); 634 m_imageBuffer->setClient(this);
635 m_imageBuffer->setFilterLevel(pixelated ? SkPaint::kNone_FilterLevel : SkPai nt::kLow_FilterLevel);
esprehn 2014/12/16 19:22:32 You don't need this line or the bool pixelated or
jackhou1 2014/12/17 01:28:09 This is what I tried earlier but it didn't work. I
629 636
630 m_didFailToCreateImageBuffer = false; 637 m_didFailToCreateImageBuffer = false;
631 638
632 updateExternallyAllocatedMemory(); 639 updateExternallyAllocatedMemory();
633 640
634 if (is3D()) { 641 if (is3D()) {
635 // Early out for WebGL canvases 642 // Early out for WebGL canvases
636 return; 643 return;
637 } 644 }
638 645
639 m_imageBuffer->setClient(this); 646 m_imageBuffer->setClient(this);
640 m_imageBuffer->context()->setShouldClampToSourceRect(false); 647 m_imageBuffer->context()->setShouldClampToSourceRect(false);
641 m_imageBuffer->context()->disableAntialiasingOptimizationForHairlineImages() ; 648 m_imageBuffer->context()->disableAntialiasingOptimizationForHairlineImages() ;
642 m_imageBuffer->context()->setImageInterpolationQuality(CanvasDefaultInterpol ationQuality); 649 m_imageBuffer->context()->setImageInterpolationQuality(pixelated ? Interpola tionLow : CanvasDefaultInterpolationQuality);
esprehn 2014/12/16 19:22:32 Doesn't this need to be dynamically updated in wil
jackhou1 2014/12/17 01:28:09 Done.
643 // Enabling MSAA overrides a request to disable antialiasing. This is true r egardless of whether the 650 // 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 651 // 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. 652 // canvases but not in unaccelerated canvases.
646 if (!msaaSampleCount && document().settings() && !document().settings()->ant ialiased2dCanvasEnabled()) 653 if (!msaaSampleCount && document().settings() && !document().settings()->ant ialiased2dCanvasEnabled())
647 m_imageBuffer->context()->setShouldAntialias(false); 654 m_imageBuffer->context()->setShouldAntialias(false);
648 // GraphicsContext's defaults don't always agree with the 2d canvas spec. 655 // GraphicsContext's defaults don't always agree with the 2d canvas spec.
649 // See CanvasRenderingContext2D::State::State() for more information. 656 // See CanvasRenderingContext2D::State::State() for more information.
650 m_imageBuffer->context()->setMiterLimit(10); 657 m_imageBuffer->context()->setMiterLimit(10);
651 m_imageBuffer->context()->setStrokeThickness(1); 658 m_imageBuffer->context()->setStrokeThickness(1);
652 #if ENABLE(ASSERT) 659 #if ENABLE(ASSERT)
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 if (!isPaintable()) { 810 if (!isPaintable()) {
804 *status = InvalidSourceImageStatus; 811 *status = InvalidSourceImageStatus;
805 return nullptr; 812 return nullptr;
806 } 813 }
807 814
808 if (!m_context) { 815 if (!m_context) {
809 *status = NormalSourceImageStatus; 816 *status = NormalSourceImageStatus;
810 return createTransparentImage(size()); 817 return createTransparentImage(size());
811 } 818 }
812 819
820 m_imageBuffer->willAccessPixels();
821
813 if (m_context->is3d()) { 822 if (m_context->is3d()) {
814 m_context->paintRenderingResultsToCanvas(BackBuffer); 823 m_context->paintRenderingResultsToCanvas(BackBuffer);
815 *status = ExternalSourceImageStatus; 824 *status = ExternalSourceImageStatus;
816 825
817 // can't create SkImage from WebGLImageBufferSurface (contains only SkBi tmap) 826 // can't create SkImage from WebGLImageBufferSurface (contains only SkBi tmap)
818 return buffer()->copyImage(DontCopyBackingStore, Unscaled); 827 return buffer()->copyImage(DontCopyBackingStore, Unscaled);
819 } 828 }
820 829
821 RefPtr<SkImage> image = buffer()->newImageSnapshot(); 830 RefPtr<SkImage> image = buffer()->newImageSnapshot();
822 if (image) { 831 if (image) {
823 *status = NormalSourceImageStatus; 832 *status = NormalSourceImageStatus;
824 return StaticBitmapImage::create(image.release()); 833 return StaticBitmapImage::create(image.release());
825 } 834 }
826 835
827 *status = InvalidSourceImageStatus; 836 *status = InvalidSourceImageStatus;
828 return nullptr; 837 return nullptr;
829 } 838 }
830 839
831 bool HTMLCanvasElement::wouldTaintOrigin(SecurityOrigin*) const 840 bool HTMLCanvasElement::wouldTaintOrigin(SecurityOrigin*) const
832 { 841 {
833 return !originClean(); 842 return !originClean();
834 } 843 }
835 844
836 FloatSize HTMLCanvasElement::sourceSize() const 845 FloatSize HTMLCanvasElement::sourceSize() const
837 { 846 {
838 return FloatSize(width(), height()); 847 return FloatSize(width(), height());
839 } 848 }
840 849
841 } 850 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698