diff --git a/GRRLIB/GRRLIB/GRRLIB_core.c b/GRRLIB/GRRLIB/GRRLIB_core.c index b79ff79..faedf7b 100644 --- a/GRRLIB/GRRLIB/GRRLIB_core.c +++ b/GRRLIB/GRRLIB/GRRLIB_core.c @@ -28,6 +28,7 @@ THE SOFTWARE. #define __GRRLIB_CORE__ #include +#include "grrlib/GRRLIB_ttf.h" #define DEFAULT_FIFO_SIZE (256 * 1024) /**< GX fifo buffer size. */ @@ -161,6 +162,9 @@ int GRRLIB_Init (void) { // Initialise the filing system if (!fatInitDefault()) error_code = -2; + // Initialise TTF + if (GRRLIB_InitTTF()) error_code = -3; + VIDEO_SetBlack(false); // Enable video output return error_code; } @@ -192,4 +196,7 @@ void GRRLIB_Exit (void) { if (xfb[0] != NULL) { free(MEM_K1_TO_K0(xfb[0])); xfb[0] = NULL; } if (xfb[1] != NULL) { free(MEM_K1_TO_K0(xfb[1])); xfb[1] = NULL; } if (gp_fifo != NULL) { free(gp_fifo); gp_fifo = NULL; } + + // Done with TTF + GRRLIB_ExitTTF(); } diff --git a/GRRLIB/GRRLIB/GRRLIB_ttf.c b/GRRLIB/GRRLIB/GRRLIB_ttf.c new file mode 100644 index 0000000..c9d2e36 --- /dev/null +++ b/GRRLIB/GRRLIB/GRRLIB_ttf.c @@ -0,0 +1,238 @@ +/*------------------------------------------------------------------------------ +Copyright (c) 2009 The GRRLIB Team + +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 +#include "grrlib/GRRLIB_ttf.h" +#include + +static FT_Library ftLibrary; /**< A handle to a FreeType library instance. */ + +// Static function prototypes +static void DrawBitmap(FT_Bitmap *bitmap, int offset, int top, const u32 color) ; + + +/** + * Initialize FreeType library. + * @return int 0=OK; -1=Failed + * @see GRRLIB_ExitFreetype + */ +int GRRLIB_InitTTF () { + if (FT_Init_FreeType(&ftLibrary)) { + return -1; + } + return 0; +} + +/** + * Call this when your done with FreeType. + */ +void GRRLIB_ExitTTF (void) { + FT_Done_FreeType(ftLibrary); +} + +/** + * Load a TTF from a buffer. + * @param file_base Buffer with TTF data. + * @param file_size Size of the TTF buffer. + * @return A handle to a given TTF font object. + * @see GRRLIB_FreeTTF + */ +GRRLIB_ttfFont* GRRLIB_LoadTTF (const u8* file_base, s32 file_size) { + GRRLIB_ttfFont* myFont = (GRRLIB_ttfFont*)malloc(sizeof(GRRLIB_ttfFont)); + FT_New_Memory_Face(ftLibrary, file_base, file_size, 0, &myFont->face); + myFont->kerning = FT_HAS_KERNING(myFont->face); +/* + if (FT_Set_Pixel_Sizes(myFont->face, 0, fontSize)) { + FT_Set_Pixel_Sizes(myFont->face, 0, 12); + } +*/ + return myFont; +} + +/** + * Free memory allocated by TTF fonts. + * @param myFont A TTF. + */ +void GRRLIB_FreeTTF (GRRLIB_ttfFont *myFont) { + FT_Done_Face(myFont->face); + free(myFont); + myFont = NULL; +} + +/** + * Print function for TTF font. + * @param x Specifies the x-coordinate of the upper-left corner of the text. + * @param y Specifies the y-coordinate of the upper-left corner of the text. + * @param myFont A TTF. + * @param string Text to draw. + * @param fontSize Size of the font. + * @param color Text color in RGB format. + */ +void GRRLIB_PrintfTTF(int x, int y, GRRLIB_ttfFont *myFont, const char *string, unsigned int fontSize, const u32 color) { + size_t length = strlen(string) + 1; + wchar_t *utf32 = (wchar_t*)malloc(length * sizeof(wchar_t)); + utf32[length] = '\0'; + mbstowcs(utf32, string, length); + + GRRLIB_PrintfTTFW(x, y, myFont, utf32, fontSize, color); + + free(utf32); +} + +/** + * Print function for TTF font. + * @author wplaat and DrTwox + * @param x Specifies the x-coordinate of the upper-left corner of the text. + * @param y Specifies the y-coordinate of the upper-left corner of the text. + * @param myFont A TTF. + * @param utf32 Text to draw. + * @param fontSize Size of the font. + * @param color Text color in RGB format. + */ +void GRRLIB_PrintfTTFW(int x, int y, GRRLIB_ttfFont *myFont, const wchar_t *utf32, unsigned int fontSize, const u32 color) { + unsigned int loop; + int penX = 0; + int penY = fontSize; + FT_GlyphSlot slot = myFont->face->glyph; + FT_UInt glyphIndex = 0; + FT_UInt previousGlyph = 0; + + if (FT_Set_Pixel_Sizes(myFont->face, 0, fontSize)) { + FT_Set_Pixel_Sizes(myFont->face, 0, 12); + } + + size_t length = wcslen(utf32); + + /* Loop over each character, until the + * end of the string is reached, or until the pixel width is too wide */ + for (loop = 0; loop < length; ++loop) { + glyphIndex = FT_Get_Char_Index(myFont->face, utf32[ loop ]); + + /* To the best of my knowledge, none of the other freetype + * implementations use kerning */ + if (myFont->kerning && previousGlyph && glyphIndex) { + FT_Vector delta; + FT_Get_Kerning(myFont->face, previousGlyph, glyphIndex, FT_KERNING_DEFAULT, &delta); + penX += delta.x >> 6; + } + if (FT_Load_Glyph(myFont->face, glyphIndex, FT_LOAD_RENDER)) { + continue; + } + + DrawBitmap(&slot->bitmap, + penX + slot->bitmap_left + x, + penY - slot->bitmap_top + y, + color); + penX += slot->advance.x >> 6; + previousGlyph = glyphIndex; + } +} + +/** + * Draw a character on the screen. + * @param bitmap Bitmap to draw. + * @param offset x-coordinate offset. + * @param top y-coordinate. + * @param color character color in RGB format. + */ +static void DrawBitmap(FT_Bitmap *bitmap, int offset, int top, const u32 color) { + FT_Int i, j, p, q; + FT_Int x_max = offset + bitmap->width; + FT_Int y_max = top + bitmap->rows; + + for ( i = offset, p = 0; i < x_max; i++, p++ ) { + for ( j = top, q = 0; j < y_max; j++, q++ ) { + GRRLIB_Plot( i, j, + RGBA((color >> 16) & 0xFF, + (color >> 8) & 0xFF, + color & 0xFF, + bitmap->buffer[ q * bitmap->width + p ]) ); + } + } +} + +/** + * Get the width of a text in pixel. + * @param myFont A TTF. + * @param string The text to check. + * @param fontSize The size of the font. + * @return The width of a text in pixel. + */ +unsigned int GRRLIB_WidthTTF(GRRLIB_ttfFont *myFont, const char *string, unsigned int fontSize) { + if(string == NULL) { + return 0; + } + unsigned int penX; + size_t length = strlen(string) + 1; + wchar_t *utf32 = (wchar_t*)malloc(length * sizeof(wchar_t)); + utf32[length] = '\0'; + length = mbstowcs(utf32, string, length); + + penX = GRRLIB_WidthTTFW(myFont, utf32, fontSize); + + free(utf32); + + return penX; +} + +/** + * Get the width of a text in pixel. + * @param myFont A TTF. + * @param utf32 The text to check. + * @param fontSize The size of the font. + * @return The width of a text in pixel. + */ +unsigned int GRRLIB_WidthTTFW(GRRLIB_ttfFont *myFont, const wchar_t *utf32, unsigned int fontSize) { + unsigned int loop; + unsigned int penX = 0; + FT_UInt glyphIndex; + FT_UInt previousGlyph = 0; + size_t length; + + if(utf32 == NULL) { + return 0; + } + + if(FT_Set_Pixel_Sizes(myFont->face, 0, fontSize)) { + FT_Set_Pixel_Sizes(myFont->face, 0, 12); + } + + length = wcslen(utf32); + + for(loop = 0; loop < length; ++loop) { + glyphIndex = FT_Get_Char_Index(myFont->face, utf32[ loop ]); + + if(myFont->kerning && previousGlyph && glyphIndex) { + FT_Vector delta; + FT_Get_Kerning(myFont->face, previousGlyph, glyphIndex, FT_KERNING_DEFAULT, &delta); + penX += delta.x >> 6; + } + if(FT_Load_Glyph(myFont->face, glyphIndex, FT_LOAD_RENDER)) { + continue; + } + + penX += myFont->face->glyph->advance.x >> 6; + previousGlyph = glyphIndex; + } + + return penX; +} diff --git a/GRRLIB/GRRLIB/grrlib.h b/GRRLIB/GRRLIB/grrlib.h index eeaadd8..efc3908 100644 --- a/GRRLIB/GRRLIB/grrlib.h +++ b/GRRLIB/GRRLIB/grrlib.h @@ -37,6 +37,8 @@ THE SOFTWARE. // Includes //============================================================================== #include +#include +#include FT_FREETYPE_H //============================================================================== //============================================================================== @@ -137,15 +139,24 @@ typedef struct GRRLIB_bytemapChar { * Structure to hold the bytemap font information. */ typedef struct GRRLIB_bytemapFont { - char *name; /**< Font name. */ - u32 *palette; /**< Font palette. */ - u16 nbChar; /**< Number of characters in font. */ - u8 version; /**< Version. */ - s8 tracking; /**< Tracking (Add-space after each char) (-128 to 127). */ + char *name; /**< Font name. */ + u32 *palette; /**< Font palette. */ + u16 nbChar; /**< Number of characters in font. */ + u8 version; /**< Version. */ + s8 tracking; /**< Tracking (Add-space after each char) (-128 to 127). */ - GRRLIB_bytemapChar *charDef; /**< Array of bitmap characters. */ + GRRLIB_bytemapChar *charDef; /**< Array of bitmap characters. */ } GRRLIB_bytemapFont; +//------------------------------------------------------------------------------ +/** + * Structure to hold the TTF information. + */ +typedef struct GRRLIB_Font { + FT_Face face; /**< A TTF face object. */ + FT_Bool kerning; /**< true whenever a face object contains kerning data that can be accessed with FT_Get_Kerning. */ +} GRRLIB_ttfFont; + //------------------------------------------------------------------------------ /** * This structure contains information about the type, size, and layout of a file that containing a device-independent bitmap (DIB). diff --git a/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h b/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h index 3c2ae50..ac72548 100644 --- a/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h +++ b/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h @@ -148,5 +148,13 @@ void GRRLIB_2dMode(); void GRRLIB_ObjectView(f32 posx, f32 posy, f32 posz, f32 angx, f32 angy, f32 angz); void GRRLIB_SetTexture(GRRLIB_texImg *tex, bool rep); +//------------------------------------------------------------------------------ +// GRRLIB_Freetype.c - FreeType function for GRRLIB +GRRLIB_ttfFont* GRRLIB_LoadTTF(const u8* file_base, s32 file_size); +void GRRLIB_FreeTTF(GRRLIB_ttfFont *myFont); +void GRRLIB_PrintfTTF(int x, int y, GRRLIB_ttfFont *myFont, const char *string, unsigned int fontSize, const u32 color); +void GRRLIB_PrintfTTFW(int x, int y, GRRLIB_ttfFont *myFont, const wchar_t *string, unsigned int fontSize, const u32 color); +unsigned int GRRLIB_WidthTTF(GRRLIB_ttfFont *myFont, const char *, unsigned int); +unsigned int GRRLIB_WidthTTFW(GRRLIB_ttfFont *myFont, const wchar_t *, unsigned int); #endif // __GRRLIB_FNLIB_H__ diff --git a/GRRLIB/GRRLIB/grrlib/GRRLIB_ttf.h b/GRRLIB/GRRLIB/grrlib/GRRLIB_ttf.h new file mode 100644 index 0000000..2cd6f47 --- /dev/null +++ b/GRRLIB/GRRLIB/grrlib/GRRLIB_ttf.h @@ -0,0 +1,24 @@ +/*------------------------------------------------------------------------------ +Copyright (c) 2009 The GRRLIB Team + +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. +------------------------------------------------------------------------------*/ + +int GRRLIB_InitTTF(); +void GRRLIB_ExitTTF(); diff --git a/examples/3D_CubedTileDemo/Makefile b/examples/3D_CubedTileDemo/Makefile index c47d164..a5ed35e 100644 --- a/examples/3D_CubedTileDemo/Makefile +++ b/examples/3D_CubedTileDemo/Makefile @@ -33,7 +33,7 @@ LDFLAGS = -g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/3D_sample1/Makefile b/examples/3D_sample1/Makefile index c47d164..a5ed35e 100644 --- a/examples/3D_sample1/Makefile +++ b/examples/3D_sample1/Makefile @@ -33,7 +33,7 @@ LDFLAGS = -g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/3D_sample2/Makefile b/examples/3D_sample2/Makefile index c47d164..a5ed35e 100644 --- a/examples/3D_sample2/Makefile +++ b/examples/3D_sample2/Makefile @@ -33,7 +33,7 @@ LDFLAGS = -g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/3D_sample3/Makefile b/examples/3D_sample3/Makefile index c47d164..a5ed35e 100644 --- a/examples/3D_sample3/Makefile +++ b/examples/3D_sample3/Makefile @@ -33,7 +33,7 @@ LDFLAGS = -g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/3D_sample4/Makefile b/examples/3D_sample4/Makefile index c47d164..a5ed35e 100644 --- a/examples/3D_sample4/Makefile +++ b/examples/3D_sample4/Makefile @@ -33,7 +33,7 @@ LDFLAGS = -g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/TileDemo/Makefile b/examples/TileDemo/Makefile index c47d164..a5ed35e 100644 --- a/examples/TileDemo/Makefile +++ b/examples/TileDemo/Makefile @@ -33,7 +33,7 @@ LDFLAGS = -g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/basic_drawing/Makefile b/examples/basic_drawing/Makefile index 2a371db..50453f9 100644 --- a/examples/basic_drawing/Makefile +++ b/examples/basic_drawing/Makefile @@ -33,7 +33,7 @@ LDFLAGS = -g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/bitmap_fx/Makefile b/examples/bitmap_fx/Makefile index c47d164..a5ed35e 100644 --- a/examples/bitmap_fx/Makefile +++ b/examples/bitmap_fx/Makefile @@ -33,7 +33,7 @@ LDFLAGS = -g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/blending/Makefile b/examples/blending/Makefile index c47d164..a5ed35e 100644 --- a/examples/blending/Makefile +++ b/examples/blending/Makefile @@ -33,7 +33,7 @@ LDFLAGS = -g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/compositing/Makefile b/examples/compositing/Makefile index c47d164..a5ed35e 100644 --- a/examples/compositing/Makefile +++ b/examples/compositing/Makefile @@ -33,7 +33,7 @@ LDFLAGS = -g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/funsin/Makefile b/examples/funsin/Makefile index 0ece1fd..0ab59c7 100644 --- a/examples/funsin/Makefile +++ b/examples/funsin/Makefile @@ -33,7 +33,7 @@ LDFLAGS = -g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/particle/Makefile b/examples/particle/Makefile index c47d164..a5ed35e 100644 --- a/examples/particle/Makefile +++ b/examples/particle/Makefile @@ -33,7 +33,7 @@ LDFLAGS = -g $(MACHDEP) -mrvl -Wl,-Map,$(notdir $@).map #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/template/Makefile b/examples/template/Makefile index 21e8a82..8ec21ac 100644 --- a/examples/template/Makefile +++ b/examples/template/Makefile @@ -34,7 +34,7 @@ LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map # any extra libraries we wish to link with the project # the order can-be/is critical #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat LIBS += -lwiiuse #LIBS += -lmodplay -lasnd LIBS += -lbte -logc -lm diff --git a/examples/ttf/Makefile b/examples/ttf/Makefile new file mode 100644 index 0000000..307e39d --- /dev/null +++ b/examples/ttf/Makefile @@ -0,0 +1,157 @@ +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC") +endif + +include $(DEVKITPPC)/wii_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := source +DATA := data +INCLUDES := + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -g -O2 -Wall $(MACHDEP) $(INCLUDE) +CXXFLAGS = $(CFLAGS) + +LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +# the order can-be/is critical +#--------------------------------------------------------------------------------- +LIBS := -lgrrlib +LIBS += -lfreetype +LIBS += -lpngu -lpng -ljpeg -lz -lfat +LIBS += -lwiiuse +#LIBS += -lmodplay -lasnd +LIBS += -lbte -logc -lm + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES), -iquote $(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) \ + -I$(LIBOGC_INC) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L$(LIBOGC_LIB) + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol + +#--------------------------------------------------------------------------------- +run: + wiiload $(TARGET).dol + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).dol: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with the .jpg extension +#--------------------------------------------------------------------------------- +%.jpg.o : %.jpg +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + $(bin2o) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with the .png extension +#--------------------------------------------------------------------------------- +%.png.o : %.png +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + $(bin2o) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with the .ttf extension +#--------------------------------------------------------------------------------- +%.ttf.o : %.ttf +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + $(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- diff --git a/examples/ttf/data/FreeMonoBold.ttf b/examples/ttf/data/FreeMonoBold.ttf new file mode 100644 index 0000000..9332a5a Binary files /dev/null and b/examples/ttf/data/FreeMonoBold.ttf differ diff --git a/examples/ttf/source/main.c b/examples/ttf/source/main.c new file mode 100644 index 0000000..ae74615 --- /dev/null +++ b/examples/ttf/source/main.c @@ -0,0 +1,57 @@ +/*=========================================== + TrueType Font demo +============================================*/ +#include + +#include +#include + +// Font +#include "FreeMonoBold_ttf.h" + +extern GXRModeObj *rmode; + +int main(int argc, char **argv) { + // Initialise the Graphics & Video subsystem + GRRLIB_Init(); + GRRLIB_ttfFont *myFont = GRRLIB_LoadTTF(FreeMonoBold_ttf, FreeMonoBold_ttf_size); + + GRRLIB_texImg *CopiedImg = GRRLIB_CreateEmptyTexture(rmode->fbWidth, rmode->efbHeight); + + // Initialise the Wii Remotes + WPAD_Init(); + + // Loop forever + while(1) { + GRRLIB_DrawImg(0, 0, CopiedImg, 0, 1, 1, 0xFFFFFFFF); + char Letter[2] = {rand() % 93 + 32, '\0'}; + GRRLIB_PrintfTTF(rand() % rmode->fbWidth - 50, + rand() % rmode->efbHeight - 50, + myFont, + Letter, + rand() % 180 + 20, + rand() % 0xFFFFFF); + GRRLIB_Screen2Texture(0, 0, CopiedImg, false); + + GRRLIB_Render(); // Render the frame buffer to the TV + + WPAD_ScanPads(); // Scan the Wii Remotes + + if (WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME) + break; + if (WPAD_ButtonsDown(0) & WPAD_BUTTON_A) { + GRRLIB_Rectangle(0, 0, rmode->fbWidth, rmode->efbHeight, 0x000000FF, 1); + GRRLIB_Screen2Texture(0, 0, CopiedImg, false); + } + if(WPAD_ButtonsHeld(0) & WPAD_BUTTON_1 && WPAD_ButtonsHeld(0) & WPAD_BUTTON_2) { + WPAD_Rumble(0, true); // Rumble on + GRRLIB_ScrShot("sd:/grrlib_ttf.png"); + WPAD_Rumble(0, false); // Rumble off + } + } + + GRRLIB_FreeTTF(myFont); + GRRLIB_Exit(); // Be a good boy, clear the memory allocated by GRRLIB + + exit(0); // Use exit() to exit a program, do not use 'return' from main() +} diff --git a/examples/unlimited2d/Makefile b/examples/unlimited2d/Makefile index e887406..80222d8 100644 --- a/examples/unlimited2d/Makefile +++ b/examples/unlimited2d/Makefile @@ -34,7 +34,7 @@ LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map -Wl,--section-start,.init=0x81 #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/examples/unlimited3d/Makefile b/examples/unlimited3d/Makefile index e887406..80222d8 100644 --- a/examples/unlimited3d/Makefile +++ b/examples/unlimited3d/Makefile @@ -34,7 +34,7 @@ LDFLAGS = -g $(MACHDEP) -Wl,-Map,$(notdir $@).map -Wl,--section-start,.init=0x81 #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgrrlib -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm +LIBS := -lgrrlib -lfreetype -lpngu -lpng -ljpeg -lz -lfat -lwiiuse -lbte -logc -lm #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing diff --git a/grrlib.doxygen b/grrlib.doxygen index e8e7e0f..0b1a889 100644 --- a/grrlib.doxygen +++ b/grrlib.doxygen @@ -1,4 +1,4 @@ -# Doxyfile 1.6.1 +# Doxyfile 1.6.2 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project @@ -397,6 +397,12 @@ HIDE_SCOPE_NAMES = YES SHOW_INCLUDE_FILES = YES +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. @@ -811,6 +817,12 @@ HTML_FOOTER = HTML_STYLESHEET = +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = NO + # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. @@ -912,7 +924,7 @@ QCH_FILE = # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace -QHP_NAMESPACE = +QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see @@ -944,6 +956,23 @@ QHP_SECT_FILTER_ATTRS = QHG_LOCATION = +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. @@ -984,15 +1013,26 @@ TREEVIEW_WIDTH = 250 FORMULA_FONTSIZE = 10 -# When the SEARCHENGINE tag is enable doxygen will generate a search box +# When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) -# there is already a search function so this one should typically -# be disabled. +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvances is that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- @@ -1009,7 +1049,10 @@ GENERATE_LATEX = NO LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. LATEX_CMD_NAME = latex