OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 1211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1222 LayoutUnit stripHeight = isHorizontal() ? static_cast<LayoutUnit>(height
()) : totalLogicalWidth; | 1222 LayoutUnit stripHeight = isHorizontal() ? static_cast<LayoutUnit>(height
()) : totalLogicalWidth; |
1223 | 1223 |
1224 GraphicsContextStateSaver stateSaver(*paintInfo.context); | 1224 GraphicsContextStateSaver stateSaver(*paintInfo.context); |
1225 paintInfo.context->clip(LayoutRect(rect.x(), rect.y(), width(), height()
)); | 1225 paintInfo.context->clip(LayoutRect(rect.x(), rect.y(), width(), height()
)); |
1226 boxPainter.paintFillLayerExtended(paintInfo, c, fillLayer, LayoutRect(st
ripX, stripY, stripWidth, stripHeight), BackgroundBleedNone, this, rect.size(),
op); | 1226 boxPainter.paintFillLayerExtended(paintInfo, c, fillLayer, LayoutRect(st
ripX, stripY, stripWidth, stripHeight), BackgroundBleedNone, this, rect.size(),
op); |
1227 } | 1227 } |
1228 } | 1228 } |
1229 | 1229 |
1230 void InlineFlowBox::paintBoxShadow(const PaintInfo& info, RenderStyle* s, Shadow
Style shadowStyle, const LayoutRect& paintRect) | 1230 void InlineFlowBox::paintBoxShadow(const PaintInfo& info, RenderStyle* s, Shadow
Style shadowStyle, const LayoutRect& paintRect) |
1231 { | 1231 { |
| 1232 ASSERT(!renderer()->isText); |
| 1233 BoxPainter boxPainter(toRenderBox(renderer())); |
1232 if ((!prevLineBox() && !nextLineBox()) || !parent()) | 1234 if ((!prevLineBox() && !nextLineBox()) || !parent()) |
1233 boxModelObject()->paintBoxShadow(info, paintRect, s, shadowStyle); | 1235 boxPainter.paintBoxShadow(info, paintRect, s, shadowStyle); |
1234 else { | 1236 else { |
1235 // FIXME: We can do better here in the multi-line case. We want to push
a clip so that the shadow doesn't | 1237 // FIXME: We can do better here in the multi-line case. We want to push
a clip so that the shadow doesn't |
1236 // protrude incorrectly at the edges, and we want to possibly include sh
adows cast from the previous/following lines | 1238 // protrude incorrectly at the edges, and we want to possibly include sh
adows cast from the previous/following lines |
1237 boxModelObject()->paintBoxShadow(info, paintRect, s, shadowStyle, includ
eLogicalLeftEdge(), includeLogicalRightEdge()); | 1239 boxPainter.paintBoxShadow(info, paintRect, s, shadowStyle, includeLogica
lLeftEdge(), includeLogicalRightEdge()); |
1238 } | 1240 } |
1239 } | 1241 } |
1240 | 1242 |
1241 void InlineFlowBox::constrainToLineTopAndBottomIfNeeded(LayoutRect& rect) const | 1243 void InlineFlowBox::constrainToLineTopAndBottomIfNeeded(LayoutRect& rect) const |
1242 { | 1244 { |
1243 bool noQuirksMode = renderer().document().inNoQuirksMode(); | 1245 bool noQuirksMode = renderer().document().inNoQuirksMode(); |
1244 if (!noQuirksMode && !hasTextChildren() && !(descendantsHaveSameLineHeightAn
dBaseline() && hasTextDescendants())) { | 1246 if (!noQuirksMode && !hasTextChildren() && !(descendantsHaveSameLineHeightAn
dBaseline() && hasTextDescendants())) { |
1245 const RootInlineBox& rootBox = root(); | 1247 const RootInlineBox& rootBox = root(); |
1246 LayoutUnit logicalTop = isHorizontal() ? rect.y() : rect.x(); | 1248 LayoutUnit logicalTop = isHorizontal() ? rect.y() : rect.x(); |
1247 LayoutUnit logicalHeight = isHorizontal() ? rect.height() : rect.width()
; | 1249 LayoutUnit logicalHeight = isHorizontal() ? rect.height() : rect.width()
; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1326 // non-first-line style. | 1328 // non-first-line style. |
1327 if (parent() && renderer().style()->hasBorder()) { | 1329 if (parent() && renderer().style()->hasBorder()) { |
1328 const NinePieceImage& borderImage = renderer().style()->borderImage(); | 1330 const NinePieceImage& borderImage = renderer().style()->borderImage(); |
1329 StyleImage* borderImageSource = borderImage.image(); | 1331 StyleImage* borderImageSource = borderImage.image(); |
1330 bool hasBorderImage = borderImageSource && borderImageSource->canRender(
renderer(), styleToUse->effectiveZoom()); | 1332 bool hasBorderImage = borderImageSource && borderImageSource->canRender(
renderer(), styleToUse->effectiveZoom()); |
1331 if (hasBorderImage && !borderImageSource->isLoaded()) | 1333 if (hasBorderImage && !borderImageSource->isLoaded()) |
1332 return; // Don't paint anything while we wait for the image to load. | 1334 return; // Don't paint anything while we wait for the image to load. |
1333 | 1335 |
1334 // The simple case is where we either have no border image or we are the
only box for this object. | 1336 // The simple case is where we either have no border image or we are the
only box for this object. |
1335 // In those cases only a single call to draw is required. | 1337 // In those cases only a single call to draw is required. |
| 1338 ASSERT(!renderer().isText()); |
| 1339 BoxPainter boxPainter(toRenderBox(renderer())); |
1336 if (!hasBorderImage || (!prevLineBox() && !nextLineBox())) { | 1340 if (!hasBorderImage || (!prevLineBox() && !nextLineBox())) { |
1337 boxModelObject()->paintBorder(paintInfo, paintRect, renderer().style
(isFirstLineStyle()), BackgroundBleedNone, includeLogicalLeftEdge(), includeLogi
calRightEdge()); | 1341 |
| 1342 boxPainter.paintBorder(paintInfo, paintRect, renderer().style(isFirs
tLineStyle()), BackgroundBleedNone, includeLogicalLeftEdge(), includeLogicalRigh
tEdge()); |
1338 } else { | 1343 } else { |
1339 // We have a border image that spans multiple lines. | 1344 // We have a border image that spans multiple lines. |
1340 // We need to adjust tx and ty by the width of all previous lines. | 1345 // We need to adjust tx and ty by the width of all previous lines. |
1341 // Think of border image painting on inlines as though you had one l
ong line, a single continuous | 1346 // Think of border image painting on inlines as though you had one l
ong line, a single continuous |
1342 // strip. Even though that strip has been broken up across multiple
lines, you still paint it | 1347 // strip. Even though that strip has been broken up across multiple
lines, you still paint it |
1343 // as though you had one single line. This means each line has to pi
ck up the image where | 1348 // as though you had one single line. This means each line has to pi
ck up the image where |
1344 // the previous line left off. | 1349 // the previous line left off. |
1345 // FIXME: What the heck do we do with RTL here? The math we're using
is obviously not right, | 1350 // FIXME: What the heck do we do with RTL here? The math we're using
is obviously not right, |
1346 // but it isn't even clear how this should work at all. | 1351 // but it isn't even clear how this should work at all. |
1347 LayoutUnit logicalOffsetOnLine = 0; | 1352 LayoutUnit logicalOffsetOnLine = 0; |
1348 for (InlineFlowBox* curr = prevLineBox(); curr; curr = curr->prevLin
eBox()) | 1353 for (InlineFlowBox* curr = prevLineBox(); curr; curr = curr->prevLin
eBox()) |
1349 logicalOffsetOnLine += curr->logicalWidth(); | 1354 logicalOffsetOnLine += curr->logicalWidth(); |
1350 LayoutUnit totalLogicalWidth = logicalOffsetOnLine; | 1355 LayoutUnit totalLogicalWidth = logicalOffsetOnLine; |
1351 for (InlineFlowBox* curr = this; curr; curr = curr->nextLineBox()) | 1356 for (InlineFlowBox* curr = this; curr; curr = curr->nextLineBox()) |
1352 totalLogicalWidth += curr->logicalWidth(); | 1357 totalLogicalWidth += curr->logicalWidth(); |
1353 LayoutUnit stripX = adjustedPaintOffset.x() - (isHorizontal() ? logi
calOffsetOnLine : LayoutUnit()); | 1358 LayoutUnit stripX = adjustedPaintOffset.x() - (isHorizontal() ? logi
calOffsetOnLine : LayoutUnit()); |
1354 LayoutUnit stripY = adjustedPaintOffset.y() - (isHorizontal() ? Layo
utUnit() : logicalOffsetOnLine); | 1359 LayoutUnit stripY = adjustedPaintOffset.y() - (isHorizontal() ? Layo
utUnit() : logicalOffsetOnLine); |
1355 LayoutUnit stripWidth = isHorizontal() ? totalLogicalWidth : frameRe
ct.width(); | 1360 LayoutUnit stripWidth = isHorizontal() ? totalLogicalWidth : frameRe
ct.width(); |
1356 LayoutUnit stripHeight = isHorizontal() ? frameRect.height() : total
LogicalWidth; | 1361 LayoutUnit stripHeight = isHorizontal() ? frameRect.height() : total
LogicalWidth; |
1357 | 1362 |
1358 LayoutRect clipRect = clipRectForNinePieceImageStrip(this, borderIma
ge, paintRect); | 1363 LayoutRect clipRect = clipRectForNinePieceImageStrip(this, borderIma
ge, paintRect); |
1359 GraphicsContextStateSaver stateSaver(*paintInfo.context); | 1364 GraphicsContextStateSaver stateSaver(*paintInfo.context); |
1360 paintInfo.context->clip(clipRect); | 1365 paintInfo.context->clip(clipRect); |
1361 boxModelObject()->paintBorder(paintInfo, LayoutRect(stripX, stripY,
stripWidth, stripHeight), renderer().style(isFirstLineStyle())); | 1366 boxPainter.paintBorder(paintInfo, LayoutRect(stripX, stripY, stripWi
dth, stripHeight), renderer().style(isFirstLineStyle())); |
1362 } | 1367 } |
1363 } | 1368 } |
1364 } | 1369 } |
1365 | 1370 |
1366 void InlineFlowBox::paintMask(PaintInfo& paintInfo, const LayoutPoint& paintOffs
et) | 1371 void InlineFlowBox::paintMask(PaintInfo& paintInfo, const LayoutPoint& paintOffs
et) |
1367 { | 1372 { |
1368 if (!paintInfo.shouldPaintWithinRoot(&renderer()) || renderer().style()->vis
ibility() != VISIBLE || paintInfo.phase != PaintPhaseMask) | 1373 if (!paintInfo.shouldPaintWithinRoot(&renderer()) || renderer().style()->vis
ibility() != VISIBLE || paintInfo.phase != PaintPhaseMask) |
1369 return; | 1374 return; |
1370 | 1375 |
1371 // Pixel snap mask painting. | 1376 // Pixel snap mask painting. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1403 | 1408 |
1404 bool hasBoxImage = maskBoxImage && maskBoxImage->canRender(renderer(), rende
rer().style()->effectiveZoom()); | 1409 bool hasBoxImage = maskBoxImage && maskBoxImage->canRender(renderer(), rende
rer().style()->effectiveZoom()); |
1405 if (!hasBoxImage || !maskBoxImage->isLoaded()) { | 1410 if (!hasBoxImage || !maskBoxImage->isLoaded()) { |
1406 if (pushTransparencyLayer) | 1411 if (pushTransparencyLayer) |
1407 paintInfo.context->endLayer(); | 1412 paintInfo.context->endLayer(); |
1408 return; // Don't paint anything while we wait for the image to load. | 1413 return; // Don't paint anything while we wait for the image to load. |
1409 } | 1414 } |
1410 | 1415 |
1411 // The simple case is where we are the only box for this object. In those | 1416 // The simple case is where we are the only box for this object. In those |
1412 // cases only a single call to draw is required. | 1417 // cases only a single call to draw is required. |
| 1418 ASSERT(!renderer().isText()); |
| 1419 BoxPainter boxPainter(toRenderBox(renderer())); |
1413 if (!prevLineBox() && !nextLineBox()) { | 1420 if (!prevLineBox() && !nextLineBox()) { |
1414 boxModelObject()->paintNinePieceImage(paintInfo.context, LayoutRect(adju
stedPaintOffset, frameRect.size()), renderer().style(), maskNinePieceImage, comp
ositeOp); | 1421 boxPainter.paintNinePieceImage(paintInfo.context, LayoutRect(adjustedPai
ntOffset, frameRect.size()), renderer().style(), maskNinePieceImage, compositeOp
); |
1415 } else { | 1422 } else { |
1416 // We have a mask image that spans multiple lines. | 1423 // We have a mask image that spans multiple lines. |
1417 // We need to adjust _tx and _ty by the width of all previous lines. | 1424 // We need to adjust _tx and _ty by the width of all previous lines. |
1418 LayoutUnit logicalOffsetOnLine = 0; | 1425 LayoutUnit logicalOffsetOnLine = 0; |
1419 for (InlineFlowBox* curr = prevLineBox(); curr; curr = curr->prevLineBox
()) | 1426 for (InlineFlowBox* curr = prevLineBox(); curr; curr = curr->prevLineBox
()) |
1420 logicalOffsetOnLine += curr->logicalWidth(); | 1427 logicalOffsetOnLine += curr->logicalWidth(); |
1421 LayoutUnit totalLogicalWidth = logicalOffsetOnLine; | 1428 LayoutUnit totalLogicalWidth = logicalOffsetOnLine; |
1422 for (InlineFlowBox* curr = this; curr; curr = curr->nextLineBox()) | 1429 for (InlineFlowBox* curr = this; curr; curr = curr->nextLineBox()) |
1423 totalLogicalWidth += curr->logicalWidth(); | 1430 totalLogicalWidth += curr->logicalWidth(); |
1424 LayoutUnit stripX = adjustedPaintOffset.x() - (isHorizontal() ? logicalO
ffsetOnLine : LayoutUnit()); | 1431 LayoutUnit stripX = adjustedPaintOffset.x() - (isHorizontal() ? logicalO
ffsetOnLine : LayoutUnit()); |
1425 LayoutUnit stripY = adjustedPaintOffset.y() - (isHorizontal() ? LayoutUn
it() : logicalOffsetOnLine); | 1432 LayoutUnit stripY = adjustedPaintOffset.y() - (isHorizontal() ? LayoutUn
it() : logicalOffsetOnLine); |
1426 LayoutUnit stripWidth = isHorizontal() ? totalLogicalWidth : frameRect.w
idth(); | 1433 LayoutUnit stripWidth = isHorizontal() ? totalLogicalWidth : frameRect.w
idth(); |
1427 LayoutUnit stripHeight = isHorizontal() ? frameRect.height() : totalLogi
calWidth; | 1434 LayoutUnit stripHeight = isHorizontal() ? frameRect.height() : totalLogi
calWidth; |
1428 | 1435 |
1429 LayoutRect clipRect = clipRectForNinePieceImageStrip(this, maskNinePiece
Image, paintRect); | 1436 LayoutRect clipRect = clipRectForNinePieceImageStrip(this, maskNinePiece
Image, paintRect); |
1430 GraphicsContextStateSaver stateSaver(*paintInfo.context); | 1437 GraphicsContextStateSaver stateSaver(*paintInfo.context); |
1431 paintInfo.context->clip(clipRect); | 1438 paintInfo.context->clip(clipRect); |
1432 boxModelObject()->paintNinePieceImage(paintInfo.context, LayoutRect(stri
pX, stripY, stripWidth, stripHeight), renderer().style(), maskNinePieceImage, co
mpositeOp); | 1439 boxPainter.paintNinePieceImage(paintInfo.context, LayoutRect(stripX, str
ipY, stripWidth, stripHeight), renderer().style(), maskNinePieceImage, composite
Op); |
1433 } | 1440 } |
1434 | 1441 |
1435 if (pushTransparencyLayer) | 1442 if (pushTransparencyLayer) |
1436 paintInfo.context->endLayer(); | 1443 paintInfo.context->endLayer(); |
1437 } | 1444 } |
1438 | 1445 |
1439 InlineBox* InlineFlowBox::firstLeafChild() const | 1446 InlineBox* InlineFlowBox::firstLeafChild() const |
1440 { | 1447 { |
1441 InlineBox* leaf = 0; | 1448 InlineBox* leaf = 0; |
1442 for (InlineBox* child = firstChild(); child && !leaf; child = child->nextOnL
ine()) | 1449 for (InlineBox* child = firstChild(); child && !leaf; child = child->nextOnL
ine()) |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1677 ASSERT(child->prevOnLine() == prev); | 1684 ASSERT(child->prevOnLine() == prev); |
1678 prev = child; | 1685 prev = child; |
1679 } | 1686 } |
1680 ASSERT(prev == m_lastChild); | 1687 ASSERT(prev == m_lastChild); |
1681 #endif | 1688 #endif |
1682 } | 1689 } |
1683 | 1690 |
1684 #endif | 1691 #endif |
1685 | 1692 |
1686 } // namespace blink | 1693 } // namespace blink |
OLD | NEW |