diff options
Diffstat (limited to 'lib/kformula/glyphelement.cpp')
-rw-r--r-- | lib/kformula/glyphelement.cpp | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/lib/kformula/glyphelement.cpp b/lib/kformula/glyphelement.cpp new file mode 100644 index 00000000..709609cf --- /dev/null +++ b/lib/kformula/glyphelement.cpp @@ -0,0 +1,159 @@ +/* This file is part of the KDE project + Copyright (C) 2006 Alfredo Beaumont Sainz <alfredo.beaumont@gmail.com> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +#include <tqfontmetrics.h> +#include <tqpainter.h> + +#include "fontstyle.h" +#include "glyphelement.h" + +KFORMULA_NAMESPACE_BEGIN + +GlyphElement::GlyphElement( BasicElement* parent ) : TextElement( ' ', false, parent ) { +} + +bool GlyphElement::readAttributesFromMathMLDom( const TQDomElement& element ) +{ + if ( !BasicElement::readAttributesFromMathMLDom( element ) ) { + return false; + } + + // MathML Section 3.2.9.2 + m_fontFamily = element.attribute( "fontfamily" ); + if ( m_fontFamily.isNull() ) { + kdWarning( DEBUGID ) << "Required attribute fontfamily not found in glyph element\n"; + return false; + } + TQString indexStr = element.attribute( "index" ); + if ( indexStr.isNull() ) { + kdWarning( DEBUGID ) << "Required attribute index not found in glyph element\n"; + return false; + } + bool ok; + ushort index = indexStr.toUShort( &ok ); + if ( ! ok ) { + kdWarning( DEBUGID ) << "Invalid index value in glyph element\n"; + return false; + } + m_char = TQChar( index ); + + m_alt = element.attribute( "alt" ); + if ( m_alt.isNull() ) { + kdWarning( DEBUGID ) << "Required attribute alt not found in glyph element\n"; + return false; + } + + TQStringList missing; + FontStyle::testFont( missing, m_fontFamily.lower() ); + m_hasFont = missing.isEmpty(); + + return true; +} + + +/** + * Calculates our width and height and + * our children's parentPosition. + */ +void GlyphElement::calcSizes( const ContextStyle& context, + ContextStyle::TextStyle tstyle, + ContextStyle::IndexStyle /*istyle*/, + StyleAttributes& style ) +{ + double factor = style.sizeFactor(); + luPt mySize = context.getAdjustedSize( tstyle, factor ); + TQRect bound; + + if ( m_hasFont ) { + TQFont font( m_fontFamily ); + font.setPointSizeFloat( context.layoutUnitPtToPt( mySize ) ); + TQFontMetrics fm ( font ); + bound = fm.boundingRect( m_char ); + setWidth( context.ptToLayoutUnitPt( fm.width( m_char ) ) ); + } + else { + TQFont font( context.getDefaultFont() ); + font.setPointSizeFloat( context.layoutUnitPtToPt( mySize ) ); + TQFontMetrics fm ( font ); + bound = fm.boundingRect( m_alt ); + setWidth( context.ptToLayoutUnitPt( fm.width( m_alt ) ) ); + } + setHeight( context.ptToLayoutUnitPt( bound.height() ) ); + setBaseline( context.ptToLayoutUnitPt( -bound.top() ) ); + + // There are some glyphs in TeX that have + // baseline==0. (\int, \sum, \prod) + if ( getBaseline() == 0 ) { + setBaseline( -1 ); + } +} + +/** + * Draws the whole element including its children. + * The `parentOrigin' is the point this element's parent starts. + * We can use our parentPosition to get our own origin then. + */ +void GlyphElement::draw( TQPainter& painter, const LuPixelRect& /*r*/, + const ContextStyle& context, + ContextStyle::TextStyle tstyle, + ContextStyle::IndexStyle /*istyle*/, + StyleAttributes& style, + const LuPixelPoint& parentOrigin ) +{ + LuPixelPoint myPos( parentOrigin.x()+getX(), parentOrigin.y()+getY() ); + //if ( !LuPixelRect( myPos.x(), myPos.y(), getWidth(), getHeight() ).intersects( r ) ) + // return; + + double factor = style.sizeFactor(); + luPt mySize = context.getAdjustedSize( tstyle, factor ); + TQFont font; + TQString text; + + if ( m_hasFont ) { + painter.setPen( style.color() ); + setCharStyle( style.charStyle() ); + setCharFamily( style.charFamily() ); + font = TQFont( m_fontFamily ); + text = m_char; + painter.fillRect( context.layoutUnitToPixelX( myPos.x() ), + context.layoutUnitToPixelY( myPos.y() ), + context.layoutUnitToPixelX( getWidth() ), + context.layoutUnitToPixelY( getHeight() ), + style.background() ); + } + else { + painter.setPen( context.getErrorColor() ); + font = context.getDefaultFont(); + text = m_alt; + } + font.setPointSizeFloat( context.layoutUnitToFontSize( mySize, false ) ); + painter.setFont( font ); + painter.drawText( context.layoutUnitToPixelX( myPos.x() ), + context.layoutUnitToPixelY( myPos.y()+getBaseline() ), + text ); +} + +void GlyphElement::writeMathMLAttributes( TQDomElement& element ) const +{ + element.setAttribute( "fontfamily", m_fontFamily ); + element.setAttribute( "index", m_char.unicode() ); + element.setAttribute( "alt", m_alt ); +} + +KFORMULA_NAMESPACE_END |