/********************************************************************** TextRenderer - a temporary replacement for QGLWidget::renderText until it matures a bit more ;) Copyright (C) 2007 Benoit Jacob This file is part of the Avogadro molecular editor project. For more information, see Avogadro is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Avogadro 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **********************************************************************/ #ifndef TEXTRENDERER_H #define TEXTRENDERER_H #include #include namespace Avogadro { /** * @class TextRenderer * @internal * @author Benoit Jacob * * NOTE: This class is only there as a temporary replacement for * QGLWidget::renderText(). As of Qt 4.2.3 and Qt 4.3-beta1, this function is * too slow and can't do outlined text. If a future version of Qt brings a * sufficiently improved QGLWidget::renderText(), we will of course drop this class. * * This class renders text inside a QGLWidget. It replaces the functionality * of QGLWidget::renderText(). * * Its advantages over the renderText() in Qt 4.2.3 are that it is much faster both at * render-time and at startup, consumes less memory, and does outlined text. Its drawbacks are that * it can't yet handle rendering more than one font simultaneously, and that its Unicode-safeness is * not perfect as superpositions of unicode characters aren't handled. * * Every QFont can be used, every character encodings supported by Qt can be used. * * To draw plain 2D text on top of the scene, do: * @code textRenderer.begin(); textRenderer.draw( x1, y1, string1 ); textRenderer.draw( x2, y2, string2 ); textRenderer.draw( x3, y2, string3 ); textRenderer.end(); * @endcode * * To draw text as a transparent object inside the scene, do: * @code textRenderer.begin(); textRenderer.draw( pos1, string1 ); textRenderer.draw( pos2, string2 ); textRenderer.draw( pos3, string3 ); textRenderer.end(); * @endcode * * In order to set the text color, please call glColor3f or glColor4f before * calling draw(). Of course you can * also call qglColor or Color::apply(). You can achieve semitransparent text at * no additional cost by choosing a semitransparent color. * * Please make sure that no relevant OpenGL state change occurs between * begin() and end(), except the state changes performed by the TextRenderer * itself. In other words, please avoid calling glSomething() between begin() and * end(), except if you are sure that this call won't result in a conflicting state * change. Of course calling glColor*() is allowed. * * If you experience rendering problems, you can try the following: * - disable some OpenGL state bits. For instance, TextRenderer automatically * disables fog and lighting during rendering, because it doesn't work * correctly with them enabled. There probably are other OpenGL state bits * that have to be disabled, so if your program enables some of them, you * might have to disable them before rendering text. * - if you experience poor font quality, meake sure that your GLWidget is using * an antialiased font. * */ class CharRenderer; class GLWidget; class TextRendererPrivate; class TextRenderer { public: TextRenderer(); ~TextRenderer(); /** * Call this before drawing any text. This method saves the GL state * and changes it to prepare for text rendering. * @param widget The widget to use for rendering */ void begin(GLWidget *widget); /** * Call this after drawing text. This method restores the GL state * to what it was when begin() was called. */ void end(); /** * Draw text inside the 3D scene. Must be called between begin() and end(). * The text is centered (both horizontally and vertically) around the specified position. * @param pos the position of the text in the scene's coordinate system * @param string the QString to render * @returns the height in pixels of the text just rendered (0 for an empty string). */ int draw( const Eigen::Vector3d & pos, const QString &string); /** * Draw 2D text at the position (x,y) in window coordinates. Must be called * between begin() and end(). * (0,0) is the top-left corner. * @param x the x-coordinate * @param y the y-coordinate * @param string the QString to render * @returns the height in pixels of the text just rendered (0 for an empty string). */ int draw( int x, int y, const QString &string); bool isActive(); private: TextRendererPrivate * const d; }; } // namespace Avogadro #endif // __TEXTRENDERER_H