::iterator i = this->fontData.begin(); i != this->fontData.end(); i++) {
+ free(i->second.glyphDataTexture);
+ }
+
+ this->fontData.clear();
+}
+
+void FreeTypeGX::changeSize(FT_UInt pointSize) {
+ this->unloadFont();
+ this->ftPointSize = pointSize;
+ FT_Set_Pixel_Sizes(this->ftFace, 0, this->ftPointSize);
+}
+
+/**
+ * Adjusts the texture data buffer to necessary width for a given texture format.
+ *
+ * This routine determines adjusts the given texture width into the required width to hold the necessary texture data for proper alignment.
+ *
+ * @param textureWidth The initial guess for the texture width.
+ * @param textureFormat The texture format to which the data is to be converted.
+ * @return The correctly adjusted texture width.
+ */
+uint16_t FreeTypeGX::adjustTextureWidth(uint16_t textureWidth, uint8_t textureFormat) {
+ uint16_t alignment;
+
+ switch(textureFormat) {
+ case GX_TF_I4: /* 8x8 Tiles - 4-bit Intensity */
+ case GX_TF_I8: /* 8x4 Tiles - 8-bit Intensity */
+ case GX_TF_IA4: /* 8x4 Tiles - 4-bit Intensity, , 4-bit Alpha */
+ alignment = 8;
+ break;
+
+ case GX_TF_IA8: /* 4x4 Tiles - 8-bit Intensity, 8-bit Alpha */
+ case GX_TF_RGB565: /* 4x4 Tiles - RGB565 Format */
+ case GX_TF_RGB5A3: /* 4x4 Tiles - RGB5A3 Format */
+ case GX_TF_RGBA8: /* 4x4 Tiles - RGBA8 Dual Cache Line Format */
+ default:
+ alignment = 4;
+ break;
+ }
+ return textureWidth % alignment == 0 ? textureWidth : alignment + textureWidth - (textureWidth % alignment);
+
+}
+
+/**
+ * Adjusts the texture data buffer to necessary height for a given texture format.
+ *
+ * This routine determines adjusts the given texture height into the required height to hold the necessary texture data for proper alignment.
+ *
+ * @param textureHeight The initial guess for the texture height.
+ * @param textureFormat The texture format to which the data is to be converted.
+ * @return The correctly adjusted texture height.
+ */
+uint16_t FreeTypeGX::adjustTextureHeight(uint16_t textureHeight, uint8_t textureFormat) {
+ uint16_t alignment;
+
+ switch(textureFormat) {
+ case GX_TF_I4: /* 8x8 Tiles - 4-bit Intensity */
+ alignment = 8;
+ break;
+
+ case GX_TF_I8: /* 8x4 Tiles - 8-bit Intensity */
+ case GX_TF_IA4: /* 8x4 Tiles - 4-bit Intensity, , 4-bit Alpha */
+ case GX_TF_IA8: /* 4x4 Tiles - 8-bit Intensity, 8-bit Alpha */
+ case GX_TF_RGB565: /* 4x4 Tiles - RGB565 Format */
+ case GX_TF_RGB5A3: /* 4x4 Tiles - RGB5A3 Format */
+ case GX_TF_RGBA8: /* 4x4 Tiles - RGBA8 Dual Cache Line Format */
+ default:
+ alignment = 4;
+ break;
+ }
+ return textureHeight % alignment == 0 ? textureHeight : alignment + textureHeight - (textureHeight % alignment);
+
+}
+
+/**
+ * Caches the given font glyph in the instance font texture buffer.
+ *
+ * This routine renders and stores the requested glyph's bitmap and relevant information into its own quickly addressible
+ * structure within an instance-specific map.
+ *
+ * @param charCode The requested glyph's character code.
+ * @return A pointer to the allocated font structure.
+ */
+ftgxCharData *FreeTypeGX::cacheGlyphData(wchar_t charCode) {
+ FT_UInt gIndex;
+ uint16_t textureWidth = 0, textureHeight = 0;
+
+ gIndex = FT_Get_Char_Index( this->ftFace, charCode );
+ if (!FT_Load_Glyph(this->ftFace, gIndex, FT_LOAD_DEFAULT )) {
+ FT_Render_Glyph( this->ftSlot, FT_RENDER_MODE_NORMAL );
+
+ if(this->ftSlot->format == FT_GLYPH_FORMAT_BITMAP) {
+ FT_Bitmap *glyphBitmap = &this->ftSlot->bitmap;
+
+ textureWidth = adjustTextureWidth(glyphBitmap->width, this->textureFormat);
+ textureHeight = adjustTextureHeight(glyphBitmap->rows, this->textureFormat);
+
+ this->fontData[charCode] = (ftgxCharData){
+ this->ftSlot->advance.x >> 6,
+ gIndex,
+ textureWidth,
+ textureHeight,
+ this->ftSlot->bitmap_top,
+ this->ftSlot->bitmap_top,
+ textureHeight - this->ftSlot->bitmap_top,
+ NULL
+ };
+ this->loadGlyphData(glyphBitmap, &this->fontData[charCode]);
+
+ return &this->fontData[charCode];
+ }
+ }
+
+ return NULL;
+}
+
+/**
+ * Locates each character in this wrapper's configured font face and proccess them.
+ *
+ * This routine locates each character in the configured font face and renders the glyph's bitmap.
+ * Each bitmap and relevant information is loaded into its own quickly addressible structure within an instance-specific map.
+ */
+uint16_t FreeTypeGX::cacheGlyphDataComplete() {
+ uint16_t i = 0;
+ FT_UInt gIndex;
+ FT_ULong charCode = FT_Get_First_Char( this->ftFace, &gIndex );
+ while ( gIndex != 0 ) {
+
+ if(this->cacheGlyphData(charCode) != NULL) {
+ i++;
+ }
+
+ charCode = FT_Get_Next_Char( this->ftFace, charCode, &gIndex );
+ }
+
+ return i;
+}
+
+/**
+ * Loads the rendered bitmap into the relevant structure's data buffer.
+ *
+ * This routine does a simple byte-wise copy of the glyph's rendered 8-bit grayscale bitmap into the structure's buffer.
+ * Each byte is converted from the bitmap's intensity value into the a uint32_t RGBA value.
+ *
+ * @param bmp A pointer to the most recently rendered glyph's bitmap.
+ * @param charData A pointer to an allocated ftgxCharData structure whose data represent that of the last rendered glyph.
+ */
+void FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData) {
+
+ uint32_t *glyphData = (uint32_t *)memalign(32, charData->textureWidth * charData->textureHeight * 4);
+ memset(glyphData, 0x00, charData->textureWidth * charData->textureHeight * 4);
+
+ for (uint16_t imagePosY = 0; imagePosY < bmp->rows; imagePosY++) {
+ for (uint16_t imagePosX = 0; imagePosX < bmp->width; imagePosX++) {
+ uint32_t pixel = (uint32_t) bmp->buffer[imagePosY * bmp->width + imagePosX];
+ glyphData[imagePosY * charData->textureWidth + imagePosX] = 0x00000000 | (pixel << 24) | (pixel << 16) | (pixel << 8) | pixel;
+ }
+ }
+
+ switch(this->textureFormat) {
+ case GX_TF_I4:
+ charData->glyphDataTexture = Metaphrasis::convertBufferToI4(glyphData, charData->textureWidth, charData->textureHeight);
+ break;
+ case GX_TF_I8:
+ charData->glyphDataTexture = Metaphrasis::convertBufferToI8(glyphData, charData->textureWidth, charData->textureHeight);
+ break;
+ case GX_TF_IA4:
+ charData->glyphDataTexture = Metaphrasis::convertBufferToIA4(glyphData, charData->textureWidth, charData->textureHeight);
+ break;
+ case GX_TF_IA8:
+ charData->glyphDataTexture = Metaphrasis::convertBufferToIA8(glyphData, charData->textureWidth, charData->textureHeight);
+ break;
+ case GX_TF_RGB565:
+ charData->glyphDataTexture = Metaphrasis::convertBufferToRGB565(glyphData, charData->textureWidth, charData->textureHeight);
+ break;
+ case GX_TF_RGB5A3:
+ charData->glyphDataTexture = Metaphrasis::convertBufferToRGB5A3(glyphData, charData->textureWidth, charData->textureHeight);
+ break;
+ case GX_TF_RGBA8:
+ default:
+ charData->glyphDataTexture = Metaphrasis::convertBufferToRGBA8(glyphData, charData->textureWidth, charData->textureHeight);
+ break;
+ }
+
+ free(glyphData);
+}
+
+/**
+ * Determines the x offset of the rendered string.
+ *
+ * This routine calculates the x offset of the rendered string based off of a supplied positional format parameter.
+ *
+ * @param width Current pixel width of the string.
+ * @param format Positional format of the string.
+ */
+uint16_t FreeTypeGX::getStyleOffsetWidth(uint16_t width, uint16_t format) {
+
+ if (format & FTGX_JUSTIFY_LEFT ) {
+ return 0;
+ }
+ else if (format & FTGX_JUSTIFY_CENTER ) {
+ return width >> 1;
+ }
+ else if (format & FTGX_JUSTIFY_RIGHT ) {
+ return width;
+ }
+
+ return 0;
+}
+
+/**
+ * Determines the y offset of the rendered string.
+ *
+ * This routine calculates the y offset of the rendered string based off of a supplied positional format parameter.
+ *
+ * @param offset Current pixel offset data of the string.
+ * @param format Positional format of the string.
+ */
+uint16_t FreeTypeGX::getStyleOffsetHeight(ftgxDataOffset offset, uint16_t format) {
+ if (format & FTGX_ALIGN_TOP ) {
+ return -offset.max;
+ }
+ else if (format & FTGX_ALIGN_MIDDLE ) {
+ return -offset.max;
+ }
+ else if (format & FTGX_ALIGN_BOTTOM ) {
+ return offset.min;
+ }
+
+ return 0;
+}
+
+/**
+ * Processes the supplied text string and prints the results at the specified coordinates.
+ *
+ * This routine processes each character of the supplied text string, loads the relevant preprocessed bitmap buffer,
+ * a texture from said buffer, and loads the resultant texture into the EFB.
+ *
+ * @param x Screen X coordinate at which to output the text.
+ * @param y Screen Y coordinate at which to output the text. Note that this value corresponds to the text string origin and not the top or bottom of the glyphs.
+ * @param text NULL terminated string to output.
+ * @param color Optional color to apply to the text characters. If not specified default value is ftgxWhite: (GXColor){0xff, 0xff, 0xff, 0xff}
+ * @param textStyle Flags which specify any styling which should be applied to the rendered string.
+ * @return The number of characters printed.
+ */
+uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, wchar_t *text, GXColor color, uint16_t textStyle) {
+ uint16_t strLength = wcslen(text);
+ uint16_t x_pos = x, printed = 0;
+ uint16_t x_offset = 0, y_offset = 0;
+ GXTexObj glyphTexture;
+ FT_Vector pairDelta;
+
+ if(textStyle & 0x000F) {
+ x_offset = this->getStyleOffsetWidth(this->getWidth(text), textStyle);
+ }
+ if(textStyle & 0x00F0) {
+ y_offset = this->getStyleOffsetHeight(this->getOffset(text), textStyle);
+ }
+
+ for (uint16_t i = 0; i < strLength; i++) {
+
+ ftgxCharData* glyphData = NULL;
+ if( this->fontData.find(text[i]) != this->fontData.end() ) {
+ glyphData = &this->fontData[text[i]];
+ }
+ else {
+ glyphData = this->cacheGlyphData(text[i]);
+ }
+
+ if(glyphData != NULL) {
+
+ if(this->ftKerningEnabled && i) {
+ FT_Get_Kerning( this->ftFace, this->fontData[text[i - 1]].glyphIndex, glyphData->glyphIndex, FT_KERNING_DEFAULT, &pairDelta );
+ x_pos += pairDelta.x >> 6;
+ }
+
+ GX_InitTexObj(&glyphTexture, glyphData->glyphDataTexture, glyphData->textureWidth, glyphData->textureHeight, this->textureFormat, GX_CLAMP, GX_CLAMP, GX_FALSE);
+ this->copyTextureToFramebuffer(&glyphTexture, glyphData->textureWidth, glyphData->textureHeight, x_pos - x_offset, y - glyphData->renderOffsetY - y_offset, color);
+
+ x_pos += glyphData->glyphAdvanceX;
+ printed++;
+ }
+ }
+
+ if(textStyle & 0x0F00) {
+ this->drawTextFeature(x - x_offset, y, this->getWidth(text), this->getOffset(text), textStyle, color);
+ }
+
+ return printed;
+}
+
+/**
+ * \overload
+ */
+uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, wchar_t const *text, GXColor color, uint16_t textStyle) {
+ return this->drawText(x, y, (wchar_t *)text, color, textStyle);
+}
+
+void FreeTypeGX::drawTextFeature(int16_t x, int16_t y, uint16_t width, ftgxDataOffset offsetData, uint16_t format, GXColor color) {
+ uint16_t featureHeight = this->ftPointSize >> 4 > 0 ? this->ftPointSize >> 4 : 1;
+
+ if (format & FTGX_STYLE_UNDERLINE ) {
+ switch(format & 0x00F0) {
+ case FTGX_ALIGN_TOP:
+ this->copyFeatureToFramebuffer(width, featureHeight, x, y + offsetData.max + 1, color);
+ break;
+ case FTGX_ALIGN_MIDDLE:
+ this->copyFeatureToFramebuffer(width, featureHeight, x, y + ((offsetData.max - offsetData.min) >> 1) + 1, color);
+ break;
+ case FTGX_ALIGN_BOTTOM:
+ this->copyFeatureToFramebuffer(width, featureHeight, x, y - offsetData.min, color);
+ break;
+ default:
+ this->copyFeatureToFramebuffer(width, featureHeight, x, y + 1, color);
+ break;
+ }
+ }
+
+ if (format & FTGX_STYLE_STRIKE ) {
+ switch(format & 0x00F0) {
+ case FTGX_ALIGN_TOP:
+ this->copyFeatureToFramebuffer(width, featureHeight, x, y + ((offsetData.max + offsetData.min) >> 1), color);
+ break;
+ case FTGX_ALIGN_MIDDLE:
+ this->copyFeatureToFramebuffer(width, featureHeight, x, y, color);
+ break;
+ case FTGX_ALIGN_BOTTOM:
+ this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData.max + offsetData.min) >> 1), color);
+ break;
+ default:
+ this->copyFeatureToFramebuffer(width, featureHeight, x, y - ((offsetData.max - offsetData.min) >> 1), color);
+ break;
+ }
+ }
+}
+
+/**
+ * Processes the supplied string and return the width of the string in pixels.
+ *
+ * This routine processes each character of the supplied text string and calculates the width of the entire string.
+ * Note that if precaching of the entire font set is not enabled any uncached glyph will be cached after the call to this function.
+ *
+ * @param text NULL terminated string to calculate.
+ * @return The width of the text string in pixels.
+ */
+uint16_t FreeTypeGX::getWidth(wchar_t *text) {
+ uint16_t strLength = wcslen(text);
+ uint16_t strWidth = 0;
+ FT_Vector pairDelta;
+
+ for (uint16_t i = 0; i < strLength; i++) {
+
+ ftgxCharData* glyphData = NULL;
+ if( this->fontData.find(text[i]) != this->fontData.end() ) {
+ glyphData = &this->fontData[text[i]];
+ }
+ else {
+ glyphData = this->cacheGlyphData(text[i]);
+ }
+
+ if(glyphData != NULL) {
+ if(this->ftKerningEnabled && (i > 0)) {
+ FT_Get_Kerning( this->ftFace, this->fontData[text[i - 1]].glyphIndex, glyphData->glyphIndex, FT_KERNING_DEFAULT, &pairDelta );
+ strWidth += pairDelta.x >> 6;
+ }
+
+ strWidth += glyphData->glyphAdvanceX;
+ }
+ }
+
+ return strWidth;
+}
+
+/**
+ *
+ * \overload
+ */
+uint16_t FreeTypeGX::getWidth(wchar_t const *text) {
+ return this->getWidth((wchar_t *)text);
+}
+
+/**
+ * Processes the supplied string and return the height of the string in pixels.
+ *
+ * This routine processes each character of the supplied text string and calculates the height of the entire string.
+ * Note that if precaching of the entire font set is not enabled any uncached glyph will be cached after the call to this function.
+ *
+ * @param text NULL terminated string to calculate.
+ * @return The height of the text string in pixels.
+ */
+uint16_t FreeTypeGX::getHeight(wchar_t *text) {
+ ftgxDataOffset offset = this->getOffset(text);
+
+ return offset.max + offset.min;
+}
+
+/**
+ *
+ * \overload
+ */
+uint16_t FreeTypeGX::getHeight(wchar_t const *text) {
+ return this->getHeight((wchar_t *)text);
+}
+
+/**
+ * Get the maximum offset above and minimum offset below the font origin line.
+ *
+ * This function calculates the maximum pixel height above the font origin line and the minimum
+ * pixel height below the font origin line and returns the values in an addressible structure.
+ *
+ * @param text NULL terminated string to calculate.
+ * @return The max and min values above and below the font origin line.
+ */
+ftgxDataOffset FreeTypeGX::getOffset(wchar_t *text) {
+ uint16_t strLength = wcslen(text);
+ uint16_t strMax = 0, strMin = 0;
+
+ for (uint16_t i = 0; i < strLength; i++) {
+
+ ftgxCharData* glyphData = NULL;
+ if( this->fontData.find(text[i]) != this->fontData.end() ) {
+ glyphData = &this->fontData[text[i]];
+ }
+ else {
+ glyphData = this->cacheGlyphData(text[i]);
+ }
+
+ if(glyphData != NULL) {
+ strMax = glyphData->renderOffsetMax > strMax ? glyphData->renderOffsetMax : strMax;
+ strMin = glyphData->renderOffsetMin > strMin ? glyphData->renderOffsetMin : strMin;
+ }
+ }
+
+ return (ftgxDataOffset){strMax, strMin};
+}
+
+/**
+ *
+ * \overload
+ */
+ftgxDataOffset FreeTypeGX::getOffset(wchar_t const *text) {
+ return this->getOffset(text);
+}
+
+/**
+ * Copies the supplied texture quad to the EFB.
+ *
+ * This routine uses the in-built GX quad builder functions to define the texture bounds and location on the EFB target.
+ *
+ * @param texObj A pointer to the glyph's initialized texture object.
+ * @param texWidth The pixel width of the texture object.
+ * @param texHeight The pixel height of the texture object.
+ * @param screenX The screen X coordinate at which to output the rendered texture.
+ * @param screenY The screen Y coordinate at which to output the rendered texture.
+ * @param color Color to apply to the texture.
+ */
+void FreeTypeGX::copyTextureToFramebuffer(GXTexObj *texObj, f32 texWidth, f32 texHeight, int16_t screenX, int16_t screenY, GXColor color) {
+
+ GX_LoadTexObj(texObj, GX_TEXMAP0);
+ GX_InvalidateTexAll();
+
+ GX_SetTevOp (GX_TEVSTAGE0, GX_MODULATE);
+ GX_SetVtxDesc (GX_VA_TEX0, GX_DIRECT);
+
+ GX_Begin(GX_QUADS, this->vertexIndex, 4);
+ GX_Position2s16(screenX, screenY);
+ GX_Color4u8(color.r, color.g, color.b, color.a);
+ GX_TexCoord2f32(0.0f, 0.0f);
+
+ GX_Position2s16(texWidth + screenX, screenY);
+ GX_Color4u8(color.r, color.g, color.b, color.a);
+ GX_TexCoord2f32(1.0f, 0.0f);
+
+ GX_Position2s16(texWidth + screenX, texHeight + screenY);
+ GX_Color4u8(color.r, color.g, color.b, color.a);
+ GX_TexCoord2f32(1.0f, 1.0f);
+
+ GX_Position2s16(screenX, texHeight + screenY);
+ GX_Color4u8(color.r, color.g, color.b, color.a);
+ GX_TexCoord2f32(0.0f, 1.0f);
+ GX_End();
+
+ this->setDefaultMode();
+}
+
+/**
+ * Creates a feature quad to the EFB.
+ *
+ * This function creates a simple quad for displaying underline or strikeout text styling.
+ *
+ * @param featureWidth The pixel width of the quad.
+ * @param featureHeight The pixel height of the quad.
+ * @param screenX The screen X coordinate at which to output the quad.
+ * @param screenY The screen Y coordinate at which to output the quad.
+ * @param color Color to apply to the texture.
+ */
+void FreeTypeGX::copyFeatureToFramebuffer(f32 featureWidth, f32 featureHeight, int16_t screenX, int16_t screenY, GXColor color) {
+
+ GX_SetTevOp (GX_TEVSTAGE0, GX_PASSCLR);
+ GX_SetVtxDesc (GX_VA_TEX0, GX_NONE);
+
+ GX_Begin(GX_QUADS, this->vertexIndex, 4);
+ GX_Position2s16(screenX, screenY);
+ GX_Color4u8(color.r, color.g, color.b, color.a);
+
+ GX_Position2s16(featureWidth + screenX, screenY);
+ GX_Color4u8(color.r, color.g, color.b, color.a);
+
+ GX_Position2s16(featureWidth + screenX, featureHeight + screenY);
+ GX_Color4u8(color.r, color.g, color.b, color.a);
+
+ GX_Position2s16(screenX, featureHeight + screenY);
+ GX_Color4u8(color.r, color.g, color.b, color.a);
+ GX_End();
+
+ this->setDefaultMode();
+}
diff --git a/source/ngc/FreeTypeGX.h b/source/ngc/FreeTypeGX.h
new file mode 100644
index 0000000..935cd7d
--- /dev/null
+++ b/source/ngc/FreeTypeGX.h
@@ -0,0 +1,286 @@
+/*
+ * FreeTypeGX is a wrapper class for libFreeType which renders a compiled
+ * FreeType parsable font into a GX texture for Wii homebrew development.
+ * Copyright (C) 2008 Armin Tamzarian
+ * Modified by Tantric, 2009
+ *
+ * This file is part of FreeTypeGX.
+ *
+ * FreeTypeGX is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * FreeTypeGX is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with FreeTypeGX. If not, see .
+ */
+
+/** \mainpage FreeTypeGX
+ *
+ * \section sec_intro Introduction
+ *
+ * FreeTypeGX is a wrapper class for libFreeType which renders a compiled FreeType parsable font into a GX texture for Wii homebrew development.
+ *
+ * FreeTypeGX is written in C++ and makes use of a selectable pre-buffered or buffer-on-demand methodology to allow fast and efficient printing of text to the EFB.
+ *
+ * This library was developed in-full by Armin Tamzarian with the support of developers in \#wiibrew on EFnet.
+ *
+ * \section sec_installation_source Installation (Source Code)
+ *
+ * -# Ensure that you have the libFreeType Wii library installed in your development environment with the library added to your Makefile where appropriate.
+ * -# Ensure that you have the Metaphrasis library installed in your development environment with the library added to your Makefile where appropriate.
+ * -# Extract the FreeTypeGX archive.
+ * -# Copy the contents of the src directory into your project's development path.
+ * -# Include the FreeTypeGX header file in your code using syntax such as the following:
+ * \code
+ * #include "FreeTypeGX.h"
+ * \endcode
+ *
+ * \section sec_installation_library Installation (Library)
+ *
+ * -# Ensure that you have the libFreeType Wii library installed in your development environment with the library added to your Makefile where appropriate.
+ * -# Ensure that you have the Metaphrasis library installed in your development environment with the library added to your Makefile where appropriate.
+ * -# Extract the FreeTypeGX archive.
+ * -# Copy the contents of the lib directory into your devKitPro/libogc directory.
+ * -# Include the FreeTypeGX header file in your code using syntax such as the following:
+ * \code
+ * #include "FreeTypeGX.h"
+ * \endcode
+ *
+ * \section sec_freetypegx_prerequisites FreeTypeGX Prerequisites
+ *
+ * Before you begin using FreeTypeGX in your project you must ensure that the desired font in compiled into your project. For this example I will assume you are building your project with a Makefile using devKitPro evironment and are attempting to include a font whose filename is rursus_compact_mono.ttf.
+ *
+ * -# Copy the font into a directory which will be processed by the project's Makefile. If you are unsure about where you should place your font just copy the it into your project's source directory.
+ * \n\n
+ * -# Modify the Makefile to convert the font into an object file:
+ * \code
+ * %.ttf.o : %.ttf
+ * @echo $(notdir $<)
+ * $(bin2o)
+ * \endcode
+ * \n
+ * -# Include the font object's generated header file in your source code:
+ * \code
+ * #include "rursus_compact_mono_ttf.h"
+ * \endcode
+ * This header file defines the two variables that you will need for use within your project:
+ * \code
+ * extern const u8 rursus_compact_mono_ttf[]; A pointer to the font buffer within the compiled project.
+ * extern const u32 rursus_compact_mono_ttf_size; The size of the font's buffer in bytes.
+ * \endcode
+ *
+ * \section sec_freetypegx_usage FreeTypeGX Usage
+ *
+ * -# Within the file you included the FreeTypeGX.h header create an instance object of the FreeTypeGX class:
+ * \code
+ * FreeTypeGX *freeTypeGX = new FreeTypeGX();
+ * \endcode
+ * Alternately you can specify a texture format to which you would like to render the font characters. Note that the default value for this parameter is GX_TF_RGBA8.
+ * \code
+ * FreeTypeGX *freeTypeGX = new FreeTypeGX(GX_TF_RGB565);
+ * \endcode
+ * Furthermore, you can also specify a vertex format index to avoid conflicts with concurrent libraries or other systems. Note that the default value for this parameter is GX_VTXFMT1.
+ * \code
+ * FreeTypeGX *freeTypeGX = new FreeTypeGX(GX_TF_RGB565, GX_VTXFMT1);
+ * \endcode
+ * \n
+ * Currently supported textures are:
+ * \li GX_TF_I4
+ * \li GX_TF_I8
+ * \li GX_TF_IA4
+ * \li GX_TF_IA8
+ * \li GX_TF_RGB565
+ * \li GX_TF_RGB5A3
+ * \li GX_TF_RGBA8
+ *
+ * \n
+ * -# Using the allocated FreeTypeGX instance object call the loadFont function to load the font from the compiled buffer and specify the desired point size. Note that this function can be called multiple times to load a new:
+ * \code
+ * freeTypeGX->loadFont(rursus_compact_mono_ttf, rursus_compact_mono_ttf_size, 64);
+ * \endcode
+ * Alternately you can specify a flag which will load and cache all available font glyphs immidiately. Note that on large font sets enabling this feature could take a significant amount of time.
+ * \code
+ * freeTypeGX->loadFont(rursus_compact_mono_ttf, rursus_compact_mono_ttf_size, 64, true);
+ * \endcode
+ * \n
+ * -# If necessary you can enable compatibility modes with concurrent libraries or systems. For more information on this feature see the documentation for setCompatibilityMode:
+ * \code
+ * freeTypeGX->setCompatibilityMode(FTGX_COMPATIBILITY_GRRLIB);
+ * \endcode
+ * -# Using the allocated FreeTypeGX instance object call the drawText function to print a string at the specified screen X and Y coordinates to the current EFB:
+ * \code
+ * freeTypeGX->drawText(10, 25, _TEXT("FreeTypeGX Rocks!"));
+ * \endcode
+ * Alternately you can specify a GXColor object you would like to apply to the printed characters:
+ * \code
+ * freeTypeGX->drawText(10, 25, _TEXT("FreeTypeGX Rocks!"),
+ * (GXColor){0xff, 0xee, 0xaa, 0xff});
+ * \endcode
+ * Furthermore you can also specify a group of styling parameters which will modify the positioning or style of the text:
+ * \code
+ * freeTypeGX->drawText(10, 25, _TEXT("FreeTypeGX Rocks!"),
+ * (GXColor){0xff, 0xee, 0xaa, 0xff},
+ * FTGX_JUSTIFY_CENTER | FTGX_ALIGN_BOTTOM | FTGX_STYLE_UNDERLINE);
+ * \endcode
+ * \n
+ * Currently style parameters are:
+ * \li FTGX_JUSTIFY_LEFT
+ * \li FTGX_JUSTIFY_CENTER
+ * \li FTGX_JUSTIFY_RIGHT
+ * \li FTGX_ALIGN_TOP
+ * \li FTGX_ALIGN_MIDDLE
+ * \li FTGX_ALIGN_BOTTOM
+ * \li FTGX_STYLE_UNDERLINE
+ * \li FTGX_STYLE_STRIKE
+ *
+ * \section sec_license License
+ *
+ * FreeTypeGX is distributed under the GNU Lesser General Public License.
+ *
+ * \section sec_contact Contact
+ *
+ * If you have any suggestions, questions, or comments regarding this library feel free to e-mail me at tamzarian1989 [at] gmail [dawt] com.
+ */
+
+#ifndef FREETYPEGX_H_
+#define FREETYPEGX_H_
+
+#include
+#include
+#include FT_FREETYPE_H
+#include FT_BITMAP_H
+#include
+
+#include
+#include
+#include