| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2003, 2006, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2006, 2008 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 709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 { | 720 { |
| 721 if (box->renderer().isText()) | 721 if (box->renderer().isText()) |
| 722 return box->parent()->logicalTop(); | 722 return box->parent()->logicalTop(); |
| 723 | 723 |
| 724 RenderBoxModelObject* renderer = box->boxModelObject(); | 724 RenderBoxModelObject* renderer = box->boxModelObject(); |
| 725 ASSERT(renderer->isInline()); | 725 ASSERT(renderer->isInline()); |
| 726 if (!renderer->isInline()) | 726 if (!renderer->isInline()) |
| 727 return 0; | 727 return 0; |
| 728 | 728 |
| 729 // This method determines the vertical position for inline elements. | 729 // This method determines the vertical position for inline elements. |
| 730 bool firstLine = isFirstLineStyle(); | 730 OwnOrFirstLineStyle ownOrFirstLineStyle = isFirstLineStyle(); |
| 731 if (firstLine && !renderer->document().styleEngine()->usesFirstLineRules()) | 731 if (ownOrFirstLineStyle == FirstLineStyle && !renderer->document().styleEngi
ne()->usesFirstLineRules()) |
| 732 firstLine = false; | 732 ownOrFirstLineStyle = OwnStyle; |
| 733 | 733 |
| 734 // Check the cache. | 734 // Check the cache. |
| 735 bool isRenderInline = renderer->isRenderInline(); | 735 bool isRenderInline = renderer->isRenderInline(); |
| 736 if (isRenderInline && !firstLine) { | 736 if (isRenderInline && ownOrFirstLineStyle == OwnStyle) { |
| 737 LayoutUnit verticalPosition = verticalPositionCache.get(renderer, baseli
neType()); | 737 LayoutUnit verticalPosition = verticalPositionCache.get(renderer, baseli
neType()); |
| 738 if (verticalPosition != PositionUndefined) | 738 if (verticalPosition != PositionUndefined) |
| 739 return verticalPosition; | 739 return verticalPosition; |
| 740 } | 740 } |
| 741 | 741 |
| 742 LayoutUnit verticalPosition = 0; | 742 LayoutUnit verticalPosition = 0; |
| 743 EVerticalAlign verticalAlign = renderer->style()->verticalAlign(); | 743 EVerticalAlign verticalAlign = renderer->style()->verticalAlign(); |
| 744 if (verticalAlign == TOP || verticalAlign == BOTTOM) | 744 if (verticalAlign == TOP || verticalAlign == BOTTOM) |
| 745 return 0; | 745 return 0; |
| 746 | 746 |
| 747 RenderObject* parent = renderer->parent(); | 747 RenderObject* parent = renderer->parent(); |
| 748 if (parent->isRenderInline() && parent->style()->verticalAlign() != TOP && p
arent->style()->verticalAlign() != BOTTOM) | 748 if (parent->isRenderInline() && parent->style()->verticalAlign() != TOP && p
arent->style()->verticalAlign() != BOTTOM) |
| 749 verticalPosition = box->parent()->logicalTop(); | 749 verticalPosition = box->parent()->logicalTop(); |
| 750 | 750 |
| 751 if (verticalAlign != BASELINE) { | 751 if (verticalAlign != BASELINE) { |
| 752 const Font& font = parent->style(firstLine)->font(); | 752 const Font& font = parent->style(ownOrFirstLineStyle)->font(); |
| 753 const FontMetrics& fontMetrics = font.fontMetrics(); | 753 const FontMetrics& fontMetrics = font.fontMetrics(); |
| 754 int fontSize = font.fontDescription().computedPixelSize(); | 754 int fontSize = font.fontDescription().computedPixelSize(); |
| 755 | 755 |
| 756 LineDirectionMode lineDirection = parent->isHorizontalWritingMode() ? Ho
rizontalLine : VerticalLine; | 756 LineDirectionMode lineDirection = parent->isHorizontalWritingMode() ? Ho
rizontalLine : VerticalLine; |
| 757 | 757 |
| 758 if (verticalAlign == SUB) | 758 if (verticalAlign == SUB) |
| 759 verticalPosition += fontSize / 5 + 1; | 759 verticalPosition += fontSize / 5 + 1; |
| 760 else if (verticalAlign == SUPER) | 760 else if (verticalAlign == SUPER) |
| 761 verticalPosition -= fontSize / 3 + 1; | 761 verticalPosition -= fontSize / 3 + 1; |
| 762 else if (verticalAlign == TEXT_TOP) | 762 else if (verticalAlign == TEXT_TOP) |
| 763 verticalPosition += renderer->baselinePosition(baselineType(), first
Line, lineDirection) - fontMetrics.ascent(baselineType()); | 763 verticalPosition += renderer->baselinePosition(baselineType(), ownOr
FirstLineStyle, lineDirection) - fontMetrics.ascent(baselineType()); |
| 764 else if (verticalAlign == MIDDLE) | 764 else if (verticalAlign == MIDDLE) |
| 765 verticalPosition = (verticalPosition - static_cast<LayoutUnit>(fontM
etrics.xHeight() / 2) - renderer->lineHeight(firstLine, lineDirection) / 2 + ren
derer->baselinePosition(baselineType(), firstLine, lineDirection)).round(); | 765 verticalPosition = (verticalPosition - static_cast<LayoutUnit>(fontM
etrics.xHeight() / 2) - renderer->lineHeight(ownOrFirstLineStyle, lineDirection)
/ 2 + renderer->baselinePosition(baselineType(), ownOrFirstLineStyle, lineDirec
tion)).round(); |
| 766 else if (verticalAlign == TEXT_BOTTOM) { | 766 else if (verticalAlign == TEXT_BOTTOM) { |
| 767 verticalPosition += fontMetrics.descent(baselineType()); | 767 verticalPosition += fontMetrics.descent(baselineType()); |
| 768 // lineHeight - baselinePosition is always 0 for replaced elements (
except inline blocks), so don't bother wasting time in that case. | 768 // lineHeight - baselinePosition is always 0 for replaced elements (
except inline blocks), so don't bother wasting time in that case. |
| 769 if (!renderer->isReplaced() || renderer->isInlineBlockOrInlineTable(
)) | 769 if (!renderer->isReplaced() || renderer->isInlineBlockOrInlineTable(
)) |
| 770 verticalPosition -= (renderer->lineHeight(firstLine, lineDirecti
on) - renderer->baselinePosition(baselineType(), firstLine, lineDirection)); | 770 verticalPosition -= (renderer->lineHeight(ownOrFirstLineStyle, l
ineDirection) - renderer->baselinePosition(baselineType(), ownOrFirstLineStyle,
lineDirection)); |
| 771 } else if (verticalAlign == BASELINE_MIDDLE) | 771 } else if (verticalAlign == BASELINE_MIDDLE) |
| 772 verticalPosition += -renderer->lineHeight(firstLine, lineDirection)
/ 2 + renderer->baselinePosition(baselineType(), firstLine, lineDirection); | 772 verticalPosition += -renderer->lineHeight(ownOrFirstLineStyle, lineD
irection) / 2 + renderer->baselinePosition(baselineType(), ownOrFirstLineStyle,
lineDirection); |
| 773 else if (verticalAlign == LENGTH) { | 773 else if (verticalAlign == LENGTH) { |
| 774 LayoutUnit lineHeight; | 774 LayoutUnit lineHeight; |
| 775 //Per http://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align
: 'Percentages: refer to the 'line-height' of the element itself'. | 775 //Per http://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align
: 'Percentages: refer to the 'line-height' of the element itself'. |
| 776 if (renderer->style()->verticalAlignLength().isPercent()) | 776 if (renderer->style()->verticalAlignLength().isPercent()) |
| 777 lineHeight = renderer->style()->computedLineHeight(); | 777 lineHeight = renderer->style()->computedLineHeight(); |
| 778 else | 778 else |
| 779 lineHeight = renderer->lineHeight(firstLine, lineDirection); | 779 lineHeight = renderer->lineHeight(ownOrFirstLineStyle, lineDirec
tion); |
| 780 verticalPosition -= valueForLength(renderer->style()->verticalAlignL
ength(), lineHeight); | 780 verticalPosition -= valueForLength(renderer->style()->verticalAlignL
ength(), lineHeight); |
| 781 } | 781 } |
| 782 } | 782 } |
| 783 | 783 |
| 784 // Store the cached value. | 784 // Store the cached value. |
| 785 if (isRenderInline && !firstLine) | 785 if (isRenderInline && ownOrFirstLineStyle == OwnStyle) |
| 786 verticalPositionCache.set(renderer, baselineType(), verticalPosition); | 786 verticalPositionCache.set(renderer, baselineType(), verticalPosition); |
| 787 | 787 |
| 788 return verticalPosition; | 788 return verticalPosition; |
| 789 } | 789 } |
| 790 | 790 |
| 791 bool RootInlineBox::includeLeadingForBox(InlineBox* box) const | 791 bool RootInlineBox::includeLeadingForBox(InlineBox* box) const |
| 792 { | 792 { |
| 793 if (box->renderer().isReplaced() || (box->renderer().isText() && !box->isTex
t())) | 793 if (box->renderer().isReplaced() || (box->renderer().isText() && !box->isTex
t())) |
| 794 return false; | 794 return false; |
| 795 | 795 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 875 } | 875 } |
| 876 | 876 |
| 877 #ifndef NDEBUG | 877 #ifndef NDEBUG |
| 878 const char* RootInlineBox::boxName() const | 878 const char* RootInlineBox::boxName() const |
| 879 { | 879 { |
| 880 return "RootInlineBox"; | 880 return "RootInlineBox"; |
| 881 } | 881 } |
| 882 #endif | 882 #endif |
| 883 | 883 |
| 884 } // namespace WebCore | 884 } // namespace WebCore |
| OLD | NEW |