| 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 603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 614 } | 614 } |
| 615 | 615 |
| 616 void RootInlineBox::ascentAndDescentForBox(InlineBox* box, GlyphOverflowAndFallb
ackFontsMap& textBoxDataMap, int& ascent, int& descent, | 616 void RootInlineBox::ascentAndDescentForBox(InlineBox* box, GlyphOverflowAndFallb
ackFontsMap& textBoxDataMap, int& ascent, int& descent, |
| 617 bool& affectsAscent, bool& affectsDes
cent) const | 617 bool& affectsAscent, bool& affectsDes
cent) const |
| 618 { | 618 { |
| 619 bool ascentDescentSet = false; | 619 bool ascentDescentSet = false; |
| 620 | 620 |
| 621 // Replaced boxes will return 0 for the line-height if line-box-contain says
they are | 621 // Replaced boxes will return 0 for the line-height if line-box-contain says
they are |
| 622 // not to be included. | 622 // not to be included. |
| 623 if (box->renderer().isReplaced()) { | 623 if (box->renderer().isReplaced()) { |
| 624 if (renderer().style(isFirstLineStyle())->lineBoxContain() & LineBoxCont
ainReplaced) { | 624 if (renderer().styleOrFirstLineStyle(isFirstLineStyle())->lineBoxContain
() & LineBoxContainReplaced) { |
| 625 ascent = box->baselinePosition(baselineType()); | 625 ascent = box->baselinePosition(baselineType()); |
| 626 descent = box->lineHeight() - ascent; | 626 descent = box->lineHeight() - ascent; |
| 627 | 627 |
| 628 // Replaced elements always affect both the ascent and descent. | 628 // Replaced elements always affect both the ascent and descent. |
| 629 affectsAscent = true; | 629 affectsAscent = true; |
| 630 affectsDescent = true; | 630 affectsDescent = true; |
| 631 } | 631 } |
| 632 return; | 632 return; |
| 633 } | 633 } |
| 634 | 634 |
| 635 Vector<const SimpleFontData*>* usedFonts = 0; | 635 Vector<const SimpleFontData*>* usedFonts = 0; |
| 636 GlyphOverflow* glyphOverflow = 0; | 636 GlyphOverflow* glyphOverflow = 0; |
| 637 if (box->isText()) { | 637 if (box->isText()) { |
| 638 GlyphOverflowAndFallbackFontsMap::iterator it = textBoxDataMap.find(toIn
lineTextBox(box)); | 638 GlyphOverflowAndFallbackFontsMap::iterator it = textBoxDataMap.find(toIn
lineTextBox(box)); |
| 639 usedFonts = it == textBoxDataMap.end() ? 0 : &it->value.first; | 639 usedFonts = it == textBoxDataMap.end() ? 0 : &it->value.first; |
| 640 glyphOverflow = it == textBoxDataMap.end() ? 0 : &it->value.second; | 640 glyphOverflow = it == textBoxDataMap.end() ? 0 : &it->value.second; |
| 641 } | 641 } |
| 642 | 642 |
| 643 bool includeLeading = includeLeadingForBox(box); | 643 bool includeLeading = includeLeadingForBox(box); |
| 644 bool includeFont = includeFontForBox(box); | 644 bool includeFont = includeFontForBox(box); |
| 645 | 645 |
| 646 bool setUsedFont = false; | 646 bool setUsedFont = false; |
| 647 bool setUsedFontWithLeading = false; | 647 bool setUsedFontWithLeading = false; |
| 648 | 648 |
| 649 if (usedFonts && !usedFonts->isEmpty() && (includeFont || (box->renderer().s
tyle(isFirstLineStyle())->lineHeight().isNegative() && includeLeading))) { | 649 if (usedFonts && !usedFonts->isEmpty() && (includeFont || (box->renderer().s
tyleOrFirstLineStyle(isFirstLineStyle())->lineHeight().isNegative() && includeLe
ading))) { |
| 650 usedFonts->append(box->renderer().style(isFirstLineStyle())->font().prim
aryFont()); | 650 usedFonts->append(box->renderer().styleOrFirstLineStyle(isFirstLineStyle
())->font().primaryFont()); |
| 651 for (size_t i = 0; i < usedFonts->size(); ++i) { | 651 for (size_t i = 0; i < usedFonts->size(); ++i) { |
| 652 const FontMetrics& fontMetrics = usedFonts->at(i)->fontMetrics(); | 652 const FontMetrics& fontMetrics = usedFonts->at(i)->fontMetrics(); |
| 653 int usedFontAscent = fontMetrics.ascent(baselineType()); | 653 int usedFontAscent = fontMetrics.ascent(baselineType()); |
| 654 int usedFontDescent = fontMetrics.descent(baselineType()); | 654 int usedFontDescent = fontMetrics.descent(baselineType()); |
| 655 int halfLeading = (fontMetrics.lineSpacing() - fontMetrics.height())
/ 2; | 655 int halfLeading = (fontMetrics.lineSpacing() - fontMetrics.height())
/ 2; |
| 656 int usedFontAscentAndLeading = usedFontAscent + halfLeading; | 656 int usedFontAscentAndLeading = usedFontAscent + halfLeading; |
| 657 int usedFontDescentAndLeading = fontMetrics.lineSpacing() - usedFont
AscentAndLeading; | 657 int usedFontDescentAndLeading = fontMetrics.lineSpacing() - usedFont
AscentAndLeading; |
| 658 if (includeFont) { | 658 if (includeFont) { |
| 659 setAscentAndDescent(ascent, descent, usedFontAscent, usedFontDes
cent, ascentDescentSet); | 659 setAscentAndDescent(ascent, descent, usedFontAscent, usedFontDes
cent, ascentDescentSet); |
| 660 setUsedFont = true; | 660 setUsedFont = true; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 678 | 678 |
| 679 // Examine the font box for inline flows and text boxes to see if any pa
rt of it is above the baseline. | 679 // Examine the font box for inline flows and text boxes to see if any pa
rt of it is above the baseline. |
| 680 // If the top of our font box relative to the root box baseline is above
the root box baseline, then | 680 // If the top of our font box relative to the root box baseline is above
the root box baseline, then |
| 681 // we are contributing to the maxAscent value. Descent is similar. If an
y part of our font box is below | 681 // we are contributing to the maxAscent value. Descent is similar. If an
y part of our font box is below |
| 682 // the root box's baseline, then we contribute to the maxDescent value. | 682 // the root box's baseline, then we contribute to the maxDescent value. |
| 683 affectsAscent = ascentWithLeading - box->logicalTop() > 0; | 683 affectsAscent = ascentWithLeading - box->logicalTop() > 0; |
| 684 affectsDescent = descentWithLeading + box->logicalTop() > 0; | 684 affectsDescent = descentWithLeading + box->logicalTop() > 0; |
| 685 } | 685 } |
| 686 | 686 |
| 687 if (includeFontForBox(box) && !setUsedFont) { | 687 if (includeFontForBox(box) && !setUsedFont) { |
| 688 int fontAscent = box->renderer().style(isFirstLineStyle())->fontMetrics(
).ascent(baselineType()); | 688 int fontAscent = box->renderer().styleOrFirstLineStyle(isFirstLineStyle(
))->fontMetrics().ascent(baselineType()); |
| 689 int fontDescent = box->renderer().style(isFirstLineStyle())->fontMetrics
().descent(baselineType()); | 689 int fontDescent = box->renderer().styleOrFirstLineStyle(isFirstLineStyle
())->fontMetrics().descent(baselineType()); |
| 690 setAscentAndDescent(ascent, descent, fontAscent, fontDescent, ascentDesc
entSet); | 690 setAscentAndDescent(ascent, descent, fontAscent, fontDescent, ascentDesc
entSet); |
| 691 affectsAscent = fontAscent - box->logicalTop() > 0; | 691 affectsAscent = fontAscent - box->logicalTop() > 0; |
| 692 affectsDescent = fontDescent + box->logicalTop() > 0; | 692 affectsDescent = fontDescent + box->logicalTop() > 0; |
| 693 } | 693 } |
| 694 | 694 |
| 695 if (includeGlyphsForBox(box) && glyphOverflow && glyphOverflow->computeBound
s) { | 695 if (includeGlyphsForBox(box) && glyphOverflow && glyphOverflow->computeBound
s) { |
| 696 setAscentAndDescent(ascent, descent, glyphOverflow->top, glyphOverflow->
bottom, ascentDescentSet); | 696 setAscentAndDescent(ascent, descent, glyphOverflow->top, glyphOverflow->
bottom, ascentDescentSet); |
| 697 affectsAscent = glyphOverflow->top - box->logicalTop() > 0; | 697 affectsAscent = glyphOverflow->top - box->logicalTop() > 0; |
| 698 affectsDescent = glyphOverflow->bottom + box->logicalTop() > 0; | 698 affectsDescent = glyphOverflow->bottom + box->logicalTop() > 0; |
| 699 glyphOverflow->top = std::min(glyphOverflow->top, std::max(0, glyphOverf
low->top - box->renderer().style(isFirstLineStyle())->fontMetrics().ascent(basel
ineType()))); | 699 glyphOverflow->top = std::min(glyphOverflow->top, std::max(0, glyphOverf
low->top - box->renderer().styleOrFirstLineStyle(isFirstLineStyle())->fontMetric
s().ascent(baselineType()))); |
| 700 glyphOverflow->bottom = std::min(glyphOverflow->bottom, std::max(0, glyp
hOverflow->bottom - box->renderer().style(isFirstLineStyle())->fontMetrics().des
cent(baselineType()))); | 700 glyphOverflow->bottom = std::min(glyphOverflow->bottom, std::max(0, glyp
hOverflow->bottom - box->renderer().styleOrFirstLineStyle(isFirstLineStyle())->f
ontMetrics().descent(baselineType()))); |
| 701 } | 701 } |
| 702 | 702 |
| 703 if (includeMarginForBox(box)) { | 703 if (includeMarginForBox(box)) { |
| 704 LayoutUnit ascentWithMargin = box->renderer().style(isFirstLineStyle())-
>fontMetrics().ascent(baselineType()); | 704 LayoutUnit ascentWithMargin = box->renderer().styleOrFirstLineStyle(isFi
rstLineStyle())->fontMetrics().ascent(baselineType()); |
| 705 LayoutUnit descentWithMargin = box->renderer().style(isFirstLineStyle())
->fontMetrics().descent(baselineType()); | 705 LayoutUnit descentWithMargin = box->renderer().styleOrFirstLineStyle(isF
irstLineStyle())->fontMetrics().descent(baselineType()); |
| 706 if (box->parent() && !box->renderer().isText()) { | 706 if (box->parent() && !box->renderer().isText()) { |
| 707 ascentWithMargin += box->boxModelObject()->borderBefore() + box->box
ModelObject()->paddingBefore() + box->boxModelObject()->marginBefore(); | 707 ascentWithMargin += box->boxModelObject()->borderBefore() + box->box
ModelObject()->paddingBefore() + box->boxModelObject()->marginBefore(); |
| 708 descentWithMargin += box->boxModelObject()->borderAfter() + box->box
ModelObject()->paddingAfter() + box->boxModelObject()->marginAfter(); | 708 descentWithMargin += box->boxModelObject()->borderAfter() + box->box
ModelObject()->paddingAfter() + box->boxModelObject()->marginAfter(); |
| 709 } | 709 } |
| 710 setAscentAndDescent(ascent, descent, ascentWithMargin, descentWithMargin
, ascentDescentSet); | 710 setAscentAndDescent(ascent, descent, ascentWithMargin, descentWithMargin
, ascentDescentSet); |
| 711 | 711 |
| 712 // Treat like a replaced element, since we're using the margin box. | 712 // Treat like a replaced element, since we're using the margin box. |
| 713 affectsAscent = true; | 713 affectsAscent = true; |
| 714 affectsDescent = true; | 714 affectsDescent = true; |
| 715 } | 715 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 741 LayoutUnit verticalPosition = 0; | 741 LayoutUnit verticalPosition = 0; |
| 742 EVerticalAlign verticalAlign = renderer->style()->verticalAlign(); | 742 EVerticalAlign verticalAlign = renderer->style()->verticalAlign(); |
| 743 if (verticalAlign == TOP || verticalAlign == BOTTOM) | 743 if (verticalAlign == TOP || verticalAlign == BOTTOM) |
| 744 return 0; | 744 return 0; |
| 745 | 745 |
| 746 RenderObject* parent = renderer->parent(); | 746 RenderObject* parent = renderer->parent(); |
| 747 if (parent->isRenderInline() && parent->style()->verticalAlign() != TOP && p
arent->style()->verticalAlign() != BOTTOM) | 747 if (parent->isRenderInline() && parent->style()->verticalAlign() != TOP && p
arent->style()->verticalAlign() != BOTTOM) |
| 748 verticalPosition = box->parent()->logicalTop(); | 748 verticalPosition = box->parent()->logicalTop(); |
| 749 | 749 |
| 750 if (verticalAlign != BASELINE) { | 750 if (verticalAlign != BASELINE) { |
| 751 const Font& font = parent->style(firstLine)->font(); | 751 const Font& font = parent->styleOrFirstLineStyle(firstLine)->font(); |
| 752 const FontMetrics& fontMetrics = font.fontMetrics(); | 752 const FontMetrics& fontMetrics = font.fontMetrics(); |
| 753 int fontSize = font.fontDescription().computedPixelSize(); | 753 int fontSize = font.fontDescription().computedPixelSize(); |
| 754 | 754 |
| 755 LineDirectionMode lineDirection = parent->isHorizontalWritingMode() ? Ho
rizontalLine : VerticalLine; | 755 LineDirectionMode lineDirection = parent->isHorizontalWritingMode() ? Ho
rizontalLine : VerticalLine; |
| 756 | 756 |
| 757 if (verticalAlign == SUB) | 757 if (verticalAlign == SUB) |
| 758 verticalPosition += fontSize / 5 + 1; | 758 verticalPosition += fontSize / 5 + 1; |
| 759 else if (verticalAlign == SUPER) | 759 else if (verticalAlign == SUPER) |
| 760 verticalPosition -= fontSize / 3 + 1; | 760 verticalPosition -= fontSize / 3 + 1; |
| 761 else if (verticalAlign == TEXT_TOP) | 761 else if (verticalAlign == TEXT_TOP) |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 } | 874 } |
| 875 | 875 |
| 876 #ifndef NDEBUG | 876 #ifndef NDEBUG |
| 877 const char* RootInlineBox::boxName() const | 877 const char* RootInlineBox::boxName() const |
| 878 { | 878 { |
| 879 return "RootInlineBox"; | 879 return "RootInlineBox"; |
| 880 } | 880 } |
| 881 #endif | 881 #endif |
| 882 | 882 |
| 883 } // namespace WebCore | 883 } // namespace WebCore |
| OLD | NEW |