⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 freetypelibrary.cpp

📁 最新osg包
💻 CPP
字号:
/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield  * * This library is open source and may be redistributed and/or modified under   * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or  * (at your option) any later version.  The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. *  * 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  * OpenSceneGraph Public License for more details.*/#include "FreeTypeLibrary.h"#include <osg/Notify>//#include <ft2build.h>//#define PRINT_OUT_FONT_DETAILS#ifdef PRINT_OUT_FONT_DETAILS    #include <freetype/ftsnames.h>#endif#include FT_TRUETYPE_IDS_HFreeTypeLibrary::FreeTypeLibrary(){    osg::notify(osg::INFO) << "FreeTypeLibrary::FreeTypeLibrary()" << std::endl;     FT_Error error = FT_Init_FreeType( &_ftlibrary );    if (error)    {        osg::notify(osg::WARN)<<"Warning: an error occurred during FT_Init_FreeType(..) initialisation, error code = "<<std::hex<<error<<std::dec<<std::endl;    }}FreeTypeLibrary::~FreeTypeLibrary(){    // need to remove the implementations from the Fonts here    // just in case the Fonts continue to have external references    // to them, otherwise they will try to point to an object thats    // definition has been unloaded along with the unload of the FreeType    // plugin.    while(!_fontImplementationSet.empty())    {        FreeTypeFont* fontImplementation = *_fontImplementationSet.begin();        _fontImplementationSet.erase(_fontImplementationSet.begin());        osgText::Font* font = fontImplementation->_facade;        if (font) font->setImplementation(0);        else fontImplementation->_facade = 0;    }        while(!_font3DImplementationSet.empty())    {        FreeTypeFont3D* font3DImplementation = *_font3DImplementationSet.begin();        _font3DImplementationSet.erase(_font3DImplementationSet.begin());        osgText::Font3D* font3D = font3DImplementation->_facade;        if (font3D) font3D->setImplementation(0);        else font3DImplementation->_facade = 0;    }        FT_Done_FreeType( _ftlibrary);}FreeTypeLibrary* FreeTypeLibrary::instance(){    static osg::ref_ptr<FreeTypeLibrary> s_library = new FreeTypeLibrary;    return s_library.get();}bool FreeTypeLibrary::getFace(const std::string& fontfile,unsigned int index, FT_Face & face){    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(getMutex());    FT_Error error = FT_New_Face( _ftlibrary, fontfile.c_str(), index, &face );    if (error == FT_Err_Unknown_File_Format)    {        osg::notify(osg::WARN)<<" .... the font file could be opened and read, but it appears"<<std::endl;        osg::notify(osg::WARN)<<" .... that its font format is unsupported"<<std::endl;        return false;    }    else if (error)    {        osg::notify(osg::WARN)<<" .... another error code means that the font file could not"<<std::endl;        osg::notify(osg::WARN)<<" .... be opened, read or simply that it is broken.."<<std::endl;        return false;    }    #ifdef PRINT_OUT_FONT_DETAILS    osg::notify(osg::NOTICE)<<"Face"<<face<<std::endl;    unsigned int count = FT_Get_Sfnt_Name_Count(face);    for(unsigned int i=0; i<count; ++i)    {        FT_SfntName names;        FT_Error error = FT_Get_Sfnt_Name(face, i, &names);                std::string name((char*)names.string, (char*)names.string + names.string_len);                osg::notify(osg::NOTICE)<<"names "<<name<<std::endl;    }    osg::notify(osg::NOTICE)<<std::endl;#endif    //    // GT: Fix to handle symbol fonts in MS Windows    //    verifyCharacterMap(face);        return true;}FT_Byte* FreeTypeLibrary::getFace(std::istream& fontstream, unsigned int index, FT_Face & face){    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(getMutex());    FT_Open_Args args;    std::streampos start = fontstream.tellg();    fontstream.seekg(0, std::ios::end);    std::streampos end = fontstream.tellg();    fontstream.seekg(start, std::ios::beg);    std::streampos length = end - start;    /* empty stream into memory, open that, and keep the pointer in a FreeTypeFont for cleanup */    FT_Byte *buffer = new FT_Byte[length];    fontstream.read(reinterpret_cast<char*>(buffer), length);    if (!fontstream || (static_cast<std::streampos>(fontstream.gcount()) != length))    {        osg::notify(osg::WARN)<<" .... the font file could not be read from its stream"<<std::endl;        return 0;    }    args.flags = FT_OPEN_MEMORY;    args.memory_base = buffer;    args.memory_size = length;    FT_Error error = FT_Open_Face( _ftlibrary, &args, index, &face );    if (error == FT_Err_Unknown_File_Format)    {        osg::notify(osg::WARN)<<" .... the font file could be opened and read, but it appears"<<std::endl;        osg::notify(osg::WARN)<<" .... that its font format is unsupported"<<std::endl;        return 0;    }    else if (error)    {        osg::notify(osg::WARN)<<" .... another error code means that the font file could not"<<std::endl;        osg::notify(osg::WARN)<<" .... be opened, read or simply that it is broken..."<<std::endl;        return 0;    }    //    // GT: Fix to handle symbol fonts in MS Windows    //    verifyCharacterMap(face);        return buffer;}osgText::Font* FreeTypeLibrary::getFont(const std::string& fontfile, unsigned int index, unsigned int flags){    FT_Face face;    if (getFace(fontfile, index, face) == false) return (0);    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(getMutex());        FreeTypeFont* fontImp = new FreeTypeFont(fontfile,face,flags);    osgText::Font* font = new osgText::Font(fontImp);    _fontImplementationSet.insert(fontImp);        return font;}osgText::Font* FreeTypeLibrary::getFont(std::istream& fontstream, unsigned int index, unsigned int flags){    FT_Face face = 0;    FT_Byte * buffer = getFace(fontstream, index, face);    if (face == 0) return (0);        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(getMutex());    FreeTypeFont* fontImp = new FreeTypeFont(buffer,face,flags);    osgText::Font* font = new osgText::Font(fontImp);        _fontImplementationSet.insert(fontImp);    return font;}osgText::Font3D* FreeTypeLibrary::getFont3D(const std::string& fontfile, unsigned int index, unsigned int flags){    FT_Face face;    if (getFace(fontfile, index, face) == false) return (0);    OpenThreads::ScopedLock<OpenThreads::Mutex> lock(getMutex());        FreeTypeFont3D* font3DImp = new FreeTypeFont3D(fontfile,face,flags);    osgText::Font3D* font3D = new osgText::Font3D(font3DImp);    _font3DImplementationSet.insert(font3DImp);        return font3D;}osgText::Font3D* FreeTypeLibrary::getFont3D(std::istream& fontstream, unsigned int index, unsigned int flags){    FT_Face face = 0;    FT_Byte * buffer = getFace(fontstream, index, face);    if (face == 0) return (0);        OpenThreads::ScopedLock<OpenThreads::Mutex> lock(getMutex());    FreeTypeFont3D* font3DImp = new FreeTypeFont3D(buffer,face,flags);    osgText::Font3D* font3D = new osgText::Font3D(font3DImp);        _font3DImplementationSet.insert(font3DImp);    return font3D;}void FreeTypeLibrary::verifyCharacterMap(FT_Face face){    //    // GT: Verify the correct character mapping for MS windows     // as symbol fonts were being returned incorrectly    //    FT_CharMap charmap;    if (face->charmap == NULL)    {        for (int n = 0; n < face->num_charmaps; n++)         {             charmap = face->charmaps[n];             if (charmap->platform_id == TT_PLATFORM_MICROSOFT)             {                 FT_Set_Charmap(face, charmap);                break;             }         }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -