| 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 "core/paint/InlineFlowBoxPainter.h" | 5 #include "core/paint/InlineFlowBoxPainter.h" |
| 6 | 6 |
| 7 #include "core/layout/LayoutBlock.h" | 7 #include "core/layout/LayoutBlock.h" |
| 8 #include "core/layout/LayoutInline.h" | 8 #include "core/layout/LayoutInline.h" |
| 9 #include "core/layout/LayoutView.h" | 9 #include "core/layout/LayoutView.h" |
| 10 #include "core/layout/api/LineLayoutAPIShim.h" |
| 10 #include "core/layout/api/LineLayoutBoxModel.h" | 11 #include "core/layout/api/LineLayoutBoxModel.h" |
| 11 #include "core/layout/api/SelectionState.h" | 12 #include "core/layout/api/SelectionState.h" |
| 12 #include "core/layout/line/InlineFlowBox.h" | 13 #include "core/layout/line/InlineFlowBox.h" |
| 13 #include "core/paint/BoxPainter.h" | 14 #include "core/paint/BoxPainter.h" |
| 14 #include "core/paint/LineLayoutPaintShim.h" | |
| 15 #include "core/paint/PaintInfo.h" | 15 #include "core/paint/PaintInfo.h" |
| 16 #include "core/paint/PaintLayer.h" | 16 #include "core/paint/PaintLayer.h" |
| 17 #include "platform/graphics/GraphicsContextStateSaver.h" | 17 #include "platform/graphics/GraphicsContextStateSaver.h" |
| 18 #include "platform/graphics/paint/DrawingRecorder.h" | 18 #include "platform/graphics/paint/DrawingRecorder.h" |
| 19 | 19 |
| 20 namespace blink { | 20 namespace blink { |
| 21 | 21 |
| 22 void InlineFlowBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint&
paintOffset, const LayoutUnit lineTop, const LayoutUnit lineBottom) | 22 void InlineFlowBoxPainter::paint(const PaintInfo& paintInfo, const LayoutPoint&
paintOffset, const LayoutUnit lineTop, const LayoutUnit lineBottom) |
| 23 { | 23 { |
| 24 ASSERT(!shouldPaintSelfOutline(paintInfo.phase) && !shouldPaintDescendantOut
lines(paintInfo.phase)); | 24 ASSERT(!shouldPaintSelfOutline(paintInfo.phase) && !shouldPaintDescendantOut
lines(paintInfo.phase)); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 55 { | 55 { |
| 56 // FIXME: This should be a for loop or similar. It's a little non-trivial to
do so, however, since the layers need to be | 56 // FIXME: This should be a for loop or similar. It's a little non-trivial to
do so, however, since the layers need to be |
| 57 // painted in reverse order. | 57 // painted in reverse order. |
| 58 if (fillLayer.next()) | 58 if (fillLayer.next()) |
| 59 paintFillLayers(paintInfo, c, *fillLayer.next(), rect, op); | 59 paintFillLayers(paintInfo, c, *fillLayer.next(), rect, op); |
| 60 paintFillLayer(paintInfo, c, fillLayer, rect, op); | 60 paintFillLayer(paintInfo, c, fillLayer, rect, op); |
| 61 } | 61 } |
| 62 | 62 |
| 63 void InlineFlowBoxPainter::paintFillLayer(const PaintInfo& paintInfo, const Colo
r& c, const FillLayer& fillLayer, const LayoutRect& rect, SkXfermode::Mode op) | 63 void InlineFlowBoxPainter::paintFillLayer(const PaintInfo& paintInfo, const Colo
r& c, const FillLayer& fillLayer, const LayoutRect& rect, SkXfermode::Mode op) |
| 64 { | 64 { |
| 65 LayoutBoxModelObject* boxModel = toLayoutBoxModelObject(LineLayoutPaintShim:
:layoutObjectFrom(m_inlineFlowBox.boxModelObject())); | 65 LayoutBoxModelObject* boxModel = toLayoutBoxModelObject(LineLayoutAPIShim::l
ayoutObjectFrom(m_inlineFlowBox.boxModelObject())); |
| 66 StyleImage* img = fillLayer.image(); | 66 StyleImage* img = fillLayer.image(); |
| 67 bool hasFillImage = img && img->canRender(); | 67 bool hasFillImage = img && img->canRender(); |
| 68 if ((!hasFillImage && !m_inlineFlowBox.lineLayoutItem().style()->hasBorderRa
dius()) || (!m_inlineFlowBox.prevLineBox() && !m_inlineFlowBox.nextLineBox()) ||
!m_inlineFlowBox.parent()) { | 68 if ((!hasFillImage && !m_inlineFlowBox.lineLayoutItem().style()->hasBorderRa
dius()) || (!m_inlineFlowBox.prevLineBox() && !m_inlineFlowBox.nextLineBox()) ||
!m_inlineFlowBox.parent()) { |
| 69 BoxPainter::paintFillLayer(*boxModel, paintInfo, c, fillLayer, rect, Bac
kgroundBleedNone, &m_inlineFlowBox, rect.size(), op); | 69 BoxPainter::paintFillLayer(*boxModel, paintInfo, c, fillLayer, rect, Bac
kgroundBleedNone, &m_inlineFlowBox, rect.size(), op); |
| 70 } else if (m_inlineFlowBox.lineLayoutItem().style()->boxDecorationBreak() ==
DCLONE) { | 70 } else if (m_inlineFlowBox.lineLayoutItem().style()->boxDecorationBreak() ==
DCLONE) { |
| 71 GraphicsContextStateSaver stateSaver(paintInfo.context); | 71 GraphicsContextStateSaver stateSaver(paintInfo.context); |
| 72 paintInfo.context.clip(pixelSnappedIntRect(rect)); | 72 paintInfo.context.clip(pixelSnappedIntRect(rect)); |
| 73 BoxPainter::paintFillLayer(*boxModel, paintInfo, c, fillLayer, rect, Bac
kgroundBleedNone, &m_inlineFlowBox, rect.size(), op); | 73 BoxPainter::paintFillLayer(*boxModel, paintInfo, c, fillLayer, rect, Bac
kgroundBleedNone, &m_inlineFlowBox, rect.size(), op); |
| 74 } else { | 74 } else { |
| 75 // We have a fill image that spans multiple lines. | 75 // We have a fill image that spans multiple lines. |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 } | 175 } |
| 176 | 176 |
| 177 void InlineFlowBoxPainter::paintBoxDecorationBackground(const PaintInfo& paintIn
fo, const LayoutPoint& paintOffset, const LayoutRect& cullRect) | 177 void InlineFlowBoxPainter::paintBoxDecorationBackground(const PaintInfo& paintIn
fo, const LayoutPoint& paintOffset, const LayoutRect& cullRect) |
| 178 { | 178 { |
| 179 ASSERT(paintInfo.phase == PaintPhaseForeground); | 179 ASSERT(paintInfo.phase == PaintPhaseForeground); |
| 180 if (m_inlineFlowBox.lineLayoutItem().style()->visibility() != VISIBLE) | 180 if (m_inlineFlowBox.lineLayoutItem().style()->visibility() != VISIBLE) |
| 181 return; | 181 return; |
| 182 | 182 |
| 183 // You can use p::first-line to specify a background. If so, the root line b
oxes for | 183 // You can use p::first-line to specify a background. If so, the root line b
oxes for |
| 184 // a line may actually have to paint a background. | 184 // a line may actually have to paint a background. |
| 185 LayoutObject* inlineFlowBoxLayoutObject = LineLayoutPaintShim::layoutObjectF
rom(m_inlineFlowBox.lineLayoutItem()); | 185 LayoutObject* inlineFlowBoxLayoutObject = LineLayoutAPIShim::layoutObjectFro
m(m_inlineFlowBox.lineLayoutItem()); |
| 186 const ComputedStyle* styleToUse = m_inlineFlowBox.lineLayoutItem().style(m_i
nlineFlowBox.isFirstLineStyle()); | 186 const ComputedStyle* styleToUse = m_inlineFlowBox.lineLayoutItem().style(m_i
nlineFlowBox.isFirstLineStyle()); |
| 187 bool shouldPaintBoxDecorationBackground; | 187 bool shouldPaintBoxDecorationBackground; |
| 188 if (m_inlineFlowBox.parent()) | 188 if (m_inlineFlowBox.parent()) |
| 189 shouldPaintBoxDecorationBackground = inlineFlowBoxLayoutObject->hasBoxDe
corationBackground(); | 189 shouldPaintBoxDecorationBackground = inlineFlowBoxLayoutObject->hasBoxDe
corationBackground(); |
| 190 else | 190 else |
| 191 shouldPaintBoxDecorationBackground = m_inlineFlowBox.isFirstLineStyle()
&& styleToUse != m_inlineFlowBox.lineLayoutItem().style(); | 191 shouldPaintBoxDecorationBackground = m_inlineFlowBox.isFirstLineStyle()
&& styleToUse != m_inlineFlowBox.lineLayoutItem().style(); |
| 192 | 192 |
| 193 if (!shouldPaintBoxDecorationBackground) | 193 if (!shouldPaintBoxDecorationBackground) |
| 194 return; | 194 return; |
| 195 | 195 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 215 paintBoxShadow(paintInfo, *styleToUse, Normal, adjustedFrameRect); | 215 paintBoxShadow(paintInfo, *styleToUse, Normal, adjustedFrameRect); |
| 216 | 216 |
| 217 Color backgroundColor = inlineFlowBoxLayoutObject->resolveColor(*styleToUse,
CSSPropertyBackgroundColor); | 217 Color backgroundColor = inlineFlowBoxLayoutObject->resolveColor(*styleToUse,
CSSPropertyBackgroundColor); |
| 218 paintFillLayers(paintInfo, backgroundColor, styleToUse->backgroundLayers(),
adjustedFrameRect); | 218 paintFillLayers(paintInfo, backgroundColor, styleToUse->backgroundLayers(),
adjustedFrameRect); |
| 219 paintBoxShadow(paintInfo, *styleToUse, Inset, adjustedFrameRect); | 219 paintBoxShadow(paintInfo, *styleToUse, Inset, adjustedFrameRect); |
| 220 | 220 |
| 221 switch (borderPaintingType) { | 221 switch (borderPaintingType) { |
| 222 case DontPaintBorders: | 222 case DontPaintBorders: |
| 223 break; | 223 break; |
| 224 case PaintBordersWithoutClip: | 224 case PaintBordersWithoutClip: |
| 225 BoxPainter::paintBorder(*toLayoutBoxModelObject(LineLayoutPaintShim::lay
outObjectFrom(m_inlineFlowBox.boxModelObject())), paintInfo, adjustedFrameRect,
m_inlineFlowBox.lineLayoutItem().styleRef(m_inlineFlowBox.isFirstLineStyle()), B
ackgroundBleedNone, m_inlineFlowBox.includeLogicalLeftEdge(), m_inlineFlowBox.in
cludeLogicalRightEdge()); | 225 BoxPainter::paintBorder(*toLayoutBoxModelObject(LineLayoutAPIShim::layou
tObjectFrom(m_inlineFlowBox.boxModelObject())), paintInfo, adjustedFrameRect, m_
inlineFlowBox.lineLayoutItem().styleRef(m_inlineFlowBox.isFirstLineStyle()), Bac
kgroundBleedNone, m_inlineFlowBox.includeLogicalLeftEdge(), m_inlineFlowBox.incl
udeLogicalRightEdge()); |
| 226 break; | 226 break; |
| 227 case PaintBordersWithClip: | 227 case PaintBordersWithClip: |
| 228 // FIXME: What the heck do we do with RTL here? The math we're using is
obviously not right, | 228 // FIXME: What the heck do we do with RTL here? The math we're using is
obviously not right, |
| 229 // but it isn't even clear how this should work at all. | 229 // but it isn't even clear how this should work at all. |
| 230 LayoutRect imageStripPaintRect = paintRectForImageStrip(adjustedPaintOff
set, frameRect.size(), LTR); | 230 LayoutRect imageStripPaintRect = paintRectForImageStrip(adjustedPaintOff
set, frameRect.size(), LTR); |
| 231 GraphicsContextStateSaver stateSaver(paintInfo.context); | 231 GraphicsContextStateSaver stateSaver(paintInfo.context); |
| 232 paintInfo.context.clip(adjustedClipRect); | 232 paintInfo.context.clip(adjustedClipRect); |
| 233 BoxPainter::paintBorder(*toLayoutBoxModelObject(LineLayoutPaintShim::lay
outObjectFrom(m_inlineFlowBox.boxModelObject())), paintInfo, imageStripPaintRect
, m_inlineFlowBox.lineLayoutItem().styleRef(m_inlineFlowBox.isFirstLineStyle()))
; | 233 BoxPainter::paintBorder(*toLayoutBoxModelObject(LineLayoutAPIShim::layou
tObjectFrom(m_inlineFlowBox.boxModelObject())), paintInfo, imageStripPaintRect,
m_inlineFlowBox.lineLayoutItem().styleRef(m_inlineFlowBox.isFirstLineStyle())); |
| 234 break; | 234 break; |
| 235 } | 235 } |
| 236 } | 236 } |
| 237 | 237 |
| 238 void InlineFlowBoxPainter::paintMask(const PaintInfo& paintInfo, const LayoutPoi
nt& paintOffset) | 238 void InlineFlowBoxPainter::paintMask(const PaintInfo& paintInfo, const LayoutPoi
nt& paintOffset) |
| 239 { | 239 { |
| 240 if (m_inlineFlowBox.lineLayoutItem().style()->visibility() != VISIBLE || pai
ntInfo.phase != PaintPhaseMask) | 240 if (m_inlineFlowBox.lineLayoutItem().style()->visibility() != VISIBLE || pai
ntInfo.phase != PaintPhaseMask) |
| 241 return; | 241 return; |
| 242 | 242 |
| 243 LayoutRect frameRect = frameRectClampedToLineTopAndBottomIfNeeded(); | 243 LayoutRect frameRect = frameRectClampedToLineTopAndBottomIfNeeded(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 272 LayoutRect paintRect = LayoutRect(adjustedPaintOffset, frameRect.size()); | 272 LayoutRect paintRect = LayoutRect(adjustedPaintOffset, frameRect.size()); |
| 273 paintFillLayers(paintInfo, Color::transparent, m_inlineFlowBox.lineLayoutIte
m().style()->maskLayers(), paintRect, compositeOp); | 273 paintFillLayers(paintInfo, Color::transparent, m_inlineFlowBox.lineLayoutIte
m().style()->maskLayers(), paintRect, compositeOp); |
| 274 | 274 |
| 275 bool hasBoxImage = maskBoxImage && maskBoxImage->canRender(); | 275 bool hasBoxImage = maskBoxImage && maskBoxImage->canRender(); |
| 276 if (!hasBoxImage || !maskBoxImage->isLoaded()) { | 276 if (!hasBoxImage || !maskBoxImage->isLoaded()) { |
| 277 if (pushTransparencyLayer) | 277 if (pushTransparencyLayer) |
| 278 paintInfo.context.endLayer(); | 278 paintInfo.context.endLayer(); |
| 279 return; // Don't paint anything while we wait for the image to load. | 279 return; // Don't paint anything while we wait for the image to load. |
| 280 } | 280 } |
| 281 | 281 |
| 282 LayoutBoxModelObject* boxModel = toLayoutBoxModelObject(LineLayoutPaintShim:
:layoutObjectFrom(m_inlineFlowBox.boxModelObject())); | 282 LayoutBoxModelObject* boxModel = toLayoutBoxModelObject(LineLayoutAPIShim::l
ayoutObjectFrom(m_inlineFlowBox.boxModelObject())); |
| 283 // The simple case is where we are the only box for this object. In those | 283 // The simple case is where we are the only box for this object. In those |
| 284 // cases only a single call to draw is required. | 284 // cases only a single call to draw is required. |
| 285 if (!m_inlineFlowBox.prevLineBox() && !m_inlineFlowBox.nextLineBox()) { | 285 if (!m_inlineFlowBox.prevLineBox() && !m_inlineFlowBox.nextLineBox()) { |
| 286 BoxPainter::paintNinePieceImage(*boxModel, paintInfo.context, paintRect,
m_inlineFlowBox.lineLayoutItem().styleRef(), maskNinePieceImage, compositeOp); | 286 BoxPainter::paintNinePieceImage(*boxModel, paintInfo.context, paintRect,
m_inlineFlowBox.lineLayoutItem().styleRef(), maskNinePieceImage, compositeOp); |
| 287 } else { | 287 } else { |
| 288 // We have a mask image that spans multiple lines. | 288 // We have a mask image that spans multiple lines. |
| 289 // FIXME: What the heck do we do with RTL here? The math we're using is
obviously not right, | 289 // FIXME: What the heck do we do with RTL here? The math we're using is
obviously not right, |
| 290 // but it isn't even clear how this should work at all. | 290 // but it isn't even clear how this should work at all. |
| 291 LayoutRect imageStripPaintRect = paintRectForImageStrip(adjustedPaintOff
set, frameRect.size(), LTR); | 291 LayoutRect imageStripPaintRect = paintRectForImageStrip(adjustedPaintOff
set, frameRect.size(), LTR); |
| 292 FloatRect clipRect(clipRectForNinePieceImageStrip(m_inlineFlowBox, maskN
inePieceImage, paintRect)); | 292 FloatRect clipRect(clipRectForNinePieceImageStrip(m_inlineFlowBox, maskN
inePieceImage, paintRect)); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 318 rect.setHeight(logicalHeight); | 318 rect.setHeight(logicalHeight); |
| 319 } else { | 319 } else { |
| 320 rect.setX(logicalTop); | 320 rect.setX(logicalTop); |
| 321 rect.setWidth(logicalHeight); | 321 rect.setWidth(logicalHeight); |
| 322 } | 322 } |
| 323 } | 323 } |
| 324 return rect; | 324 return rect; |
| 325 } | 325 } |
| 326 | 326 |
| 327 } // namespace blink | 327 } // namespace blink |
| OLD | NEW |