Home | History | Annotate | Download | only in paint
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "config.h"
      6 #include "core/paint/HTMLCanvasPainter.h"
      7 
      8 #include "core/html/HTMLCanvasElement.h"
      9 #include "core/rendering/PaintInfo.h"
     10 #include "core/rendering/RenderHTMLCanvas.h"
     11 #include "platform/geometry/LayoutPoint.h"
     12 
     13 namespace blink {
     14 
     15 void HTMLCanvasPainter::paintReplaced(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
     16 {
     17     GraphicsContext* context = paintInfo.context;
     18 
     19     LayoutRect contentRect = m_renderHTMLCanvas.contentBoxRect();
     20     contentRect.moveBy(paintOffset);
     21     LayoutRect paintRect = m_renderHTMLCanvas.replacedContentRect();
     22     paintRect.moveBy(paintOffset);
     23 
     24     bool clip = !contentRect.contains(paintRect);
     25     if (clip) {
     26         // Not allowed to overflow the content box.
     27         paintInfo.context->save();
     28         paintInfo.context->clip(pixelSnappedIntRect(contentRect));
     29     }
     30 
     31     // FIXME: InterpolationNone should be used if ImageRenderingOptimizeContrast is set.
     32     // See bug for more details: crbug.com/353716.
     33     InterpolationQuality interpolationQuality = m_renderHTMLCanvas.style()->imageRendering() == ImageRenderingOptimizeContrast ? InterpolationLow : CanvasDefaultInterpolationQuality;
     34 
     35     HTMLCanvasElement* canvas = toHTMLCanvasElement(m_renderHTMLCanvas.node());
     36     LayoutSize layoutSize = contentRect.size();
     37     if (m_renderHTMLCanvas.style()->imageRendering() == ImageRenderingPixelated
     38         && (layoutSize.width() > canvas->width() || layoutSize.height() > canvas->height() || layoutSize == canvas->size())) {
     39         interpolationQuality = InterpolationNone;
     40     }
     41 
     42     InterpolationQuality previousInterpolationQuality = context->imageInterpolationQuality();
     43     context->setImageInterpolationQuality(interpolationQuality);
     44     canvas->paint(context, paintRect);
     45     context->setImageInterpolationQuality(previousInterpolationQuality);
     46 
     47     if (clip)
     48         context->restore();
     49 }
     50 
     51 } // namespace blink
     52