diff options
Diffstat (limited to 'Source/WebCore/rendering/InlineFlowBox.cpp')
-rw-r--r-- | Source/WebCore/rendering/InlineFlowBox.cpp | 177 |
1 files changed, 107 insertions, 70 deletions
diff --git a/Source/WebCore/rendering/InlineFlowBox.cpp b/Source/WebCore/rendering/InlineFlowBox.cpp index b58a30e..045edff 100644 --- a/Source/WebCore/rendering/InlineFlowBox.cpp +++ b/Source/WebCore/rendering/InlineFlowBox.cpp @@ -97,7 +97,8 @@ void InlineFlowBox::addToLine(InlineBox* child) child->setFirstLineStyleBit(m_firstLine); child->setIsHorizontal(isHorizontal()); if (child->isText()) { - m_hasTextChildren = true; + if (child->renderer()->parent() == renderer()) + m_hasTextChildren = true; m_hasTextDescendants = true; } else if (child->isInlineFlowBox()) { if (static_cast<InlineFlowBox*>(child)->hasTextDescendants()) @@ -111,12 +112,13 @@ void InlineFlowBox::addToLine(InlineBox* child) if (child->renderer()->isReplaced()) shouldClearDescendantsHaveSameLineHeightAndBaseline = true; else if (child->isText()) { - if (child->renderer()->isBR()) { - if (parentStyle->font().fontMetrics().ascent() != childStyle->font().fontMetrics().ascent() - || parentStyle->font().fontMetrics().descent() != childStyle->font().fontMetrics().descent() || parentStyle->lineHeight() != childStyle->lineHeight() + if (child->renderer()->isBR() || child->renderer()->parent() != renderer()) { + if (!parentStyle->font().fontMetrics().hasIdenticalAscentDescentAndLineGap(childStyle->font().fontMetrics()) + || parentStyle->lineHeight() != childStyle->lineHeight() || (parentStyle->verticalAlign() != BASELINE && !isRootInlineBox()) || childStyle->verticalAlign() != BASELINE) shouldClearDescendantsHaveSameLineHeightAndBaseline = true; - } else if (childStyle->hasTextCombine() || childStyle->textEmphasisMark() != TextEmphasisMarkNone) + } + if (childStyle->hasTextCombine() || childStyle->textEmphasisMark() != TextEmphasisMarkNone) shouldClearDescendantsHaveSameLineHeightAndBaseline = true; } else { if (child->renderer()->isBR()) { @@ -127,8 +129,9 @@ void InlineFlowBox::addToLine(InlineBox* child) ASSERT(isInlineFlowBox()); InlineFlowBox* childFlowBox = static_cast<InlineFlowBox*>(child); // Check the child's bit, and then also check for differences in font, line-height, vertical-align - if (!childFlowBox->descendantsHaveSameLineHeightAndBaseline() || parentStyle->font().fontMetrics().ascent() != childStyle->font().fontMetrics().ascent() - || parentStyle->font().fontMetrics().descent() != childStyle->font().fontMetrics().descent() || parentStyle->lineHeight() != childStyle->lineHeight() + if (!childFlowBox->descendantsHaveSameLineHeightAndBaseline() + || !parentStyle->font().fontMetrics().hasIdenticalAscentDescentAndLineGap(childStyle->font().fontMetrics()) + || parentStyle->lineHeight() != childStyle->lineHeight() || (parentStyle->verticalAlign() != BASELINE && !isRootInlineBox()) || childStyle->verticalAlign() != BASELINE || childStyle->hasBorder() || childStyle->hasPadding() || childStyle->hasTextCombine()) shouldClearDescendantsHaveSameLineHeightAndBaseline = true; @@ -139,6 +142,23 @@ void InlineFlowBox::addToLine(InlineBox* child) clearDescendantsHaveSameLineHeightAndBaseline(); } + if (!child->renderer()->isPositioned()) { + if (child->isText()) { + RenderStyle* childStyle = child->renderer()->style(m_firstLine); + if (childStyle->letterSpacing() < 0 || childStyle->textShadow() || childStyle->textEmphasisMark() != TextEmphasisMarkNone || childStyle->textStrokeWidth()) + child->clearKnownToHaveNoOverflow(); + } else if (child->renderer()->isReplaced()) { + RenderBox* box = toRenderBox(child->renderer()); + if (box->hasRenderOverflow() || box->hasSelfPaintingLayer()) + child->clearKnownToHaveNoOverflow(); + } else if (!child->renderer()->isBR() && (child->renderer()->style(m_firstLine)->boxShadow() || child->boxModelObject()->hasSelfPaintingLayer() + || (child->renderer()->isListMarker() && !toRenderListMarker(child->renderer())->isInside()))) + child->clearKnownToHaveNoOverflow(); + + if (knownToHaveNoOverflow() && child->isInlineFlowBox() && !static_cast<InlineFlowBox*>(child)->knownToHaveNoOverflow()) + clearKnownToHaveNoOverflow(); + } + checkConsistency(); } @@ -232,19 +252,21 @@ RenderLineBoxList* InlineFlowBox::rendererLineBoxes() const return toRenderInline(renderer())->lineBoxes(); } -bool InlineFlowBox::onEndChain(RenderObject* endObject) +static inline bool isLastChildForRenderer(RenderObject* ancestor, RenderObject* child) { - if (!endObject) + if (!child) return false; - if (endObject == renderer()) + if (child == ancestor) return true; - RenderObject* curr = endObject; + RenderObject* curr = child; RenderObject* parent = curr->parent(); - while (parent && !parent->isRenderBlock()) { - if (parent->lastChild() != curr || parent == renderer()) + while (parent && (!parent->isRenderBlock() || parent->isInline())) { + if (parent->lastChild() != curr) return false; + if (parent == ancestor) + return true; curr = parent; parent = curr->parent(); @@ -256,7 +278,7 @@ bool InlineFlowBox::onEndChain(RenderObject* endObject) static bool isAnsectorAndWithinBlock(RenderObject* ancestor, RenderObject* child) { RenderObject* object = child; - while (object && !object->isRenderBlock()) { + while (object && (!object->isRenderBlock() || object->isInline())) { if (object == ancestor) return true; object = object->parent(); @@ -264,7 +286,7 @@ static bool isAnsectorAndWithinBlock(RenderObject* ancestor, RenderObject* child return false; } -void InlineFlowBox::determineSpacingForFlowBoxes(bool lastLine, RenderObject* endObject, RenderObject* logicallyLastRunRenderer) +void InlineFlowBox::determineSpacingForFlowBoxes(bool lastLine, bool isLogicallyLastRunWrapped, RenderObject* logicallyLastRunRenderer) { // All boxes start off open. They will not apply any margins/border/padding on // any side. @@ -287,8 +309,13 @@ void InlineFlowBox::determineSpacingForFlowBoxes(bool lastLine, RenderObject* en if (!lineBoxList->lastLineBox()->isConstructed()) { RenderInline* inlineFlow = toRenderInline(renderer()); - bool isLastObjectOnLine = (endObject && endObject->isText()) ? !isAnsectorAndWithinBlock(renderer(), logicallyLastRunRenderer->parent()) : onEndChain(logicallyLastRunRenderer); + bool isLastObjectOnLine = !isAnsectorAndWithinBlock(renderer(), logicallyLastRunRenderer) || (isLastChildForRenderer(renderer(), logicallyLastRunRenderer) && !isLogicallyLastRunWrapped); + // We include the border under these conditions: + // (1) The next line was not created, or it is constructed. We check the previous line for rtl. + // (2) The logicallyLastRun is not a descendant of this renderer. + // (3) The logicallyLastRun is a descendant of this renderer, but it is the last child of this renderer and it does not wrap to the next line. + if (ltr) { if (!nextLineBox() && ((lastLine || isLastObjectOnLine) && !inlineFlow->continuation())) @@ -307,7 +334,7 @@ void InlineFlowBox::determineSpacingForFlowBoxes(bool lastLine, RenderObject* en for (InlineBox* currChild = firstChild(); currChild; currChild = currChild->nextOnLine()) { if (currChild->isInlineFlowBox()) { InlineFlowBox* currFlow = static_cast<InlineFlowBox*>(currChild); - currFlow->determineSpacingForFlowBoxes(lastLine, endObject, logicallyLastRunRenderer); + currFlow->determineSpacingForFlowBoxes(lastLine, isLogicallyLastRunWrapped, logicallyLastRunRenderer); } } } @@ -319,7 +346,10 @@ float InlineFlowBox::placeBoxesInInlineDirection(float logicalLeft, bool& needsW float startLogicalLeft = logicalLeft; logicalLeft += borderLogicalLeft() + paddingLogicalLeft(); - + + float minLogicalLeft = startLogicalLeft; + float maxLogicalRight = logicalLeft; + for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { if (curr->renderer()->isText()) { InlineTextBox* text = static_cast<InlineTextBox*>(curr); @@ -330,7 +360,11 @@ float InlineFlowBox::placeBoxesInInlineDirection(float logicalLeft, bool& needsW needsWordSpacing = !isSpaceOrNewline(rt->characters()[text->end()]); } text->setLogicalLeft(logicalLeft); + if (knownToHaveNoOverflow()) + minLogicalLeft = min(logicalLeft, minLogicalLeft); logicalLeft += text->logicalWidth(); + if (knownToHaveNoOverflow()) + maxLogicalRight = max(logicalLeft, maxLogicalRight); } else { if (curr->renderer()->isPositioned()) { if (curr->renderer()->parent()->style()->isLeftToRightDirection()) @@ -345,7 +379,11 @@ float InlineFlowBox::placeBoxesInInlineDirection(float logicalLeft, bool& needsW if (curr->renderer()->isRenderInline()) { InlineFlowBox* flow = static_cast<InlineFlowBox*>(curr); logicalLeft += flow->marginLogicalLeft(); + if (knownToHaveNoOverflow()) + minLogicalLeft = min(logicalLeft, minLogicalLeft); logicalLeft = flow->placeBoxesInInlineDirection(logicalLeft, needsWordSpacing, textBoxDataMap); + if (knownToHaveNoOverflow()) + maxLogicalRight = max(logicalLeft, maxLogicalRight); logicalLeft += flow->marginLogicalRight(); } else if (!curr->renderer()->isListMarker() || toRenderListMarker(curr->renderer())->isInside()) { // The box can have a different writing-mode than the overall line, so this is a bit complicated. @@ -355,13 +393,20 @@ float InlineFlowBox::placeBoxesInInlineDirection(float logicalLeft, bool& needsW logicalLeft += logicalLeftMargin; curr->setLogicalLeft(logicalLeft); - logicalLeft += curr->logicalWidth() + logicalRightMargin; + if (knownToHaveNoOverflow()) + minLogicalLeft = min(logicalLeft, minLogicalLeft); + logicalLeft += curr->logicalWidth(); + if (knownToHaveNoOverflow()) + maxLogicalRight = max(logicalLeft, maxLogicalRight); + logicalLeft += logicalRightMargin; } } } logicalLeft += borderLogicalRight() + paddingLogicalRight(); setLogicalWidth(logicalLeft - startLogicalLeft); + if (knownToHaveNoOverflow() && (minLogicalLeft < startLogicalLeft || maxLogicalRight > logicalLeft)) + clearKnownToHaveNoOverflow(); return logicalLeft; } @@ -631,7 +676,7 @@ void InlineFlowBox::placeBoxesInBlockDirection(int top, int maxHeight, int maxAs lineBottom = max(lineBottom, newLogicalTop + boxHeight); lineBottomIncludingMargins = max(lineBottom, max(lineBottomIncludingMargins, newLogicalTopIncludingMargins + boxHeightIncludingMargins)); } - + // Adjust boxes to use their real box y/height and not the logical height (as dictated by // line-height). if (inlineFlowBox) @@ -674,7 +719,7 @@ void InlineFlowBox::flipLinesInBlockDirection(int lineTop, int lineBottom) } } -void InlineFlowBox::addBoxShadowVisualOverflow(IntRect& logicalVisualOverflow) +inline void InlineFlowBox::addBoxShadowVisualOverflow(IntRect& logicalVisualOverflow) { if (!parent()) return; // Box-shadow doesn't apply to root line boxes. @@ -697,14 +742,15 @@ void InlineFlowBox::addBoxShadowVisualOverflow(IntRect& logicalVisualOverflow) logicalRightVisualOverflow - logicalLeftVisualOverflow, logicalBottomVisualOverflow - logicalTopVisualOverflow); } -void InlineFlowBox::addTextBoxVisualOverflow(const InlineTextBox* textBox, GlyphOverflowAndFallbackFontsMap& textBoxDataMap, IntRect& logicalVisualOverflow) +inline void InlineFlowBox::addTextBoxVisualOverflow(InlineTextBox* textBox, GlyphOverflowAndFallbackFontsMap& textBoxDataMap, IntRect& logicalVisualOverflow) { - RenderStyle* style = renderer()->style(m_firstLine); - int strokeOverflow = static_cast<int>(ceilf(style->textStrokeWidth() / 2.0f)); + if (textBox->knownToHaveNoOverflow()) + return; + RenderStyle* style = textBox->renderer()->style(m_firstLine); + GlyphOverflowAndFallbackFontsMap::iterator it = textBoxDataMap.find(textBox); GlyphOverflow* glyphOverflow = it == textBoxDataMap.end() ? 0 : &it->second.second; - bool isFlippedLine = style->isFlippedLinesWritingMode(); int topGlyphEdge = glyphOverflow ? (isFlippedLine ? glyphOverflow->bottom : glyphOverflow->top) : 0; @@ -712,6 +758,7 @@ void InlineFlowBox::addTextBoxVisualOverflow(const InlineTextBox* textBox, Glyph int leftGlyphEdge = glyphOverflow ? glyphOverflow->left : 0; int rightGlyphEdge = glyphOverflow ? glyphOverflow->right : 0; + int strokeOverflow = static_cast<int>(ceilf(style->textStrokeWidth() / 2.0f)); int topGlyphOverflow = -strokeOverflow - topGlyphEdge; int bottomGlyphOverflow = strokeOverflow + bottomGlyphEdge; int leftGlyphOverflow = -strokeOverflow - leftGlyphEdge; @@ -728,8 +775,7 @@ void InlineFlowBox::addTextBoxVisualOverflow(const InlineTextBox* textBox, Glyph // If letter-spacing is negative, we should factor that into right layout overflow. (Even in RTL, letter-spacing is // applied to the right, so this is not an issue with left overflow. - int letterSpacing = min(0, (int)style->font().letterSpacing()); - rightGlyphOverflow -= letterSpacing; + rightGlyphOverflow -= min(0, (int)style->font().letterSpacing()); int textShadowLogicalTop; int textShadowLogicalBottom; @@ -752,9 +798,11 @@ void InlineFlowBox::addTextBoxVisualOverflow(const InlineTextBox* textBox, Glyph logicalVisualOverflow = IntRect(logicalLeftVisualOverflow, logicalTopVisualOverflow, logicalRightVisualOverflow - logicalLeftVisualOverflow, logicalBottomVisualOverflow - logicalTopVisualOverflow); + + textBox->setLogicalOverflowRect(logicalVisualOverflow); } -void InlineFlowBox::addReplacedChildOverflow(const InlineBox* inlineBox, IntRect& logicalLayoutOverflow, IntRect& logicalVisualOverflow) +inline void InlineFlowBox::addReplacedChildOverflow(const InlineBox* inlineBox, IntRect& logicalLayoutOverflow, IntRect& logicalVisualOverflow) { RenderBox* box = toRenderBox(inlineBox->renderer()); @@ -775,17 +823,16 @@ void InlineFlowBox::addReplacedChildOverflow(const InlineBox* inlineBox, IntRect logicalLayoutOverflow.unite(childLogicalLayoutOverflow); } -void InlineFlowBox::computeOverflow(int lineTop, int lineBottom, bool strictMode, GlyphOverflowAndFallbackFontsMap& textBoxDataMap) +void InlineFlowBox::computeOverflow(int lineTop, int lineBottom, GlyphOverflowAndFallbackFontsMap& textBoxDataMap) { - // Any spillage outside of the line top and bottom is not considered overflow. We just ignore this, since it only happens - // from the "your ascent/descent don't affect the line" quirk. - int topOverflow = max(logicalTop(), lineTop); - int bottomOverflow = min(logicalBottom(), lineBottom); - + // If we know we have no overflow, we can just bail. + if (knownToHaveNoOverflow()) + return; + // Visual overflow just includes overflow for stuff we need to repaint ourselves. Self-painting layers are ignored. // Layout overflow is used to determine scrolling extent, so it still includes child layers and also factors in // transforms, relative positioning, etc. - IntRect logicalLayoutOverflow(enclosingIntRect(FloatRect(logicalLeft(), topOverflow, logicalWidth(), bottomOverflow - topOverflow))); + IntRect logicalLayoutOverflow(enclosingIntRect(logicalFrameRectIncludingLineHeight(lineTop, lineBottom))); IntRect logicalVisualOverflow(logicalLayoutOverflow); // box-shadow on root line boxes is applying to the block and not to the lines. @@ -800,50 +847,40 @@ void InlineFlowBox::computeOverflow(int lineTop, int lineBottom, bool strictMode RenderText* rt = toRenderText(text->renderer()); if (rt->isBR()) continue; - addTextBoxVisualOverflow(text, textBoxDataMap, logicalVisualOverflow); + IntRect textBoxOverflow(enclosingIntRect(text->logicalFrameRect())); + addTextBoxVisualOverflow(text, textBoxDataMap, textBoxOverflow); + logicalVisualOverflow.unite(textBoxOverflow); } else if (curr->renderer()->isRenderInline()) { InlineFlowBox* flow = static_cast<InlineFlowBox*>(curr); - flow->computeOverflow(lineTop, lineBottom, strictMode, textBoxDataMap); + flow->computeOverflow(lineTop, lineBottom, textBoxDataMap); if (!flow->boxModelObject()->hasSelfPaintingLayer()) - logicalVisualOverflow.unite(flow->logicalVisualOverflowRect()); - IntRect childLayoutOverflow = flow->logicalLayoutOverflowRect(); + logicalVisualOverflow.unite(flow->logicalVisualOverflowRect(lineTop, lineBottom)); + IntRect childLayoutOverflow = flow->logicalLayoutOverflowRect(lineTop, lineBottom); childLayoutOverflow.move(flow->boxModelObject()->relativePositionLogicalOffset()); logicalLayoutOverflow.unite(childLayoutOverflow); } else addReplacedChildOverflow(curr, logicalLayoutOverflow, logicalVisualOverflow); } - setOverflowFromLogicalRects(logicalLayoutOverflow, logicalVisualOverflow); + setOverflowFromLogicalRects(logicalLayoutOverflow, logicalVisualOverflow, lineTop, lineBottom); } -// FIXME: You will notice there is no contains() check here. If the rect is smaller than the frame box it actually -// becomes the new overflow. The reason for this is that in quirks mode we don't let inline flow boxes paint -// outside of the root line box's lineTop and lineBottom values. We accomplish this visual clamping by actually -// insetting the overflow rect so that it's smaller than the frame rect. -// -// The reason we don't just mutate the frameRect in quirks mode is that we'd have to put the m_height member variable -// back into InlineBox. Basically the tradeoff is 4 bytes in all modes (for m_height) added to InlineFlowBox, or -// the allocation of a RenderOverflow struct for InlineFlowBoxes in quirks mode only. For now, we're opting to award -// the smaller memory consumption to strict mode pages. -// -// It might be possible to hash a custom height, or to require that lineTop and lineBottom be passed in to -// all functions that query overflow. -void InlineFlowBox::setLayoutOverflow(const IntRect& rect) +void InlineFlowBox::setLayoutOverflow(const IntRect& rect, int lineTop, int lineBottom) { - IntRect frameBox = enclosingIntRect(FloatRect(x(), y(), width(), height())); - if (frameBox == rect || rect.isEmpty()) + IntRect frameBox = enclosingIntRect(frameRectIncludingLineHeight(lineTop, lineBottom)); + if (frameBox.contains(rect) || rect.isEmpty()) return; - + if (!m_overflow) m_overflow.set(new RenderOverflow(frameBox, frameBox)); m_overflow->setLayoutOverflow(rect); } -void InlineFlowBox::setVisualOverflow(const IntRect& rect) +void InlineFlowBox::setVisualOverflow(const IntRect& rect, int lineTop, int lineBottom) { - IntRect frameBox = enclosingIntRect(FloatRect(x(), y(), width(), height())); - if (frameBox == rect || rect.isEmpty()) + IntRect frameBox = enclosingIntRect(frameRectIncludingLineHeight(lineTop, lineBottom)); + if (frameBox.contains(rect) || rect.isEmpty()) return; if (!m_overflow) @@ -852,18 +889,18 @@ void InlineFlowBox::setVisualOverflow(const IntRect& rect) m_overflow->setVisualOverflow(rect); } -void InlineFlowBox::setOverflowFromLogicalRects(const IntRect& logicalLayoutOverflow, const IntRect& logicalVisualOverflow) +void InlineFlowBox::setOverflowFromLogicalRects(const IntRect& logicalLayoutOverflow, const IntRect& logicalVisualOverflow, int lineTop, int lineBottom) { IntRect layoutOverflow(isHorizontal() ? logicalLayoutOverflow : logicalLayoutOverflow.transposedRect()); - setLayoutOverflow(layoutOverflow); + setLayoutOverflow(layoutOverflow, lineTop, lineBottom); IntRect visualOverflow(isHorizontal() ? logicalVisualOverflow : logicalVisualOverflow.transposedRect()); - setVisualOverflow(visualOverflow); + setVisualOverflow(visualOverflow, lineTop, lineBottom); } -bool InlineFlowBox::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, int x, int y, int tx, int ty) +bool InlineFlowBox::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, int x, int y, int tx, int ty, int lineTop, int lineBottom) { - IntRect overflowRect(visualOverflowRect()); + IntRect overflowRect(visualOverflowRect(lineTop, lineBottom)); flipForWritingMode(overflowRect); overflowRect.move(tx, ty); if (!overflowRect.intersects(result.rectForPoint(x, y))) @@ -871,7 +908,7 @@ bool InlineFlowBox::nodeAtPoint(const HitTestRequest& request, HitTestResult& re // Check children first. for (InlineBox* curr = lastChild(); curr; curr = curr->prevOnLine()) { - if ((curr->renderer()->isText() || !curr->boxModelObject()->hasSelfPaintingLayer()) && curr->nodeAtPoint(request, result, x, y, tx, ty)) { + if ((curr->renderer()->isText() || !curr->boxModelObject()->hasSelfPaintingLayer()) && curr->nodeAtPoint(request, result, x, y, tx, ty, lineTop, lineBottom)) { renderer()->updateHitTestResult(result, IntPoint(x - tx, y - ty)); return true; } @@ -909,9 +946,9 @@ bool InlineFlowBox::nodeAtPoint(const HitTestRequest& request, HitTestResult& re return false; } -void InlineFlowBox::paint(PaintInfo& paintInfo, int tx, int ty) +void InlineFlowBox::paint(PaintInfo& paintInfo, int tx, int ty, int lineTop, int lineBottom) { - IntRect overflowRect(visualOverflowRect()); + IntRect overflowRect(visualOverflowRect(lineTop, lineBottom)); overflowRect.inflate(renderer()->maximalOutlineSize(paintInfo.phase)); flipForWritingMode(overflowRect); overflowRect.move(tx, ty); @@ -974,7 +1011,7 @@ void InlineFlowBox::paint(PaintInfo& paintInfo, int tx, int ty) if (paintPhase != PaintPhaseSelfOutline) { for (InlineBox* curr = firstChild(); curr; curr = curr->nextOnLine()) { if (curr->renderer()->isText() || !curr->boxModelObject()->hasSelfPaintingLayer()) - curr->paint(childInfo, tx, ty); + curr->paint(childInfo, tx, ty, lineTop, lineBottom); } } } @@ -992,7 +1029,7 @@ void InlineFlowBox::paintFillLayer(const PaintInfo& paintInfo, const Color& c, c StyleImage* img = fillLayer->image(); bool hasFillImage = img && img->canRender(renderer()->style()->effectiveZoom()); if ((!hasFillImage && !renderer()->style()->hasBorderRadius()) || (!prevLineBox() && !nextLineBox()) || !parent()) - boxModelObject()->paintFillLayerExtended(paintInfo, c, fillLayer, tx, ty, w, h, this, op); + boxModelObject()->paintFillLayerExtended(paintInfo, c, fillLayer, tx, ty, w, h, this, w, h, op); else { // We have a fill image that spans multiple lines. // We need to adjust tx and ty by the width of all previous lines. @@ -1021,7 +1058,7 @@ void InlineFlowBox::paintFillLayer(const PaintInfo& paintInfo, const Color& c, c int stripHeight = isHorizontal() ? height() : totalLogicalWidth; paintInfo.context->save(); paintInfo.context->clip(IntRect(tx, ty, width(), height())); - boxModelObject()->paintFillLayerExtended(paintInfo, c, fillLayer, stripX, stripY, stripWidth, stripHeight, this, op); + boxModelObject()->paintFillLayerExtended(paintInfo, c, fillLayer, stripX, stripY, stripWidth, stripHeight, this, w, h, op); paintInfo.context->restore(); } } |