121939df44de1705786c545cd1bf519d47250322dBen Murdoch/* 221939df44de1705786c545cd1bf519d47250322dBen Murdoch * Copyright (C) 2009 Alex Milowski (alex@milowski.com). All rights reserved. 321939df44de1705786c545cd1bf519d47250322dBen Murdoch * Copyright (C) 2010 François Sausset (sausset@gmail.com). All rights reserved. 421939df44de1705786c545cd1bf519d47250322dBen Murdoch * 521939df44de1705786c545cd1bf519d47250322dBen Murdoch * Redistribution and use in source and binary forms, with or without 621939df44de1705786c545cd1bf519d47250322dBen Murdoch * modification, are permitted provided that the following conditions 721939df44de1705786c545cd1bf519d47250322dBen Murdoch * are met: 821939df44de1705786c545cd1bf519d47250322dBen Murdoch * 1. Redistributions of source code must retain the above copyright 921939df44de1705786c545cd1bf519d47250322dBen Murdoch * notice, this list of conditions and the following disclaimer. 1021939df44de1705786c545cd1bf519d47250322dBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1121939df44de1705786c545cd1bf519d47250322dBen Murdoch * notice, this list of conditions and the following disclaimer in the 1221939df44de1705786c545cd1bf519d47250322dBen Murdoch * documentation and/or other materials provided with the distribution. 1321939df44de1705786c545cd1bf519d47250322dBen Murdoch * 1421939df44de1705786c545cd1bf519d47250322dBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1521939df44de1705786c545cd1bf519d47250322dBen Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1621939df44de1705786c545cd1bf519d47250322dBen Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1721939df44de1705786c545cd1bf519d47250322dBen Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1821939df44de1705786c545cd1bf519d47250322dBen Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1921939df44de1705786c545cd1bf519d47250322dBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2021939df44de1705786c545cd1bf519d47250322dBen Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2121939df44de1705786c545cd1bf519d47250322dBen Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2221939df44de1705786c545cd1bf519d47250322dBen Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2321939df44de1705786c545cd1bf519d47250322dBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2421939df44de1705786c545cd1bf519d47250322dBen Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2521939df44de1705786c545cd1bf519d47250322dBen Murdoch */ 2621939df44de1705786c545cd1bf519d47250322dBen Murdoch 2721939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "config.h" 2821939df44de1705786c545cd1bf519d47250322dBen Murdoch 2921939df44de1705786c545cd1bf519d47250322dBen Murdoch#if ENABLE(MATHML) 3021939df44de1705786c545cd1bf519d47250322dBen Murdoch 3121939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "RenderMathMLRoot.h" 3221939df44de1705786c545cd1bf519d47250322dBen Murdoch 3321939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "GraphicsContext.h" 3421939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "MathMLNames.h" 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PaintInfo.h" 3621939df44de1705786c545cd1bf519d47250322dBen Murdoch 3721939df44de1705786c545cd1bf519d47250322dBen Murdochnamespace WebCore { 3821939df44de1705786c545cd1bf519d47250322dBen Murdoch 3921939df44de1705786c545cd1bf519d47250322dBen Murdochusing namespace MathMLNames; 4021939df44de1705786c545cd1bf519d47250322dBen Murdoch 4121939df44de1705786c545cd1bf519d47250322dBen Murdoch// Left margin of the radical (px) 4221939df44de1705786c545cd1bf519d47250322dBen Murdochconst int gRadicalLeftMargin = 3; 4321939df44de1705786c545cd1bf519d47250322dBen Murdoch// Bottom padding of the radical (px) 4421939df44de1705786c545cd1bf519d47250322dBen Murdochconst int gRadicalBasePad = 3; 4521939df44de1705786c545cd1bf519d47250322dBen Murdoch// Threshold above which the radical shape is modified to look nice with big bases (%) 46dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochconst float gThresholdBaseHeight = 1.5f; 4721939df44de1705786c545cd1bf519d47250322dBen Murdoch// Radical width (%) 48dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochconst float gRadicalWidth = 0.75f; 4921939df44de1705786c545cd1bf519d47250322dBen Murdoch// Horizontal position of the bottom point of the radical (%) 50dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochconst float gRadicalBottomPointXPos= 0.5f; 5121939df44de1705786c545cd1bf519d47250322dBen Murdoch// Horizontal position of the top left point of the radical (%) 52dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochconst float gRadicalTopLeftPointXPos = 0.8f; 5321939df44de1705786c545cd1bf519d47250322dBen Murdoch// Vertical position of the top left point of the radical (%) 54dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochconst float gRadicalTopLeftPointYPos = 0.625f; 5521939df44de1705786c545cd1bf519d47250322dBen Murdoch// Vertical shift of the left end point of the radical (%) 56dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochconst float gRadicalLeftEndYShift = 0.05f; 5721939df44de1705786c545cd1bf519d47250322dBen Murdoch// Root padding around the base (%) 58dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochconst float gRootPadding = 0.2f; 5921939df44de1705786c545cd1bf519d47250322dBen Murdoch// Additional bottom root padding (%) 60dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochconst float gRootBottomPadding = 0.2f; 6121939df44de1705786c545cd1bf519d47250322dBen Murdoch 6221939df44de1705786c545cd1bf519d47250322dBen Murdoch// Radical line thickness (%) 63dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochconst float gRadicalLineThickness = 0.02f; 6421939df44de1705786c545cd1bf519d47250322dBen Murdoch// Radical thick line thickness (%) 65dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochconst float gRadicalThickLineThickness = 0.1f; 6621939df44de1705786c545cd1bf519d47250322dBen Murdoch 6721939df44de1705786c545cd1bf519d47250322dBen MurdochRenderMathMLRoot::RenderMathMLRoot(Node *expression) 6821939df44de1705786c545cd1bf519d47250322dBen Murdoch: RenderMathMLBlock(expression) 6921939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 7021939df44de1705786c545cd1bf519d47250322dBen Murdoch} 7121939df44de1705786c545cd1bf519d47250322dBen Murdoch 7221939df44de1705786c545cd1bf519d47250322dBen Murdochvoid RenderMathMLRoot::addChild(RenderObject* child, RenderObject* ) 7321939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 7421939df44de1705786c545cd1bf519d47250322dBen Murdoch if (isEmpty()) { 7521939df44de1705786c545cd1bf519d47250322dBen Murdoch // Add a block for the index 7621939df44de1705786c545cd1bf519d47250322dBen Murdoch RenderBlock* block = new (renderArena()) RenderBlock(node()); 7721939df44de1705786c545cd1bf519d47250322dBen Murdoch RefPtr<RenderStyle> indexStyle = makeBlockStyle(); 7821939df44de1705786c545cd1bf519d47250322dBen Murdoch indexStyle->setDisplay(INLINE_BLOCK); 7921939df44de1705786c545cd1bf519d47250322dBen Murdoch block->setStyle(indexStyle.release()); 8021939df44de1705786c545cd1bf519d47250322dBen Murdoch RenderBlock::addChild(block); 8121939df44de1705786c545cd1bf519d47250322dBen Murdoch 8221939df44de1705786c545cd1bf519d47250322dBen Murdoch // FIXME: the wrapping does not seem to be needed anymore. 8321939df44de1705786c545cd1bf519d47250322dBen Murdoch // this is the base, so wrap it so we can pad it 8421939df44de1705786c545cd1bf519d47250322dBen Murdoch block = new (renderArena()) RenderBlock(node()); 8521939df44de1705786c545cd1bf519d47250322dBen Murdoch RefPtr<RenderStyle> baseStyle = makeBlockStyle(); 8621939df44de1705786c545cd1bf519d47250322dBen Murdoch baseStyle->setDisplay(INLINE_BLOCK); 8721939df44de1705786c545cd1bf519d47250322dBen Murdoch baseStyle->setPaddingLeft(Length(5 * gRadicalWidth , Percent)); 8821939df44de1705786c545cd1bf519d47250322dBen Murdoch block->setStyle(baseStyle.release()); 8921939df44de1705786c545cd1bf519d47250322dBen Murdoch RenderBlock::addChild(block); 9021939df44de1705786c545cd1bf519d47250322dBen Murdoch block->addChild(child); 9121939df44de1705786c545cd1bf519d47250322dBen Murdoch } else { 9221939df44de1705786c545cd1bf519d47250322dBen Murdoch // always add to the index 9321939df44de1705786c545cd1bf519d47250322dBen Murdoch firstChild()->addChild(child); 9421939df44de1705786c545cd1bf519d47250322dBen Murdoch } 9521939df44de1705786c545cd1bf519d47250322dBen Murdoch} 9621939df44de1705786c545cd1bf519d47250322dBen Murdoch 9721939df44de1705786c545cd1bf519d47250322dBen Murdochvoid RenderMathMLRoot::paint(PaintInfo& info, int tx, int ty) 9821939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 9921939df44de1705786c545cd1bf519d47250322dBen Murdoch RenderMathMLBlock::paint(info , tx , ty); 10021939df44de1705786c545cd1bf519d47250322dBen Murdoch 10106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen if (info.context->paintingDisabled()) 10206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen return; 1035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 1045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!firstChild() || !lastChild()) 1055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 1065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 10721939df44de1705786c545cd1bf519d47250322dBen Murdoch tx += x(); 10821939df44de1705786c545cd1bf519d47250322dBen Murdoch ty += y(); 10921939df44de1705786c545cd1bf519d47250322dBen Murdoch 11021939df44de1705786c545cd1bf519d47250322dBen Murdoch RenderBoxModelObject* indexBox = toRenderBoxModelObject(lastChild()); 11121939df44de1705786c545cd1bf519d47250322dBen Murdoch 11221939df44de1705786c545cd1bf519d47250322dBen Murdoch int maxHeight = indexBox->offsetHeight(); 11321939df44de1705786c545cd1bf519d47250322dBen Murdoch // default to the font size in pixels if we're empty 11421939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!maxHeight) 11521939df44de1705786c545cd1bf519d47250322dBen Murdoch maxHeight = style()->fontSize(); 11621939df44de1705786c545cd1bf519d47250322dBen Murdoch int width = indexBox->offsetWidth(); 11721939df44de1705786c545cd1bf519d47250322dBen Murdoch 11821939df44de1705786c545cd1bf519d47250322dBen Murdoch int indexWidth = 0; 11921939df44de1705786c545cd1bf519d47250322dBen Murdoch RenderObject* current = firstChild(); 12021939df44de1705786c545cd1bf519d47250322dBen Murdoch while (current != lastChild()) { 12121939df44de1705786c545cd1bf519d47250322dBen Murdoch if (current->isBoxModelObject()) { 12221939df44de1705786c545cd1bf519d47250322dBen Murdoch RenderBoxModelObject* box = toRenderBoxModelObject(current); 12321939df44de1705786c545cd1bf519d47250322dBen Murdoch indexWidth += box->offsetWidth(); 12421939df44de1705786c545cd1bf519d47250322dBen Murdoch } 12521939df44de1705786c545cd1bf519d47250322dBen Murdoch current = current->nextSibling(); 12621939df44de1705786c545cd1bf519d47250322dBen Murdoch } 12721939df44de1705786c545cd1bf519d47250322dBen Murdoch 12821939df44de1705786c545cd1bf519d47250322dBen Murdoch int frontWidth = static_cast<int>(style()->fontSize() * gRadicalWidth); 12921939df44de1705786c545cd1bf519d47250322dBen Murdoch int topStartShift = 0; 13021939df44de1705786c545cd1bf519d47250322dBen Murdoch // Base height above which the shape of the root changes 13121939df44de1705786c545cd1bf519d47250322dBen Murdoch int thresholdHeight = static_cast<int>(gThresholdBaseHeight * style()->fontSize()); 13221939df44de1705786c545cd1bf519d47250322dBen Murdoch 13321939df44de1705786c545cd1bf519d47250322dBen Murdoch if (maxHeight > thresholdHeight && thresholdHeight) { 13421939df44de1705786c545cd1bf519d47250322dBen Murdoch float shift = (maxHeight - thresholdHeight) / static_cast<float>(thresholdHeight); 13521939df44de1705786c545cd1bf519d47250322dBen Murdoch if (shift > 1.) 136dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch shift = 1.0f; 13721939df44de1705786c545cd1bf519d47250322dBen Murdoch topStartShift = static_cast<int>(gRadicalBottomPointXPos * frontWidth * shift); 13821939df44de1705786c545cd1bf519d47250322dBen Murdoch } 13921939df44de1705786c545cd1bf519d47250322dBen Murdoch 14021939df44de1705786c545cd1bf519d47250322dBen Murdoch width += topStartShift; 14121939df44de1705786c545cd1bf519d47250322dBen Murdoch 14221939df44de1705786c545cd1bf519d47250322dBen Murdoch int rootPad = static_cast<int>(gRootPadding * style()->fontSize()); 14321939df44de1705786c545cd1bf519d47250322dBen Murdoch int start = tx + indexWidth + gRadicalLeftMargin + style()->paddingLeft().value() - rootPad; 14421939df44de1705786c545cd1bf519d47250322dBen Murdoch ty += style()->paddingTop().value() - rootPad; 14521939df44de1705786c545cd1bf519d47250322dBen Murdoch 14621939df44de1705786c545cd1bf519d47250322dBen Murdoch FloatPoint topStart(start - topStartShift, ty); 14721939df44de1705786c545cd1bf519d47250322dBen Murdoch FloatPoint bottomLeft(start - gRadicalBottomPointXPos * frontWidth , ty + maxHeight + gRadicalBasePad); 14821939df44de1705786c545cd1bf519d47250322dBen Murdoch FloatPoint topLeft(start - gRadicalTopLeftPointXPos * frontWidth , ty + gRadicalTopLeftPointYPos * maxHeight); 14921939df44de1705786c545cd1bf519d47250322dBen Murdoch FloatPoint leftEnd(start - frontWidth , topLeft.y() + gRadicalLeftEndYShift * style()->fontSize()); 15021939df44de1705786c545cd1bf519d47250322dBen Murdoch 15121939df44de1705786c545cd1bf519d47250322dBen Murdoch info.context->save(); 15221939df44de1705786c545cd1bf519d47250322dBen Murdoch 15321939df44de1705786c545cd1bf519d47250322dBen Murdoch info.context->setStrokeThickness(gRadicalLineThickness * style()->fontSize()); 15421939df44de1705786c545cd1bf519d47250322dBen Murdoch info.context->setStrokeStyle(SolidStroke); 155a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch info.context->setStrokeColor(style()->visitedDependentColor(CSSPropertyColor), ColorSpaceDeviceRGB); 15621939df44de1705786c545cd1bf519d47250322dBen Murdoch info.context->setLineJoin(MiterJoin); 15721939df44de1705786c545cd1bf519d47250322dBen Murdoch info.context->setMiterLimit(style()->fontSize()); 15821939df44de1705786c545cd1bf519d47250322dBen Murdoch 15921939df44de1705786c545cd1bf519d47250322dBen Murdoch Path root; 16021939df44de1705786c545cd1bf519d47250322dBen Murdoch 16121939df44de1705786c545cd1bf519d47250322dBen Murdoch root.moveTo(FloatPoint(topStart.x() + width, ty)); 16221939df44de1705786c545cd1bf519d47250322dBen Murdoch // draw top 16321939df44de1705786c545cd1bf519d47250322dBen Murdoch root.addLineTo(topStart); 16421939df44de1705786c545cd1bf519d47250322dBen Murdoch // draw from top left corner to bottom point of radical 16521939df44de1705786c545cd1bf519d47250322dBen Murdoch root.addLineTo(bottomLeft); 16621939df44de1705786c545cd1bf519d47250322dBen Murdoch // draw from bottom point to top of left part of radical base "pocket" 16721939df44de1705786c545cd1bf519d47250322dBen Murdoch root.addLineTo(topLeft); 16821939df44de1705786c545cd1bf519d47250322dBen Murdoch // draw to end 16921939df44de1705786c545cd1bf519d47250322dBen Murdoch root.addLineTo(leftEnd); 17021939df44de1705786c545cd1bf519d47250322dBen Murdoch 171f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch info.context->strokePath(root); 17221939df44de1705786c545cd1bf519d47250322dBen Murdoch 17321939df44de1705786c545cd1bf519d47250322dBen Murdoch info.context->save(); 17421939df44de1705786c545cd1bf519d47250322dBen Murdoch 17521939df44de1705786c545cd1bf519d47250322dBen Murdoch // Build a mask to draw the thick part of the root. 17621939df44de1705786c545cd1bf519d47250322dBen Murdoch Path mask; 17721939df44de1705786c545cd1bf519d47250322dBen Murdoch 17821939df44de1705786c545cd1bf519d47250322dBen Murdoch mask.moveTo(topStart); 17921939df44de1705786c545cd1bf519d47250322dBen Murdoch mask.addLineTo(bottomLeft); 18021939df44de1705786c545cd1bf519d47250322dBen Murdoch mask.addLineTo(topLeft); 18121939df44de1705786c545cd1bf519d47250322dBen Murdoch mask.addLineTo(FloatPoint(2 * topLeft.x() - leftEnd.x(), 2 * topLeft.y() - leftEnd.y())); 18221939df44de1705786c545cd1bf519d47250322dBen Murdoch 18321939df44de1705786c545cd1bf519d47250322dBen Murdoch info.context->clip(mask); 18421939df44de1705786c545cd1bf519d47250322dBen Murdoch 18521939df44de1705786c545cd1bf519d47250322dBen Murdoch // Draw the thick part of the root. 18621939df44de1705786c545cd1bf519d47250322dBen Murdoch info.context->setStrokeThickness(gRadicalThickLineThickness * style()->fontSize()); 18721939df44de1705786c545cd1bf519d47250322dBen Murdoch info.context->setLineCap(SquareCap); 18821939df44de1705786c545cd1bf519d47250322dBen Murdoch 18921939df44de1705786c545cd1bf519d47250322dBen Murdoch Path line; 190a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch line.moveTo(bottomLeft); 191a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch line.addLineTo(topLeft); 192a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 193f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch info.context->strokePath(line); 19421939df44de1705786c545cd1bf519d47250322dBen Murdoch 19521939df44de1705786c545cd1bf519d47250322dBen Murdoch info.context->restore(); 19621939df44de1705786c545cd1bf519d47250322dBen Murdoch 19721939df44de1705786c545cd1bf519d47250322dBen Murdoch info.context->restore(); 19821939df44de1705786c545cd1bf519d47250322dBen Murdoch 19921939df44de1705786c545cd1bf519d47250322dBen Murdoch} 20021939df44de1705786c545cd1bf519d47250322dBen Murdoch 20121939df44de1705786c545cd1bf519d47250322dBen Murdochvoid RenderMathMLRoot::layout() 20221939df44de1705786c545cd1bf519d47250322dBen Murdoch{ 20321939df44de1705786c545cd1bf519d47250322dBen Murdoch RenderBlock::layout(); 2045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 2055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!firstChild() || !lastChild()) 2065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 2075ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 20821939df44de1705786c545cd1bf519d47250322dBen Murdoch int maxHeight = toRenderBoxModelObject(lastChild())->offsetHeight(); 20921939df44de1705786c545cd1bf519d47250322dBen Murdoch 21021939df44de1705786c545cd1bf519d47250322dBen Murdoch RenderObject* current = lastChild()->firstChild(); 2115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (current) 2125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen current->style()->setVerticalAlign(BASELINE); 21321939df44de1705786c545cd1bf519d47250322dBen Murdoch 21421939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!maxHeight) 21521939df44de1705786c545cd1bf519d47250322dBen Murdoch maxHeight = style()->fontSize(); 21621939df44de1705786c545cd1bf519d47250322dBen Murdoch 21721939df44de1705786c545cd1bf519d47250322dBen Murdoch // Base height above which the shape of the root changes 21821939df44de1705786c545cd1bf519d47250322dBen Murdoch int thresholdHeight = static_cast<int>(gThresholdBaseHeight * style()->fontSize()); 21921939df44de1705786c545cd1bf519d47250322dBen Murdoch int topStartShift = 0; 22021939df44de1705786c545cd1bf519d47250322dBen Murdoch 22121939df44de1705786c545cd1bf519d47250322dBen Murdoch if (maxHeight > thresholdHeight && thresholdHeight) { 22221939df44de1705786c545cd1bf519d47250322dBen Murdoch float shift = (maxHeight - thresholdHeight) / static_cast<float>(thresholdHeight); 22321939df44de1705786c545cd1bf519d47250322dBen Murdoch if (shift > 1.) 224dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch shift = 1.0f; 22521939df44de1705786c545cd1bf519d47250322dBen Murdoch int frontWidth = static_cast<int>(style()->fontSize() * gRadicalWidth); 22621939df44de1705786c545cd1bf519d47250322dBen Murdoch topStartShift = static_cast<int>(gRadicalBottomPointXPos * frontWidth * shift); 22721939df44de1705786c545cd1bf519d47250322dBen Murdoch 22821939df44de1705786c545cd1bf519d47250322dBen Murdoch style()->setPaddingBottom(Length(static_cast<int>(gRootBottomPadding * style()->fontSize()), Fixed)); 22921939df44de1705786c545cd1bf519d47250322dBen Murdoch } 23021939df44de1705786c545cd1bf519d47250322dBen Murdoch 23121939df44de1705786c545cd1bf519d47250322dBen Murdoch // Positioning of the index 2322bde8e466a4451c7319e3a072d118917957d6554Steve Block RenderObject* possibleIndex = firstChild()->firstChild(); 2332bde8e466a4451c7319e3a072d118917957d6554Steve Block while (possibleIndex && !possibleIndex->isBoxModelObject()) 2342bde8e466a4451c7319e3a072d118917957d6554Steve Block possibleIndex = possibleIndex->nextSibling(); 2352bde8e466a4451c7319e3a072d118917957d6554Steve Block RenderBoxModelObject* indexBox = toRenderBoxModelObject(possibleIndex); 2365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (!indexBox) 2375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return; 23821939df44de1705786c545cd1bf519d47250322dBen Murdoch 23921939df44de1705786c545cd1bf519d47250322dBen Murdoch int indexShift = indexBox->offsetWidth() + topStartShift; 24021939df44de1705786c545cd1bf519d47250322dBen Murdoch int radicalHeight = static_cast<int>((1 - gRadicalTopLeftPointYPos) * maxHeight); 24121939df44de1705786c545cd1bf519d47250322dBen Murdoch int rootMarginTop = radicalHeight + style()->paddingBottom().value() + indexBox->offsetHeight() - (maxHeight + static_cast<int>(gRootPadding * style()->fontSize())); 24221939df44de1705786c545cd1bf519d47250322dBen Murdoch 24321939df44de1705786c545cd1bf519d47250322dBen Murdoch style()->setPaddingLeft(Length(indexShift, Fixed)); 24421939df44de1705786c545cd1bf519d47250322dBen Murdoch if (rootMarginTop > 0) 24521939df44de1705786c545cd1bf519d47250322dBen Murdoch style()->setPaddingTop(Length(rootMarginTop + static_cast<int>(gRootPadding * style()->fontSize()), Fixed)); 24621939df44de1705786c545cd1bf519d47250322dBen Murdoch 247e14391e94c850b8bd03680c23b38978db68687a8John Reck setNeedsLayout(true); 248e14391e94c850b8bd03680c23b38978db68687a8John Reck setPreferredLogicalWidthsDirty(true, false); 24921939df44de1705786c545cd1bf519d47250322dBen Murdoch RenderBlock::layout(); 25006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 25121939df44de1705786c545cd1bf519d47250322dBen Murdoch indexBox->style()->setBottom(Length(radicalHeight + style()->paddingBottom().value(), Fixed)); 25206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen 25306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen // Now that we've potentially changed its position, we need layout the index again. 254e14391e94c850b8bd03680c23b38978db68687a8John Reck indexBox->setNeedsLayout(true); 25521939df44de1705786c545cd1bf519d47250322dBen Murdoch indexBox->layout(); 25621939df44de1705786c545cd1bf519d47250322dBen Murdoch} 25721939df44de1705786c545cd1bf519d47250322dBen Murdoch 25821939df44de1705786c545cd1bf519d47250322dBen Murdoch} 25921939df44de1705786c545cd1bf519d47250322dBen Murdoch 26021939df44de1705786c545cd1bf519d47250322dBen Murdoch#endif // ENABLE(MATHML) 26121939df44de1705786c545cd1bf519d47250322dBen Murdoch 26221939df44de1705786c545cd1bf519d47250322dBen Murdoch 263