diff options
author | scuri <scuri> | 2010-06-21 22:55:10 +0000 |
---|---|---|
committer | scuri <scuri> | 2010-06-21 22:55:10 +0000 |
commit | 37a92b86d13e89d0dcec92be6d23ceced29dbc36 (patch) | |
tree | faff61ef668379212b4ed948934533c3f2fe308b /src/ftgl/FTFont | |
parent | a124216ee05a5d63ea8fcdafcd050ad1fadf0b09 (diff) |
*** empty log message ***
Diffstat (limited to 'src/ftgl/FTFont')
-rw-r--r-- | src/ftgl/FTFont/FTBitmapFont.cpp | 106 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTBitmapFontImpl.h | 62 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTBufferFont.cpp | 349 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTBufferFontImpl.h | 81 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTExtrudeFont.cpp | 89 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTExtrudeFontImpl.h | 81 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTFont.cpp | 552 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTFontGlue.cpp | 227 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTFontImpl.h | 162 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTOutlineFont.cpp | 129 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTOutlineFontImpl.h | 73 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTPixmapFont.cpp | 131 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTPixmapFontImpl.h | 60 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTPolygonFont.cpp | 89 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTPolygonFontImpl.h | 60 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTTextureFont.cpp | 267 | ||||
-rw-r--r-- | src/ftgl/FTFont/FTTextureFontImpl.h | 152 |
17 files changed, 2670 insertions, 0 deletions
diff --git a/src/ftgl/FTFont/FTBitmapFont.cpp b/src/ftgl/FTFont/FTBitmapFont.cpp new file mode 100644 index 0000000..ebf3f1e --- /dev/null +++ b/src/ftgl/FTFont/FTBitmapFont.cpp @@ -0,0 +1,106 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTBitmapFontImpl.h" + + +// +// FTBitmapFont +// + + +FTBitmapFont::FTBitmapFont(char const *fontFilePath) : + FTFont(new FTBitmapFontImpl(this, fontFilePath)) +{} + + +FTBitmapFont::FTBitmapFont(unsigned char const *pBufferBytes, + size_t bufferSizeInBytes) : + FTFont(new FTBitmapFontImpl(this, pBufferBytes, bufferSizeInBytes)) +{} + + +FTBitmapFont::~FTBitmapFont() +{} + + +FTGlyph* FTBitmapFont::MakeGlyph(FT_GlyphSlot ftGlyph) +{ + return new FTBitmapGlyph(ftGlyph); +} + + +// +// FTBitmapFontImpl +// + + +template <typename T> +inline FTPoint FTBitmapFontImpl::RenderI(const T* string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + // Protect GL_BLEND + glPushAttrib(GL_COLOR_BUFFER_BIT); + + // Protect glPixelStorei() calls (also in FTBitmapGlyphImpl::RenderImpl) + glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); + + glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glDisable(GL_BLEND); + + FTPoint tmp = FTFontImpl::Render(string, len, + position, spacing, renderMode); + + glPopClientAttrib(); + glPopAttrib(); + + return tmp; +} + + +FTPoint FTBitmapFontImpl::Render(const char * string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + return RenderI(string, len, position, spacing, renderMode); +} + + +FTPoint FTBitmapFontImpl::Render(const wchar_t * string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + return RenderI(string, len, position, spacing, renderMode); +} + diff --git a/src/ftgl/FTFont/FTBitmapFontImpl.h b/src/ftgl/FTFont/FTBitmapFontImpl.h new file mode 100644 index 0000000..7f733d6 --- /dev/null +++ b/src/ftgl/FTFont/FTBitmapFontImpl.h @@ -0,0 +1,62 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __FTBitmapFontImpl__ +#define __FTBitmapFontImpl__ + +#include "FTFontImpl.h" + +class FTGlyph; + +class FTBitmapFontImpl : public FTFontImpl +{ + friend class FTBitmapFont; + + protected: + FTBitmapFontImpl(FTFont *ftFont, const char* fontFilePath) : + FTFontImpl(ftFont, fontFilePath) {}; + + FTBitmapFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) : + FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes) {}; + + virtual FTPoint Render(const char *s, const int len, + FTPoint position, FTPoint spacing, + int renderMode); + + virtual FTPoint Render(const wchar_t *s, const int len, + FTPoint position, FTPoint spacing, + int renderMode); + + private: + /* Internal generic Render() implementation */ + template <typename T> + inline FTPoint RenderI(const T *s, const int len, + FTPoint position, FTPoint spacing, int mode); +}; + +#endif // __FTBitmapFontImpl__ + diff --git a/src/ftgl/FTFont/FTBufferFont.cpp b/src/ftgl/FTFont/FTBufferFont.cpp new file mode 100644 index 0000000..e48e2ab --- /dev/null +++ b/src/ftgl/FTFont/FTBufferFont.cpp @@ -0,0 +1,349 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include <wchar.h> + +#include "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTBufferFontImpl.h" + + +// +// FTBufferFont +// + + +FTBufferFont::FTBufferFont(char const *fontFilePath) : + FTFont(new FTBufferFontImpl(this, fontFilePath)) +{} + + +FTBufferFont::FTBufferFont(unsigned char const *pBufferBytes, + size_t bufferSizeInBytes) : + FTFont(new FTBufferFontImpl(this, pBufferBytes, bufferSizeInBytes)) +{} + + +FTBufferFont::~FTBufferFont() +{} + + +FTGlyph* FTBufferFont::MakeGlyph(FT_GlyphSlot ftGlyph) +{ + FTBufferFontImpl *myimpl = dynamic_cast<FTBufferFontImpl *>(impl); + if(!myimpl) + { + return NULL; + } + + return myimpl->MakeGlyphImpl(ftGlyph); +} + + +// +// FTBufferFontImpl +// + + +FTBufferFontImpl::FTBufferFontImpl(FTFont *ftFont, const char* fontFilePath) : + FTFontImpl(ftFont, fontFilePath), + buffer(new FTBuffer()) +{ + load_flags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP; + + glGenTextures(BUFFER_CACHE_SIZE, idCache); + + for(int i = 0; i < BUFFER_CACHE_SIZE; i++) + { + stringCache[i] = NULL; + glBindTexture(GL_TEXTURE_2D, idCache[i]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + + lastString = 0; +} + + +FTBufferFontImpl::FTBufferFontImpl(FTFont *ftFont, + const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) : + FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes), + buffer(new FTBuffer()) +{ + load_flags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP; + + glGenTextures(BUFFER_CACHE_SIZE, idCache); + + for(int i = 0; i < BUFFER_CACHE_SIZE; i++) + { + stringCache[i] = NULL; + glBindTexture(GL_TEXTURE_2D, idCache[i]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + + lastString = 0; +} + + +FTBufferFontImpl::~FTBufferFontImpl() +{ + glDeleteTextures(BUFFER_CACHE_SIZE, idCache); + + for(int i = 0; i < BUFFER_CACHE_SIZE; i++) + { + if(stringCache[i]) + { + free(stringCache[i]); + } + } + + delete buffer; +} + + +FTGlyph* FTBufferFontImpl::MakeGlyphImpl(FT_GlyphSlot ftGlyph) +{ + return new FTBufferGlyph(ftGlyph, buffer); +} + + +bool FTBufferFontImpl::FaceSize(const unsigned int size, + const unsigned int res) +{ + for(int i = 0; i < BUFFER_CACHE_SIZE; i++) + { + if(stringCache[i]) + { + free(stringCache[i]); + stringCache[i] = NULL; + } + } + + return FTFontImpl::FaceSize(size, res); +} + + +static inline GLuint NextPowerOf2(GLuint in) +{ + in -= 1; + + in |= in >> 16; + in |= in >> 8; + in |= in >> 4; + in |= in >> 2; + in |= in >> 1; + + return in + 1; +} + + +inline int StringCompare(void const *a, char const *b, int len) +{ + return len < 0 ? strcmp((char const *)a, b) + : strncmp((char const *)a, b, len); +} + + +inline int StringCompare(void const *a, wchar_t const *b, int len) +{ + return len < 0 ? wcscmp((wchar_t const *)a, b) + : wcsncmp((wchar_t const *)a, b, len); +} + + +inline char *StringCopy(char const *s, int len) +{ + if(len < 0) + { + return strdup(s); + } + else + { +#ifdef HAVE_STRNDUP + return strndup(s, len); +#else + char *s2 = (char*)malloc(len + 1); + memcpy(s2, s, len); + s2[len] = 0; + return s2; +#endif + } +} + + +inline wchar_t *StringCopy(wchar_t const *s, int len) +{ + if(len < 0) + { +#if defined HAVE_WCSDUP + return wcsdup(s); +#else + len = (int)wcslen(s); +#endif + } + + wchar_t *s2 = (wchar_t *)malloc((len + 1) * sizeof(wchar_t)); + memcpy(s2, s, len * sizeof(wchar_t)); + s2[len] = 0; + return s2; +} + + +template <typename T> +inline FTPoint FTBufferFontImpl::RenderI(const T* string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + const float padding = 3.0f; + int width, height, texWidth, texHeight; + int cacheIndex = -1; + bool inCache = false; + + // Protect blending functions, GL_BLEND and GL_TEXTURE_2D + glPushAttrib(GL_COLOR_BUFFER_BIT | GL_ENABLE_BIT); + + // Protect glPixelStorei() calls + glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); + + glEnable(GL_BLEND); + glEnable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_ONE + + // Search whether the string is already in a texture we uploaded + for(int n = 0; n < BUFFER_CACHE_SIZE; n++) + { + int i = (lastString + n + BUFFER_CACHE_SIZE) % BUFFER_CACHE_SIZE; + + if(stringCache[i] && !StringCompare(stringCache[i], string, len)) + { + cacheIndex = i; + inCache = true; + break; + } + } + + // If the string was not found, we need to put it in the cache and compute + // its new bounding box. + if(!inCache) + { + // FIXME: this cache is not very efficient. We should first expire + // strings that are not used very often. + cacheIndex = lastString; + lastString = (lastString + 1) % BUFFER_CACHE_SIZE; + + if(stringCache[cacheIndex]) + { + free(stringCache[cacheIndex]); + } + // FIXME: only the first N bytes are copied; we want the first N chars. + stringCache[cacheIndex] = StringCopy(string, len); + bboxCache[cacheIndex] = BBox(string, len, FTPoint(), spacing); + } + + FTBBox bbox = bboxCache[cacheIndex]; + + width = static_cast<int>(bbox.Upper().X() - bbox.Lower().X() + + padding + padding + 0.5); + height = static_cast<int>(bbox.Upper().Y() - bbox.Lower().Y() + + padding + padding + 0.5); + + texWidth = NextPowerOf2(width); + texHeight = NextPowerOf2(height); + + glBindTexture(GL_TEXTURE_2D, idCache[cacheIndex]); + + // If the string was not found, we need to render the text in a new + // texture buffer, then upload it to the OpenGL layer. + if(!inCache) + { + buffer->Size(texWidth, texHeight); + buffer->Pos(FTPoint(padding, padding) - bbox.Lower()); + + advanceCache[cacheIndex] = + FTFontImpl::Render(string, len, FTPoint(), spacing, renderMode); + + glBindTexture(GL_TEXTURE_2D, idCache[cacheIndex]); + + glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + /* TODO: use glTexSubImage2D later? */ + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, texWidth, texHeight, 0, + GL_ALPHA, GL_UNSIGNED_BYTE, (GLvoid *)buffer->Pixels()); + + buffer->Size(0, 0); + } + + FTPoint low = position + bbox.Lower(); + FTPoint up = position + bbox.Upper(); + + glBegin(GL_QUADS); + glNormal3f(0.0f, 0.0f, 1.0f); + glTexCoord2f(padding / texWidth, + (texHeight - height + padding) / texHeight); + glVertex2f(low.Xf(), up.Yf()); + glTexCoord2f(padding / texWidth, + (texHeight - padding) / texHeight); + glVertex2f(low.Xf(), low.Yf()); + glTexCoord2f((width - padding) / texWidth, + (texHeight - padding) / texHeight); + glVertex2f(up.Xf(), low.Yf()); + glTexCoord2f((width - padding) / texWidth, + (texHeight - height + padding) / texHeight); + glVertex2f(up.Xf(), up.Yf()); + glEnd(); + + glPopClientAttrib(); + glPopAttrib(); + + return position + advanceCache[cacheIndex]; +} + + +FTPoint FTBufferFontImpl::Render(const char * string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + return RenderI(string, len, position, spacing, renderMode); +} + + +FTPoint FTBufferFontImpl::Render(const wchar_t * string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + return RenderI(string, len, position, spacing, renderMode); +} + diff --git a/src/ftgl/FTFont/FTBufferFontImpl.h b/src/ftgl/FTFont/FTBufferFontImpl.h new file mode 100644 index 0000000..15557f6 --- /dev/null +++ b/src/ftgl/FTFont/FTBufferFontImpl.h @@ -0,0 +1,81 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __FTBufferFontImpl__ +#define __FTBufferFontImpl__ + +#include "FTFontImpl.h" + +class FTGlyph; +class FTBuffer; + +class FTBufferFontImpl : public FTFontImpl +{ + friend class FTBufferFont; + + protected: + FTBufferFontImpl(FTFont *ftFont, const char* fontFilePath); + + FTBufferFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, + size_t bufferSizeInBytes); + + virtual ~FTBufferFontImpl(); + + virtual FTPoint Render(const char *s, const int len, + FTPoint position, FTPoint spacing, + int renderMode); + + virtual FTPoint Render(const wchar_t *s, const int len, + FTPoint position, FTPoint spacing, + int renderMode); + + virtual bool FaceSize(const unsigned int size, + const unsigned int res); + + private: + /** + * Create an FTBufferGlyph object for the base class. + */ + FTGlyph* MakeGlyphImpl(FT_GlyphSlot ftGlyph); + + /* Internal generic Render() implementation */ + template <typename T> + inline FTPoint RenderI(const T *s, const int len, + FTPoint position, FTPoint spacing, int mode); + + /* Pixel buffer */ + FTBuffer *buffer; + + static const int BUFFER_CACHE_SIZE = 16; + /* Texture IDs */ + GLuint idCache[BUFFER_CACHE_SIZE]; + void *stringCache[BUFFER_CACHE_SIZE]; + FTBBox bboxCache[BUFFER_CACHE_SIZE]; + FTPoint advanceCache[BUFFER_CACHE_SIZE]; + int lastString; +}; + +#endif // __FTBufferFontImpl__ + diff --git a/src/ftgl/FTFont/FTExtrudeFont.cpp b/src/ftgl/FTFont/FTExtrudeFont.cpp new file mode 100644 index 0000000..9e8eb72 --- /dev/null +++ b/src/ftgl/FTFont/FTExtrudeFont.cpp @@ -0,0 +1,89 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTExtrudeFontImpl.h" + + +// +// FTExtrudeFont +// + + +FTExtrudeFont::FTExtrudeFont(char const *fontFilePath) : + FTFont(new FTExtrudeFontImpl(this, fontFilePath)) +{} + + +FTExtrudeFont::FTExtrudeFont(const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) : + FTFont(new FTExtrudeFontImpl(this, pBufferBytes, bufferSizeInBytes)) +{} + + +FTExtrudeFont::~FTExtrudeFont() +{} + + +FTGlyph* FTExtrudeFont::MakeGlyph(FT_GlyphSlot ftGlyph) +{ + FTExtrudeFontImpl *myimpl = dynamic_cast<FTExtrudeFontImpl *>(impl); + if(!myimpl) + { + return NULL; + } + + return new FTExtrudeGlyph(ftGlyph, myimpl->depth, myimpl->front, + myimpl->back, myimpl->useDisplayLists); +} + + +// +// FTExtrudeFontImpl +// + + +FTExtrudeFontImpl::FTExtrudeFontImpl(FTFont *ftFont, const char* fontFilePath) +: FTFontImpl(ftFont, fontFilePath), + depth(0.0f), front(0.0f), back(0.0f) +{ + load_flags = FT_LOAD_NO_HINTING; +} + + +FTExtrudeFontImpl::FTExtrudeFontImpl(FTFont *ftFont, + const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) +: FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes), + depth(0.0f), front(0.0f), back(0.0f) +{ + load_flags = FT_LOAD_NO_HINTING; +} + diff --git a/src/ftgl/FTFont/FTExtrudeFontImpl.h b/src/ftgl/FTFont/FTExtrudeFontImpl.h new file mode 100644 index 0000000..c2ddf27 --- /dev/null +++ b/src/ftgl/FTFont/FTExtrudeFontImpl.h @@ -0,0 +1,81 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __FTExtrudeFontImpl__ +#define __FTExtrudeFontImpl__ + +#include "FTFontImpl.h" + +class FTGlyph; + +class FTExtrudeFontImpl : public FTFontImpl +{ + friend class FTExtrudeFont; + + protected: + FTExtrudeFontImpl(FTFont *ftFont, const char* fontFilePath); + + FTExtrudeFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, + size_t bufferSizeInBytes); + + /** + * Set the extrusion distance for the font. + * + * @param d The extrusion distance. + */ + virtual void Depth(float d) { depth = d; } + + /** + * Set the outset distance for the font. Only implemented by + * FTOutlineFont, FTPolygonFont and FTExtrudeFont + * + * @param o The outset distance. + */ + virtual void Outset(float o) { front = back = o; } + + /** + * Set the outset distance for the font. Only implemented by + * FTExtrudeFont + * + * @param f The front outset distance. + * @param b The back outset distance. + */ + virtual void Outset(float f, float b) { front = f; back = b; } + + private: + /** + * The extrusion distance for the font. + */ + float depth; + + /** + * The outset distance (front and back) for the font. + */ + float front, back; +}; + +#endif // __FTExtrudeFontImpl__ + diff --git a/src/ftgl/FTFont/FTFont.cpp b/src/ftgl/FTFont/FTFont.cpp new file mode 100644 index 0000000..a7206fb --- /dev/null +++ b/src/ftgl/FTFont/FTFont.cpp @@ -0,0 +1,552 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include "FTInternals.h" +#include "FTUnicode.h" + +#include "FTFontImpl.h" + +#include "FTBitmapFontImpl.h" +#include "FTExtrudeFontImpl.h" +#include "FTOutlineFontImpl.h" +#include "FTPixmapFontImpl.h" +#include "FTPolygonFontImpl.h" +#include "FTTextureFontImpl.h" + +#include "FTGlyphContainer.h" +#include "FTFace.h" + + +// +// FTFont +// + + +FTFont::FTFont(char const *fontFilePath) +{ + impl = new FTFontImpl(this, fontFilePath); +} + + +FTFont::FTFont(const unsigned char *pBufferBytes, size_t bufferSizeInBytes) +{ + impl = new FTFontImpl(this, pBufferBytes, bufferSizeInBytes); +} + + +FTFont::FTFont(FTFontImpl *pImpl) +{ + impl = pImpl; +} + + +FTFont::~FTFont() +{ + delete impl; +} + + +bool FTFont::Attach(const char* fontFilePath) +{ + return impl->Attach(fontFilePath); +} + + +bool FTFont::Attach(const unsigned char *pBufferBytes, size_t bufferSizeInBytes) +{ + return impl->Attach(pBufferBytes, bufferSizeInBytes); +} + + +bool FTFont::FaceSize(const unsigned int size, const unsigned int res) +{ + return impl->FaceSize(size, res); +} + + +unsigned int FTFont::FaceSize() const +{ + return impl->FaceSize(); +} + + +void FTFont::Depth(float depth) +{ + return impl->Depth(depth); +} + + +void FTFont::Outset(float outset) +{ + return impl->Outset(outset); +} + + +void FTFont::Outset(float front, float back) +{ + return impl->Outset(front, back); +} + + +void FTFont::GlyphLoadFlags(FT_Int flags) +{ + return impl->GlyphLoadFlags(flags); +} + + +bool FTFont::CharMap(FT_Encoding encoding) +{ + return impl->CharMap(encoding); +} + + +unsigned int FTFont::CharMapCount() const +{ + return impl->CharMapCount(); +} + + +FT_Encoding* FTFont::CharMapList() +{ + return impl->CharMapList(); +} + + +void FTFont::UseDisplayList(bool useList) +{ + return impl->UseDisplayList(useList); +} + + +float FTFont::Ascender() const +{ + return impl->Ascender(); +} + + +float FTFont::Descender() const +{ + return impl->Descender(); +} + + +float FTFont::LineHeight() const +{ + return impl->LineHeight(); +} + + +FTPoint FTFont::Render(const char * string, const int len, + FTPoint position, FTPoint spacing, int renderMode) +{ + return impl->Render(string, len, position, spacing, renderMode); +} + + +FTPoint FTFont::Render(const wchar_t * string, const int len, + FTPoint position, FTPoint spacing, int renderMode) +{ + return impl->Render(string, len, position, spacing, renderMode); +} + + +float FTFont::Advance(const char * string, const int len, FTPoint spacing) +{ + return impl->Advance(string, len, spacing); +} + + +float FTFont::Advance(const wchar_t * string, const int len, FTPoint spacing) +{ + return impl->Advance(string, len, spacing); +} + + +FTBBox FTFont::BBox(const char *string, const int len, + FTPoint position, FTPoint spacing) +{ + return impl->BBox(string, len, position, spacing); +} + + +FTBBox FTFont::BBox(const wchar_t *string, const int len, + FTPoint position, FTPoint spacing) +{ + return impl->BBox(string, len, position, spacing); +} + + +FT_Error FTFont::Error() const +{ + return impl->err; +} + + +// +// FTFontImpl +// + + +FTFontImpl::FTFontImpl(FTFont *ftFont, char const *fontFilePath) : + face(fontFilePath), + useDisplayLists(true), + load_flags(FT_LOAD_DEFAULT), + intf(ftFont), + glyphList(0) +{ + err = face.Error(); + if(err == 0) + { + glyphList = new FTGlyphContainer(&face); + } +} + + +FTFontImpl::FTFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) : + face(pBufferBytes, bufferSizeInBytes), + useDisplayLists(true), + load_flags(FT_LOAD_DEFAULT), + intf(ftFont), + glyphList(0) +{ + err = face.Error(); + if(err == 0) + { + glyphList = new FTGlyphContainer(&face); + } +} + + +FTFontImpl::~FTFontImpl() +{ + if(glyphList) + { + delete glyphList; + } +} + + +bool FTFontImpl::Attach(const char* fontFilePath) +{ + if(!face.Attach(fontFilePath)) + { + err = face.Error(); + return false; + } + + err = 0; + return true; +} + + +bool FTFontImpl::Attach(const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) +{ + if(!face.Attach(pBufferBytes, bufferSizeInBytes)) + { + err = face.Error(); + return false; + } + + err = 0; + return true; +} + + +bool FTFontImpl::FaceSize(const unsigned int size, const unsigned int res) +{ + if(glyphList != NULL) + { + delete glyphList; + glyphList = NULL; + } + + charSize = face.Size(size, res); + err = face.Error(); + + if(err != 0) + { + return false; + } + + glyphList = new FTGlyphContainer(&face); + return true; +} + + +unsigned int FTFontImpl::FaceSize() const +{ + return charSize.CharSize(); +} + + +void FTFontImpl::Depth(float depth) +{ + ; +} + + +void FTFontImpl::Outset(float outset) +{ + ; +} + + +void FTFontImpl::Outset(float front, float back) +{ + ; +} + + +void FTFontImpl::GlyphLoadFlags(FT_Int flags) +{ + load_flags = flags; +} + + +bool FTFontImpl::CharMap(FT_Encoding encoding) +{ + bool result = glyphList->CharMap(encoding); + err = glyphList->Error(); + return result; +} + + +unsigned int FTFontImpl::CharMapCount() const +{ + return face.CharMapCount(); +} + + +FT_Encoding* FTFontImpl::CharMapList() +{ + return face.CharMapList(); +} + + +void FTFontImpl::UseDisplayList(bool useList) +{ + useDisplayLists = useList; +} + + +float FTFontImpl::Ascender() const +{ + return charSize.Ascender(); +} + + +float FTFontImpl::Descender() const +{ + return charSize.Descender(); +} + + +float FTFontImpl::LineHeight() const +{ + return charSize.Height(); +} + + +template <typename T> +inline FTBBox FTFontImpl::BBoxI(const T* string, const int len, + FTPoint position, FTPoint spacing) +{ + FTBBox totalBBox; + + /* Only compute the bounds if string is non-empty. */ + if(string && ('\0' != string[0])) + { + // for multibyte - we can't rely on sizeof(T) == character + FTUnicodeStringItr<T> ustr(string); + unsigned int thisChar = *ustr++; + unsigned int nextChar = *ustr; + + if(CheckGlyph(thisChar)) + { + totalBBox = glyphList->BBox(thisChar); + totalBBox += position; + + position += FTPoint(glyphList->Advance(thisChar, nextChar), 0.0); + } + + /* Expand totalBox by each glyph in string */ + for(int i = 1; (len < 0 && *ustr) || (len >= 0 && i < len); i++) + { + thisChar = *ustr++; + nextChar = *ustr; + + if(CheckGlyph(thisChar)) + { + position += spacing; + + FTBBox tempBBox = glyphList->BBox(thisChar); + tempBBox += position; + totalBBox |= tempBBox; + + position += FTPoint(glyphList->Advance(thisChar, nextChar), + 0.0); + } + } + } + + return totalBBox; +} + + +FTBBox FTFontImpl::BBox(const char *string, const int len, + FTPoint position, FTPoint spacing) +{ + /* The chars need to be unsigned because they are cast to int later */ + return BBoxI((const unsigned char *)string, len, position, spacing); +} + + +FTBBox FTFontImpl::BBox(const wchar_t *string, const int len, + FTPoint position, FTPoint spacing) +{ + return BBoxI(string, len, position, spacing); +} + + +template <typename T> +inline float FTFontImpl::AdvanceI(const T* string, const int len, + FTPoint spacing) +{ + float advance = 0.0f; + FTUnicodeStringItr<T> ustr(string); + + for(int i = 0; (len < 0 && *ustr) || (len >= 0 && i < len); i++) + { + unsigned int thisChar = *ustr++; + unsigned int nextChar = *ustr; + + if(CheckGlyph(thisChar)) + { + advance += glyphList->Advance(thisChar, nextChar); + } + + if(nextChar) + { + advance += spacing.Xf(); + } + } + + return advance; +} + + +float FTFontImpl::Advance(const char* string, const int len, FTPoint spacing) +{ + /* The chars need to be unsigned because they are cast to int later */ + return AdvanceI((const unsigned char *)string, len, spacing); +} + + +float FTFontImpl::Advance(const wchar_t* string, const int len, FTPoint spacing) +{ + return AdvanceI(string, len, spacing); +} + + +template <typename T> +inline FTPoint FTFontImpl::RenderI(const T* string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + // for multibyte - we can't rely on sizeof(T) == character + FTUnicodeStringItr<T> ustr(string); + + for(int i = 0; (len < 0 && *ustr) || (len >= 0 && i < len); i++) + { + unsigned int thisChar = *ustr++; + unsigned int nextChar = *ustr; + + if(CheckGlyph(thisChar)) + { + position += glyphList->Render(thisChar, nextChar, + position, renderMode); + } + + if(nextChar) + { + position += spacing; + } + } + + return position; +} + + +FTPoint FTFontImpl::Render(const char * string, const int len, + FTPoint position, FTPoint spacing, int renderMode) +{ + return RenderI((const unsigned char *)string, + len, position, spacing, renderMode); +} + + +FTPoint FTFontImpl::Render(const wchar_t * string, const int len, + FTPoint position, FTPoint spacing, int renderMode) +{ + return RenderI(string, len, position, spacing, renderMode); +} + + +bool FTFontImpl::CheckGlyph(const unsigned int characterCode) +{ + if(glyphList->Glyph(characterCode)) + { + return true; + } + + unsigned int glyphIndex = glyphList->FontIndex(characterCode); + FT_GlyphSlot ftSlot = face.Glyph(glyphIndex, load_flags); + if(!ftSlot) + { + err = face.Error(); + return false; + } + + FTGlyph* tempGlyph = intf->MakeGlyph(ftSlot); + if(!tempGlyph) + { + if(0 == err) + { + err = 0x13; + } + + return false; + } + + glyphList->Add(tempGlyph, characterCode); + + return true; +} + diff --git a/src/ftgl/FTFont/FTFontGlue.cpp b/src/ftgl/FTFont/FTFontGlue.cpp new file mode 100644 index 0000000..b23e787 --- /dev/null +++ b/src/ftgl/FTFont/FTFontGlue.cpp @@ -0,0 +1,227 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Éric Beets <ericbeets@free.fr> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include "FTInternals.h" + +static const FTPoint static_ftpoint; +static const FTBBox static_ftbbox; + +FTGL_BEGIN_C_DECLS + +#define C_TOR(cname, cargs, cxxname, cxxarg, cxxtype) \ + FTGLfont* cname cargs \ + { \ + cxxname *f = new cxxname cxxarg; \ + if(f->Error()) \ + { \ + delete f; \ + return NULL; \ + } \ + FTGLfont *ftgl = (FTGLfont *)malloc(sizeof(FTGLfont)); \ + ftgl->ptr = f; \ + ftgl->type = cxxtype; \ + return ftgl; \ + } + +// FTBitmapFont::FTBitmapFont(); +C_TOR(ftglCreateBitmapFont, (const char *fontname), + FTBitmapFont, (fontname), FONT_BITMAP); + +// FTBufferFont::FTBufferFont(); +C_TOR(ftglCreateBufferFont, (const char *fontname), + FTBufferFont, (fontname), FONT_BUFFER); + +// FTExtrudeFont::FTExtrudeFont(); +C_TOR(ftglCreateExtrudeFont, (const char *fontname), + FTExtrudeFont, (fontname), FONT_EXTRUDE); + +// FTOutlineFont::FTOutlineFont(); +C_TOR(ftglCreateOutlineFont, (const char *fontname), + FTOutlineFont, (fontname), FONT_OUTLINE); + +// FTPixmapFont::FTPixmapFont(); +C_TOR(ftglCreatePixmapFont, (const char *fontname), + FTPixmapFont, (fontname), FONT_PIXMAP); + +// FTPolygonFont::FTPolygonFont(); +C_TOR(ftglCreatePolygonFont, (const char *fontname), + FTPolygonFont, (fontname), FONT_POLYGON); + +// FTTextureFont::FTTextureFont(); +C_TOR(ftglCreateTextureFont, (const char *fontname), + FTTextureFont, (fontname), FONT_TEXTURE); + +// FTCustomFont::FTCustomFont(); +class FTCustomFont : public FTFont +{ +public: + FTCustomFont(char const *fontFilePath, void *p, + FTGLglyph * (*makeglyph) (FT_GlyphSlot, void *)) + : FTFont(fontFilePath), + data(p), + makeglyphCallback(makeglyph) + {} + + ~FTCustomFont() + {} + + FTGlyph* MakeGlyph(FT_GlyphSlot slot) + { + FTGLglyph *g = makeglyphCallback(slot, data); + FTGlyph *glyph = g->ptr; + // XXX: we no longer need g, and no one will free it for us. Not + // very elegant, and we need to make sure no one else will try to + // use it. + free(g); + return glyph; + } + +private: + void *data; + FTGLglyph *(*makeglyphCallback) (FT_GlyphSlot, void *); +}; + +C_TOR(ftglCreateCustomFont, (char const *fontFilePath, void *data, + FTGLglyph * (*makeglyphCallback) (FT_GlyphSlot, void *)), + FTCustomFont, (fontFilePath, data, makeglyphCallback), FONT_CUSTOM); + +#define C_FUN(cret, cname, cargs, cxxerr, cxxname, cxxarg) \ + cret cname cargs \ + { \ + if(!f || !f->ptr) \ + { \ + fprintf(stderr, "FTGL warning: NULL pointer in %s\n", #cname); \ + cxxerr; \ + } \ + return f->ptr->cxxname cxxarg; \ + } + +// FTFont::~FTFont(); +void ftglDestroyFont(FTGLfont *f) +{ + if(!f || !f->ptr) + { + fprintf(stderr, "FTGL warning: NULL pointer in %s\n", __FUNCTION__); + return; + } + delete f->ptr; + free(f); +} + +// bool FTFont::Attach(const char* fontFilePath); +C_FUN(int, ftglAttachFile, (FTGLfont *f, const char* path), + return 0, Attach, (path)); + +// bool FTFont::Attach(const unsigned char *pBufferBytes, +// size_t bufferSizeInBytes); +C_FUN(int, ftglAttachData, (FTGLfont *f, const unsigned char *p, size_t s), + return 0, Attach, (p, s)); + +// void FTFont::GlyphLoadFlags(FT_Int flags); +C_FUN(void, ftglSetFontGlyphLoadFlags, (FTGLfont *f, FT_Int flags), + return, GlyphLoadFlags, (flags)); + +// bool FTFont::CharMap(FT_Encoding encoding); +C_FUN(int, ftglSetFontCharMap, (FTGLfont *f, FT_Encoding enc), + return 0, CharMap, (enc)); + +// unsigned int FTFont::CharMapCount(); +C_FUN(unsigned int, ftglGetFontCharMapCount, (FTGLfont *f), + return 0, CharMapCount, ()); + +// FT_Encoding* FTFont::CharMapList(); +C_FUN(FT_Encoding *, ftglGetFontCharMapList, (FTGLfont* f), + return NULL, CharMapList, ()); + +// virtual bool FTFont::FaceSize(const unsigned int size, +// const unsigned int res = 72); +C_FUN(int, ftglSetFontFaceSize, (FTGLfont *f, unsigned int s, unsigned int r), + return 0, FaceSize, (s, r > 0 ? r : 72)); + +// unsigned int FTFont::FaceSize() const; +// XXX: need to call FaceSize() as FTFont::FaceSize() because of FTGLTexture +C_FUN(unsigned int, ftglGetFontFaceSize, (FTGLfont *f), + return 0, FTFont::FaceSize, ()); + +// virtual void FTFont::Depth(float depth); +C_FUN(void, ftglSetFontDepth, (FTGLfont *f, float d), return, Depth, (d)); + +// virtual void FTFont::Outset(float front, float back); +C_FUN(void, ftglSetFontOutset, (FTGLfont *f, float front, float back), + return, FTFont::Outset, (front, back)); + +// void FTFont::UseDisplayList(bool useList); +C_FUN(void, ftglSetFontDisplayList, (FTGLfont *f, int l), + return, UseDisplayList, (l != 0)); + +// float FTFont::Ascender() const; +C_FUN(float, ftglGetFontAscender, (FTGLfont *f), return 0.f, Ascender, ()); + +// float FTFont::Descender() const; +C_FUN(float, ftglGetFontDescender, (FTGLfont *f), return 0.f, Descender, ()); + +// float FTFont::LineHeight() const; +C_FUN(float, ftglGetFontLineHeight, (FTGLfont *f), return 0.f, LineHeight, ()); + +// void FTFont::BBox(const char* string, float& llx, float& lly, float& llz, +// float& urx, float& ury, float& urz); +extern "C++" { +C_FUN(static FTBBox, _ftglGetFontBBox, (FTGLfont *f, char const *s, int len), + return static_ftbbox, BBox, (s, len)); +} + +void ftglGetFontBBox(FTGLfont *f, const char* s, int len, float c[6]) +{ + FTBBox ret = _ftglGetFontBBox(f, s, len); + FTPoint lower = ret.Lower(), upper = ret.Upper(); + c[0] = lower.Xf(); c[1] = lower.Yf(); c[2] = lower.Zf(); + c[3] = upper.Xf(); c[4] = upper.Yf(); c[5] = upper.Zf(); +} + +// float FTFont::Advance(const char* string); +C_FUN(float, ftglGetFontAdvance, (FTGLfont *f, char const *s), + return 0.0, Advance, (s)); + +// virtual void Render(const char* string, int renderMode); +extern "C++" { +C_FUN(static FTPoint, _ftglRenderFont, (FTGLfont *f, char const *s, int len, + FTPoint pos, FTPoint spacing, int mode), + return static_ftpoint, Render, (s, len, pos, spacing, mode)); +} + +void ftglRenderFont(FTGLfont *f, const char *s, int mode) +{ + _ftglRenderFont(f, s, -1, FTPoint(), FTPoint(), mode); +} + +// FT_Error FTFont::Error() const; +C_FUN(FT_Error, ftglGetFontError, (FTGLfont *f), return -1, Error, ()); + +FTGL_END_C_DECLS + diff --git a/src/ftgl/FTFont/FTFontImpl.h b/src/ftgl/FTFont/FTFontImpl.h new file mode 100644 index 0000000..36c3bf8 --- /dev/null +++ b/src/ftgl/FTFont/FTFontImpl.h @@ -0,0 +1,162 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __FTFontImpl__ +#define __FTFontImpl__ + +#include "FTGL/ftgl.h" + +#include "FTFace.h" + +class FTGlyphContainer; +class FTGlyph; + +class FTFontImpl +{ + friend class FTFont; + + protected: + FTFontImpl(FTFont *ftFont, char const *fontFilePath); + + FTFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, + size_t bufferSizeInBytes); + + virtual ~FTFontImpl(); + + virtual bool Attach(const char* fontFilePath); + + virtual bool Attach(const unsigned char *pBufferBytes, + size_t bufferSizeInBytes); + + virtual void GlyphLoadFlags(FT_Int flags); + + virtual bool CharMap(FT_Encoding encoding); + + virtual unsigned int CharMapCount() const; + + virtual FT_Encoding* CharMapList(); + + virtual void UseDisplayList(bool useList); + + virtual float Ascender() const; + + virtual float Descender() const; + + virtual float LineHeight() const; + + virtual bool FaceSize(const unsigned int size, + const unsigned int res); + + virtual unsigned int FaceSize() const; + + virtual void Depth(float depth); + + virtual void Outset(float outset); + + virtual void Outset(float front, float back); + + virtual FTBBox BBox(const char *s, const int len, FTPoint, FTPoint); + + virtual FTBBox BBox(const wchar_t *s, const int len, FTPoint, FTPoint); + + virtual float Advance(const char *s, const int len, FTPoint); + + virtual float Advance(const wchar_t *s, const int len, FTPoint); + + virtual FTPoint Render(const char *s, const int len, + FTPoint, FTPoint, int); + + virtual FTPoint Render(const wchar_t *s, const int len, + FTPoint, FTPoint, int); + + /** + * Current face object + */ + FTFace face; + + /** + * Current size object + */ + FTSize charSize; + + /** + * Flag to enable or disable the use of Display Lists inside FTGL + * <code>true</code> turns ON display lists. + * <code>false</code> turns OFF display lists. + */ + bool useDisplayLists; + + /** + * The default glyph loading flags. + */ + FT_Int load_flags; + + /** + * Current error code. Zero means no error. + */ + FT_Error err; + + private: + /** + * A link back to the interface of which we are the implementation. + */ + FTFont *intf; + + /** + * Check that the glyph at <code>chr</code> exist. If not load it. + * + * @param chr character index + * @return <code>true</code> if the glyph can be created. + */ + bool CheckGlyph(const unsigned int chr); + + /** + * An object that holds a list of glyphs + */ + FTGlyphContainer* glyphList; + + /** + * Current pen or cursor position; + */ + FTPoint pen; + + /* Internal generic BBox() implementation */ + template <typename T> + inline FTBBox BBoxI(const T *s, const int len, + FTPoint position, FTPoint spacing); + + /* Internal generic Advance() implementation */ + template <typename T> + inline float AdvanceI(const T *s, const int len, FTPoint spacing); + + /* Internal generic Render() implementation */ + template <typename T> + inline FTPoint RenderI(const T *s, const int len, + FTPoint position, FTPoint spacing, int mode); +}; + +#endif // __FTFontImpl__ + diff --git a/src/ftgl/FTFont/FTOutlineFont.cpp b/src/ftgl/FTFont/FTOutlineFont.cpp new file mode 100644 index 0000000..9ebc9a0 --- /dev/null +++ b/src/ftgl/FTFont/FTOutlineFont.cpp @@ -0,0 +1,129 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTOutlineFontImpl.h" + + +// +// FTOutlineFont +// + + +FTOutlineFont::FTOutlineFont(char const *fontFilePath) : + FTFont(new FTOutlineFontImpl(this, fontFilePath)) +{} + + +FTOutlineFont::FTOutlineFont(const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) : + FTFont(new FTOutlineFontImpl(this, pBufferBytes, bufferSizeInBytes)) +{} + + +FTOutlineFont::~FTOutlineFont() +{} + + +FTGlyph* FTOutlineFont::MakeGlyph(FT_GlyphSlot ftGlyph) +{ + FTOutlineFontImpl *myimpl = dynamic_cast<FTOutlineFontImpl *>(impl); + if(!myimpl) + { + return NULL; + } + + return new FTOutlineGlyph(ftGlyph, myimpl->outset, + myimpl->useDisplayLists); +} + + +// +// FTOutlineFontImpl +// + + +FTOutlineFontImpl::FTOutlineFontImpl(FTFont *ftFont, const char* fontFilePath) +: FTFontImpl(ftFont, fontFilePath), + outset(0.0f) +{ + load_flags = FT_LOAD_NO_HINTING; +} + + +FTOutlineFontImpl::FTOutlineFontImpl(FTFont *ftFont, + const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) +: FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes), + outset(0.0f) +{ + load_flags = FT_LOAD_NO_HINTING; +} + + +template <typename T> +inline FTPoint FTOutlineFontImpl::RenderI(const T* string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + // Protect GL_TEXTURE_2D, glHint(), GL_LINE_SMOOTH and blending functions + glPushAttrib(GL_ENABLE_BIT | GL_HINT_BIT | GL_LINE_BIT + | GL_COLOR_BUFFER_BIT); + + glDisable(GL_TEXTURE_2D); + glEnable(GL_LINE_SMOOTH); + glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_ONE + + FTPoint tmp = FTFontImpl::Render(string, len, + position, spacing, renderMode); + + glPopAttrib(); + + return tmp; +} + + +FTPoint FTOutlineFontImpl::Render(const char * string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + return RenderI(string, len, position, spacing, renderMode); +} + + +FTPoint FTOutlineFontImpl::Render(const wchar_t * string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + return RenderI(string, len, position, spacing, renderMode); +} + diff --git a/src/ftgl/FTFont/FTOutlineFontImpl.h b/src/ftgl/FTFont/FTOutlineFontImpl.h new file mode 100644 index 0000000..38b4d26 --- /dev/null +++ b/src/ftgl/FTFont/FTOutlineFontImpl.h @@ -0,0 +1,73 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __FTOutlineFontImpl__ +#define __FTOutlineFontImpl__ + +#include "FTFontImpl.h" + +class FTGlyph; + +class FTOutlineFontImpl : public FTFontImpl +{ + friend class FTOutlineFont; + + protected: + FTOutlineFontImpl(FTFont *ftFont, const char* fontFilePath); + + FTOutlineFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, + size_t bufferSizeInBytes); + + /** + * Set the outset distance for the font. Only implemented by + * FTOutlineFont, FTPolygonFont and FTExtrudeFont + * + * @param outset The outset distance. + */ + virtual void Outset(float o) { outset = o; } + + virtual FTPoint Render(const char *s, const int len, + FTPoint position, FTPoint spacing, + int renderMode); + + virtual FTPoint Render(const wchar_t *s, const int len, + FTPoint position, FTPoint spacing, + int renderMode); + + private: + /** + * The outset distance for the font. + */ + float outset; + + /* Internal generic Render() implementation */ + template <typename T> + inline FTPoint RenderI(const T *s, const int len, + FTPoint position, FTPoint spacing, int mode); +}; + +#endif // __FTOutlineFontImpl__ + diff --git a/src/ftgl/FTFont/FTPixmapFont.cpp b/src/ftgl/FTFont/FTPixmapFont.cpp new file mode 100644 index 0000000..5638ac8 --- /dev/null +++ b/src/ftgl/FTFont/FTPixmapFont.cpp @@ -0,0 +1,131 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTPixmapFontImpl.h" + + +// +// FTPixmapFont +// + + +FTPixmapFont::FTPixmapFont(char const *fontFilePath) : + FTFont(new FTPixmapFontImpl(this, fontFilePath)) +{} + + +FTPixmapFont::FTPixmapFont(const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) : + FTFont(new FTPixmapFontImpl(this, pBufferBytes, bufferSizeInBytes)) +{} + + +FTPixmapFont::~FTPixmapFont() +{} + + +FTGlyph* FTPixmapFont::MakeGlyph(FT_GlyphSlot ftGlyph) +{ + return new FTPixmapGlyph(ftGlyph); +} + + +// +// FTPixmapFontImpl +// + + +FTPixmapFontImpl::FTPixmapFontImpl(FTFont *ftFont, const char* fontFilePath) +: FTFontImpl(ftFont, fontFilePath) +{ + load_flags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP; +} + + +FTPixmapFontImpl::FTPixmapFontImpl(FTFont *ftFont, + const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) +: FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes) +{ + load_flags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP; +} + + +template <typename T> +inline FTPoint FTPixmapFontImpl::RenderI(const T* string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + // Protect GL_TEXTURE_2D and GL_BLEND, glPixelTransferf(), and blending + // functions. + glPushAttrib(GL_ENABLE_BIT | GL_PIXEL_MODE_BIT | GL_COLOR_BUFFER_BIT); + + // Protect glPixelStorei() calls (made by FTPixmapGlyphImpl::RenderImpl). + glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glDisable(GL_TEXTURE_2D); + + GLfloat ftglColour[4]; + glGetFloatv(GL_CURRENT_RASTER_COLOR, ftglColour); + + glPixelTransferf(GL_RED_SCALE, ftglColour[0]); + glPixelTransferf(GL_GREEN_SCALE, ftglColour[1]); + glPixelTransferf(GL_BLUE_SCALE, ftglColour[2]); + glPixelTransferf(GL_ALPHA_SCALE, ftglColour[3]); + + FTPoint tmp = FTFontImpl::Render(string, len, + position, spacing, renderMode); + + glPopClientAttrib(); + glPopAttrib(); + + return tmp; +} + + +FTPoint FTPixmapFontImpl::Render(const char * string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + return RenderI(string, len, position, spacing, renderMode); +} + + +FTPoint FTPixmapFontImpl::Render(const wchar_t * string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + return RenderI(string, len, position, spacing, renderMode); +} + diff --git a/src/ftgl/FTFont/FTPixmapFontImpl.h b/src/ftgl/FTFont/FTPixmapFontImpl.h new file mode 100644 index 0000000..321f4a6 --- /dev/null +++ b/src/ftgl/FTFont/FTPixmapFontImpl.h @@ -0,0 +1,60 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __FTPixmapFontImpl__ +#define __FTPixmapFontImpl__ + +#include "FTFontImpl.h" + +class FTGlyph; + +class FTPixmapFontImpl : public FTFontImpl +{ + friend class FTPixmapFont; + + protected: + FTPixmapFontImpl(FTFont *ftFont, const char* fontFilePath); + + FTPixmapFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, + size_t bufferSizeInBytes); + + virtual FTPoint Render(const char *s, const int len, + FTPoint position, FTPoint spacing, + int renderMode); + + virtual FTPoint Render(const wchar_t *s, const int len, + FTPoint position, FTPoint spacing, + int renderMode); + + private: + /* Internal generic Render() implementation */ + template <typename T> + inline FTPoint RenderI(const T *s, const int len, + FTPoint position, FTPoint spacing, int mode); +}; + +#endif // __FTPixmapFontImpl__ + diff --git a/src/ftgl/FTFont/FTPolygonFont.cpp b/src/ftgl/FTFont/FTPolygonFont.cpp new file mode 100644 index 0000000..83c3ad1 --- /dev/null +++ b/src/ftgl/FTFont/FTPolygonFont.cpp @@ -0,0 +1,89 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTPolygonFontImpl.h" + + +// +// FTPolygonFont +// + + +FTPolygonFont::FTPolygonFont(char const *fontFilePath) : + FTFont(new FTPolygonFontImpl(this, fontFilePath)) +{} + + +FTPolygonFont::FTPolygonFont(const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) : + FTFont(new FTPolygonFontImpl(this, pBufferBytes, bufferSizeInBytes)) +{} + + +FTPolygonFont::~FTPolygonFont() +{} + + +FTGlyph* FTPolygonFont::MakeGlyph(FT_GlyphSlot ftGlyph) +{ + FTPolygonFontImpl *myimpl = dynamic_cast<FTPolygonFontImpl *>(impl); + if(!myimpl) + { + return NULL; + } + + return new FTPolygonGlyph(ftGlyph, myimpl->outset, + myimpl->useDisplayLists); +} + + +// +// FTPolygonFontImpl +// + + +FTPolygonFontImpl::FTPolygonFontImpl(FTFont *ftFont, const char* fontFilePath) +: FTFontImpl(ftFont, fontFilePath), + outset(0.0f) +{ + load_flags = FT_LOAD_NO_HINTING; +} + + +FTPolygonFontImpl::FTPolygonFontImpl(FTFont *ftFont, + const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) +: FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes), + outset(0.0f) +{ + load_flags = FT_LOAD_NO_HINTING; +} + diff --git a/src/ftgl/FTFont/FTPolygonFontImpl.h b/src/ftgl/FTFont/FTPolygonFontImpl.h new file mode 100644 index 0000000..47b35a6 --- /dev/null +++ b/src/ftgl/FTFont/FTPolygonFontImpl.h @@ -0,0 +1,60 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __FTPolygonFontImpl__ +#define __FTPolygonFontImpl__ + +#include "FTFontImpl.h" + +class FTGlyph; + +class FTPolygonFontImpl : public FTFontImpl +{ + friend class FTPolygonFont; + + protected: + FTPolygonFontImpl(FTFont *ftFont, const char* fontFilePath); + + FTPolygonFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, + size_t bufferSizeInBytes); + + /** + * Set the outset distance for the font. Only implemented by + * FTOutlineFont, FTPolygonFont and FTExtrudeFont + * + * @param depth The outset distance. + */ + virtual void Outset(float o) { outset = o; } + + private: + /** + * The outset distance (front and back) for the font. + */ + float outset; +}; + +#endif // __FTPolygonFontImpl__ + diff --git a/src/ftgl/FTFont/FTTextureFont.cpp b/src/ftgl/FTFont/FTTextureFont.cpp new file mode 100644 index 0000000..4e385ea --- /dev/null +++ b/src/ftgl/FTFont/FTTextureFont.cpp @@ -0,0 +1,267 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "config.h" + +#include <cassert> +#include <string> // For memset + +#include "FTGL/ftgl.h" + +#include "FTInternals.h" + +#include "../FTGlyph/FTTextureGlyphImpl.h" +#include "./FTTextureFontImpl.h" + + +// +// FTTextureFont +// + + +FTTextureFont::FTTextureFont(char const *fontFilePath) : + FTFont(new FTTextureFontImpl(this, fontFilePath)) +{} + + +FTTextureFont::FTTextureFont(const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) : + FTFont(new FTTextureFontImpl(this, pBufferBytes, bufferSizeInBytes)) +{} + + +FTTextureFont::~FTTextureFont() +{} + + +FTGlyph* FTTextureFont::MakeGlyph(FT_GlyphSlot ftGlyph) +{ + FTTextureFontImpl *myimpl = dynamic_cast<FTTextureFontImpl *>(impl); + if(!myimpl) + { + return NULL; + } + + return myimpl->MakeGlyphImpl(ftGlyph); +} + + +// +// FTTextureFontImpl +// + + +static inline GLuint NextPowerOf2(GLuint in) +{ + in -= 1; + + in |= in >> 16; + in |= in >> 8; + in |= in >> 4; + in |= in >> 2; + in |= in >> 1; + + return in + 1; +} + + +FTTextureFontImpl::FTTextureFontImpl(FTFont *ftFont, const char* fontFilePath) +: FTFontImpl(ftFont, fontFilePath), + maximumGLTextureSize(0), + textureWidth(0), + textureHeight(0), + glyphHeight(0), + glyphWidth(0), + padding(3), + xOffset(0), + yOffset(0) +{ + load_flags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP; + remGlyphs = numGlyphs = face.GlyphCount(); +} + + +FTTextureFontImpl::FTTextureFontImpl(FTFont *ftFont, + const unsigned char *pBufferBytes, + size_t bufferSizeInBytes) +: FTFontImpl(ftFont, pBufferBytes, bufferSizeInBytes), + maximumGLTextureSize(0), + textureWidth(0), + textureHeight(0), + glyphHeight(0), + glyphWidth(0), + padding(3), + xOffset(0), + yOffset(0) +{ + load_flags = FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP; + remGlyphs = numGlyphs = face.GlyphCount(); +} + + +FTTextureFontImpl::~FTTextureFontImpl() +{ + if(textureIDList.size()) + { + glDeleteTextures((GLsizei)textureIDList.size(), + (const GLuint*)&textureIDList[0]); + } +} + + +FTGlyph* FTTextureFontImpl::MakeGlyphImpl(FT_GlyphSlot ftGlyph) +{ + glyphHeight = static_cast<int>(charSize.Height() + 0.5); + glyphWidth = static_cast<int>(charSize.Width() + 0.5); + + if(glyphHeight < 1) glyphHeight = 1; + if(glyphWidth < 1) glyphWidth = 1; + + if(textureIDList.empty()) + { + textureIDList.push_back(CreateTexture()); + xOffset = yOffset = padding; + } + + if(xOffset > (textureWidth - glyphWidth)) + { + xOffset = padding; + yOffset += glyphHeight; + + if(yOffset > (textureHeight - glyphHeight)) + { + textureIDList.push_back(CreateTexture()); + yOffset = padding; + } + } + + FTTextureGlyph* tempGlyph = new FTTextureGlyph(ftGlyph, textureIDList[textureIDList.size() - 1], + xOffset, yOffset, textureWidth, textureHeight); + xOffset += static_cast<int>(tempGlyph->BBox().Upper().X() - tempGlyph->BBox().Lower().X() + padding + 0.5); + + --remGlyphs; + + return tempGlyph; +} + + +void FTTextureFontImpl::CalculateTextureSize() +{ + if(!maximumGLTextureSize) + { + maximumGLTextureSize = 1024; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*)&maximumGLTextureSize); + assert(maximumGLTextureSize); // If you hit this then you have an invalid OpenGL context. + } + + textureWidth = NextPowerOf2((remGlyphs * glyphWidth) + (padding * 2)); + textureWidth = textureWidth > maximumGLTextureSize ? maximumGLTextureSize : textureWidth; + + int h = static_cast<int>((textureWidth - (padding * 2)) / glyphWidth + 0.5); + + textureHeight = NextPowerOf2(((numGlyphs / h) + 1) * glyphHeight); + textureHeight = textureHeight > maximumGLTextureSize ? maximumGLTextureSize : textureHeight; +} + + +GLuint FTTextureFontImpl::CreateTexture() +{ + CalculateTextureSize(); + + int totalMemory = textureWidth * textureHeight; + unsigned char* textureMemory = new unsigned char[totalMemory]; + memset(textureMemory, 0, totalMemory); + + GLuint textID; + glGenTextures(1, (GLuint*)&textID); + + glBindTexture(GL_TEXTURE_2D, textID); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, textureWidth, textureHeight, + 0, GL_ALPHA, GL_UNSIGNED_BYTE, textureMemory); + + delete [] textureMemory; + + return textID; +} + + +bool FTTextureFontImpl::FaceSize(const unsigned int size, const unsigned int res) +{ + if(!textureIDList.empty()) + { + glDeleteTextures((GLsizei)textureIDList.size(), (const GLuint*)&textureIDList[0]); + textureIDList.clear(); + remGlyphs = numGlyphs = face.GlyphCount(); + } + + return FTFontImpl::FaceSize(size, res); +} + + +template <typename T> +inline FTPoint FTTextureFontImpl::RenderI(const T* string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + // Protect GL_TEXTURE_2D, GL_BLEND and blending functions + glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_ONE + + glEnable(GL_TEXTURE_2D); + + FTTextureGlyphImpl::ResetActiveTexture(); + + FTPoint tmp = FTFontImpl::Render(string, len, + position, spacing, renderMode); + + glPopAttrib(); + + return tmp; +} + + +FTPoint FTTextureFontImpl::Render(const char * string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + return RenderI(string, len, position, spacing, renderMode); +} + + +FTPoint FTTextureFontImpl::Render(const wchar_t * string, const int len, + FTPoint position, FTPoint spacing, + int renderMode) +{ + return RenderI(string, len, position, spacing, renderMode); +} + diff --git a/src/ftgl/FTFont/FTTextureFontImpl.h b/src/ftgl/FTFont/FTTextureFontImpl.h new file mode 100644 index 0000000..c9cf22b --- /dev/null +++ b/src/ftgl/FTFont/FTTextureFontImpl.h @@ -0,0 +1,152 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Sam Hocevar <sam@zoy.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __FTTextureFontImpl__ +#define __FTTextureFontImpl__ + +#include "FTFontImpl.h" + +#include "FTVector.h" + +class FTTextureGlyph; + +class FTTextureFontImpl : public FTFontImpl +{ + friend class FTTextureFont; + + protected: + FTTextureFontImpl(FTFont *ftFont, const char* fontFilePath); + + FTTextureFontImpl(FTFont *ftFont, const unsigned char *pBufferBytes, + size_t bufferSizeInBytes); + + virtual ~FTTextureFontImpl(); + + /** + * Set the char size for the current face. + * + * @param size the face size in points (1/72 inch) + * @param res the resolution of the target device. + * @return <code>true</code> if size was set correctly + */ + virtual bool FaceSize(const unsigned int size, + const unsigned int res = 72); + + virtual FTPoint Render(const char *s, const int len, + FTPoint position, FTPoint spacing, + int renderMode); + + virtual FTPoint Render(const wchar_t *s, const int len, + FTPoint position, FTPoint spacing, + int renderMode); + + private: + /** + * Create an FTTextureGlyph object for the base class. + */ + FTGlyph* MakeGlyphImpl(FT_GlyphSlot ftGlyph); + + /** + * Get the size of a block of memory required to layout the glyphs + * + * Calculates a width and height based on the glyph sizes and the + * number of glyphs. It over estimates. + */ + inline void CalculateTextureSize(); + + /** + * Creates a 'blank' OpenGL texture object. + * + * The format is GL_ALPHA and the params are + * GL_TEXTURE_WRAP_S = GL_CLAMP + * GL_TEXTURE_WRAP_T = GL_CLAMP + * GL_TEXTURE_MAG_FILTER = GL_LINEAR + * GL_TEXTURE_MIN_FILTER = GL_LINEAR + * Note that mipmapping is NOT used + */ + inline GLuint CreateTexture(); + + /** + * The maximum texture dimension on this OpenGL implemetation + */ + GLsizei maximumGLTextureSize; + + /** + * The minimum texture width required to hold the glyphs + */ + GLsizei textureWidth; + + /** + * The minimum texture height required to hold the glyphs + */ + GLsizei textureHeight; + + /** + *An array of texture ids + */ + FTVector<GLuint> textureIDList; + + /** + * The max height for glyphs in the current font + */ + int glyphHeight; + + /** + * The max width for glyphs in the current font + */ + int glyphWidth; + + /** + * A value to be added to the height and width to ensure that + * glyphs don't overlap in the texture + */ + unsigned int padding; + + /** + * + */ + unsigned int numGlyphs; + + /** + */ + unsigned int remGlyphs; + + /** + */ + int xOffset; + + /** + */ + int yOffset; + + /* Internal generic Render() implementation */ + template <typename T> + inline FTPoint RenderI(const T *s, const int len, + FTPoint position, FTPoint spacing, int mode); +}; + +#endif // __FTTextureFontImpl__ + |