1 /*      _______   __   __   __   ______   __   __   _______   __   __
2  *     / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___  /\ /  |\/ /\
3  *    / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /
4  *   / / /__   / / // / // / // / /    / ___  / // ___  / // /| ' / /
5  *  / /_// /\ / /_// / // / // /_/_   / / // / // /\_/ / // / |  / /
6  * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /
7  * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/
8  *
9  * Copyright (c) 2004 - 2008 Olof Naess�n and Per Larsson
10  *
11  *
12  * Per Larsson a.k.a finalman
13  * Olof Naess�n a.k.a jansem/yakslem
14  *
15  * Visit: http://guichan.sourceforge.net
16  *
17  * License: (BSD)
18  * Redistribution and use in source and binary forms, with or without
19  * modification, are permitted provided that the following conditions
20  * are met:
21  * 1. Redistributions of source code must retain the above copyright
22  *    notice, this list of conditions and the following disclaimer.
23  * 2. Redistributions in binary form must reproduce the above copyright
24  *    notice, this list of conditions and the following disclaimer in
25  *    the documentation and/or other materials provided with the
26  *    distribution.
27  * 3. Neither the name of Guichan nor the names of its contributors may
28  *    be used to endorse or promote products derived from this software
29  *    without specific prior written permission.
30  *
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
37  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
38  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
39  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
40  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
41  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42  */
43 
44 /*
45  * For comments regarding functions please see the header file.
46  */
47 
48 #include "guichan/contrib/opengl/oglftfont.hpp"
49 
50 #include "guichan/exception.hpp"
51 #include "guichan/opengl/openglgraphics.hpp"
52 
53 namespace gcn
54 {
55     namespace contrib
56     {
OGLFTFont(const std::string & filename,int size)57         OGLFTFont::OGLFTFont (const std::string& filename, int size)
58         {
59             mRowSpacing = 0;
60             mFilename = filename;
61             mFont = NULL;
62             mSize = size;
63 
64             mFont = new OGLFT::TranslucentTexture(filename.c_str(), size, 72);
65 
66             if(mFont == NULL || !mFont->isValid())
67             {
68                 throw GCN_EXCEPTION("Invalid True Type Font.");
69             }
70 
71             glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
72 
73             mFontColor = gcn::Color(0, 0, 0, 0);
74         }
75 
~OGLFTFont()76         OGLFTFont::~OGLFTFont()
77         {
78             delete mFont;
79         }
80 
getWidth(const std::string & text) const81         int OGLFTFont::getWidth(const std::string& text) const
82         {
83             OGLFT::BBox bbox = mFont->measure(text.c_str());
84 
85             return (int)bbox.x_max_ + (int)bbox.x_min_;
86         }
87 
getHeight() const88         int OGLFTFont::getHeight() const
89         {
90             return mSize - 1 + mRowSpacing;
91         }
92 
setRowSpacing(int spacing)93         void OGLFTFont::setRowSpacing(int spacing)
94         {
95             mRowSpacing = spacing;
96         }
97 
getRowSpacing()98         int OGLFTFont::getRowSpacing()
99         {
100             return mRowSpacing;
101         }
102 
getColor()103         gcn::Color OGLFTFont::getColor()
104         {
105             return mFontColor;
106         }
107 
setColor(gcn::Color color)108         void OGLFTFont::setColor(gcn::Color color)
109         {
110             mFontColor = color;
111         }
112 
drawString(gcn::Graphics * graphics,const std::string & text,int x,int y)113         void OGLFTFont::drawString(gcn::Graphics* graphics, const std::string& text, int x, int y)
114         {
115             if (text == "")
116             {
117                 return;
118             }
119 
120             gcn::OpenGLGraphics* glGraphics = dynamic_cast<gcn::OpenGLGraphics *>(graphics);
121 
122             if(glGraphics == NULL)
123             {
124                 throw GCN_EXCEPTION("Graphics object not an OpenGL graphics object!");
125             }
126 
127             const gcn::ClipRectangle& top = glGraphics->getCurrentClipArea();
128 
129             mFont->setForegroundColor(mFontColor.r/255, mFontColor.g/255, mFontColor.b/255);
130 
131             glPushMatrix();
132             glEnable(GL_TEXTURE_2D);
133             glEnable(GL_BLEND);
134             glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
135 
136             glTranslated(x + top.xOffset, y + top.yOffset + (mSize/2)+5, 0.);
137             glRotatef(180., 1., 0., 0.);
138 
139             mFont->draw(text.c_str());
140 
141             glDisable(GL_BLEND);
142             glDisable(GL_TEXTURE_2D);
143             glPopMatrix();
144         }
145     }
146 }
147