OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2007 David Smith (catfish.man@gmail.com) | 4 * (C) 2007 David Smith (catfish.man@gmail.com) |
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. | 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc.
All rights reserved. |
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 22 matching lines...) Expand all Loading... |
33 #include "core/editing/EditingUtilities.h" | 33 #include "core/editing/EditingUtilities.h" |
34 #include "core/editing/Editor.h" | 34 #include "core/editing/Editor.h" |
35 #include "core/editing/FrameSelection.h" | 35 #include "core/editing/FrameSelection.h" |
36 #include "core/frame/FrameView.h" | 36 #include "core/frame/FrameView.h" |
37 #include "core/frame/LocalFrame.h" | 37 #include "core/frame/LocalFrame.h" |
38 #include "core/frame/Settings.h" | 38 #include "core/frame/Settings.h" |
39 #include "core/html/HTMLMarqueeElement.h" | 39 #include "core/html/HTMLMarqueeElement.h" |
40 #include "core/layout/HitTestLocation.h" | 40 #include "core/layout/HitTestLocation.h" |
41 #include "core/layout/HitTestResult.h" | 41 #include "core/layout/HitTestResult.h" |
42 #include "core/layout/LayoutAnalyzer.h" | 42 #include "core/layout/LayoutAnalyzer.h" |
43 #include "core/layout/LayoutDeprecatedFlexibleBox.h" | |
44 #include "core/layout/LayoutFlexibleBox.h" | 43 #include "core/layout/LayoutFlexibleBox.h" |
45 #include "core/layout/LayoutFlowThread.h" | 44 #include "core/layout/LayoutFlowThread.h" |
46 #include "core/layout/LayoutGrid.h" | 45 #include "core/layout/LayoutGrid.h" |
47 #include "core/layout/LayoutInline.h" | 46 #include "core/layout/LayoutInline.h" |
48 #include "core/layout/LayoutMultiColumnSpannerPlaceholder.h" | 47 #include "core/layout/LayoutMultiColumnSpannerPlaceholder.h" |
49 #include "core/layout/LayoutObject.h" | 48 #include "core/layout/LayoutObject.h" |
50 #include "core/layout/LayoutTableCell.h" | 49 #include "core/layout/LayoutTableCell.h" |
51 #include "core/layout/LayoutTextCombine.h" | 50 #include "core/layout/LayoutTextCombine.h" |
52 #include "core/layout/LayoutTextControl.h" | 51 #include "core/layout/LayoutTextControl.h" |
53 #include "core/layout/LayoutTextFragment.h" | 52 #include "core/layout/LayoutTextFragment.h" |
(...skipping 2028 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2082 } | 2081 } |
2083 | 2082 |
2084 LayoutUnit LayoutBlock::minLineHeightForReplacedObject(bool isFirstLine, LayoutU
nit replacedHeight) const | 2083 LayoutUnit LayoutBlock::minLineHeightForReplacedObject(bool isFirstLine, LayoutU
nit replacedHeight) const |
2085 { | 2084 { |
2086 if (!document().inNoQuirksMode() && replacedHeight) | 2085 if (!document().inNoQuirksMode() && replacedHeight) |
2087 return replacedHeight; | 2086 return replacedHeight; |
2088 | 2087 |
2089 return std::max<LayoutUnit>(replacedHeight, lineHeight(isFirstLine, isHorizo
ntalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes))
; | 2088 return std::max<LayoutUnit>(replacedHeight, lineHeight(isFirstLine, isHorizo
ntalWritingMode() ? HorizontalLine : VerticalLine, PositionOfInteriorLineBoxes))
; |
2090 } | 2089 } |
2091 | 2090 |
| 2091 // TODO(mstensho): Figure out if all of this baseline code is needed here, or if
it should be moved |
| 2092 // down to LayoutBlockFlow. LayoutDeprecatedFlexibleBox and LayoutGrid lack base
line calculation |
| 2093 // overrides, so the code is here just for them. Just walking the block children
in logical order |
| 2094 // seems rather wrong for those two layout modes, though. |
| 2095 |
2092 int LayoutBlock::firstLineBoxBaseline() const | 2096 int LayoutBlock::firstLineBoxBaseline() const |
2093 { | 2097 { |
| 2098 ASSERT(!childrenInline()); |
2094 if (isWritingModeRoot() && !isRubyRun()) | 2099 if (isWritingModeRoot() && !isRubyRun()) |
2095 return -1; | 2100 return -1; |
2096 | 2101 |
2097 if (childrenInline()) { | |
2098 if (firstLineBox()) | |
2099 return firstLineBox()->logicalTop() + style(true)->getFontMetrics().
ascent(firstRootBox()->baselineType()); | |
2100 return -1; | |
2101 } | |
2102 for (LayoutBox* curr = firstChildBox(); curr; curr = curr->nextSiblingBox())
{ | 2102 for (LayoutBox* curr = firstChildBox(); curr; curr = curr->nextSiblingBox())
{ |
2103 if (!curr->isFloatingOrOutOfFlowPositioned()) { | 2103 if (!curr->isFloatingOrOutOfFlowPositioned()) { |
2104 int result = curr->firstLineBoxBaseline(); | 2104 int result = curr->firstLineBoxBaseline(); |
2105 if (result != -1) | 2105 if (result != -1) |
2106 return curr->logicalTop() + result; // Translate to our coordina
te space. | 2106 return curr->logicalTop() + result; // Translate to our coordina
te space. |
2107 } | 2107 } |
2108 } | 2108 } |
2109 return -1; | 2109 return -1; |
2110 } | 2110 } |
2111 | 2111 |
2112 int LayoutBlock::inlineBlockBaseline(LineDirectionMode lineDirection) const | 2112 int LayoutBlock::inlineBlockBaseline(LineDirectionMode lineDirection) const |
2113 { | 2113 { |
2114 // CSS2.1 states that the baseline of an 'inline-block' is: | 2114 ASSERT(!childrenInline()); |
2115 // the baseline of the last line box in the normal flow, unless it has | |
2116 // either no in-flow line boxes or if its 'overflow' property has a computed | |
2117 // value other than 'visible', in which case the baseline is the bottom | |
2118 // margin edge. | |
2119 // We likewise avoid using the last line box in the case of size containment
, | |
2120 // where the block's contents shouldn't be considered when laying out its | |
2121 // ancestors or siblings. | |
2122 | |
2123 if ((!style()->isOverflowVisible() && !shouldIgnoreOverflowPropertyForInline
BlockBaseline()) || style()->containsSize()) { | 2115 if ((!style()->isOverflowVisible() && !shouldIgnoreOverflowPropertyForInline
BlockBaseline()) || style()->containsSize()) { |
2124 // We are not calling LayoutBox::baselinePosition here because the calle
r should add the margin-top/margin-right, not us. | 2116 // We are not calling LayoutBox::baselinePosition here because the calle
r should add the margin-top/margin-right, not us. |
2125 return lineDirection == HorizontalLine ? size().height() + marginBottom(
) : size().width() + marginLeft(); | 2117 return lineDirection == HorizontalLine ? size().height() + marginBottom(
) : size().width() + marginLeft(); |
2126 } | 2118 } |
2127 | 2119 |
2128 if (isWritingModeRoot() && !isRubyRun()) | 2120 if (isWritingModeRoot() && !isRubyRun()) |
2129 return -1; | 2121 return -1; |
2130 | 2122 |
2131 if (childrenInline()) { | |
2132 if (!firstLineBox() && hasLineIfEmpty()) { | |
2133 const FontMetrics& fontMetrics = firstLineStyle()->getFontMetrics(); | |
2134 return fontMetrics.ascent() | |
2135 + (lineHeight(true, lineDirection, PositionOfInteriorLineBoxes)
- fontMetrics.height()) / 2 | |
2136 + (lineDirection == HorizontalLine ? borderTop() + paddingTop()
: borderRight() + paddingRight()); | |
2137 } | |
2138 if (lastLineBox()) | |
2139 return lastLineBox()->logicalTop() + style(lastLineBox() == firstLin
eBox())->getFontMetrics().ascent(lastRootBox()->baselineType()); | |
2140 return -1; | |
2141 } | |
2142 | |
2143 bool haveNormalFlowChild = false; | 2123 bool haveNormalFlowChild = false; |
2144 for (LayoutBox* curr = lastChildBox(); curr; curr = curr->previousSiblingBox
()) { | 2124 for (LayoutBox* curr = lastChildBox(); curr; curr = curr->previousSiblingBox
()) { |
2145 if (!curr->isFloatingOrOutOfFlowPositioned()) { | 2125 if (!curr->isFloatingOrOutOfFlowPositioned()) { |
2146 haveNormalFlowChild = true; | 2126 haveNormalFlowChild = true; |
2147 int result = curr->inlineBlockBaseline(lineDirection); | 2127 int result = curr->inlineBlockBaseline(lineDirection); |
2148 if (result != -1) | 2128 if (result != -1) |
2149 return curr->logicalTop() + result; // Translate to our coordina
te space. | 2129 return curr->logicalTop() + result; // Translate to our coordina
te space. |
2150 } | 2130 } |
2151 } | 2131 } |
2152 if (!haveNormalFlowChild && hasLineIfEmpty()) { | 2132 if (!haveNormalFlowChild && hasLineIfEmpty()) { |
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2646 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout
Object* obj) const | 2626 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout
Object* obj) const |
2647 { | 2627 { |
2648 showLayoutObject(); | 2628 showLayoutObject(); |
2649 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) | 2629 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) |
2650 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); | 2630 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); |
2651 } | 2631 } |
2652 | 2632 |
2653 #endif | 2633 #endif |
2654 | 2634 |
2655 } // namespace blink | 2635 } // namespace blink |
OLD | NEW |