diff options
Diffstat (limited to 'src/ftgl/FTGlyph')
-rw-r--r-- | src/ftgl/FTGlyph/FTBitmapGlyph.cpp | 128 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTBitmapGlyphImpl.h | 71 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTBufferGlyph.cpp | 121 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTBufferGlyphImpl.h | 52 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTExtrudeGlyph.cpp | 265 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTExtrudeGlyphImpl.h | 69 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTGlyph.cpp | 112 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTGlyphGlue.cpp | 198 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTGlyphImpl.h | 64 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTOutlineGlyph.cpp | 149 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTOutlineGlyphImpl.h | 69 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTPixmapGlyph.cpp | 139 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTPixmapGlyphImpl.h | 67 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTPolygonGlyph.cpp | 156 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTPolygonGlyphImpl.h | 66 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTTextureGlyph.cpp | 153 | ||||
-rw-r--r-- | src/ftgl/FTGlyph/FTTextureGlyphImpl.h | 88 |
17 files changed, 1967 insertions, 0 deletions
diff --git a/src/ftgl/FTGlyph/FTBitmapGlyph.cpp b/src/ftgl/FTGlyph/FTBitmapGlyph.cpp new file mode 100644 index 0000000..989c890 --- /dev/null +++ b/src/ftgl/FTGlyph/FTBitmapGlyph.cpp @@ -0,0 +1,128 @@ +/* + * 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 <string> + +#include "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTBitmapGlyphImpl.h" + + +// +// FTGLBitmapGlyph +// + + +FTBitmapGlyph::FTBitmapGlyph(FT_GlyphSlot glyph) : + FTGlyph(new FTBitmapGlyphImpl(glyph)) +{} + + +FTBitmapGlyph::~FTBitmapGlyph() +{} + + +const FTPoint& FTBitmapGlyph::Render(const FTPoint& pen, int renderMode) +{ + FTBitmapGlyphImpl *myimpl = dynamic_cast<FTBitmapGlyphImpl *>(impl); + return myimpl->RenderImpl(pen, renderMode); +} + + +// +// FTGLBitmapGlyphImpl +// + + +FTBitmapGlyphImpl::FTBitmapGlyphImpl(FT_GlyphSlot glyph) +: FTGlyphImpl(glyph), + destWidth(0), + destHeight(0), + data(0) +{ + err = FT_Render_Glyph(glyph, FT_RENDER_MODE_MONO); + if(err || ft_glyph_format_bitmap != glyph->format) + { + return; + } + + FT_Bitmap bitmap = glyph->bitmap; + + unsigned int srcWidth = bitmap.width; + unsigned int srcHeight = bitmap.rows; + unsigned int srcPitch = bitmap.pitch; + + destWidth = srcWidth; + destHeight = srcHeight; + destPitch = srcPitch; + + if(destWidth && destHeight) + { + data = new unsigned char[destPitch * destHeight]; + unsigned char* dest = data + ((destHeight - 1) * destPitch); + + unsigned char* src = bitmap.buffer; + + for(unsigned int y = 0; y < srcHeight; ++y) + { + memcpy(dest, src, srcPitch); + dest -= destPitch; + src += srcPitch; + } + } + + pos = FTPoint(glyph->bitmap_left, static_cast<int>(srcHeight) - glyph->bitmap_top, 0.0); +} + + +FTBitmapGlyphImpl::~FTBitmapGlyphImpl() +{ + delete [] data; +} + + +const FTPoint& FTBitmapGlyphImpl::RenderImpl(const FTPoint& pen, int renderMode) +{ + if(data) + { + float dx, dy; + + dx = pen.Xf() + pos.Xf(); + dy = pen.Yf() - pos.Yf(); + + glBitmap(0, 0, 0.0f, 0.0f, dx, dy, (const GLubyte*)0); + glPixelStorei(GL_UNPACK_ROW_LENGTH, destPitch * 8); + glBitmap(destWidth, destHeight, 0.0f, 0.0, 0.0, 0.0, + (const GLubyte*)data); + glBitmap(0, 0, 0.0f, 0.0f, -dx, -dy, (const GLubyte*)0); + } + + return advance; +} + diff --git a/src/ftgl/FTGlyph/FTBitmapGlyphImpl.h b/src/ftgl/FTGlyph/FTBitmapGlyphImpl.h new file mode 100644 index 0000000..c61a679 --- /dev/null +++ b/src/ftgl/FTGlyph/FTBitmapGlyphImpl.h @@ -0,0 +1,71 @@ +/* + * 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 __FTBitmapGlyphImpl__ +#define __FTBitmapGlyphImpl__ + +#include "FTGlyphImpl.h" + +class FTBitmapGlyphImpl : public FTGlyphImpl +{ + friend class FTBitmapGlyph; + + protected: + FTBitmapGlyphImpl(FT_GlyphSlot glyph); + + virtual ~FTBitmapGlyphImpl(); + + virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); + + private: + /** + * The width of the glyph 'image' + */ + unsigned int destWidth; + + /** + * The height of the glyph 'image' + */ + unsigned int destHeight; + + /** + * The pitch of the glyph 'image' + */ + unsigned int destPitch; + + /** + * Vector from the pen position to the topleft corner of the bitmap + */ + FTPoint pos; + + /** + * Pointer to the 'image' data + */ + unsigned char* data; +}; + +#endif // __FTBitmapGlyphImpl__ + diff --git a/src/ftgl/FTGlyph/FTBufferGlyph.cpp b/src/ftgl/FTGlyph/FTBufferGlyph.cpp new file mode 100644 index 0000000..7a78b0e --- /dev/null +++ b/src/ftgl/FTGlyph/FTBufferGlyph.cpp @@ -0,0 +1,121 @@ +/* + * 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 <string> + +#include "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTBufferGlyphImpl.h" + + +// +// FTGLBufferGlyph +// + + +FTBufferGlyph::FTBufferGlyph(FT_GlyphSlot glyph, FTBuffer *buffer) : + FTGlyph(new FTBufferGlyphImpl(glyph, buffer)) +{} + + +FTBufferGlyph::~FTBufferGlyph() +{} + + +const FTPoint& FTBufferGlyph::Render(const FTPoint& pen, int renderMode) +{ + FTBufferGlyphImpl *myimpl = dynamic_cast<FTBufferGlyphImpl *>(impl); + return myimpl->RenderImpl(pen, renderMode); +} + + +// +// FTGLBufferGlyphImpl +// + + +FTBufferGlyphImpl::FTBufferGlyphImpl(FT_GlyphSlot glyph, FTBuffer *p) +: FTGlyphImpl(glyph), + has_bitmap(false), + buffer(p) +{ + err = FT_Render_Glyph(glyph, FT_RENDER_MODE_NORMAL); + if(err || glyph->format != ft_glyph_format_bitmap) + { + return; + } + + bitmap = glyph->bitmap; + pixels = new unsigned char[bitmap.pitch * bitmap.rows]; + memcpy(pixels, bitmap.buffer, bitmap.pitch * bitmap.rows); + + if(bitmap.width && bitmap.rows) + { + has_bitmap = true; + corner = FTPoint(glyph->bitmap_left, glyph->bitmap_top); + } +} + + +FTBufferGlyphImpl::~FTBufferGlyphImpl() +{ + delete[] pixels; +} + + +const FTPoint& FTBufferGlyphImpl::RenderImpl(const FTPoint& pen, int renderMode) +{ + if(has_bitmap) + { + FTPoint pos(buffer->Pos() + pen + corner); + int dx = (int)(pos.Xf() + 0.5f); + int dy = buffer->Height() - (int)(pos.Yf() + 0.5f); + unsigned char * dest = buffer->Pixels() + dx + dy * buffer->Width(); + + for(int y = 0; y < bitmap.rows; y++) + { + // FIXME: change the loop bounds instead of doing this test + if(y + dy < 0 || y + dy >= buffer->Height()) continue; + + for(int x = 0; x < bitmap.width; x++) + { + if(x + dx < 0 || x + dx >= buffer->Width()) continue; + + unsigned char p = pixels[y * bitmap.pitch + x]; + + if(p) + { + dest[y * buffer->Width() + x] = p; + } + } + } + } + + return advance; +} + diff --git a/src/ftgl/FTGlyph/FTBufferGlyphImpl.h b/src/ftgl/FTGlyph/FTBufferGlyphImpl.h new file mode 100644 index 0000000..5a15049 --- /dev/null +++ b/src/ftgl/FTGlyph/FTBufferGlyphImpl.h @@ -0,0 +1,52 @@ +/* + * 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 __FTBufferGlyphImpl__ +#define __FTBufferGlyphImpl__ + +#include "FTGlyphImpl.h" + +class FTBufferGlyphImpl : public FTGlyphImpl +{ + friend class FTBufferGlyph; + + protected: + FTBufferGlyphImpl(FT_GlyphSlot glyph, FTBuffer *p); + + virtual ~FTBufferGlyphImpl(); + + virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); + + private: + bool has_bitmap; + FT_Bitmap bitmap; + unsigned char *pixels; + FTPoint corner; + + FTBuffer *buffer; +}; + +#endif // __FTBufferGlyphImpl__ + diff --git a/src/ftgl/FTGlyph/FTExtrudeGlyph.cpp b/src/ftgl/FTGlyph/FTExtrudeGlyph.cpp new file mode 100644 index 0000000..df0496e --- /dev/null +++ b/src/ftgl/FTGlyph/FTExtrudeGlyph.cpp @@ -0,0 +1,265 @@ +/* + * 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 <iostream> + +#include "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTExtrudeGlyphImpl.h" +#include "FTVectoriser.h" + + +// +// FTGLExtrudeGlyph +// + + +FTExtrudeGlyph::FTExtrudeGlyph(FT_GlyphSlot glyph, float depth, + float frontOutset, float backOutset, + bool useDisplayList) : + FTGlyph(new FTExtrudeGlyphImpl(glyph, depth, frontOutset, backOutset, + useDisplayList)) +{} + + +FTExtrudeGlyph::~FTExtrudeGlyph() +{} + + +const FTPoint& FTExtrudeGlyph::Render(const FTPoint& pen, int renderMode) +{ + FTExtrudeGlyphImpl *myimpl = dynamic_cast<FTExtrudeGlyphImpl *>(impl); + return myimpl->RenderImpl(pen, renderMode); +} + + +// +// FTGLExtrudeGlyphImpl +// + + +FTExtrudeGlyphImpl::FTExtrudeGlyphImpl(FT_GlyphSlot glyph, float _depth, + float _frontOutset, float _backOutset, + bool useDisplayList) +: FTGlyphImpl(glyph), + vectoriser(0), + glList(0) +{ + bBox.SetDepth(-_depth); + + if(ft_glyph_format_outline != glyph->format) + { + err = 0x14; // Invalid_Outline + return; + } + + vectoriser = new FTVectoriser(glyph); + + if((vectoriser->ContourCount() < 1) || (vectoriser->PointCount() < 3)) + { + delete vectoriser; + vectoriser = NULL; + return; + } + + hscale = glyph->face->size->metrics.x_ppem * 64; + vscale = glyph->face->size->metrics.y_ppem * 64; + depth = _depth; + frontOutset = _frontOutset; + backOutset = _backOutset; + + if(useDisplayList) + { + glList = glGenLists(3); + + /* Front face */ + glNewList(glList + 0, GL_COMPILE); + RenderFront(); + glEndList(); + + /* Back face */ + glNewList(glList + 1, GL_COMPILE); + RenderBack(); + glEndList(); + + /* Side face */ + glNewList(glList + 2, GL_COMPILE); + RenderSide(); + glEndList(); + + delete vectoriser; + vectoriser = NULL; + } +} + + +FTExtrudeGlyphImpl::~FTExtrudeGlyphImpl() +{ + if(glList) + { + glDeleteLists(glList, 3); + } + else if(vectoriser) + { + delete vectoriser; + } +} + + +const FTPoint& FTExtrudeGlyphImpl::RenderImpl(const FTPoint& pen, + int renderMode) +{ + glTranslatef(pen.Xf(), pen.Yf(), pen.Zf()); + if(glList) + { + if(renderMode & FTGL::RENDER_FRONT) + glCallList(glList + 0); + if(renderMode & FTGL::RENDER_BACK) + glCallList(glList + 1); + if(renderMode & FTGL::RENDER_SIDE) + glCallList(glList + 2); + } + else if(vectoriser) + { + if(renderMode & FTGL::RENDER_FRONT) + RenderFront(); + if(renderMode & FTGL::RENDER_BACK) + RenderBack(); + if(renderMode & FTGL::RENDER_SIDE) + RenderSide(); + } + glTranslatef(-pen.Xf(), -pen.Yf(), -pen.Zf()); + + return advance; +} + + +void FTExtrudeGlyphImpl::RenderFront() +{ + vectoriser->MakeMesh(1.0, 1, frontOutset); + glNormal3d(0.0, 0.0, 1.0); + + const FTMesh *mesh = vectoriser->GetMesh(); + for(unsigned int j = 0; j < mesh->TesselationCount(); ++j) + { + const FTTesselation* subMesh = mesh->Tesselation(j); + unsigned int polygonType = subMesh->PolygonType(); + + glBegin(polygonType); + for(unsigned int i = 0; i < subMesh->PointCount(); ++i) + { + FTPoint pt = subMesh->Point(i); + + glTexCoord2f(pt.Xf() / hscale, + pt.Yf() / vscale); + + glVertex3f(pt.Xf() / 64.0f, + pt.Yf() / 64.0f, + 0.0f); + } + glEnd(); + } +} + + +void FTExtrudeGlyphImpl::RenderBack() +{ + vectoriser->MakeMesh(-1.0, 2, backOutset); + glNormal3d(0.0, 0.0, -1.0); + + const FTMesh *mesh = vectoriser->GetMesh(); + for(unsigned int j = 0; j < mesh->TesselationCount(); ++j) + { + const FTTesselation* subMesh = mesh->Tesselation(j); + unsigned int polygonType = subMesh->PolygonType(); + + glBegin(polygonType); + for(unsigned int i = 0; i < subMesh->PointCount(); ++i) + { + FTPoint pt = subMesh->Point(i); + + glTexCoord2f(subMesh->Point(i).Xf() / hscale, + subMesh->Point(i).Yf() / vscale); + + glVertex3f(subMesh->Point(i).Xf() / 64.0f, + subMesh->Point(i).Yf() / 64.0f, + -depth); + } + glEnd(); + } +} + + +void FTExtrudeGlyphImpl::RenderSide() +{ + int contourFlag = vectoriser->ContourFlag(); + + for(size_t c = 0; c < vectoriser->ContourCount(); ++c) + { + const FTContour* contour = vectoriser->Contour(c); + size_t n = contour->PointCount(); + + if(n < 2) + { + continue; + } + + glBegin(GL_QUAD_STRIP); + for(size_t j = 0; j <= n; ++j) + { + size_t cur = (j == n) ? 0 : j; + size_t next = (cur == n - 1) ? 0 : cur + 1; + + FTPoint frontPt = contour->FrontPoint(cur); + FTPoint nextPt = contour->FrontPoint(next); + FTPoint backPt = contour->BackPoint(cur); + + FTPoint normal = FTPoint(0.f, 0.f, 1.f) ^ (frontPt - nextPt); + if(normal != FTPoint(0.0f, 0.0f, 0.0f)) + { + glNormal3dv(static_cast<const FTGL_DOUBLE*>(normal.Normalise())); + } + + glTexCoord2f(frontPt.Xf() / hscale, frontPt.Yf() / vscale); + + if(contourFlag & ft_outline_reverse_fill) + { + glVertex3f(backPt.Xf() / 64.0f, backPt.Yf() / 64.0f, 0.0f); + glVertex3f(frontPt.Xf() / 64.0f, frontPt.Yf() / 64.0f, -depth); + } + else + { + glVertex3f(backPt.Xf() / 64.0f, backPt.Yf() / 64.0f, -depth); + glVertex3f(frontPt.Xf() / 64.0f, frontPt.Yf() / 64.0f, 0.0f); + } + } + glEnd(); + } +} + diff --git a/src/ftgl/FTGlyph/FTExtrudeGlyphImpl.h b/src/ftgl/FTGlyph/FTExtrudeGlyphImpl.h new file mode 100644 index 0000000..7c547c7 --- /dev/null +++ b/src/ftgl/FTGlyph/FTExtrudeGlyphImpl.h @@ -0,0 +1,69 @@ +/* + * 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 __FTExtrudeGlyphImpl__ +#define __FTExtrudeGlyphImpl__ + +#include "FTGlyphImpl.h" + +class FTVectoriser; + +class FTExtrudeGlyphImpl : public FTGlyphImpl +{ + friend class FTExtrudeGlyph; + + protected: + FTExtrudeGlyphImpl(FT_GlyphSlot glyph, float depth, float frontOutset, + float backOutset, bool useDisplayList); + + virtual ~FTExtrudeGlyphImpl(); + + virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); + + private: + /** + * Private rendering methods. + */ + void RenderFront(); + void RenderBack(); + void RenderSide(); + + /** + * Private rendering variables. + */ + unsigned int hscale, vscale; + float depth; + float frontOutset, backOutset; + FTVectoriser *vectoriser; + + /** + * OpenGL display list + */ + GLuint glList; +}; + +#endif // __FTExtrudeGlyphImpl__ + diff --git a/src/ftgl/FTGlyph/FTGlyph.cpp b/src/ftgl/FTGlyph/FTGlyph.cpp new file mode 100644 index 0000000..4d3dff6 --- /dev/null +++ b/src/ftgl/FTGlyph/FTGlyph.cpp @@ -0,0 +1,112 @@ +/* + * 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 "FTGlyphImpl.h" + + +// +// FTGlyph +// + + +FTGlyph::FTGlyph(FT_GlyphSlot glyph) +{ + impl = new FTGlyphImpl(glyph); +} + + +FTGlyph::FTGlyph(FTGlyphImpl *pImpl) +{ + impl = pImpl; +} + + +FTGlyph::~FTGlyph() +{ + delete impl; +} + + +float FTGlyph::Advance() const +{ + return impl->Advance(); +} + + +const FTBBox& FTGlyph::BBox() const +{ + return impl->BBox(); +} + + +FT_Error FTGlyph::Error() const +{ + return impl->Error(); +} + + +// +// FTGlyphImpl +// + + +FTGlyphImpl::FTGlyphImpl(FT_GlyphSlot glyph, bool useList) : err(0) +{ + if(glyph) + { + bBox = FTBBox(glyph); + advance = FTPoint(glyph->advance.x / 64.0f, + glyph->advance.y / 64.0f); + } +} + + +FTGlyphImpl::~FTGlyphImpl() +{} + + +float FTGlyphImpl::Advance() const +{ + return advance.Xf(); +} + + +const FTBBox& FTGlyphImpl::BBox() const +{ + return bBox; +} + + +FT_Error FTGlyphImpl::Error() const +{ + return err; +} + diff --git a/src/ftgl/FTGlyph/FTGlyphGlue.cpp b/src/ftgl/FTGlyph/FTGlyphGlue.cpp new file mode 100644 index 0000000..0fbbc01 --- /dev/null +++ b/src/ftgl/FTGlyph/FTGlyphGlue.cpp @@ -0,0 +1,198 @@ +/* + * 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" + +static const FTPoint static_ftpoint; +static const FTBBox static_ftbbox; + +FTGL_BEGIN_C_DECLS + +#define C_TOR(cname, cargs, cxxname, cxxarg, cxxtype) \ + FTGLglyph* cname cargs \ + { \ + cxxname *g = new cxxname cxxarg; \ + if(g->Error()) \ + { \ + delete g; \ + return NULL; \ + } \ + FTGLglyph *ftgl = (FTGLglyph *)malloc(sizeof(FTGLglyph)); \ + ftgl->ptr = g; \ + ftgl->type = cxxtype; \ + return ftgl; \ + } + +// FTBitmapGlyph::FTBitmapGlyph(); +C_TOR(ftglCreateBitmapGlyph, (FT_GlyphSlot glyph), + FTBitmapGlyph, (glyph), GLYPH_BITMAP); + +// FTBufferGlyph::FTBufferGlyph(); +// FIXME: not implemented + +// FTExtrudeGlyph::FTExtrudeGlyph(); +C_TOR(ftglCreateExtrudeGlyph, (FT_GlyphSlot glyph, float depth, + float frontOutset, float backOutset, int useDisplayList), + FTExtrudeGlyph, (glyph, depth, frontOutset, backOutset, (useDisplayList != 0)), + GLYPH_EXTRUDE); + +// FTOutlineGlyph::FTOutlineGlyph(); +C_TOR(ftglCreateOutlineGlyph, (FT_GlyphSlot glyph, float outset, + int useDisplayList), + FTOutlineGlyph, (glyph, outset, (useDisplayList != 0)), GLYPH_OUTLINE); + +// FTPixmapGlyph::FTPixmapGlyph(); +C_TOR(ftglCreatePixmapGlyph, (FT_GlyphSlot glyph), + FTPixmapGlyph, (glyph), GLYPH_PIXMAP); + +// FTPolygonGlyph::FTPolygonGlyph(); +C_TOR(ftglCreatePolygonGlyph, (FT_GlyphSlot glyph, float outset, + int useDisplayList), + FTPolygonGlyph, (glyph, outset, (useDisplayList != 0)), GLYPH_POLYGON); + +// FTTextureGlyph::FTTextureGlyph(); +C_TOR(ftglCreateTextureGlyph, (FT_GlyphSlot glyph, int id, int xOffset, + int yOffset, int width, int height), + FTTextureGlyph, (glyph, id, xOffset, yOffset, width, height), + GLYPH_TEXTURE); + +// FTCustomGlyph::FTCustomGlyph(); +class FTCustomGlyph : public FTGlyph +{ +public: + FTCustomGlyph(FTGLglyph *base, void *p, + void (*render) (FTGLglyph *, void *, FTGL_DOUBLE, FTGL_DOUBLE, + int, FTGL_DOUBLE *, FTGL_DOUBLE *), + void (*destroy) (FTGLglyph *, void *)) + : FTGlyph((FT_GlyphSlot)0), + baseGlyph(base), + data(p), + renderCallback(render), + destroyCallback(destroy) + {} + + ~FTCustomGlyph() + { + destroyCallback(baseGlyph, data); + } + + float Advance() const { return baseGlyph->ptr->Advance(); } + + const FTPoint& Render(const FTPoint& pen, int renderMode) + { + FTGL_DOUBLE advancex, advancey; + renderCallback(baseGlyph, data, pen.X(), pen.Y(), renderMode, + &advancex, &advancey); + advance = FTPoint(advancex, advancey); + return advance; + } + + const FTBBox& BBox() const { return baseGlyph->ptr->BBox(); } + + FT_Error Error() const { return baseGlyph->ptr->Error(); } + +private: + FTPoint advance; + FTGLglyph *baseGlyph; + void *data; + void (*renderCallback) (FTGLglyph *, void *, FTGL_DOUBLE, FTGL_DOUBLE, + int, FTGL_DOUBLE *, FTGL_DOUBLE *); + void (*destroyCallback) (FTGLglyph *, void *); +}; + +C_TOR(ftglCreateCustomGlyph, (FTGLglyph *base, void *data, + void (*renderCallback) (FTGLglyph *, void *, FTGL_DOUBLE, FTGL_DOUBLE, + int, FTGL_DOUBLE *, FTGL_DOUBLE *), + void (*destroyCallback) (FTGLglyph *, void *)), + FTCustomGlyph, (base, data, renderCallback, destroyCallback), + GLYPH_CUSTOM); + +#define C_FUN(cret, cname, cargs, cxxerr, cxxname, cxxarg) \ + cret cname cargs \ + { \ + if(!g || !g->ptr) \ + { \ + fprintf(stderr, "FTGL warning: NULL pointer in %s\n", #cname); \ + cxxerr; \ + } \ + return g->ptr->cxxname cxxarg; \ + } + +// FTGlyph::~FTGlyph(); +void ftglDestroyGlyph(FTGLglyph *g) +{ + if(!g || !g->ptr) + { + fprintf(stderr, "FTGL warning: NULL pointer in %s\n", __FUNCTION__); + return; + } + delete g->ptr; + free(g); +} + +// const FTPoint& FTGlyph::Render(const FTPoint& pen, int renderMode); +extern "C++" { +C_FUN(static const FTPoint&, _ftglRenderGlyph, (FTGLglyph *g, + const FTPoint& pen, int renderMode), + return static_ftpoint, Render, (pen, renderMode)); +} + +void ftglRenderGlyph(FTGLglyph *g, FTGL_DOUBLE penx, FTGL_DOUBLE peny, + int renderMode, FTGL_DOUBLE *advancex, + FTGL_DOUBLE *advancey) +{ + FTPoint pen(penx, peny); + FTPoint ret = _ftglRenderGlyph(g, pen, renderMode); + *advancex = ret.X(); + *advancey = ret.Y(); +} + +// float FTGlyph::Advance() const; +C_FUN(float, ftglGetGlyphAdvance, (FTGLglyph *g), return 0.0, Advance, ()); + +// const FTBBox& FTGlyph::BBox() const; +extern "C++" { +C_FUN(static const FTBBox&, _ftglGetGlyphBBox, (FTGLglyph *g), + return static_ftbbox, BBox, ()); +} + +void ftglGetGlyphBBox(FTGLglyph *g, float bounds[6]) +{ + FTBBox ret = _ftglGetGlyphBBox(g); + FTPoint lower = ret.Lower(), upper = ret.Upper(); + bounds[0] = lower.Xf(); bounds[1] = lower.Yf(); bounds[2] = lower.Zf(); + bounds[3] = upper.Xf(); bounds[4] = upper.Yf(); bounds[5] = upper.Zf(); +} + +// FT_Error FTGlyph::Error() const; +C_FUN(FT_Error, ftglGetGlyphError, (FTGLglyph *g), return -1, Error, ()); + +FTGL_END_C_DECLS + diff --git a/src/ftgl/FTGlyph/FTGlyphImpl.h b/src/ftgl/FTGlyph/FTGlyphImpl.h new file mode 100644 index 0000000..37ea96f --- /dev/null +++ b/src/ftgl/FTGlyph/FTGlyphImpl.h @@ -0,0 +1,64 @@ +/* + * 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 __FTGlyphImpl__ +#define __FTGlyphImpl__ + +#include "FTGL/ftgl.h" + +class FTGlyphImpl +{ + friend class FTGlyph; + + protected: + FTGlyphImpl(FT_GlyphSlot glyph, bool useDisplayList = true); + + virtual ~FTGlyphImpl(); + + float Advance() const; + + const FTBBox& BBox() const; + + FT_Error Error() const; + + /** + * The advance distance for this glyph + */ + FTPoint advance; + + /** + * The bounding box of this glyph. + */ + FTBBox bBox; + + /** + * Current error code. Zero means no error. + */ + FT_Error err; +}; + +#endif // __FTGlyphImpl__ + diff --git a/src/ftgl/FTGlyph/FTOutlineGlyph.cpp b/src/ftgl/FTGlyph/FTOutlineGlyph.cpp new file mode 100644 index 0000000..48e11f7 --- /dev/null +++ b/src/ftgl/FTGlyph/FTOutlineGlyph.cpp @@ -0,0 +1,149 @@ +/* + * 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 "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTOutlineGlyphImpl.h" +#include "FTVectoriser.h" + + +// +// FTGLOutlineGlyph +// + + +FTOutlineGlyph::FTOutlineGlyph(FT_GlyphSlot glyph, float outset, + bool useDisplayList) : + FTGlyph(new FTOutlineGlyphImpl(glyph, outset, useDisplayList)) +{} + + +FTOutlineGlyph::~FTOutlineGlyph() +{} + + +const FTPoint& FTOutlineGlyph::Render(const FTPoint& pen, int renderMode) +{ + FTOutlineGlyphImpl *myimpl = dynamic_cast<FTOutlineGlyphImpl *>(impl); + return myimpl->RenderImpl(pen, renderMode); +} + + +// +// FTGLOutlineGlyphImpl +// + + +FTOutlineGlyphImpl::FTOutlineGlyphImpl(FT_GlyphSlot glyph, float _outset, + bool useDisplayList) +: FTGlyphImpl(glyph), + glList(0) +{ + if(ft_glyph_format_outline != glyph->format) + { + err = 0x14; // Invalid_Outline + return; + } + + vectoriser = new FTVectoriser(glyph); + + if((vectoriser->ContourCount() < 1) || (vectoriser->PointCount() < 3)) + { + delete vectoriser; + vectoriser = NULL; + return; + } + + outset = _outset; + + if(useDisplayList) + { + glList = glGenLists(1); + glNewList(glList, GL_COMPILE); + + DoRender(); + + glEndList(); + + delete vectoriser; + vectoriser = NULL; + } +} + + +FTOutlineGlyphImpl::~FTOutlineGlyphImpl() +{ + if(glList) + { + glDeleteLists(glList, 1); + } + else if(vectoriser) + { + delete vectoriser; + } +} + + +const FTPoint& FTOutlineGlyphImpl::RenderImpl(const FTPoint& pen, + int renderMode) +{ + glTranslatef(pen.Xf(), pen.Yf(), pen.Zf()); + if(glList) + { + glCallList(glList); + } + else if(vectoriser) + { + DoRender(); + } + glTranslatef(-pen.Xf(), -pen.Yf(), -pen.Zf()); + + return advance; +} + + +void FTOutlineGlyphImpl::DoRender() +{ + for(unsigned int c = 0; c < vectoriser->ContourCount(); ++c) + { + const FTContour* contour = vectoriser->Contour(c); + + glBegin(GL_LINE_LOOP); + for(unsigned int i = 0; i < contour->PointCount(); ++i) + { + FTPoint point = FTPoint(contour->Point(i).X() + contour->Outset(i).X() * outset, + contour->Point(i).Y() + contour->Outset(i).Y() * outset, + 0); + glVertex2f(point.Xf() / 64.0f, point.Yf() / 64.0f); + } + glEnd(); + } +} + diff --git a/src/ftgl/FTGlyph/FTOutlineGlyphImpl.h b/src/ftgl/FTGlyph/FTOutlineGlyphImpl.h new file mode 100644 index 0000000..ead4b12 --- /dev/null +++ b/src/ftgl/FTGlyph/FTOutlineGlyphImpl.h @@ -0,0 +1,69 @@ +/* + * 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 __FTOutlineGlyphImpl__ +#define __FTOutlineGlyphImpl__ + +#include "FTGlyphImpl.h" + +class FTVectoriser; + +class FTOutlineGlyphImpl : public FTGlyphImpl +{ + friend class FTOutlineGlyph; + + protected: + FTOutlineGlyphImpl(FT_GlyphSlot glyph, float outset, + bool useDisplayList); + + virtual ~FTOutlineGlyphImpl(); + + virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); + + private: + /** + * Private rendering method. + */ + void DoRender(); + + /** + * Private rendering variables. + */ + FTVectoriser *vectoriser; + + /** + * Private rendering variables. + */ + float outset; + + /** + * OpenGL display list + */ + GLuint glList; +}; + +#endif // __FTOutlineGlyphImpl__ + diff --git a/src/ftgl/FTGlyph/FTPixmapGlyph.cpp b/src/ftgl/FTGlyph/FTPixmapGlyph.cpp new file mode 100644 index 0000000..5301e43 --- /dev/null +++ b/src/ftgl/FTGlyph/FTPixmapGlyph.cpp @@ -0,0 +1,139 @@ +/* + * 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 <math.h> + +#include "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTPixmapGlyphImpl.h" + + +// +// FTGLPixmapGlyph +// + + +FTPixmapGlyph::FTPixmapGlyph(FT_GlyphSlot glyph) : + FTGlyph(new FTPixmapGlyphImpl(glyph)) +{} + + +FTPixmapGlyph::~FTPixmapGlyph() +{} + + +const FTPoint& FTPixmapGlyph::Render(const FTPoint& pen, int renderMode) +{ + FTPixmapGlyphImpl *myimpl = dynamic_cast<FTPixmapGlyphImpl *>(impl); + return myimpl->RenderImpl(pen, renderMode); +} + + +// +// FTGLPixmapGlyphImpl +// + + +FTPixmapGlyphImpl::FTPixmapGlyphImpl(FT_GlyphSlot glyph) +: FTGlyphImpl(glyph), + destWidth(0), + destHeight(0), + data(0) +{ + err = FT_Render_Glyph(glyph, FT_RENDER_MODE_NORMAL); + if(err || ft_glyph_format_bitmap != glyph->format) + { + return; + } + + FT_Bitmap bitmap = glyph->bitmap; + + //check the pixel mode + //ft_pixel_mode_grays + + int srcWidth = bitmap.width; + int srcHeight = bitmap.rows; + + destWidth = srcWidth; + destHeight = srcHeight; + + if(destWidth && destHeight) + { + data = new unsigned char[destWidth * destHeight * 2]; + unsigned char* src = bitmap.buffer; + + unsigned char* dest = data + ((destHeight - 1) * destWidth * 2); + size_t destStep = destWidth * 2 * 2; + + for(int y = 0; y < srcHeight; ++y) + { + for(int x = 0; x < srcWidth; ++x) + { + *dest++ = static_cast<unsigned char>(255); + *dest++ = *src++; + } + dest -= destStep; + } + + destHeight = srcHeight; + } + + pos.X(glyph->bitmap_left); + pos.Y(srcHeight - glyph->bitmap_top); +} + + +FTPixmapGlyphImpl::~FTPixmapGlyphImpl() +{ + delete [] data; +} + + +const FTPoint& FTPixmapGlyphImpl::RenderImpl(const FTPoint& pen, + int renderMode) +{ + if(data) + { + float dx, dy; + + dx = floor(pen.Xf() + pos.Xf()); + dy = floor(pen.Yf() - pos.Yf()); + + glBitmap(0, 0, 0.0f, 0.0f, dx, dy, (const GLubyte*)0); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_ALIGNMENT, 2); + + glDrawPixels(destWidth, destHeight, GL_LUMINANCE_ALPHA, + GL_UNSIGNED_BYTE, (const GLvoid*)data); + glBitmap(0, 0, 0.0f, 0.0f, -dx, -dy, (const GLubyte*)0); + } + + return advance; +} + diff --git a/src/ftgl/FTGlyph/FTPixmapGlyphImpl.h b/src/ftgl/FTGlyph/FTPixmapGlyphImpl.h new file mode 100644 index 0000000..8331469 --- /dev/null +++ b/src/ftgl/FTGlyph/FTPixmapGlyphImpl.h @@ -0,0 +1,67 @@ +/* + * 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 __FTPixmapGlyphImpl__ +#define __FTPixmapGlyphImpl__ + +#include "FTGlyphImpl.h" + +class FTPixmapGlyphImpl : public FTGlyphImpl +{ + friend class FTPixmapGlyph; + + protected: + FTPixmapGlyphImpl(FT_GlyphSlot glyph); + + virtual ~FTPixmapGlyphImpl(); + + virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); + + private: + /** + * The width of the glyph 'image' + */ + int destWidth; + + /** + * The height of the glyph 'image' + */ + int destHeight; + + /** + * Vector from the pen position to the topleft corner of the pixmap + */ + FTPoint pos; + + /** + * Pointer to the 'image' data + */ + unsigned char* data; + +}; + +#endif // __FTPixmapGlyphImpl__ + diff --git a/src/ftgl/FTGlyph/FTPolygonGlyph.cpp b/src/ftgl/FTGlyph/FTPolygonGlyph.cpp new file mode 100644 index 0000000..6db3581 --- /dev/null +++ b/src/ftgl/FTGlyph/FTPolygonGlyph.cpp @@ -0,0 +1,156 @@ +/* + * 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 "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTPolygonGlyphImpl.h" +#include "FTVectoriser.h" + + +// +// FTGLPolyGlyph +// + + +FTPolygonGlyph::FTPolygonGlyph(FT_GlyphSlot glyph, float outset, + bool useDisplayList) : + FTGlyph(new FTPolygonGlyphImpl(glyph, outset, useDisplayList)) +{} + + +FTPolygonGlyph::~FTPolygonGlyph() +{} + + +const FTPoint& FTPolygonGlyph::Render(const FTPoint& pen, int renderMode) +{ + FTPolygonGlyphImpl *myimpl = dynamic_cast<FTPolygonGlyphImpl *>(impl); + return myimpl->RenderImpl(pen, renderMode); +} + + +// +// FTGLPolyGlyphImpl +// + + +FTPolygonGlyphImpl::FTPolygonGlyphImpl(FT_GlyphSlot glyph, float _outset, + bool useDisplayList) +: FTGlyphImpl(glyph), + glList(0) +{ + if(ft_glyph_format_outline != glyph->format) + { + err = 0x14; // Invalid_Outline + return; + } + + vectoriser = new FTVectoriser(glyph); + + if((vectoriser->ContourCount() < 1) || (vectoriser->PointCount() < 3)) + { + delete vectoriser; + vectoriser = NULL; + return; + } + + + hscale = glyph->face->size->metrics.x_ppem * 64; + vscale = glyph->face->size->metrics.y_ppem * 64; + outset = _outset; + + if(useDisplayList) + { + glList = glGenLists(1); + glNewList(glList, GL_COMPILE); + + DoRender(); + + glEndList(); + + delete vectoriser; + vectoriser = NULL; + } +} + + +FTPolygonGlyphImpl::~FTPolygonGlyphImpl() +{ + if(glList) + { + glDeleteLists(glList, 1); + } + else if(vectoriser) + { + delete vectoriser; + } +} + + +const FTPoint& FTPolygonGlyphImpl::RenderImpl(const FTPoint& pen, + int renderMode) +{ + glTranslatef(pen.Xf(), pen.Yf(), pen.Zf()); + if(glList) + { + glCallList(glList); + } + else if(vectoriser) + { + DoRender(); + } + glTranslatef(-pen.Xf(), -pen.Yf(), -pen.Zf()); + + return advance; +} + + +void FTPolygonGlyphImpl::DoRender() +{ + vectoriser->MakeMesh(1.0, 1, outset); + + const FTMesh *mesh = vectoriser->GetMesh(); + + for(unsigned int t = 0; t < mesh->TesselationCount(); ++t) + { + const FTTesselation* subMesh = mesh->Tesselation(t); + unsigned int polygonType = subMesh->PolygonType(); + + glBegin(polygonType); + for(unsigned int i = 0; i < subMesh->PointCount(); ++i) + { + FTPoint point = subMesh->Point(i); + glTexCoord2f(point.Xf() / hscale, point.Yf() / vscale); + glVertex3f(point.Xf() / 64.0f, point.Yf() / 64.0f, 0.0f); + } + glEnd(); + } +} + diff --git a/src/ftgl/FTGlyph/FTPolygonGlyphImpl.h b/src/ftgl/FTGlyph/FTPolygonGlyphImpl.h new file mode 100644 index 0000000..e353391 --- /dev/null +++ b/src/ftgl/FTGlyph/FTPolygonGlyphImpl.h @@ -0,0 +1,66 @@ +/* + * 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 __FTPolygonGlyphImpl__ +#define __FTPolygonGlyphImpl__ + +#include "FTGlyphImpl.h" + +class FTVectoriser; + +class FTPolygonGlyphImpl : public FTGlyphImpl +{ + friend class FTPolygonGlyph; + + public: + FTPolygonGlyphImpl(FT_GlyphSlot glyph, float outset, + bool useDisplayList); + + virtual ~FTPolygonGlyphImpl(); + + virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); + + private: + /** + * Private rendering method. + */ + void DoRender(); + + /** + * Private rendering variables. + */ + unsigned int hscale, vscale; + FTVectoriser *vectoriser; + float outset; + + /** + * OpenGL display list + */ + GLuint glList; +}; + +#endif // __FTPolygonGlyphImpl__ + diff --git a/src/ftgl/FTGlyph/FTTextureGlyph.cpp b/src/ftgl/FTGlyph/FTTextureGlyph.cpp new file mode 100644 index 0000000..a9cf2e8 --- /dev/null +++ b/src/ftgl/FTGlyph/FTTextureGlyph.cpp @@ -0,0 +1,153 @@ +/* + * 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 <math.h> + +#include "FTGL/ftgl.h" + +#include "FTInternals.h" +#include "FTTextureGlyphImpl.h" + + +// +// FTGLTextureGlyph +// + + +FTTextureGlyph::FTTextureGlyph(FT_GlyphSlot glyph, int id, int xOffset, + int yOffset, int width, int height) : + FTGlyph(new FTTextureGlyphImpl(glyph, id, xOffset, yOffset, width, height)) +{} + + +FTTextureGlyph::~FTTextureGlyph() +{} + + +const FTPoint& FTTextureGlyph::Render(const FTPoint& pen, int renderMode) +{ + FTTextureGlyphImpl *myimpl = dynamic_cast<FTTextureGlyphImpl *>(impl); + return myimpl->RenderImpl(pen, renderMode); +} + + +// +// FTGLTextureGlyphImpl +// + + +GLint FTTextureGlyphImpl::activeTextureID = 0; + +FTTextureGlyphImpl::FTTextureGlyphImpl(FT_GlyphSlot glyph, int id, int xOffset, + int yOffset, int width, int height) +: FTGlyphImpl(glyph), + destWidth(0), + destHeight(0), + glTextureID(id) +{ + /* FIXME: need to propagate the render mode all the way down to + * here in order to get FT_RENDER_MODE_MONO aliased fonts. + */ + + err = FT_Render_Glyph(glyph, FT_RENDER_MODE_NORMAL); + if(err || glyph->format != ft_glyph_format_bitmap) + { + return; + } + + FT_Bitmap bitmap = glyph->bitmap; + + destWidth = bitmap.width; + destHeight = bitmap.rows; + + if(destWidth && destHeight) + { + glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); + glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + glBindTexture(GL_TEXTURE_2D, glTextureID); + glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, destWidth, destHeight, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap.buffer); + + glPopClientAttrib(); + } + + +// 0 +// +----+ +// | | +// | | +// | | +// +----+ +// 1 + + uv[0].X(static_cast<float>(xOffset) / static_cast<float>(width)); + uv[0].Y(static_cast<float>(yOffset) / static_cast<float>(height)); + uv[1].X(static_cast<float>(xOffset + destWidth) / static_cast<float>(width)); + uv[1].Y(static_cast<float>(yOffset + destHeight) / static_cast<float>(height)); + + corner = FTPoint(glyph->bitmap_left, glyph->bitmap_top); +} + + +FTTextureGlyphImpl::~FTTextureGlyphImpl() +{} + + +const FTPoint& FTTextureGlyphImpl::RenderImpl(const FTPoint& pen, + int renderMode) +{ + float dx, dy; + + if(activeTextureID != glTextureID) + { + glBindTexture(GL_TEXTURE_2D, (GLuint)glTextureID); + activeTextureID = glTextureID; + } + + dx = floor(pen.Xf() + corner.Xf()); + dy = floor(pen.Yf() + corner.Yf()); + + glBegin(GL_QUADS); + glTexCoord2f(uv[0].Xf(), uv[0].Yf()); + glVertex2f(dx, dy); + + glTexCoord2f(uv[0].Xf(), uv[1].Yf()); + glVertex2f(dx, dy - destHeight); + + glTexCoord2f(uv[1].Xf(), uv[1].Yf()); + glVertex2f(dx + destWidth, dy - destHeight); + + glTexCoord2f(uv[1].Xf(), uv[0].Yf()); + glVertex2f(dx + destWidth, dy); + glEnd(); + + return advance; +} + diff --git a/src/ftgl/FTGlyph/FTTextureGlyphImpl.h b/src/ftgl/FTGlyph/FTTextureGlyphImpl.h new file mode 100644 index 0000000..793af04 --- /dev/null +++ b/src/ftgl/FTGlyph/FTTextureGlyphImpl.h @@ -0,0 +1,88 @@ +/* + * 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 __FTTextureGlyphImpl__ +#define __FTTextureGlyphImpl__ + +#include "FTGlyphImpl.h" + +class FTTextureGlyphImpl : public FTGlyphImpl +{ + friend class FTTextureGlyph; + friend class FTTextureFontImpl; + + protected: + FTTextureGlyphImpl(FT_GlyphSlot glyph, int id, int xOffset, + int yOffset, int width, int height); + + virtual ~FTTextureGlyphImpl(); + + virtual const FTPoint& RenderImpl(const FTPoint& pen, int renderMode); + + private: + /** + * Reset the currently active texture to zero to get into a known + * state before drawing a string. This is to get round possible + * threading issues. + */ + static void ResetActiveTexture() { activeTextureID = 0; } + + /** + * The width of the glyph 'image' + */ + int destWidth; + + /** + * The height of the glyph 'image' + */ + int destHeight; + + /** + * Vector from the pen position to the topleft corner of the pixmap + */ + FTPoint corner; + + /** + * The texture co-ords of this glyph within the texture. + */ + FTPoint uv[2]; + + /** + * The texture index that this glyph is contained in. + */ + int glTextureID; + + /** + * The texture index of the currently active texture + * + * We keep track of the currently active texture to try to reduce the + * number of texture bind operations. + */ + static GLint activeTextureID; +}; + +#endif // __FTTextureGlyphImpl__ + |