/* * Copyright (C) 2009 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 "RenderMathMLBlock.h" #include "FontSelector.h" #include "GraphicsContext.h" #include "MathMLNames.h" #include "RenderInline.h" #include "RenderText.h" namespace WebCore { using namespace MathMLNames; RenderMathMLBlock::RenderMathMLBlock(Node* container) : RenderBlock(container) { } bool RenderMathMLBlock::isChildAllowed(RenderObject* child, RenderStyle*) const { return child->node() && child->node()->nodeType() == Node::ELEMENT_NODE; } PassRefPtr RenderMathMLBlock::makeBlockStyle() { RefPtr newStyle = RenderStyle::create(); newStyle->inheritFrom(style()); newStyle->setDisplay(BLOCK); return newStyle; } int RenderMathMLBlock::nonOperatorHeight() const { if (!isRenderMathMLOperator()) return offsetHeight(); return 0; } void RenderMathMLBlock::stretchToHeight(int height) { for (RenderObject* current = firstChild(); current; current = current->nextSibling()) if (current->isRenderMathMLBlock()) { RenderMathMLBlock* block = toRenderMathMLBlock(current); block->stretchToHeight(height); } } #if ENABLE(DEBUG_MATH_LAYOUT) void RenderMathMLBlock::paint(PaintInfo& info, int tx, int ty) { RenderBlock::paint(info, tx, ty); if (info.context->paintingDisabled() || info.phase != PaintPhaseForeground) return; tx += x(); ty += y(); info.context->save(); info.context->setStrokeThickness(1.0f); info.context->setStrokeStyle(SolidStroke); info.context->setStrokeColor(Color(0, 0, 255), sRGBColorSpace); info.context->drawLine(IntPoint(tx, ty), IntPoint(tx + offsetWidth(), ty)); info.context->drawLine(IntPoint(tx + offsetWidth(), ty), IntPoint(tx + offsetWidth(), ty + offsetHeight())); info.context->drawLine(IntPoint(tx, ty + offsetHeight()), IntPoint(tx + offsetWidth(), ty + offsetHeight())); info.context->drawLine(IntPoint(tx, ty), IntPoint(tx, ty + offsetHeight())); int topStart = paddingTop(); info.context->setStrokeColor(Color(0, 255, 0), sRGBColorSpace); info.context->drawLine(IntPoint(tx, ty + topStart), IntPoint(tx + offsetWidth(), ty + topStart)); int baseline = baselinePosition(true); info.context->setStrokeColor(Color(255, 0, 0), sRGBColorSpace); info.context->drawLine(IntPoint(tx, ty + baseline), IntPoint(tx + offsetWidth(), ty + baseline)); info.context->restore(); } #endif // ENABLE(DEBUG_MATH_LAYOUT) } #endif