diff --git a/platform/msvc2008/love.vcproj b/platform/msvc2008/love.vcproj index 95acd0382..afa6061ac 100644 --- a/platform/msvc2008/love.vcproj +++ b/platform/msvc2008/love.vcproj @@ -3157,6 +3157,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#include +#include "Rasterizer.h" + +namespace love +{ +namespace font +{ + + /** + * The Font module is responsible for decoding font data. It is + * not responsible for drawing it. + **/ + class Font : public Module + { + public: + + /** + * Destructor. + **/ + virtual ~Font(); + + // Implement Module + const char * getName() const; + + }; // Font + +} // font +} // love + +#endif // LOVE_FONT_FONT_H \ No newline at end of file diff --git a/src/modules/font/GlyphData.cpp b/src/modules/font/GlyphData.cpp new file mode 100644 index 000000000..850444676 --- /dev/null +++ b/src/modules/font/GlyphData.cpp @@ -0,0 +1,94 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +#include "GlyphData.h" + +namespace love +{ +namespace font +{ + + GlyphData::GlyphData(wchar_t glyph, unsigned char * glyphData, GlyphMetrics glyphMetrics, int glyphBPP) + : glyph(glyph), data(glyphData), metrics(glyphMetrics), bpp(glyphBPP) + { + } + + GlyphData::~GlyphData() + { + delete[] data; + } + + void * GlyphData::getData() const + { + return (void *) data; + } + + int GlyphData::getSize() const + { + return getWidth() * getHeight() * bpp; + } + + int GlyphData::getHeight() const + { + return metrics.height; + } + + int GlyphData::getWidth() const + { + return metrics.width; + } + + int GlyphData::getAdvance() const + { + return metrics.advance; + } + + int GlyphData::getBearingX() const + { + return metrics.bearingX; + } + + int GlyphData::getBearingY() const + { + return metrics.bearingY; + } + + int GlyphData::getMinX() const + { + return this->getBearingX(); + } + + int GlyphData::getMinY() const + { + return this->getHeight() - this->getBearingY(); + } + + int GlyphData::getMaxX() const + { + return this->getBearingX() + this->getWidth(); + } + + int GlyphData::getMaxY() const + { + return this->getBearingY(); + } + +} // font +} // love diff --git a/src/modules/font/GlyphData.h b/src/modules/font/GlyphData.h new file mode 100644 index 000000000..c375c9510 --- /dev/null +++ b/src/modules/font/GlyphData.h @@ -0,0 +1,119 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +#ifndef LOVE_FONT_GLYPH_DATA_H +#define LOVE_FONT_GLYPH_DATA_H + +// LOVE +#include + +namespace love +{ +namespace font +{ + /** + * Holds the specific glyph data. + **/ + struct GlyphMetrics + { + int height; + int width; + int advance; + int bearingX; + int bearingY; + }; + + /** + * Holds data for a specic glyph object. + **/ + class GlyphData : public Data + { + private: + // The glyph itself + wchar_t glyph; + + // Glyph metrics + GlyphMetrics metrics; + + // Glyph texture data + unsigned char * data; + + // Bits Per Pixel + int bpp; + + public: + GlyphData(wchar_t glyph, unsigned char * glyphData, GlyphMetrics glyphMetrics, int glyphBPP); + virtual ~GlyphData(); + + // Implements Data. + void * getData() const; + int getSize() const; + + /** + * Gets the height of the glyph. + **/ + int getHeight() const; + + /** + * Gets the width of the glyph. + **/ + int getWidth() const; + + /** + * Gets the advance (the space the glyph takes up) of the glyph. + **/ + int getAdvance() const; + + /** + * Gets bearing (the spacing from origin) along the x-axis of the glyph. + **/ + int getBearingX() const; + + /** + * Gets bearing (the spacing from origin) along the y-axis of the glyph. + **/ + int getBearingY() const; + + /** + * Gets the min x value of the glyph. + **/ + int getMinX() const; + + /** + * Gets the min y value of the glyph. + **/ + int getMinY() const; + + /** + * Gets the max x value of the glyph. + **/ + int getMaxX() const; + + /** + * Gets the max y value of the glyph. + **/ + int getMaxY() const; + + }; // GlyphData + +} // font +} // love + +#endif // LOVE_FONT_GLYPH_DATA_H diff --git a/src/modules/font/ImageRasterizer.cpp b/src/modules/font/ImageRasterizer.cpp new file mode 100644 index 000000000..3bb455135 --- /dev/null +++ b/src/modules/font/ImageRasterizer.cpp @@ -0,0 +1,52 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +// LOVE +#include "ImageRasterizer.h" + +#include + +namespace love +{ +namespace font +{ + ImageRasterizer::ImageRasterizer(love::filesystem::File * file, wchar_t * glyphs) + : glyphs(glyphs) + { + //imageData = new ImageData(file); + } + + ImageRasterizer::~ImageRasterizer() + { + delete imageData; + } + + int ImageRasterizer::getLineHeight() const + { + return getHeight(); + } + + GlyphData * ImageRasterizer::getGlyphData(const wchar_t glyph) const + { + return 0; + } + +} // font +} // love \ No newline at end of file diff --git a/src/modules/font/ImageRasterizer.h b/src/modules/font/ImageRasterizer.h new file mode 100644 index 000000000..fa03d64d9 --- /dev/null +++ b/src/modules/font/ImageRasterizer.h @@ -0,0 +1,58 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +#ifndef LOVE_FONT_IMAGE_RASTERIZER_H +#define LOVE_FONT_IMAGE_RASTERIZER_H + +// LOVE +#include +#include +#include + +namespace love +{ +namespace font +{ + /** + * Holds data for a font object. + **/ + class ImageRasterizer : public Rasterizer + { + private: + // The image data + love::image::ImageData * imageData; + + // Glyphs + wchar_t * glyphs; + + public: + ImageRasterizer(love::filesystem::File * file, wchar_t * glyphs); + virtual ~ImageRasterizer(); + + // Implement FontData + virtual int getLineHeight() const; + virtual GlyphData * getGlyphData(const wchar_t glyph) const; + + }; // ImageRasterizer + +} // font +} // love + +#endif // LOVE_FONT_IMAGE_RASTERIZER_H \ No newline at end of file diff --git a/src/modules/font/Rasterizer.cpp b/src/modules/font/Rasterizer.cpp new file mode 100644 index 000000000..ca1bbda57 --- /dev/null +++ b/src/modules/font/Rasterizer.cpp @@ -0,0 +1,50 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +// LOVE +#include "Rasterizer.h" + +namespace love +{ +namespace font +{ + + int Rasterizer::getHeight() const + { + return metrics.height; + } + + int Rasterizer::getAdvance() const + { + return metrics.advance; + } + + int Rasterizer::getAscent() const + { + return metrics.ascent; + } + + int Rasterizer::getDescent() const + { + return metrics.descent; + } + +} // font +} // love \ No newline at end of file diff --git a/src/modules/font/Rasterizer.h b/src/modules/font/Rasterizer.h new file mode 100644 index 000000000..8208d898f --- /dev/null +++ b/src/modules/font/Rasterizer.h @@ -0,0 +1,89 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +#ifndef LOVE_FONT_RASTERIZER_H +#define LOVE_FONT_RASTERIZER_H + +// LOVE +#include +#include "GlyphData.h" + +namespace love +{ +namespace font +{ + /** + * Holds the specific font metrics. + **/ + struct FontMetrics + { + int advance ; + int ascent; + int descent; + int height; + }; + + /** + * Holds data for a font object. + **/ + class Rasterizer : public Object + { + protected: + FontMetrics metrics; + + public: + /** + * Gets the max height of the glyphs. + **/ + virtual int getHeight() const; + + /** + * Gets the max advance of the glyphs. + **/ + virtual int getAdvance() const; + + /** + * Gets the max ascent (height above baseline) for the font. + **/ + virtual int getAscent() const; + + /** + * Gets the max descent (height below baseline) for the font. + **/ + virtual int getDescent() const; + + /** + * Gets the line height of the font. + **/ + virtual int getLineHeight() const = 0; + + /** + * Gets a specific glyph. + * @param glyph The (UNICODE) glyph to get data for + **/ + virtual GlyphData * getGlyphData(const wchar_t glyph) const = 0; + + + }; // FontData + +} // font +} // love + +#endif // LOVE_FONT_RASTERIZER_H \ No newline at end of file diff --git a/src/modules/font/freetype/FreeTypeRasterizer.cpp b/src/modules/font/freetype/FreeTypeRasterizer.cpp new file mode 100644 index 000000000..aa08c886a --- /dev/null +++ b/src/modules/font/freetype/FreeTypeRasterizer.cpp @@ -0,0 +1,118 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +// LOVE +#include "FreeTypeRasterizer.h" + +#include + +namespace love +{ +namespace font +{ +namespace freetype +{ + inline int next_p2(int num) + { + int powered = 2; + while(powered < num) powered <<= 1; + return powered; + } + + FreeTypeRasterizer::FreeTypeRasterizer(love::filesystem::File * file, int size) + { + // Initialize + data = file->read(); + + if(FT_Init_FreeType(&library)) + throw love::Exception("TrueTypeFont Loading error: FT_Init_FreeType failed\n"); + + if(FT_New_Memory_Face( library, + (const FT_Byte *)data->getData(), /* first byte in memory */ + data->getSize(), /* size in bytes */ + 0, /* face_index */ + &face)) + throw love::Exception("TrueTypeFont Loading error: FT_New_Face failed (there is probably a problem with your font file)\n"); + + FT_Set_Pixel_Sizes(face, size, size); + + // Set global metrics + metrics.advance = face->max_advance_width; + metrics.ascent = face->ascender; + metrics.descent = face->descender; + metrics.height = face->height; + } + + FreeTypeRasterizer::~FreeTypeRasterizer() + { + FT_Done_Face(face); + FT_Done_FreeType(library); + data->release(); + } + + int FreeTypeRasterizer::getLineHeight() const + { + return (int)(getHeight() * 1.25); + } + + GlyphData * FreeTypeRasterizer::getGlyphData(const wchar_t glyph) const + { + unsigned char * textureData; + love::font::GlyphMetrics glyphMetrics; + int bpp = 2; + FT_Glyph ftglyph; + + // Initialize + if(FT_Load_Glyph(face, FT_Get_Char_Index(face, glyph), FT_LOAD_DEFAULT)) + throw love::Exception("TrueTypeFont Loading vm->error: FT_Load_Glyph failed\n"); + + if( FT_Get_Glyph(face->glyph, &ftglyph) ) + throw love::Exception("TrueTypeFont Loading vm->error: FT_Get_Glyph failed\n"); + + FT_Glyph_To_Bitmap(&ftglyph, FT_RENDER_MODE_NORMAL, 0, 1); + FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)ftglyph; + FT_Bitmap& bitmap = bitmap_glyph->bitmap; //just to make things easier + + // Get metrics + glyphMetrics.bearingX = face->glyph->metrics.horiBearingX; + glyphMetrics.bearingY = face->glyph->metrics.horiBearingY; + glyphMetrics.height = face->glyph->metrics.height; + glyphMetrics.width = face->glyph->metrics.width; + glyphMetrics.advance = face->glyph->advance.x >> 6; + + // Get texture + int w = next_p2(bitmap.width); + int h = next_p2(bitmap.rows); + textureData = new unsigned char[bpp * w * h]; + + for(int j = 0; j < h; j++) for(int i = 0; i < w; i++) + { + textureData[bpp * (i + j * w)] = 255; + textureData[bpp * (i + j * w) + 1] = (i >= bitmap.width || j >= bitmap.rows) ? 0 : bitmap.buffer[i + bitmap.width * j]; + } + + // Return data + GlyphData * glyphData = new GlyphData(glyph, textureData, glyphMetrics, bpp); + return glyphData; + } + +} // freetype +} // font +} // love \ No newline at end of file diff --git a/src/modules/font/freetype/FreeTypeRasterizer.h b/src/modules/font/freetype/FreeTypeRasterizer.h new file mode 100644 index 000000000..9f0769859 --- /dev/null +++ b/src/modules/font/freetype/FreeTypeRasterizer.h @@ -0,0 +1,71 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +#ifndef LOVE_FONT_FREE_TYPE_RASTERIZER_H +#define LOVE_FONT_FREE_TYPE_RASTERIZER_H + +// LOVE +#include +#include + +// FreeType2 +#include +#include +#include +#include +#include + +namespace love +{ +namespace font +{ +namespace freetype +{ + /** + * Holds data for a font object. + **/ + class FreeTypeRasterizer : public Rasterizer + { + private: + // FreeType library + FT_Library library; + + // FreeType face + FT_Face face; + + // File data + Data * data; + + + public: + FreeTypeRasterizer(love::filesystem::File * file, int size); + virtual ~FreeTypeRasterizer(); + + // Implement FontData + virtual int getLineHeight() const; + virtual GlyphData * getGlyphData(const wchar_t glyph) const; + + }; // FreetypeRasterizer + +} // freetype +} // font +} // love + +#endif // LOVE_FONT_FREE_TYPE_RASTERIZER_H \ No newline at end of file diff --git a/src/modules/font/wrap_Font.cpp b/src/modules/font/wrap_Font.cpp new file mode 100644 index 000000000..a0e7de904 --- /dev/null +++ b/src/modules/font/wrap_Font.cpp @@ -0,0 +1,67 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +#include "wrap_Font.h" + +namespace love +{ +namespace font +{ + static Font * instance = 0; + + int _wrap_test(lua_State * L) + { + lua_pushinteger(L, 696); + + return 1; + } + + // List of functions to wrap. + static const luaL_Reg wrap_Font_functions[] = { + { "test", _wrap_test }, + { 0, 0 } + }; + + static const lua_CFunction wrap_Font_types[] = { + _wrap_test, + 0 + }; + + int wrap_Font_open(lua_State * L) + { + if(instance == 0) + { + try + { + instance = new Font(); + } + catch(Exception & e) + { + return luaL_error(L, e.what()); + } + } + + luax_register_gc(L, "love.font", instance); + + return luax_register_module(L, wrap_Font_functions, wrap_Font_types); + } + +} // sound +} // love diff --git a/src/modules/font/wrap_Font.h b/src/modules/font/wrap_Font.h new file mode 100644 index 000000000..f41b4b43d --- /dev/null +++ b/src/modules/font/wrap_Font.h @@ -0,0 +1,38 @@ +/** +* Copyright (c) 2006-2009 LOVE Development Team +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +**/ + +#ifndef LOVE_FONT_WRAP_FONT_H +#define LOVE_FONT_WRAP_FONT_H + +// LOVE +#include "Font.h" +#include "wrap_Font.h" + +namespace love +{ +namespace font +{ + int _wrap_test(lua_State * L); + int wrap_Font_open(lua_State * L); + +} // font +} // love + +#endif // LOVE_SOUND_WRAP_FONT_H