OgreFont.h
Go to the documentation of this file.
00001 /*-------------------------------------------------------------------------
00002 This source file is a part of OGRE
00003 (Object-oriented Graphics Rendering Engine)
00004 
00005 For the latest info, see http://www.ogre3d.org/
00006 
00007 Copyright (c) 2000-2011 Torus Knot Software Ltd
00008 Permission is hereby granted, free of charge, to any person obtaining a copy
00009 of this software and associated documentation files (the "Software"), to deal
00010 in the Software without restriction, including without limitation the rights
00011 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00012 copies of the Software, and to permit persons to whom the Software is
00013 furnished to do so, subject to the following conditions:
00014 
00015 The above copyright notice and this permission notice shall be included in
00016 all copies or substantial portions of the Software.
00017 
00018 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00019 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00020 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00021 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00022 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00023 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00024 THE SOFTWARE
00025 -------------------------------------------------------------------------*/
00026 
00027 #ifndef _Font_H__
00028 #define _Font_H__
00029 
00030 #include "OgrePrerequisites.h"
00031 #include "OgreResource.h"
00032 #include "OgreTexture.h"
00033 #include "OgreMaterial.h"
00034 #include "OgreCommon.h"
00035 
00036 namespace Ogre
00037 {
00045     enum FontType
00046     {
00048         FT_TRUETYPE = 1,
00050         FT_IMAGE = 2
00051     };
00052 
00053 
00067     class _OgreExport Font : public Resource, public ManualResourceLoader
00068     {
00069     protected:
00071         class _OgreExport CmdType : public ParamCommand
00072         {
00073         public:
00074             String doGet(const void* target) const;
00075             void doSet(void* target, const String& val);
00076         };
00078         class _OgreExport CmdSource : public ParamCommand
00079         {
00080         public:
00081             String doGet(const void* target) const;
00082             void doSet(void* target, const String& val);
00083         };
00085         class _OgreExport CmdSize : public ParamCommand
00086         {
00087         public:
00088             String doGet(const void* target) const;
00089             void doSet(void* target, const String& val);
00090         };
00092         class _OgreExport CmdResolution : public ParamCommand
00093         {
00094         public:
00095             String doGet(const void* target) const;
00096             void doSet(void* target, const String& val);
00097         };
00099         class _OgreExport CmdCodePoints : public ParamCommand
00100         {
00101         public:
00102             String doGet(const void* target) const;
00103             void doSet(void* target, const String& val);
00104         };
00105 
00106         // Command object for setting / getting parameters
00107         static CmdType msTypeCmd;
00108         static CmdSource msSourceCmd;
00109         static CmdSize msSizeCmd;
00110         static CmdResolution msResolutionCmd;
00111         static CmdCodePoints msCodePointsCmd;
00112 
00114         FontType mType;
00115 
00117         String mSource;
00118 
00120         Real mTtfSize;
00122         uint mTtfResolution;
00124         int mTtfMaxBearingY;
00125 
00126 
00127     public:
00128         typedef Ogre::uint32 CodePoint;
00129         typedef Ogre::FloatRect UVRect;
00131         struct GlyphInfo 
00132         {
00133             CodePoint codePoint;
00134             UVRect uvRect;
00135             Real aspectRatio;
00136 
00137             GlyphInfo(CodePoint id, const UVRect& rect, Real aspect)
00138                 : codePoint(id), uvRect(rect), aspectRatio(aspect)
00139             {
00140 
00141             }
00142         };
00144         typedef std::pair<CodePoint, CodePoint> CodePointRange;
00145         typedef vector<CodePointRange>::type CodePointRangeList;
00146     protected:
00148         typedef map<CodePoint, GlyphInfo>::type CodePointMap;
00149         CodePointMap mCodePointMap;
00150 
00152         MaterialPtr mpMaterial;
00153 
00155         TexturePtr mTexture;
00156 
00158         bool mAntialiasColour;
00159 
00161         CodePointRangeList mCodePointRangeList;
00162 
00164         void createTextureFromFont(void);
00165 
00167         virtual void loadImpl();
00169         virtual void unloadImpl();
00171         size_t calculateSize(void) const { return 0; } // permanent resource is in the texture 
00172     public:
00173 
00177         Font(ResourceManager* creator, const String& name, ResourceHandle handle,
00178             const String& group, bool isManual = false, ManualResourceLoader* loader = 0);
00179         virtual ~Font();
00180 
00182         void setType(FontType ftype);
00183 
00185         FontType getType(void) const;
00186 
00202         void setSource(const String& source);
00203 
00206         const String& getSource(void) const;
00207 
00213         void setTrueTypeSize(Real ttfSize);
00218         void setTrueTypeResolution(uint ttfResolution);
00219 
00226         Real getTrueTypeSize(void) const;
00231         uint getTrueTypeResolution(void) const;
00241         int getTrueTypeMaxBearingY() const;
00242 
00243 
00250         inline const UVRect& getGlyphTexCoords(CodePoint id) const
00251         {
00252             CodePointMap::const_iterator i = mCodePointMap.find(id);
00253             if (i != mCodePointMap.end())
00254             {
00255                 return i->second.uvRect;
00256             }
00257             else
00258             {
00259                 static UVRect nullRect(0.0, 0.0, 0.0, 0.0);
00260                 return nullRect;
00261             }
00262         }
00263 
00271         inline void setGlyphTexCoords(CodePoint id, Real u1, Real v1, Real u2, Real v2, Real textureAspect)
00272         {
00273             CodePointMap::iterator i = mCodePointMap.find(id);
00274             if (i != mCodePointMap.end())
00275             {
00276                 i->second.uvRect.left = u1;
00277                 i->second.uvRect.top = v1;
00278                 i->second.uvRect.right = u2;
00279                 i->second.uvRect.bottom = v2;
00280                 i->second.aspectRatio = textureAspect * (u2 - u1)  / (v2 - v1);
00281             }
00282             else
00283             {
00284                 mCodePointMap.insert(
00285                     CodePointMap::value_type(id, 
00286                         GlyphInfo(id, UVRect(u1, v1, u2, v2), 
00287                             textureAspect * (u2 - u1)  / (v2 - v1))));
00288             }
00289 
00290         }
00292         inline Real getGlyphAspectRatio(CodePoint id) const
00293         {
00294             CodePointMap::const_iterator i = mCodePointMap.find(id);
00295             if (i != mCodePointMap.end())
00296             {
00297                 return i->second.aspectRatio;
00298             }
00299             else
00300             {
00301                 return 1.0;
00302             }
00303         }
00309         inline void setGlyphAspectRatio(CodePoint id, Real ratio)
00310         {
00311             CodePointMap::iterator i = mCodePointMap.find(id);
00312             if (i != mCodePointMap.end())
00313             {
00314                 i->second.aspectRatio = ratio;
00315             }
00316         }
00317 
00321         const GlyphInfo& getGlyphInfo(CodePoint id) const;
00322 
00331         void addCodePointRange(const CodePointRange& range)
00332         {
00333             mCodePointRangeList.push_back(range);
00334         }
00335 
00338         void clearCodePointRanges()
00339         {
00340             mCodePointRangeList.clear();
00341         }
00345         const CodePointRangeList& getCodePointRangeList() const
00346         {
00347             return mCodePointRangeList;
00348         }
00353         inline const MaterialPtr& getMaterial() const
00354         {
00355             return mpMaterial;
00356         }
00361         inline const MaterialPtr& getMaterial()
00362         {
00363             return mpMaterial;
00364         }
00376         inline void setAntialiasColour(bool enabled)
00377         {
00378             mAntialiasColour = enabled;
00379         }
00380 
00384         inline bool getAntialiasColour(void) const
00385         {
00386             return mAntialiasColour;
00387         }
00388 
00392         void loadResource(Resource* resource);
00393     };
00400     class _OgreExport FontPtr : public SharedPtr<Font> 
00401     {
00402     public:
00403         FontPtr() : SharedPtr<Font>() {}
00404         explicit FontPtr(Font* rep) : SharedPtr<Font>(rep) {}
00405         FontPtr(const FontPtr& r) : SharedPtr<Font>(r) {} 
00406         FontPtr(const ResourcePtr& r) : SharedPtr<Font>()
00407         {
00408             // lock & copy other mutex pointer
00409             OGRE_MUTEX_CONDITIONAL(r.OGRE_AUTO_MUTEX_NAME)
00410             {
00411                 OGRE_LOCK_MUTEX(*r.OGRE_AUTO_MUTEX_NAME)
00412                 OGRE_COPY_AUTO_SHARED_MUTEX(r.OGRE_AUTO_MUTEX_NAME)
00413                 pRep = static_cast<Font*>(r.getPointer());
00414                 pUseCount = r.useCountPointer();
00415                 if (pUseCount)
00416                 {
00417                     ++(*pUseCount);
00418                 }
00419             }
00420         }
00421 
00423         FontPtr& operator=(const ResourcePtr& r)
00424         {
00425             if (pRep == static_cast<Font*>(r.getPointer()))
00426                 return *this;
00427             release();
00428             // lock & copy other mutex pointer
00429             OGRE_MUTEX_CONDITIONAL(r.OGRE_AUTO_MUTEX_NAME)
00430             {
00431                 OGRE_LOCK_MUTEX(*r.OGRE_AUTO_MUTEX_NAME)
00432                 OGRE_COPY_AUTO_SHARED_MUTEX(r.OGRE_AUTO_MUTEX_NAME)
00433                 pRep = static_cast<Font*>(r.getPointer());
00434                 pUseCount = r.useCountPointer();
00435                 if (pUseCount)
00436                 {
00437                     ++(*pUseCount);
00438                 }
00439             }
00440             else
00441             {
00442                 // RHS must be a null pointer
00443                 assert(r.isNull() && "RHS must be null if it has no mutex!");
00444                 setNull();
00445             }
00446             return *this;
00447         }
00448     };
00451 }
00452 
00453 #endif

Copyright © 2008 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Sat Jan 14 2012 18:40:43