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