00001 /* 00002 Copyright (c) 2010, The Barbarian Group 00003 All rights reserved. 00004 00005 Redistribution and use in source and binary forms, with or without modification, are permitted provided that 00006 the following conditions are met: 00007 00008 * Redistributions of source code must retain the above copyright notice, this list of conditions and 00009 the following disclaimer. 00010 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and 00011 the following disclaimer in the documentation and/or other materials provided with the distribution. 00012 00013 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED 00014 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 00015 PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 00016 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 00017 TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00018 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00019 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00020 POSSIBILITY OF SUCH DAMAGE. 00021 */ 00022 00023 #pragma once 00024 00025 #include "cinder/Cinder.h" 00026 #include "cinder/Shape2d.h" 00027 #include "cinder/Exception.h" 00028 #include "cinder/DataSource.h" 00029 00030 #include <string> 00031 #include <vector> 00032 00033 #if defined( CINDER_COCOA ) 00034 typedef struct CGFont *CGFontRef; 00035 #if defined( CINDER_COCOA ) 00036 typedef const struct __CTFont * CTFontRef; 00037 #endif 00038 #elif defined( CINDER_MSW ) 00039 #include <windows.h> 00040 00041 namespace Gdiplus { 00042 class Font; 00043 } 00044 #endif 00045 00046 namespace cinder { 00047 00048 class Font { 00049 public: 00050 typedef uint16_t Glyph; 00051 00053 Font() {} 00056 Font( const std::string &aName, float size ); 00059 Font( DataSourceRef dataSource, float size ); 00060 00061 const std::string& getName() const; 00062 std::string getFullName() const; 00063 float getSize() const; 00064 00065 float getLeading() const; 00066 float getAscent() const; 00067 float getDescent() const; 00068 size_t getNumGlyphs() const; 00069 00070 Glyph getGlyphIndex( size_t idx ); 00071 Glyph getGlyphChar( char utf8Char ); 00072 std::vector<Glyph> getGlyphs( const std::string &utf8String ); 00074 Shape2d getGlyphShape( Glyph glyphIndex ); 00075 00076 static const std::vector<std::string>& getNames( bool forceRefresh = false ); 00077 00078 #if defined( CINDER_COCOA ) 00079 CGFontRef getCgFontRef() const; 00080 #if defined( CINDER_MAC ) 00081 CTFontRef getCtFontRef() const; 00082 #endif 00083 #elif defined( CINDER_MSW ) 00084 ::LOGFONT getLogfont() const { return mObj->mLogFont; } 00085 const Gdiplus::Font* getGdiplusFont() const { return mObj->mGdiplusFont.get(); } 00086 #endif 00087 00088 private: 00089 class Obj { 00090 public: 00091 Obj( const std::string &aName, float aSize ); 00092 Obj( DataSourceRef dataSource, float size ); 00093 ~Obj(); 00094 00095 void finishSetup(); 00096 00097 00098 std::string mName; 00099 float mSize; 00100 #if defined( CINDER_COCOA ) 00101 CGFontRef mCGFont; 00102 #if defined( CINDER_MAC ) 00103 const struct __CTFont* mCTFont; 00104 #endif 00105 #elif defined( CINDER_MSW ) 00106 ::TEXTMETRIC mTextMetric; 00107 ::LOGFONTW mLogFont; 00108 ::HFONT mHfont; 00109 shared_ptr<Gdiplus::Font> mGdiplusFont; 00110 std::vector<std::pair<uint16_t,uint16_t> > mUnicodeRanges; 00111 size_t mNumGlyphs; 00112 #endif 00113 }; 00114 00115 shared_ptr<Obj> mObj; 00116 00117 public: 00119 00120 typedef shared_ptr<Obj> Font::*unspecified_bool_type; 00121 operator unspecified_bool_type() { return ( mObj.get() == 0 ) ? 0 : &Font::mObj; } 00122 void reset() { mObj.reset(); } 00124 }; 00125 00126 class FontInvalidNameExc : public cinder::Exception { 00127 }; 00128 00129 class FontGlyphFailureExc : public cinder::Exception { 00130 }; 00131 00132 } // namespace cinder