| OLD | NEW | 
|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "config.h" | 5 #include "config.h" | 
| 6 #include "core/paint/BoxPainter.h" | 6 #include "core/paint/BoxPainter.h" | 
| 7 | 7 | 
| 8 #include "core/HTMLNames.h" | 8 #include "core/HTMLNames.h" | 
| 9 #include "core/frame/Settings.h" | 9 #include "core/frame/Settings.h" | 
| 10 #include "core/html/HTMLFrameOwnerElement.h" | 10 #include "core/html/HTMLFrameOwnerElement.h" | 
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 457             if (!boxShadowShouldBeAppliedToBackground) | 457             if (!boxShadowShouldBeAppliedToBackground) | 
| 458                 backgroundRect.intersect(paintInfo.rect); | 458                 backgroundRect.intersect(paintInfo.rect); | 
| 459 | 459 | 
| 460             GraphicsContextStateSaver shadowStateSaver(*context, boxShadowShould
      BeAppliedToBackground); | 460             GraphicsContextStateSaver shadowStateSaver(*context, boxShadowShould
      BeAppliedToBackground); | 
| 461             if (boxShadowShouldBeAppliedToBackground) | 461             if (boxShadowShouldBeAppliedToBackground) | 
| 462                 BoxPainter::applyBoxShadowForBackground(context, obj); | 462                 BoxPainter::applyBoxShadowForBackground(context, obj); | 
| 463 | 463 | 
| 464             if (isOpaqueRoot && !skipBaseColor) { | 464             if (isOpaqueRoot && !skipBaseColor) { | 
| 465                 paintRootBackgroundColor(obj, paintInfo, rect, bgColor); | 465                 paintRootBackgroundColor(obj, paintInfo, rect, bgColor); | 
| 466             } else if (bgColor.alpha()) { | 466             } else if (bgColor.alpha()) { | 
| 467                 context->fillRect(backgroundRect, bgColor, context->compositeOpe
      ration()); | 467                 context->fillRect(backgroundRect, bgColor, context->compositeOpe
      rator()); | 
| 468             } | 468             } | 
| 469         } | 469         } | 
| 470     } | 470     } | 
| 471 | 471 | 
| 472     // no progressive loading of the background image | 472     // no progressive loading of the background image | 
| 473     if (shouldPaintBackgroundImage) { | 473     if (shouldPaintBackgroundImage) { | 
| 474         BackgroundImageGeometry geometry; | 474         BackgroundImageGeometry geometry; | 
| 475         calculateBackgroundImageGeometry(obj, paintInfo.paintContainer(), bgLaye
      r, scrolledPaintRect, geometry, backgroundObject); | 475         calculateBackgroundImageGeometry(obj, paintInfo.paintContainer(), bgLaye
      r, scrolledPaintRect, geometry, backgroundObject); | 
| 476         if (!geometry.destRect().isEmpty()) { | 476         if (!geometry.destRect().isEmpty()) { | 
| 477             CompositeOperator compositeOp = op == CompositeSourceOver ? bgLayer.
      composite() : op; | 477             CompositeOperator compositeOp = op == CompositeSourceOver ? bgLayer.
      composite() : op; | 
| 478             RenderObject* clientForBackgroundImage = backgroundObject ? backgrou
      ndObject : &obj; | 478             RenderObject* clientForBackgroundImage = backgroundObject ? backgrou
      ndObject : &obj; | 
| 479             RefPtr<Image> image = bgImage->image(clientForBackgroundImage, geome
      try.tileSize()); | 479             RefPtr<Image> image = bgImage->image(clientForBackgroundImage, geome
      try.tileSize()); | 
| 480             InterpolationQuality interpolationQuality = chooseInterpolationQuali
      ty(obj, context, image.get(), &bgLayer, LayoutSize(geometry.tileSize())); | 480             InterpolationQuality interpolationQuality = chooseInterpolationQuali
      ty(obj, context, image.get(), &bgLayer, LayoutSize(geometry.tileSize())); | 
| 481             if (bgLayer.maskSourceType() == MaskLuminance) | 481             if (bgLayer.maskSourceType() == MaskLuminance) | 
| 482                 context->setColorFilter(ColorFilterLuminanceToAlpha); | 482                 context->setColorFilter(ColorFilterLuminanceToAlpha); | 
| 483             InterpolationQuality previousInterpolationQuality = context->imageIn
      terpolationQuality(); | 483             InterpolationQuality previousInterpolationQuality = context->imageIn
      terpolationQuality(); | 
| 484             context->setImageInterpolationQuality(interpolationQuality); | 484             context->setImageInterpolationQuality(interpolationQuality); | 
| 485             TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "PaintI
      mage", "data", InspectorPaintImageEvent::data(obj, *bgImage)); | 485             TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "PaintI
      mage", "data", InspectorPaintImageEvent::data(obj, *bgImage)); | 
| 486             context->drawTiledImage(image.get(), geometry.destRect(), geometry.p
      hase(), geometry.tileSize(), | 486             context->drawTiledImage(image.get(), geometry.destRect(), geometry.p
      hase(), geometry.tileSize(), | 
| 487                 compositeOp, bgLayer.blendMode(), geometry.spaceSize()); | 487                 compositeOp, bgLayer.blendMode(), geometry.spaceSize()); | 
| 488             context->setImageInterpolationQuality(previousInterpolationQuality); | 488             context->setImageInterpolationQuality(previousInterpolationQuality); | 
| 489         } | 489         } | 
| 490     } | 490     } | 
| 491 | 491 | 
| 492     if (bgLayer.clip() == TextFillBox) { | 492     if (bgLayer.clip() == TextFillBox) { | 
| 493         // Create the text mask layer. | 493         // Create the text mask layer. | 
| 494         context->setCompositeOperation(CompositeDestinationIn); | 494         context->setCompositeOperation(SkXfermode::kDstIn_Mode); | 
| 495         context->beginTransparencyLayer(1); | 495         context->beginTransparencyLayer(1); | 
| 496 | 496 | 
| 497         // FIXME: Workaround for https://code.google.com/p/skia/issues/detail?id
      =1291. | 497         // FIXME: Workaround for https://code.google.com/p/skia/issues/detail?id
      =1291. | 
| 498         context->clearRect(maskRect); | 498         context->clearRect(maskRect); | 
| 499 | 499 | 
| 500         // Now draw the text into the mask. We do this by painting using a speci
      al paint phase that signals to | 500         // Now draw the text into the mask. We do this by painting using a speci
      al paint phase that signals to | 
| 501         // InlineTextBoxes that they should just add their contents to the clip. | 501         // InlineTextBoxes that they should just add their contents to the clip. | 
| 502         PaintInfo info(context, maskRect, PaintPhaseTextClip, PaintBehaviorForce
      BlackText, 0); | 502         PaintInfo info(context, maskRect, PaintPhaseTextClip, PaintBehaviorForce
      BlackText, 0); | 
| 503         context->setCompositeOperation(CompositeSourceOver); | 503         context->setCompositeOperation(SkXfermode::kSrcOver_Mode); | 
| 504         if (box) { | 504         if (box) { | 
| 505             RootInlineBox& root = box->root(); | 505             RootInlineBox& root = box->root(); | 
| 506             box->paint(info, LayoutPoint(scrolledPaintRect.x() - box->x(), scrol
      ledPaintRect.y() - box->y()), root.lineTop(), root.lineBottom()); | 506             box->paint(info, LayoutPoint(scrolledPaintRect.x() - box->x(), scrol
      ledPaintRect.y() - box->y()), root.lineTop(), root.lineBottom()); | 
| 507         } else { | 507         } else { | 
| 508             // FIXME: this should only have an effect for the line box list with
      in |obj|. Change this to create a LineBoxListPainter directly. | 508             // FIXME: this should only have an effect for the line box list with
      in |obj|. Change this to create a LineBoxListPainter directly. | 
| 509             LayoutSize localOffset = obj.isBox() ? toRenderBox(&obj)->locationOf
      fset() : LayoutSize(); | 509             LayoutSize localOffset = obj.isBox() ? toRenderBox(&obj)->locationOf
      fset() : LayoutSize(); | 
| 510             obj.paint(info, scrolledPaintRect.location() - localOffset); | 510             obj.paint(info, scrolledPaintRect.location() - localOffset); | 
| 511         } | 511         } | 
| 512 | 512 | 
| 513         context->endLayer(); | 513         context->endLayer(); | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 526 | 526 | 
| 527 void BoxPainter::paintMaskImages(const PaintInfo& paintInfo, const LayoutRect& p
      aintRect) | 527 void BoxPainter::paintMaskImages(const PaintInfo& paintInfo, const LayoutRect& p
      aintRect) | 
| 528 { | 528 { | 
| 529     // Figure out if we need to push a transparency layer to render our mask. | 529     // Figure out if we need to push a transparency layer to render our mask. | 
| 530     bool pushTransparencyLayer = false; | 530     bool pushTransparencyLayer = false; | 
| 531     bool compositedMask = m_renderBox.hasLayer() && m_renderBox.layer()->hasComp
      ositedMask(); | 531     bool compositedMask = m_renderBox.hasLayer() && m_renderBox.layer()->hasComp
      ositedMask(); | 
| 532     bool flattenCompositingLayers = m_renderBox.view()->frameView() && m_renderB
      ox.view()->frameView()->paintBehavior() & PaintBehaviorFlattenCompositingLayers; | 532     bool flattenCompositingLayers = m_renderBox.view()->frameView() && m_renderB
      ox.view()->frameView()->paintBehavior() & PaintBehaviorFlattenCompositingLayers; | 
| 533 | 533 | 
| 534     bool allMaskImagesLoaded = true; | 534     bool allMaskImagesLoaded = true; | 
| 535 | 535 | 
| 536     CompositeOperator previousCompositeOperator = paintInfo.context->compositeOp
      eration(); | 536     SkXfermode::Mode previousCompositeOperation = paintInfo.context->compositeOp
      eration(); | 
| 537 | 537 | 
| 538     if (!compositedMask || flattenCompositingLayers) { | 538     if (!compositedMask || flattenCompositingLayers) { | 
| 539         pushTransparencyLayer = true; | 539         pushTransparencyLayer = true; | 
| 540         StyleImage* maskBoxImage = m_renderBox.style()->maskBoxImage().image(); | 540         StyleImage* maskBoxImage = m_renderBox.style()->maskBoxImage().image(); | 
| 541         const FillLayer& maskLayers = m_renderBox.style()->maskLayers(); | 541         const FillLayer& maskLayers = m_renderBox.style()->maskLayers(); | 
| 542 | 542 | 
| 543         // Don't render a masked element until all the mask images have loaded, 
      to prevent a flash of unmasked content. | 543         // Don't render a masked element until all the mask images have loaded, 
      to prevent a flash of unmasked content. | 
| 544         if (maskBoxImage) | 544         if (maskBoxImage) | 
| 545             allMaskImagesLoaded &= maskBoxImage->isLoaded(); | 545             allMaskImagesLoaded &= maskBoxImage->isLoaded(); | 
| 546 | 546 | 
| 547         allMaskImagesLoaded &= maskLayers.imagesAreLoaded(); | 547         allMaskImagesLoaded &= maskLayers.imagesAreLoaded(); | 
| 548 | 548 | 
| 549         paintInfo.context->setCompositeOperation(CompositeDestinationIn); | 549         paintInfo.context->setCompositeOperation(SkXfermode::kDstIn_Mode); | 
| 550         paintInfo.context->beginTransparencyLayer(1); | 550         paintInfo.context->beginTransparencyLayer(1); | 
| 551     } | 551     } | 
| 552 | 552 | 
| 553     if (allMaskImagesLoaded) { | 553     if (allMaskImagesLoaded) { | 
| 554         paintFillLayers(paintInfo, Color::transparent, m_renderBox.style()->mask
      Layers(), paintRect, BackgroundBleedNone, CompositeSourceOver); | 554         paintFillLayers(paintInfo, Color::transparent, m_renderBox.style()->mask
      Layers(), paintRect, BackgroundBleedNone, CompositeSourceOver); | 
| 555         paintNinePieceImage(m_renderBox, paintInfo.context, paintRect, m_renderB
      ox.style(), m_renderBox.style()->maskBoxImage(), CompositeSourceOver); | 555         paintNinePieceImage(m_renderBox, paintInfo.context, paintRect, m_renderB
      ox.style(), m_renderBox.style()->maskBoxImage(), CompositeSourceOver); | 
| 556     } | 556     } | 
| 557 | 557 | 
| 558     if (pushTransparencyLayer) { | 558     if (pushTransparencyLayer) { | 
| 559         paintInfo.context->endLayer(); | 559         paintInfo.context->endLayer(); | 
| 560         paintInfo.context->setCompositeOperation(previousCompositeOperator); | 560         paintInfo.context->setCompositeOperation(previousCompositeOperation); | 
| 561     } | 561     } | 
| 562 } | 562 } | 
| 563 | 563 | 
| 564 void BoxPainter::paintClippingMask(const PaintInfo& paintInfo, const LayoutPoint
      & paintOffset) | 564 void BoxPainter::paintClippingMask(const PaintInfo& paintInfo, const LayoutPoint
      & paintOffset) | 
| 565 { | 565 { | 
| 566     if (!paintInfo.shouldPaintWithinRoot(&m_renderBox) || m_renderBox.style()->v
      isibility() != VISIBLE || paintInfo.phase != PaintPhaseClippingMask) | 566     if (!paintInfo.shouldPaintWithinRoot(&m_renderBox) || m_renderBox.style()->v
      isibility() != VISIBLE || paintInfo.phase != PaintPhaseClippingMask) | 
| 567         return; | 567         return; | 
| 568 | 568 | 
| 569     if (!m_renderBox.layer() || m_renderBox.layer()->compositingState() != Paint
      sIntoOwnBacking) | 569     if (!m_renderBox.layer() || m_renderBox.layer()->compositingState() != Paint
      sIntoOwnBacking) | 
| 570         return; | 570         return; | 
| 571 | 571 | 
| 572     LayoutRect paintRect = LayoutRect(paintOffset, m_renderBox.size()); | 572     LayoutRect paintRect = LayoutRect(paintOffset, m_renderBox.size()); | 
| 573     paintInfo.context->fillRect(pixelSnappedIntRect(paintRect), Color::black); | 573     paintInfo.context->fillRect(pixelSnappedIntRect(paintRect), Color::black); | 
| 574 } | 574 } | 
| 575 | 575 | 
| 576 void BoxPainter::paintRootBackgroundColor(RenderObject& obj, const PaintInfo& pa
      intInfo, const LayoutRect& rect, const Color& bgColor) | 576 void BoxPainter::paintRootBackgroundColor(RenderObject& obj, const PaintInfo& pa
      intInfo, const LayoutRect& rect, const Color& bgColor) | 
| 577 { | 577 { | 
| 578     GraphicsContext* context = paintInfo.context; | 578     GraphicsContext* context = paintInfo.context; | 
| 579     if (rect.isEmpty()) | 579     if (rect.isEmpty()) | 
| 580         return; | 580         return; | 
| 581 | 581 | 
| 582     ASSERT(obj.isDocumentElement()); | 582     ASSERT(obj.isDocumentElement()); | 
| 583 | 583 | 
| 584     IntRect backgroundRect(pixelSnappedIntRect(rect)); | 584     IntRect backgroundRect(pixelSnappedIntRect(rect)); | 
| 585     backgroundRect.intersect(paintInfo.rect); | 585     backgroundRect.intersect(paintInfo.rect); | 
| 586 | 586 | 
| 587     Color baseColor = obj.view()->frameView()->baseBackgroundColor(); | 587     Color baseColor = obj.view()->frameView()->baseBackgroundColor(); | 
| 588     bool shouldClearDocumentBackground = obj.document().settings() && obj.docume
      nt().settings()->shouldClearDocumentBackground(); | 588     bool shouldClearDocumentBackground = obj.document().settings() && obj.docume
      nt().settings()->shouldClearDocumentBackground(); | 
| 589     CompositeOperator operation = shouldClearDocumentBackground ? CompositeCopy 
      : context->compositeOperation(); | 589     CompositeOperator operation = shouldClearDocumentBackground ? CompositeCopy 
      : context->compositeOperator(); | 
| 590 | 590 | 
| 591     // If we have an alpha go ahead and blend with the base background color. | 591     // If we have an alpha go ahead and blend with the base background color. | 
| 592     if (baseColor.alpha()) { | 592     if (baseColor.alpha()) { | 
| 593         if (bgColor.alpha()) | 593         if (bgColor.alpha()) | 
| 594             baseColor = baseColor.blend(bgColor); | 594             baseColor = baseColor.blend(bgColor); | 
| 595         context->fillRect(backgroundRect, baseColor, operation); | 595         context->fillRect(backgroundRect, baseColor, operation); | 
| 596     } else if (bgColor.alpha()) { | 596     } else if (bgColor.alpha()) { | 
| 597         context->fillRect(backgroundRect, bgColor, operation); | 597         context->fillRect(backgroundRect, bgColor, operation); | 
| 598     } else if (shouldClearDocumentBackground) { | 598     } else if (shouldClearDocumentBackground) { | 
| 599         context->clearRect(backgroundRect); | 599         context->clearRect(backgroundRect); | 
| (...skipping 1602 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2202 | 2202 | 
| 2203     FloatPoint secondQuad[4]; | 2203     FloatPoint secondQuad[4]; | 
| 2204     secondQuad[0] = quad[0]; | 2204     secondQuad[0] = quad[0]; | 
| 2205     secondQuad[1] = FloatPoint(quad[0].x() - r1 * cx, quad[0].y() - r1 * cy); | 2205     secondQuad[1] = FloatPoint(quad[0].x() - r1 * cx, quad[0].y() - r1 * cy); | 
| 2206     secondQuad[2] = quad[2]; | 2206     secondQuad[2] = quad[2]; | 
| 2207     secondQuad[3] = quad[3]; | 2207     secondQuad[3] = quad[3]; | 
| 2208     graphicsContext->clipPolygon(4, secondQuad, !secondEdgeMatches); | 2208     graphicsContext->clipPolygon(4, secondQuad, !secondEdgeMatches); | 
| 2209 } | 2209 } | 
| 2210 | 2210 | 
| 2211 } // namespace blink | 2211 } // namespace blink | 
| OLD | NEW | 
|---|