summaryrefslogtreecommitdiffstats
path: root/lib/kformula/glyphelement.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kformula/glyphelement.cpp')
-rw-r--r--lib/kformula/glyphelement.cpp159
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