Index: Source/core/rendering/mathml/RenderMathMLSubSup.cpp |
diff --git a/Source/core/rendering/mathml/RenderMathMLSubSup.cpp b/Source/core/rendering/mathml/RenderMathMLSubSup.cpp |
deleted file mode 100644 |
index cc621b429e834cf23318fa1717b3e5012804cdcd..0000000000000000000000000000000000000000 |
--- a/Source/core/rendering/mathml/RenderMathMLSubSup.cpp |
+++ /dev/null |
@@ -1,182 +0,0 @@ |
-/* |
- * Copyright (C) 2010 Alex Milowski (alex@milowski.com). All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions |
- * are met: |
- * 1. Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * 2. Redistributions in binary form must reproduce the above copyright |
- * notice, this list of conditions and the following disclaimer in the |
- * documentation and/or other materials provided with the distribution. |
- * |
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#include "config.h" |
- |
-#if ENABLE(MATHML) |
- |
-#include "core/rendering/mathml/RenderMathMLSubSup.h" |
- |
-#include "MathMLNames.h" |
- |
-namespace WebCore { |
- |
-using namespace MathMLNames; |
- |
-RenderMathMLSubSup::RenderMathMLSubSup(Element* element) |
- : RenderMathMLBlock(element) |
- , m_scripts(0) |
-{ |
- // Determine what kind of sub/sup expression we have by element name |
- if (element->hasLocalName(MathMLNames::msubTag)) |
- m_kind = Sub; |
- else if (element->hasLocalName(MathMLNames::msupTag)) |
- m_kind = Super; |
- else { |
- ASSERT(element->hasLocalName(MathMLNames::msubsupTag)); |
- m_kind = SubSup; |
- } |
-} |
- |
-RenderBoxModelObject* RenderMathMLSubSup::base() const |
-{ |
- RenderObject* baseWrapper = firstChild(); |
- if (!baseWrapper) |
- return 0; |
- RenderObject* base = baseWrapper->firstChild(); |
- if (!base || !base->isBoxModelObject()) |
- return 0; |
- return toRenderBoxModelObject(base); |
-} |
- |
-void RenderMathMLSubSup::fixAnonymousStyles() |
-{ |
- // Set the base wrapper's style so that baseHeight in layout() will be an unstretched height. |
- ASSERT(firstChild() && firstChild()->style()->refCount() == 1); |
- firstChild()->style()->setAlignSelf(AlignFlexStart); |
- |
- ASSERT(m_scripts && m_scripts->style()->refCount() == 1); |
- RenderStyle* scriptsStyle = m_scripts->style(); |
- scriptsStyle->setFlexDirection(FlowColumn); |
- scriptsStyle->setJustifyContent(m_kind == Sub ? JustifyFlexEnd : m_kind == Super ? JustifyFlexStart : JustifySpaceBetween); |
- // Set this wrapper's font-size for its line-height & baseline position, for its children. |
- scriptsStyle->setFontSize(static_cast<int>(0.75 * style()->fontSize())); |
-} |
- |
-// FIXME: Handle arbitrary addChild/removeChild correctly throughout MathML. |
-void RenderMathMLSubSup::addChild(RenderObject* child, RenderObject* beforeChild) |
-{ |
- if (isEmpty()) { |
- RenderMathMLBlock* baseWrapper = createAnonymousMathMLBlock(); |
- RenderMathMLBlock::addChild(baseWrapper); |
- |
- m_scripts = createAnonymousMathMLBlock(); |
- RenderMathMLBlock::addChild(m_scripts); |
- |
- fixAnonymousStyles(); |
- } |
- |
- if (firstChild()->isEmpty()) |
- firstChild()->addChild(child); |
- else |
- m_scripts->addChild(child, beforeChild && beforeChild->parent() == m_scripts ? beforeChild : 0); |
-} |
- |
-void RenderMathMLSubSup::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) |
-{ |
- RenderMathMLBlock::styleDidChange(diff, oldStyle); |
- |
- if (!isEmpty()) |
- fixAnonymousStyles(); |
-} |
- |
-RenderMathMLOperator* RenderMathMLSubSup::unembellishedOperator() |
-{ |
- RenderBoxModelObject* base = this->base(); |
- if (!base || !base->isRenderMathMLBlock()) |
- return 0; |
- return toRenderMathMLBlock(base)->unembellishedOperator(); |
-} |
- |
-void RenderMathMLSubSup::layout() |
-{ |
- RenderMathMLBlock::layout(); |
- |
- RenderMathMLBlock* baseWrapper = toRenderMathMLBlock(firstChild()); |
- if (!baseWrapper || !m_scripts) |
- return; |
- RenderBox* base = baseWrapper->firstChildBox(); |
- if (!base) |
- return; |
- |
- // Our layout rules include: Don't let the superscript go below the "axis" (half x-height above the |
- // baseline), or the subscript above the axis. Also, don't let the superscript's top edge be |
- // below the base's top edge, or the subscript's bottom edge above the base's bottom edge. |
- // |
- // FIXME: Check any subscriptshift or superscriptshift attributes, and maybe use more sophisticated |
- // heuristics from TeX or elsewhere. See https://bugs.webkit.org/show_bug.cgi?id=79274#c5. |
- |
- LayoutUnit baseHeight = base->logicalHeight(); |
- LayoutUnit baseBaseline = base->firstLineBoxBaseline(); |
- if (baseBaseline == -1) |
- baseBaseline = baseHeight; |
- LayoutUnit axis = style()->fontMetrics().xHeight() / 2; |
- int fontSize = style()->fontSize(); |
- |
- ASSERT(baseWrapper->style()->hasOneRef()); |
- bool needsSecondLayout = false; |
- |
- if (RenderBox* superscript = m_kind == Sub ? 0 : m_scripts->lastChildBox()) { |
- LayoutUnit superscriptHeight = superscript->logicalHeight(); |
- LayoutUnit superscriptBaseline = superscript->firstLineBoxBaseline(); |
- if (superscriptBaseline == -1) |
- superscriptBaseline = superscriptHeight; |
- LayoutUnit minBaseline = max<LayoutUnit>(fontSize / 3 + 1 + superscriptBaseline, superscriptHeight + axis); |
- |
- Length newPadding = Length(max<LayoutUnit>(minBaseline - baseBaseline, 0), Fixed); |
- if (newPadding != baseWrapper->style()->paddingTop()) { |
- baseWrapper->style()->setPaddingTop(newPadding); |
- needsSecondLayout = true; |
- } |
- } |
- |
- if (RenderBox* subscript = m_kind == Super ? 0 : m_scripts->firstChildBox()) { |
- LayoutUnit subscriptHeight = subscript->logicalHeight(); |
- LayoutUnit subscriptBaseline = subscript->firstLineBoxBaseline(); |
- if (subscriptBaseline == -1) |
- subscriptBaseline = subscriptHeight; |
- LayoutUnit baseExtendUnderBaseline = baseHeight - baseBaseline; |
- LayoutUnit subscriptUnderItsBaseline = subscriptHeight - subscriptBaseline; |
- LayoutUnit minExtendUnderBaseline = max<LayoutUnit>(fontSize / 5 + 1 + subscriptUnderItsBaseline, subscriptHeight - axis); |
- |
- Length newPadding = Length(max<LayoutUnit>(minExtendUnderBaseline - baseExtendUnderBaseline, 0), Fixed); |
- if (newPadding != baseWrapper->style()->paddingBottom()) { |
- baseWrapper->style()->setPaddingBottom(newPadding); |
- needsSecondLayout = true; |
- } |
- } |
- |
- if (!needsSecondLayout) |
- return; |
- |
- setNeedsLayout(true, MarkOnlyThis); |
- baseWrapper->setChildNeedsLayout(true, MarkOnlyThis); |
- |
- RenderMathMLBlock::layout(); |
-} |
- |
-} |
- |
-#endif // ENABLE(MATHML) |