| @@ -31,18 +31,6 @@ else | |||
| OBJS += src/Window.cpp.o | |||
| endif | |||
| # freetype-gl | |||
| # OBJS += \ | |||
| # src/freetype-gl/font-manager.c.o \ | |||
| # src/freetype-gl/mat4.c.o \ | |||
| # src/freetype-gl/shader.c.o \ | |||
| # src/freetype-gl/text-buffer.c.o \ | |||
| # src/freetype-gl/texture-atlas.c.o \ | |||
| # src/freetype-gl/texture-font.c.o \ | |||
| # src/freetype-gl/vector.c.o \ | |||
| # src/freetype-gl/vertex-attribute.c.o \ | |||
| # src/freetype-gl/vertex-buffer.c.o | |||
| TARGET = ../libdgl.a | |||
| # -------------------------------------------------------------- | |||
| @@ -1,270 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #if 0 | |||
| # if !defined(_WIN32) && !defined(_WIN64) | |||
| # include <fontconfig/fontconfig.h> | |||
| # endif | |||
| #endif | |||
| #include <assert.h> | |||
| #include <stdio.h> | |||
| #include <stdlib.h> | |||
| #include <string.h> | |||
| #include <wchar.h> | |||
| #include "font-manager.h" | |||
| // ------------------------------------------------------------ file_exists --- | |||
| int | |||
| file_exists( const char * filename ) | |||
| { | |||
| FILE * file = fopen( filename, "r" ); | |||
| if ( file ) | |||
| { | |||
| fclose(file); | |||
| return 1; | |||
| } | |||
| return 0; | |||
| } | |||
| // ------------------------------------------------------- font_manager_new --- | |||
| font_manager_t * | |||
| font_manager_new( size_t width, size_t height, size_t depth ) | |||
| { | |||
| font_manager_t *self; | |||
| texture_atlas_t *atlas = texture_atlas_new( width, height, depth ); | |||
| self = (font_manager_t *) malloc( sizeof(font_manager_t) ); | |||
| if( !self ) | |||
| { | |||
| fprintf( stderr, | |||
| "line %d: No more memory for allocating data\n", __LINE__ ); | |||
| exit( EXIT_FAILURE ); | |||
| } | |||
| self->atlas = atlas; | |||
| self->fonts = vector_new( sizeof(texture_font_t *) ); | |||
| self->cache = wcsdup( L" " ); | |||
| return self; | |||
| } | |||
| // ---------------------------------------------------- font_manager_delete --- | |||
| void | |||
| font_manager_delete( font_manager_t * self ) | |||
| { | |||
| size_t i; | |||
| texture_font_t *font; | |||
| assert( self ); | |||
| for( i=0; i<vector_size( self->fonts ); ++i) | |||
| { | |||
| font = *(texture_font_t **) vector_get( self->fonts, i ); | |||
| texture_font_delete( font ); | |||
| } | |||
| vector_delete( self->fonts ); | |||
| texture_atlas_delete( self->atlas ); | |||
| if( self->cache ) | |||
| { | |||
| free( self->cache ); | |||
| } | |||
| free( self ); | |||
| } | |||
| // ----------------------------------------------- font_manager_delete_font --- | |||
| void | |||
| font_manager_delete_font( font_manager_t * self, | |||
| texture_font_t * font) | |||
| { | |||
| size_t i; | |||
| texture_font_t *other; | |||
| assert( self ); | |||
| assert( font ); | |||
| for( i=0; i<self->fonts->size;++i ) | |||
| { | |||
| other = (texture_font_t *) vector_get( self->fonts, i ); | |||
| if ( (strcmp(font->filename, other->filename) == 0) | |||
| && ( font->size == other->size) ) | |||
| { | |||
| vector_erase( self->fonts, i); | |||
| break; | |||
| } | |||
| } | |||
| texture_font_delete( font ); | |||
| } | |||
| // ----------------------------------------- font_manager_get_from_filename --- | |||
| texture_font_t * | |||
| font_manager_get_from_filename( font_manager_t *self, | |||
| const char * filename, | |||
| const float size ) | |||
| { | |||
| size_t i; | |||
| texture_font_t *font; | |||
| assert( self ); | |||
| for( i=0; i<vector_size(self->fonts); ++i ) | |||
| { | |||
| font = * (texture_font_t **) vector_get( self->fonts, i ); | |||
| if( (strcmp(font->filename, filename) == 0) && ( font->size == size) ) | |||
| { | |||
| return font; | |||
| } | |||
| } | |||
| font = texture_font_new_from_file( self->atlas, size, filename ); | |||
| if( font ) | |||
| { | |||
| vector_push_back( self->fonts, &font ); | |||
| texture_font_load_glyphs( font, self->cache ); | |||
| return font; | |||
| } | |||
| fprintf( stderr, "Unable to load \"%s\" (size=%.1f)\n", filename, size ); | |||
| return 0; | |||
| } | |||
| // ----------------------------------------- font_manager_get_from_description --- | |||
| texture_font_t * | |||
| font_manager_get_from_description( font_manager_t *self, | |||
| const char * family, | |||
| const float size, | |||
| const int bold, | |||
| const int italic ) | |||
| { | |||
| texture_font_t *font; | |||
| char *filename = 0; | |||
| assert( self ); | |||
| if( file_exists( family ) ) | |||
| { | |||
| filename = strdup( family ); | |||
| } | |||
| else | |||
| { | |||
| #if defined(_WIN32) || defined(_WIN64) | |||
| fprintf( stderr, "\"font_manager_get_from_description\" not implemented yet.\n" ); | |||
| return 0; | |||
| #endif | |||
| filename = font_manager_match_description( self, family, size, bold, italic ); | |||
| if( !filename ) | |||
| { | |||
| fprintf( stderr, "No \"%s (size=%.1f, bold=%d, italic=%d)\" font available.\n", | |||
| family, size, bold, italic ); | |||
| return 0; | |||
| } | |||
| } | |||
| font = font_manager_get_from_filename( self, filename, size ); | |||
| free( filename ); | |||
| return font; | |||
| } | |||
| // ------------------------------------------- font_manager_get_from_markup --- | |||
| texture_font_t * | |||
| font_manager_get_from_markup( font_manager_t *self, | |||
| const markup_t *markup ) | |||
| { | |||
| assert( self ); | |||
| assert( markup ); | |||
| return font_manager_get_from_description( self, markup->family, markup->size, | |||
| markup->bold, markup->italic ); | |||
| } | |||
| // ----------------------------------------- font_manager_match_description --- | |||
| char * | |||
| font_manager_match_description( font_manager_t * self, | |||
| const char * family, | |||
| const float size, | |||
| const int bold, | |||
| const int italic ) | |||
| { | |||
| // Use of fontconfig is disabled by default. | |||
| #if 1 | |||
| return 0; | |||
| #else | |||
| # if defined _WIN32 || defined _WIN64 | |||
| fprintf( stderr, "\"font_manager_match_description\" not implemented for windows.\n" ); | |||
| return 0; | |||
| # endif | |||
| char *filename = 0; | |||
| int weight = FC_WEIGHT_REGULAR; | |||
| int slant = FC_SLANT_ROMAN; | |||
| if ( bold ) | |||
| { | |||
| weight = FC_WEIGHT_BOLD; | |||
| } | |||
| if( italic ) | |||
| { | |||
| slant = FC_SLANT_ITALIC; | |||
| } | |||
| FcInit(); | |||
| FcPattern *pattern = FcPatternCreate(); | |||
| FcPatternAddDouble( pattern, FC_SIZE, size ); | |||
| FcPatternAddInteger( pattern, FC_WEIGHT, weight ); | |||
| FcPatternAddInteger( pattern, FC_SLANT, slant ); | |||
| FcPatternAddString( pattern, FC_FAMILY, (FcChar8*) family ); | |||
| FcConfigSubstitute( 0, pattern, FcMatchPattern ); | |||
| FcDefaultSubstitute( pattern ); | |||
| FcResult result; | |||
| FcPattern *match = FcFontMatch( 0, pattern, &result ); | |||
| FcPatternDestroy( pattern ); | |||
| if ( !match ) | |||
| { | |||
| fprintf( stderr, "fontconfig error: could not match family '%s'", family ); | |||
| return 0; | |||
| } | |||
| else | |||
| { | |||
| FcValue value; | |||
| FcResult result = FcPatternGet( match, FC_FILE, 0, &value ); | |||
| if ( result ) | |||
| { | |||
| fprintf( stderr, "fontconfig error: could not match family '%s'", family ); | |||
| } | |||
| else | |||
| { | |||
| filename = strdup( (char *)(value.u.s) ); | |||
| } | |||
| } | |||
| FcPatternDestroy( match ); | |||
| return filename; | |||
| #endif | |||
| } | |||
| @@ -1,205 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #ifndef __FONT_MANAGER_H__ | |||
| #define __FONT_MANAGER_H__ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| #include "vector.h" | |||
| #include "markup.h" | |||
| #include "texture-font.h" | |||
| #include "texture-atlas.h" | |||
| /** | |||
| * @file font-manager.h | |||
| * @author Nicolas Rougier (Nicolas.Rougier@inria.fr) | |||
| * | |||
| * @defgroup font-manager Font manager | |||
| * | |||
| * Structure in charge of caching fonts. | |||
| * | |||
| * <b>Example Usage</b>: | |||
| * @code | |||
| * #include "font-manager.h" | |||
| * | |||
| * int main( int arrgc, char *argv[] ) | |||
| * { | |||
| * font_manager_t * manager = manager_new( 512, 512, 1 ); | |||
| * texture_font_t * font = font_manager_get( manager, "Mono", 12, 0, 0 ); | |||
| * | |||
| * return 0; | |||
| * } | |||
| * @endcode | |||
| * | |||
| * @{ | |||
| */ | |||
| /** | |||
| * Structure in charge of caching fonts. | |||
| */ | |||
| typedef struct font_manager_t { | |||
| /** | |||
| * Texture atlas to hold font glyphs. | |||
| */ | |||
| texture_atlas_t * atlas; | |||
| /** | |||
| * Cached textures. | |||
| */ | |||
| vector_t * fonts; | |||
| /** | |||
| * Default glyphs to be loaded when loading a new font. | |||
| */ | |||
| wchar_t * cache; | |||
| } font_manager_t; | |||
| /** | |||
| * Creates a new empty font manager. | |||
| * | |||
| * @param width width of the underlying atlas | |||
| * @param height height of the underlying atlas | |||
| * @param depth bit depth of the underlying atlas | |||
| * | |||
| * @return a new font manager. | |||
| * | |||
| */ | |||
| font_manager_t * | |||
| font_manager_new( size_t width, | |||
| size_t height, | |||
| size_t depth ); | |||
| /** | |||
| * Deletes a font manager. | |||
| * | |||
| * @param self a font manager. | |||
| */ | |||
| void | |||
| font_manager_delete( font_manager_t *self ); | |||
| /** | |||
| * Deletes a font from the font manager. | |||
| * | |||
| * Note that font glyphs are not removed from the atlas. | |||
| * | |||
| * @param self a font manager. | |||
| * @param font font to be deleted | |||
| * | |||
| */ | |||
| void | |||
| font_manager_delete_font( font_manager_t * self, | |||
| texture_font_t * font ); | |||
| /** | |||
| * Request for a font based on a filename. | |||
| * | |||
| * @param self a font manager. | |||
| * @param filename font filename | |||
| * @param size font size | |||
| * | |||
| * @return Requested font | |||
| */ | |||
| texture_font_t * | |||
| font_manager_get_from_filename( font_manager_t * self, | |||
| const char * filename, | |||
| const float size ); | |||
| /** | |||
| * Request for a font based on a description | |||
| * | |||
| * @param self a font manager | |||
| * @param family font family | |||
| * @param size font size | |||
| * @param bold whether font is bold | |||
| * @param italic whether font is italic | |||
| * | |||
| * @return Requested font | |||
| */ | |||
| texture_font_t * | |||
| font_manager_get_from_description( font_manager_t * self, | |||
| const char * family, | |||
| const float size, | |||
| const int bold, | |||
| const int italic ); | |||
| /** | |||
| * Request for a font based on a markup | |||
| * | |||
| * @param self a font manager | |||
| * @param markup Markup describing a font | |||
| * | |||
| * @return Requested font | |||
| */ | |||
| texture_font_t * | |||
| font_manager_get_from_markup( font_manager_t *self, | |||
| const markup_t *markup ); | |||
| /** | |||
| * Search for a font filename that match description. | |||
| * | |||
| * @param self a font manager | |||
| * @param family font family | |||
| * @param size font size | |||
| * @param bold whether font is bold | |||
| * @param italic whether font is italic | |||
| * | |||
| * @return Requested font filename | |||
| */ | |||
| char * | |||
| font_manager_match_description( font_manager_t * self, | |||
| const char * family, | |||
| const float size, | |||
| const int bold, | |||
| const int italic ); | |||
| /** @} */ | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif // ifdef __cplusplus | |||
| #endif /* __FONT_MANAGER_H__ */ | |||
| @@ -1,241 +0,0 @@ | |||
| /* this macro is used to define an error */ | |||
| #define FT_ERRORDEF_( e, v, s ) \ | |||
| FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) | |||
| /* this is only used for <module>_Err_Ok, which must be 0! */ | |||
| #define FT_NOERRORDEF_( e, v, s ) \ | |||
| FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) | |||
| FT_ERROR_START_LIST | |||
| /*******************************************************************/ | |||
| /*******************************************************************/ | |||
| /***** *****/ | |||
| /***** LIST OF ERROR CODES/MESSAGES *****/ | |||
| /***** *****/ | |||
| /*******************************************************************/ | |||
| /*******************************************************************/ | |||
| /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */ | |||
| /* including this file. */ | |||
| /* generic errors */ | |||
| FT_NOERRORDEF_( Ok, 0x00, \ | |||
| "no error" ) | |||
| FT_ERRORDEF_( Cannot_Open_Resource, 0x01, \ | |||
| "cannot open resource" ) | |||
| FT_ERRORDEF_( Unknown_File_Format, 0x02, \ | |||
| "unknown file format" ) | |||
| FT_ERRORDEF_( Invalid_File_Format, 0x03, \ | |||
| "broken file" ) | |||
| FT_ERRORDEF_( Invalid_Version, 0x04, \ | |||
| "invalid FreeType version" ) | |||
| FT_ERRORDEF_( Lower_Module_Version, 0x05, \ | |||
| "module version is too low" ) | |||
| FT_ERRORDEF_( Invalid_Argument, 0x06, \ | |||
| "invalid argument" ) | |||
| FT_ERRORDEF_( Unimplemented_Feature, 0x07, \ | |||
| "unimplemented feature" ) | |||
| FT_ERRORDEF_( Invalid_Table, 0x08, \ | |||
| "broken table" ) | |||
| FT_ERRORDEF_( Invalid_Offset, 0x09, \ | |||
| "broken offset within table" ) | |||
| FT_ERRORDEF_( Array_Too_Large, 0x0A, \ | |||
| "array allocation size too large" ) | |||
| FT_ERRORDEF_( Missing_Module, 0x0B, \ | |||
| "missing module" ) | |||
| FT_ERRORDEF_( Missing_Property, 0x0C, \ | |||
| "missing property" ) | |||
| /* glyph/character errors */ | |||
| FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, \ | |||
| "invalid glyph index" ) | |||
| FT_ERRORDEF_( Invalid_Character_Code, 0x11, \ | |||
| "invalid character code" ) | |||
| FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, \ | |||
| "unsupported glyph image format" ) | |||
| FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, \ | |||
| "cannot render this glyph format" ) | |||
| FT_ERRORDEF_( Invalid_Outline, 0x14, \ | |||
| "invalid outline" ) | |||
| FT_ERRORDEF_( Invalid_Composite, 0x15, \ | |||
| "invalid composite glyph" ) | |||
| FT_ERRORDEF_( Too_Many_Hints, 0x16, \ | |||
| "too many hints" ) | |||
| FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, \ | |||
| "invalid pixel size" ) | |||
| /* handle errors */ | |||
| FT_ERRORDEF_( Invalid_Handle, 0x20, \ | |||
| "invalid object handle" ) | |||
| FT_ERRORDEF_( Invalid_Library_Handle, 0x21, \ | |||
| "invalid library handle" ) | |||
| FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, \ | |||
| "invalid module handle" ) | |||
| FT_ERRORDEF_( Invalid_Face_Handle, 0x23, \ | |||
| "invalid face handle" ) | |||
| FT_ERRORDEF_( Invalid_Size_Handle, 0x24, \ | |||
| "invalid size handle" ) | |||
| FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, \ | |||
| "invalid glyph slot handle" ) | |||
| FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, \ | |||
| "invalid charmap handle" ) | |||
| FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, \ | |||
| "invalid cache manager handle" ) | |||
| FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, \ | |||
| "invalid stream handle" ) | |||
| /* driver errors */ | |||
| FT_ERRORDEF_( Too_Many_Drivers, 0x30, \ | |||
| "too many modules" ) | |||
| FT_ERRORDEF_( Too_Many_Extensions, 0x31, \ | |||
| "too many extensions" ) | |||
| /* memory errors */ | |||
| FT_ERRORDEF_( Out_Of_Memory, 0x40, \ | |||
| "out of memory" ) | |||
| FT_ERRORDEF_( Unlisted_Object, 0x41, \ | |||
| "unlisted object" ) | |||
| /* stream errors */ | |||
| FT_ERRORDEF_( Cannot_Open_Stream, 0x51, \ | |||
| "cannot open stream" ) | |||
| FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, \ | |||
| "invalid stream seek" ) | |||
| FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, \ | |||
| "invalid stream skip" ) | |||
| FT_ERRORDEF_( Invalid_Stream_Read, 0x54, \ | |||
| "invalid stream read" ) | |||
| FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, \ | |||
| "invalid stream operation" ) | |||
| FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, \ | |||
| "invalid frame operation" ) | |||
| FT_ERRORDEF_( Nested_Frame_Access, 0x57, \ | |||
| "nested frame access" ) | |||
| FT_ERRORDEF_( Invalid_Frame_Read, 0x58, \ | |||
| "invalid frame read" ) | |||
| /* raster errors */ | |||
| FT_ERRORDEF_( Raster_Uninitialized, 0x60, \ | |||
| "raster uninitialized" ) | |||
| FT_ERRORDEF_( Raster_Corrupted, 0x61, \ | |||
| "raster corrupted" ) | |||
| FT_ERRORDEF_( Raster_Overflow, 0x62, \ | |||
| "raster overflow" ) | |||
| FT_ERRORDEF_( Raster_Negative_Height, 0x63, \ | |||
| "negative height while rastering" ) | |||
| /* cache errors */ | |||
| FT_ERRORDEF_( Too_Many_Caches, 0x70, \ | |||
| "too many registered caches" ) | |||
| /* TrueType and SFNT errors */ | |||
| FT_ERRORDEF_( Invalid_Opcode, 0x80, \ | |||
| "invalid opcode" ) | |||
| FT_ERRORDEF_( Too_Few_Arguments, 0x81, \ | |||
| "too few arguments" ) | |||
| FT_ERRORDEF_( Stack_Overflow, 0x82, \ | |||
| "stack overflow" ) | |||
| FT_ERRORDEF_( Code_Overflow, 0x83, \ | |||
| "code overflow" ) | |||
| FT_ERRORDEF_( Bad_Argument, 0x84, \ | |||
| "bad argument" ) | |||
| FT_ERRORDEF_( Divide_By_Zero, 0x85, \ | |||
| "division by zero" ) | |||
| FT_ERRORDEF_( Invalid_Reference, 0x86, \ | |||
| "invalid reference" ) | |||
| FT_ERRORDEF_( Debug_OpCode, 0x87, \ | |||
| "found debug opcode" ) | |||
| FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, \ | |||
| "found ENDF opcode in execution stream" ) | |||
| FT_ERRORDEF_( Nested_DEFS, 0x89, \ | |||
| "nested DEFS" ) | |||
| FT_ERRORDEF_( Invalid_CodeRange, 0x8A, \ | |||
| "invalid code range" ) | |||
| FT_ERRORDEF_( Execution_Too_Long, 0x8B, \ | |||
| "execution context too long" ) | |||
| FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, \ | |||
| "too many function definitions" ) | |||
| FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, \ | |||
| "too many instruction definitions" ) | |||
| FT_ERRORDEF_( Table_Missing, 0x8E, \ | |||
| "SFNT font table missing" ) | |||
| FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, \ | |||
| "horizontal header (hhea) table missing" ) | |||
| FT_ERRORDEF_( Locations_Missing, 0x90, \ | |||
| "locations (loca) table missing" ) | |||
| FT_ERRORDEF_( Name_Table_Missing, 0x91, \ | |||
| "name table missing" ) | |||
| FT_ERRORDEF_( CMap_Table_Missing, 0x92, \ | |||
| "character map (cmap) table missing" ) | |||
| FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, \ | |||
| "horizontal metrics (hmtx) table missing" ) | |||
| FT_ERRORDEF_( Post_Table_Missing, 0x94, \ | |||
| "PostScript (post) table missing" ) | |||
| FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, \ | |||
| "invalid horizontal metrics" ) | |||
| FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, \ | |||
| "invalid character map (cmap) format" ) | |||
| FT_ERRORDEF_( Invalid_PPem, 0x97, \ | |||
| "invalid ppem value" ) | |||
| FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, \ | |||
| "invalid vertical metrics" ) | |||
| FT_ERRORDEF_( Could_Not_Find_Context, 0x99, \ | |||
| "could not find context" ) | |||
| FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, \ | |||
| "invalid PostScript (post) table format" ) | |||
| FT_ERRORDEF_( Invalid_Post_Table, 0x9B, \ | |||
| "invalid PostScript (post) table" ) | |||
| /* CFF, CID, and Type 1 errors */ | |||
| FT_ERRORDEF_( Syntax_Error, 0xA0, \ | |||
| "opcode syntax error" ) | |||
| FT_ERRORDEF_( Stack_Underflow, 0xA1, \ | |||
| "argument stack underflow" ) | |||
| FT_ERRORDEF_( Ignore, 0xA2, \ | |||
| "ignore" ) | |||
| FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, \ | |||
| "no Unicode glyph name found" ) | |||
| FT_ERRORDEF_( Glyph_Too_Big, 0xA4, \ | |||
| "glyph to big for hinting" ) | |||
| /* BDF errors */ | |||
| FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, \ | |||
| "`STARTFONT' field missing" ) | |||
| FT_ERRORDEF_( Missing_Font_Field, 0xB1, \ | |||
| "`FONT' field missing" ) | |||
| FT_ERRORDEF_( Missing_Size_Field, 0xB2, \ | |||
| "`SIZE' field missing" ) | |||
| FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, \ | |||
| "`FONTBOUNDINGBOX' field missing" ) | |||
| FT_ERRORDEF_( Missing_Chars_Field, 0xB4, \ | |||
| "`CHARS' field missing" ) | |||
| FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, \ | |||
| "`STARTCHAR' field missing" ) | |||
| FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, \ | |||
| "`ENCODING' field missing" ) | |||
| FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, \ | |||
| "`BBX' field missing" ) | |||
| FT_ERRORDEF_( Bbx_Too_Big, 0xB8, \ | |||
| "`BBX' too big" ) | |||
| FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, \ | |||
| "Font header corrupted or missing fields" ) | |||
| FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, \ | |||
| "Font glyphs corrupted or missing fields" ) | |||
| /* END */ | |||
| FT_ERROR_END_LIST | |||
| @@ -1,44 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #ifndef __FREETYPE_GL_H__ | |||
| #define __FREETYPE_GL_H__ | |||
| /* Mandatory */ | |||
| #include "opengl.h" | |||
| #include "vec234.h" | |||
| #include "vector.h" | |||
| #include "texture-atlas.h" | |||
| #include "texture-font.h" | |||
| #endif /* FREETYPE_GL_H */ | |||
| @@ -1,191 +0,0 @@ | |||
| /* ========================================================================= | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ========================================================================= */ | |||
| #ifndef __MARKUP_H__ | |||
| #define __MARKUP_H__ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| #include "texture-font.h" | |||
| #include "vec234.h" | |||
| /** | |||
| * @file markup.h | |||
| * @author Nicolas Rougier (Nicolas.Rougier@inria.fr) | |||
| * | |||
| * @defgroup markup Markup | |||
| * | |||
| * Simple structure that describes text properties. | |||
| * | |||
| * <b>Example Usage</b>: | |||
| * @code | |||
| * #include "markup.h" | |||
| * | |||
| * ... | |||
| * | |||
| * vec4 black = {{0.0, 0.0, 0.0, 1.0}}; | |||
| * vec4 white = {{1.0, 1.0, 1.0, 1.0}}; | |||
| * vec4 none = {{1.0, 1.0, 1.0, 0.0}}; | |||
| * | |||
| * markup_t normal = { | |||
| * .family = "Droid Serif", | |||
| * .size = 24.0, | |||
| * .bold = 0, | |||
| * .italic = 0, | |||
| * .rise = 0.0, | |||
| * .spacing = 1.0, | |||
| * .gamma = 1.0, | |||
| * .foreground_color = black, .background_color = none, | |||
| * .underline = 0, .underline_color = black, | |||
| * .overline = 0, .overline_color = black, | |||
| * .strikethrough = 0, .strikethrough_color = black, | |||
| * .font = 0, | |||
| * }; | |||
| * | |||
| * ... | |||
| * | |||
| * @endcode | |||
| * | |||
| * @{ | |||
| */ | |||
| /** | |||
| * Simple structure that describes text properties. | |||
| */ | |||
| typedef struct markup_t | |||
| { | |||
| /** | |||
| * A font family name such as "normal", "sans", "serif" or "monospace". | |||
| */ | |||
| char * family; | |||
| /** | |||
| * Font size. | |||
| */ | |||
| float size; | |||
| /** | |||
| * Whether text is bold. | |||
| */ | |||
| int bold; | |||
| /** | |||
| * Whether text is italic. | |||
| */ | |||
| int italic; | |||
| /** | |||
| * Vertical displacement from the baseline. | |||
| */ | |||
| float rise; | |||
| /** | |||
| * Spacing between letters. | |||
| */ | |||
| float spacing; | |||
| /** | |||
| * Gamma correction. | |||
| */ | |||
| float gamma; | |||
| /** | |||
| * Text color. | |||
| */ | |||
| vec4 foreground_color; | |||
| /** | |||
| * Background color. | |||
| */ | |||
| vec4 background_color; | |||
| /** | |||
| * Whether outline is active. | |||
| */ | |||
| int outline; | |||
| /** | |||
| * Outline color. | |||
| */ | |||
| vec4 outline_color; | |||
| /** | |||
| * Whether underline is active. | |||
| */ | |||
| int underline; | |||
| /** | |||
| * Underline color. | |||
| */ | |||
| vec4 underline_color; | |||
| /** | |||
| * Whether overline is active. | |||
| */ | |||
| int overline; | |||
| /** | |||
| * Overline color. | |||
| */ | |||
| vec4 overline_color; | |||
| /** | |||
| * Whether strikethrough is active. | |||
| */ | |||
| int strikethrough; | |||
| /** | |||
| * Strikethrough color. | |||
| */ | |||
| vec4 strikethrough_color; | |||
| /** | |||
| * Pointer on the corresponding font (family/size/bold/italic) | |||
| */ | |||
| texture_font_t * font; | |||
| } markup_t; | |||
| extern markup_t default_markup; | |||
| /** @} */ | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif /* __MARKUP_H__ */ | |||
| @@ -1,263 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #include <assert.h> | |||
| #include <stdlib.h> | |||
| #include <string.h> | |||
| #include <math.h> | |||
| #include "mat4.h" | |||
| #ifndef M_PI | |||
| # define M_PI 3.14159265358979323846 | |||
| #endif | |||
| mat4 * | |||
| mat4_new( void ) | |||
| { | |||
| mat4 *self = (mat4 *) malloc( sizeof(mat4) ); | |||
| return self; | |||
| } | |||
| void | |||
| mat4_set_zero( mat4 *self ) | |||
| { | |||
| assert( self ); | |||
| memset( self, 0, sizeof( mat4 )); | |||
| } | |||
| void | |||
| mat4_set_identity( mat4 *self ) | |||
| { | |||
| assert( self ); | |||
| memset( self, 0, sizeof( mat4 )); | |||
| self->m00 = 1.0; | |||
| self->m11 = 1.0; | |||
| self->m22 = 1.0; | |||
| self->m33 = 1.0; | |||
| } | |||
| void | |||
| mat4_multiply( mat4 *self, mat4 *other ) | |||
| { | |||
| mat4 m; | |||
| size_t i; | |||
| assert( self ); | |||
| assert( other ); | |||
| for( i=0; i<4; ++i ) | |||
| { | |||
| m.data[i*4+0] = | |||
| (self->data[i*4+0] * other->data[0*4+0]) + | |||
| (self->data[i*4+1] * other->data[1*4+0]) + | |||
| (self->data[i*4+2] * other->data[2*4+0]) + | |||
| (self->data[i*4+3] * other->data[3*4+0]) ; | |||
| m.data[i*4+1] = | |||
| (self->data[i*4+0] * other->data[0*4+1]) + | |||
| (self->data[i*4+1] * other->data[1*4+1]) + | |||
| (self->data[i*4+2] * other->data[2*4+1]) + | |||
| (self->data[i*4+3] * other->data[3*4+1]) ; | |||
| m.data[i*4+2] = | |||
| (self->data[i*4+0] * other->data[0*4+2]) + | |||
| (self->data[i*4+1] * other->data[1*4+2]) + | |||
| (self->data[i*4+2] * other->data[2*4+2]) + | |||
| (self->data[i*4+3] * other->data[3*4+2]) ; | |||
| m.data[i*4+3] = | |||
| (self->data[i*4+0] * other->data[0*4+3]) + | |||
| (self->data[i*4+1] * other->data[1*4+3]) + | |||
| (self->data[i*4+2] * other->data[2*4+3]) + | |||
| (self->data[i*4+3] * other->data[3*4+3]) ; | |||
| } | |||
| memcpy( self, &m, sizeof( mat4 ) ); | |||
| } | |||
| void | |||
| mat4_set_orthographic( mat4 *self, | |||
| float left, float right, | |||
| float bottom, float top, | |||
| float znear, float zfar ) | |||
| { | |||
| assert( self ); | |||
| assert( right != left ); | |||
| assert( bottom != top ); | |||
| assert( znear != zfar ); | |||
| mat4_set_zero( self ); | |||
| self->m00 = +2.0/(right-left); | |||
| self->m30 = -(right+left)/(right-left); | |||
| self->m11 = +2.0/(top-bottom); | |||
| self->m31 = -(top+bottom)/(top-bottom); | |||
| self->m22 = -2.0/(zfar-znear); | |||
| self->m32 = -(zfar+znear)/(zfar-znear); | |||
| self->m33 = 1.0; | |||
| } | |||
| void | |||
| mat4_set_perspective( mat4 *self, | |||
| float fovy, float aspect, | |||
| float znear, float zfar) | |||
| { | |||
| float h, w; | |||
| assert( self ); | |||
| assert( znear != zfar ); | |||
| h = tan(fovy / 360.0 * M_PI) * znear; | |||
| w = h * aspect; | |||
| mat4_set_frustum( self, -w, w, -h, h, znear, zfar ); | |||
| } | |||
| void | |||
| mat4_set_frustum( mat4 *self, | |||
| float left, float right, | |||
| float bottom, float top, | |||
| float znear, float zfar ) | |||
| { | |||
| assert( self ); | |||
| assert( right != left ); | |||
| assert( bottom != top ); | |||
| assert( znear != zfar ); | |||
| mat4_set_zero( self ); | |||
| self->m00 = (2.0*znear)/(right-left); | |||
| self->m20 = (right+left)/(right-left); | |||
| self->m11 = (2.0*znear)/(top-bottom); | |||
| self->m21 = (top+bottom)/(top-bottom); | |||
| self->m22 = -(zfar+znear)/(zfar-znear); | |||
| self->m32 = -(2.0*zfar*znear)/(zfar-znear); | |||
| self->m23 = -1.0; | |||
| } | |||
| void | |||
| mat4_set_rotation( mat4 *self, | |||
| float angle, | |||
| float x, float y, float z) | |||
| { | |||
| float c, s, norm; | |||
| assert( self ); | |||
| c = cos( M_PI*angle/180.0 ); | |||
| s = sin( M_PI*angle/180.0 ); | |||
| norm = sqrt(x*x+y*y+z*z); | |||
| x /= norm; y /= norm; z /= norm; | |||
| mat4_set_identity( self ); | |||
| self->m00 = x*x*(1-c)+c; | |||
| self->m10 = y*x*(1-c)-z*s; | |||
| self->m20 = z*x*(1-c)+y*s; | |||
| self->m01 = x*y*(1-c)+z*s; | |||
| self->m11 = y*y*(1-c)+c; | |||
| self->m21 = z*y*(1-c)-x*s; | |||
| self->m02 = x*z*(1-c)-y*s; | |||
| self->m12 = y*z*(1-c)+x*s; | |||
| self->m22 = z*z*(1-c)+c; | |||
| } | |||
| void | |||
| mat4_set_translation( mat4 *self, | |||
| float x, float y, float z) | |||
| { | |||
| assert( self ); | |||
| mat4_set_identity( self ); | |||
| self-> m30 = x; | |||
| self-> m31 = y; | |||
| self-> m32 = z; | |||
| } | |||
| void | |||
| mat4_set_scaling( mat4 *self, | |||
| float x, float y, float z) | |||
| { | |||
| assert( self ); | |||
| mat4_set_identity( self ); | |||
| self-> m00 = x; | |||
| self-> m11 = y; | |||
| self-> m22 = z; | |||
| } | |||
| void | |||
| mat4_rotate( mat4 *self, | |||
| float angle, | |||
| float x, float y, float z) | |||
| { | |||
| mat4 m; | |||
| assert( self ); | |||
| mat4_set_rotation( &m, angle, x, y, z); | |||
| mat4_multiply( self, &m ); | |||
| } | |||
| void | |||
| mat4_translate( mat4 *self, | |||
| float x, float y, float z) | |||
| { | |||
| mat4 m; | |||
| assert( self ); | |||
| mat4_set_translation( &m, x, y, z); | |||
| mat4_multiply( self, &m ); | |||
| } | |||
| void | |||
| mat4_scale( mat4 *self, | |||
| float x, float y, float z) | |||
| { | |||
| mat4 m; | |||
| assert( self ); | |||
| mat4_set_scaling( &m, x, y, z); | |||
| mat4_multiply( self, &m ); | |||
| } | |||
| @@ -1,117 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #ifndef __MAT4_H__ | |||
| #define __MAT4_H__ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /** | |||
| * | |||
| */ | |||
| typedef union | |||
| { | |||
| float data[16]; /**< All compoments at once */ | |||
| struct { | |||
| float m00, m01, m02, m03; | |||
| float m10, m11, m12, m13; | |||
| float m20, m21, m22, m23; | |||
| float m30, m31, m32, m33; | |||
| }; | |||
| } mat4; | |||
| mat4 * | |||
| mat4_new( void ); | |||
| void | |||
| mat4_set_identity( mat4 *self ); | |||
| void | |||
| mat4_set_zero( mat4 *self ); | |||
| void | |||
| mat4_multiply( mat4 *self, mat4 *other ); | |||
| void | |||
| mat4_set_orthographic( mat4 *self, | |||
| float left, float right, | |||
| float bottom, float top, | |||
| float znear, float zfar ); | |||
| void | |||
| mat4_set_perspective( mat4 *self, | |||
| float fovy, float aspect, | |||
| float zNear, float zFar); | |||
| void | |||
| mat4_set_frustum( mat4 *self, | |||
| float left, float right, | |||
| float bottom, float top, | |||
| float znear, float zfar ); | |||
| void | |||
| mat4_set_rotation( mat4 *self, | |||
| float angle, | |||
| float x, float y, float z); | |||
| void | |||
| mat4_set_translation( mat4 *self, | |||
| float x, float y, float z); | |||
| void | |||
| mat4_set_scaling( mat4 *self, | |||
| float x, float y, float z); | |||
| void | |||
| mat4_rotate( mat4 *self, | |||
| float angle, | |||
| float x, float y, float z); | |||
| void | |||
| mat4_translate( mat4 *self, | |||
| float x, float y, float z); | |||
| void | |||
| mat4_scale( mat4 *self, | |||
| float x, float y, float z); | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif /* __MAT4_H__ */ | |||
| @@ -1,37 +0,0 @@ | |||
| /* | |||
| * DISTRHO Plugin Framework (DPF) | |||
| * Copyright (C) 2012-2014 Filipe Coelho <falktx@falktx.com> | |||
| * | |||
| * Permission to use, copy, modify, and/or distribute this software for any purpose with | |||
| * or without fee is hereby granted, provided that the above copyright notice and this | |||
| * permission notice appear in all copies. | |||
| * | |||
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD | |||
| * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN | |||
| * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL | |||
| * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |||
| * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | |||
| * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
| */ | |||
| #include "../../../distrho/src/DistrhoDefines.h" | |||
| /* GL includes */ | |||
| #ifdef DISTRHO_OS_MAC | |||
| # include <OpenGL/gl.h> | |||
| #else | |||
| # include <GL/gl.h> | |||
| #endif | |||
| /* missing GL defines */ | |||
| #if defined(GL_BGR_EXT) && ! defined(GL_BGR) | |||
| # define GL_BGR GL_BGR_EXT | |||
| #endif | |||
| #if defined(GL_BGRA_EXT) && ! defined(GL_BGRA) | |||
| # define GL_BGRA GL_BGRA_EXT | |||
| #endif | |||
| #ifndef GL_CLAMP_TO_BORDER | |||
| # define GL_CLAMP_TO_BORDER 0x812D | |||
| #endif | |||
| @@ -1,71 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #ifndef __PLATFORM_H__ | |||
| #define __PLATFORM_H__ | |||
| #include <stdlib.h> | |||
| //------------------------------------------------- | |||
| // stdint.h is not available on VS2008 or lower | |||
| //------------------------------------------------- | |||
| #ifdef _MSC_VER | |||
| typedef __int32 int32_t; | |||
| typedef unsigned __int32 uint32_t; | |||
| typedef __int64 int64_t; | |||
| typedef unsigned __int64 uint64_t; | |||
| #else | |||
| #include <stdint.h> | |||
| #endif // _MSC_VER | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| #ifdef __APPLE__ | |||
| /* strndup() was only added in OSX lion */ | |||
| char * strndup( const char *s1, size_t n); | |||
| #elif defined(_WIN32) || defined(_WIN64) | |||
| /* does not exist on windows */ | |||
| char * strndup( const char *s1, size_t n); | |||
| # if !defined(_MSC_VER) || _MSC_VER < 1800 | |||
| double round(double v); | |||
| # endif // _MSC_VER | |||
| # pragma warning (disable: 4244) // suspend warnings | |||
| #endif // _WIN32 || _WIN64 | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif // __cplusplus | |||
| #endif /* __PLATFORM_H__ */ | |||
| @@ -1,124 +0,0 @@ | |||
| // ---------------------------------------------------------------------------- | |||
| // OpenGL Anti-Grain Geometry (GL-AGG) - Version 0.1 | |||
| // A high quality OpenGL rendering engine for C | |||
| // Copyright (C) 2012 Nicolas P. Rougier. All rights reserved. | |||
| // Contact: Nicolas.Rougier@gmail.com | |||
| // http://code.google.com/p/gl-agg/ | |||
| // | |||
| // Redistribution and use in source and binary forms, with or without | |||
| // modification, are permitted provided that the following conditions are met: | |||
| // | |||
| // 1. Redistributions of source code must retain the above copyright notice, | |||
| // this list of conditions and the following disclaimer. | |||
| // | |||
| // 2. Redistributions in binary form must reproduce the above copyright | |||
| // notice, this list of conditions and the following disclaimer in the | |||
| // documentation and/or other materials provided with the distribution. | |||
| // | |||
| // THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| // EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| // | |||
| // The views and conclusions contained in the software and documentation are | |||
| // those of the authors and should not be interpreted as representing official | |||
| // policies, either expressed or implied, of Nicolas P. Rougier. | |||
| // ---------------------------------------------------------------------------- | |||
| #include <stdio.h> | |||
| #include <stdlib.h> | |||
| #include <string.h> | |||
| #include "opengl.h" | |||
| #include "shader.h" | |||
| // ------------------------------------------------------------ shader_read --- | |||
| char * | |||
| shader_read( const char *filename ) | |||
| { | |||
| FILE * file; | |||
| char * buffer; | |||
| size_t size; | |||
| file = fopen( filename, "rb" ); | |||
| if( !file ) | |||
| { | |||
| fprintf( stderr, "Unable to open file \"%s\".\n", filename ); | |||
| return 0; | |||
| } | |||
| fseek( file, 0, SEEK_END ); | |||
| size = ftell( file ); | |||
| fseek(file, 0, SEEK_SET ); | |||
| buffer = (char *) malloc( (size+1) * sizeof( char *) ); | |||
| fread( buffer, sizeof(char), size, file ); | |||
| buffer[size] = 0; | |||
| fclose( file ); | |||
| return buffer; | |||
| } | |||
| // --------------------------------------------------------- shader_compile --- | |||
| GLuint | |||
| shader_compile( const char* source, | |||
| const GLenum type ) | |||
| { | |||
| GLint compile_status; | |||
| GLuint handle = glCreateShader( type ); | |||
| glShaderSource( handle, 1, &source, 0 ); | |||
| glCompileShader( handle ); | |||
| glGetShaderiv( handle, GL_COMPILE_STATUS, &compile_status ); | |||
| if( compile_status == GL_FALSE ) | |||
| { | |||
| GLchar messages[256]; | |||
| glGetShaderInfoLog( handle, sizeof(messages), 0, &messages[0] ); | |||
| fprintf( stderr, "%s\n", messages ); | |||
| exit( EXIT_FAILURE ); | |||
| } | |||
| return handle; | |||
| } | |||
| // ------------------------------------------------------------ shader_load --- | |||
| GLuint | |||
| shader_load( const char * vert_filename, | |||
| const char * frag_filename ) | |||
| { | |||
| GLuint handle = glCreateProgram( ); | |||
| GLint link_status; | |||
| if( vert_filename && strlen( vert_filename ) ) | |||
| { | |||
| char *vert_source = shader_read( vert_filename ); | |||
| GLuint vert_shader = shader_compile( vert_source, GL_VERTEX_SHADER); | |||
| glAttachShader( handle, vert_shader); | |||
| glDeleteShader( vert_shader ); | |||
| free( vert_source ); | |||
| } | |||
| if( frag_filename && strlen( frag_filename ) ) | |||
| { | |||
| char *frag_source = shader_read( frag_filename ); | |||
| GLuint frag_shader = shader_compile( frag_source, GL_FRAGMENT_SHADER); | |||
| glAttachShader( handle, frag_shader); | |||
| glDeleteShader( frag_shader ); | |||
| free( frag_source ); | |||
| } | |||
| glLinkProgram( handle ); | |||
| glGetProgramiv( handle, GL_LINK_STATUS, &link_status ); | |||
| if (link_status == GL_FALSE) | |||
| { | |||
| GLchar messages[256]; | |||
| glGetProgramInfoLog( handle, sizeof(messages), 0, &messages[0] ); | |||
| fprintf( stderr, "%s\n", messages ); | |||
| exit(1); | |||
| } | |||
| return handle; | |||
| } | |||
| @@ -1,119 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012,2013 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ---------------------------------------------------------------------------- | |||
| */ | |||
| #ifndef __SHADER_H__ | |||
| #define __SHADER_H__ | |||
| #include "opengl.h" | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /** | |||
| * @file shader.h | |||
| * @author Nicolas Rougier (Nicolas.Rougier@inria.fr) | |||
| * | |||
| * @defgroup shader Shader | |||
| * | |||
| * Simple functions for loading/building a shader from sources. | |||
| * | |||
| * <b>Example Usage</b>: | |||
| * @code | |||
| * #include "shader.h" | |||
| * | |||
| * int main( int arrgc, char *argv[] ) | |||
| * { | |||
| * GLuint shader = shader_load("shader.vert", "shader.frag"); | |||
| * | |||
| * return 0; | |||
| * } | |||
| * @endcode | |||
| * | |||
| * @{ | |||
| */ | |||
| /** | |||
| * Read a fragment or vertex shader from a file | |||
| * | |||
| * @param filename file to read shader from | |||
| * @return a newly-allocated text buffer containing code. This buffer | |||
| * must be freed after usage. | |||
| * | |||
| */ | |||
| char * | |||
| shader_read( const char *filename ); | |||
| /** | |||
| * Compile a shader from a text buffer. | |||
| * | |||
| * @param source code of the shader | |||
| * @param type type of the shader | |||
| * | |||
| * @return a handle on the compiled program | |||
| * | |||
| */ | |||
| GLuint | |||
| shader_compile( const char* source, | |||
| const GLenum type ); | |||
| /** | |||
| * Load a vertex and fragment shader sources and build program | |||
| * | |||
| * @param vert_filename vertex shader filename | |||
| * @param frag_filename fragment shader filename | |||
| * | |||
| * @return a handle on the built program | |||
| * | |||
| */ | |||
| GLuint | |||
| shader_load( const char * vert_filename, | |||
| const char * frag_filename ); | |||
| /** | |||
| * | |||
| */ | |||
| GLuint | |||
| shader_get( GLuint self, | |||
| const char * name ); | |||
| /** @} */ | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif /* __SHADER_H__ */ | |||
| @@ -1,448 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #include <wchar.h> | |||
| #include <stdio.h> | |||
| #include <stdlib.h> | |||
| #include <stdarg.h> | |||
| #include <assert.h> | |||
| #include "opengl.h" | |||
| #include "text-buffer.h" | |||
| #define SET_GLYPH_VERTEX(value,x0,y0,z0,s0,t0,r,g,b,a,sh,gm) { \ | |||
| glyph_vertex_t *gv=&value; \ | |||
| gv->x=x0; gv->y=y0; gv->z=z0; \ | |||
| gv->u=s0; gv->v=t0; \ | |||
| gv->r=r; gv->g=g; gv->b=b; gv->a=a; \ | |||
| gv->shift=sh; gv->gamma=gm;} | |||
| // ---------------------------------------------------------------------------- | |||
| text_buffer_t * | |||
| text_buffer_new( size_t depth ) | |||
| { | |||
| text_buffer_t *self = (text_buffer_t *) malloc (sizeof(text_buffer_t)); | |||
| self->buffer = vertex_buffer_new( | |||
| "vertex:3f,tex_coord:2f,color:4f,ashift:1f,agamma:1f" ); | |||
| self->manager = font_manager_new( 512, 512, depth ); | |||
| self->shader = shader_load("shaders/text.vert", | |||
| "shaders/text.frag"); | |||
| self->shader_texture = glGetUniformLocation(self->shader, "texture"); | |||
| self->shader_pixel = glGetUniformLocation(self->shader, "pixel"); | |||
| self->line_start = 0; | |||
| self->line_ascender = 0; | |||
| self->base_color.r = 0.0; | |||
| self->base_color.g = 0.0; | |||
| self->base_color.b = 0.0; | |||
| self->base_color.a = 1.0; | |||
| self->line_descender = 0; | |||
| return self; | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| text_buffer_delete( text_buffer_t * self ) | |||
| { | |||
| vertex_buffer_delete( self->buffer ); | |||
| glDeleteProgram( self->shader ); | |||
| free( self ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| text_buffer_clear( text_buffer_t * self ) | |||
| { | |||
| assert( self ); | |||
| vertex_buffer_clear( self->buffer ); | |||
| self->line_start = 0; | |||
| self->line_ascender = 0; | |||
| self->line_descender = 0; | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| text_buffer_render( text_buffer_t * self ) | |||
| { | |||
| glEnable( GL_BLEND ); | |||
| glActiveTexture( GL_TEXTURE0 ); | |||
| glBindTexture( GL_TEXTURE_2D, self->manager->atlas->id ); | |||
| if( self->manager->atlas->depth == 1 ) | |||
| { | |||
| //glDisable( GL_COLOR_MATERIAL ); | |||
| glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); | |||
| glBlendColor( 1, 1, 1, 1 ); | |||
| } | |||
| else | |||
| { | |||
| //glEnable( GL_COLOR_MATERIAL ); | |||
| //glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); | |||
| //glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ); | |||
| //glBlendColor( 1.0, 1.0, 1.0, 1.0 ); | |||
| //glBlendFunc( GL_CONSTANT_COLOR_EXT, GL_ONE_MINUS_SRC_COLOR ); | |||
| //glBlendColor( self->base_color.r, | |||
| //self->base_color.g, | |||
| //self->base_color.b, | |||
| //self->base_color.a ); | |||
| glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); | |||
| glBlendColor( 1, 1, 1, 1 ); | |||
| } | |||
| glUseProgram( self->shader ); | |||
| glUniform1i( self->shader_texture, 0 ); | |||
| glUniform3f( self->shader_pixel, | |||
| 1.0/self->manager->atlas->width, | |||
| 1.0/self->manager->atlas->height, | |||
| self->manager->atlas->depth ); | |||
| vertex_buffer_render( self->buffer, GL_TRIANGLES ); | |||
| glUseProgram( 0 ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| text_buffer_printf( text_buffer_t * self, vec2 *pen, ... ) | |||
| { | |||
| markup_t *markup; | |||
| wchar_t *text; | |||
| va_list args; | |||
| if( vertex_buffer_size( self->buffer ) == 0 ) | |||
| { | |||
| self->origin = *pen; | |||
| } | |||
| va_start ( args, pen ); | |||
| do { | |||
| markup = va_arg( args, markup_t * ); | |||
| if( markup == NULL ) | |||
| { | |||
| return; | |||
| } | |||
| text = va_arg( args, wchar_t * ); | |||
| text_buffer_add_text( self, pen, markup, text, wcslen(text) ); | |||
| } while( markup != 0 ); | |||
| va_end ( args ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| text_buffer_move_last_line( text_buffer_t * self, float dy ) | |||
| { | |||
| size_t i, j; | |||
| for( i=self->line_start; i < vector_size( self->buffer->items ); ++i ) | |||
| { | |||
| ivec4 *item = (ivec4 *) vector_get( self->buffer->items, i); | |||
| for( j=item->vstart; j<item->vstart+item->vcount; ++j) | |||
| { | |||
| glyph_vertex_t * vertex = | |||
| (glyph_vertex_t *) vector_get( self->buffer->vertices, j ); | |||
| vertex->y -= dy; | |||
| } | |||
| } | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| text_buffer_add_text( text_buffer_t * self, | |||
| vec2 * pen, markup_t * markup, | |||
| wchar_t * text, size_t length ) | |||
| { | |||
| font_manager_t * manager = self->manager; | |||
| size_t i; | |||
| if( markup == NULL ) | |||
| { | |||
| return; | |||
| } | |||
| if( !markup->font ) | |||
| { | |||
| markup->font = font_manager_get_from_markup( manager, markup ); | |||
| if( ! markup->font ) | |||
| { | |||
| fprintf( stderr, "Houston, we've got a problem !\n" ); | |||
| exit( EXIT_FAILURE ); | |||
| } | |||
| } | |||
| if( length == 0 ) | |||
| { | |||
| length = wcslen(text); | |||
| } | |||
| if( vertex_buffer_size( self->buffer ) == 0 ) | |||
| { | |||
| self->origin = *pen; | |||
| } | |||
| text_buffer_add_wchar( self, pen, markup, text[0], 0 ); | |||
| for( i=1; i<length; ++i ) | |||
| { | |||
| text_buffer_add_wchar( self, pen, markup, text[i], text[i-1] ); | |||
| } | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| text_buffer_add_wchar( text_buffer_t * self, | |||
| vec2 * pen, markup_t * markup, | |||
| wchar_t current, wchar_t previous ) | |||
| { | |||
| size_t vcount = 0; | |||
| size_t icount = 0; | |||
| vertex_buffer_t * buffer = self->buffer; | |||
| texture_font_t * font = markup->font; | |||
| float gamma = markup->gamma; | |||
| // Maximum number of vertices is 20 (= 5x2 triangles) per glyph: | |||
| // - 2 triangles for background | |||
| // - 2 triangles for overline | |||
| // - 2 triangles for underline | |||
| // - 2 triangles for strikethrough | |||
| // - 2 triangles for glyph | |||
| glyph_vertex_t vertices[4*5]; | |||
| GLuint indices[6*5]; | |||
| texture_glyph_t *glyph; | |||
| texture_glyph_t *black; | |||
| float kerning = 0; | |||
| if( current == L'\n' ) | |||
| { | |||
| pen->x = self->origin.x; | |||
| pen->y += self->line_descender; | |||
| self->line_descender = 0; | |||
| self->line_ascender = 0; | |||
| self->line_start = vector_size( self->buffer->items ); | |||
| return; | |||
| } | |||
| if( markup->font->ascender > self->line_ascender ) | |||
| { | |||
| float y = pen->y; | |||
| pen->y -= (markup->font->ascender - self->line_ascender); | |||
| text_buffer_move_last_line( self, (int)(y-pen->y) ); | |||
| self->line_ascender = markup->font->ascender; | |||
| } | |||
| if( markup->font->descender < self->line_descender ) | |||
| { | |||
| self->line_descender = markup->font->descender; | |||
| } | |||
| glyph = texture_font_get_glyph( font, current ); | |||
| black = texture_font_get_glyph( font, -1 ); | |||
| if( glyph == NULL ) | |||
| { | |||
| return; | |||
| } | |||
| if( previous && markup->font->kerning ) | |||
| { | |||
| kerning = texture_glyph_get_kerning( glyph, previous ); | |||
| } | |||
| pen->x += kerning; | |||
| // Background | |||
| if( markup->background_color.alpha > 0 ) | |||
| { | |||
| float r = markup->background_color.r; | |||
| float g = markup->background_color.g; | |||
| float b = markup->background_color.b; | |||
| float a = markup->background_color.a; | |||
| float x0 = ( pen->x -kerning ); | |||
| float y0 = (int)( pen->y + font->descender ); | |||
| float x1 = ( x0 + glyph->advance_x ); | |||
| float y1 = (int)( y0 + font->height + font->linegap ); | |||
| float s0 = black->s0; | |||
| float t0 = black->t0; | |||
| float s1 = black->s1; | |||
| float t1 = black->t1; | |||
| SET_GLYPH_VERTEX(vertices[vcount+0], | |||
| (int)x0,y0,0, s0,t0, r,g,b,a, x0-((int)x0), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+1], | |||
| (int)x0,y1,0, s0,t1, r,g,b,a, x0-((int)x0), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+2], | |||
| (int)x1,y1,0, s1,t1, r,g,b,a, x1-((int)x1), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+3], | |||
| (int)x1,y0,0, s1,t0, r,g,b,a, x1-((int)x1), gamma ); | |||
| indices[icount + 0] = vcount+0; | |||
| indices[icount + 1] = vcount+1; | |||
| indices[icount + 2] = vcount+2; | |||
| indices[icount + 3] = vcount+0; | |||
| indices[icount + 4] = vcount+2; | |||
| indices[icount + 5] = vcount+3; | |||
| vcount += 4; | |||
| icount += 6; | |||
| } | |||
| // Underline | |||
| if( markup->underline ) | |||
| { | |||
| float r = markup->underline_color.r; | |||
| float g = markup->underline_color.g; | |||
| float b = markup->underline_color.b; | |||
| float a = markup->underline_color.a; | |||
| float x0 = ( pen->x - kerning ); | |||
| float y0 = (int)( pen->y + font->underline_position ); | |||
| float x1 = ( x0 + glyph->advance_x ); | |||
| float y1 = (int)( y0 + font->underline_thickness ); | |||
| float s0 = black->s0; | |||
| float t0 = black->t0; | |||
| float s1 = black->s1; | |||
| float t1 = black->t1; | |||
| SET_GLYPH_VERTEX(vertices[vcount+0], | |||
| (int)x0,y0,0, s0,t0, r,g,b,a, x0-((int)x0), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+1], | |||
| (int)x0,y1,0, s0,t1, r,g,b,a, x0-((int)x0), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+2], | |||
| (int)x1,y1,0, s1,t1, r,g,b,a, x1-((int)x1), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+3], | |||
| (int)x1,y0,0, s1,t0, r,g,b,a, x1-((int)x1), gamma ); | |||
| indices[icount + 0] = vcount+0; | |||
| indices[icount + 1] = vcount+1; | |||
| indices[icount + 2] = vcount+2; | |||
| indices[icount + 3] = vcount+0; | |||
| indices[icount + 4] = vcount+2; | |||
| indices[icount + 5] = vcount+3; | |||
| vcount += 4; | |||
| icount += 6; | |||
| } | |||
| // Overline | |||
| if( markup->overline ) | |||
| { | |||
| float r = markup->overline_color.r; | |||
| float g = markup->overline_color.g; | |||
| float b = markup->overline_color.b; | |||
| float a = markup->overline_color.a; | |||
| float x0 = ( pen->x -kerning ); | |||
| float y0 = (int)( pen->y + (int)font->ascender ); | |||
| float x1 = ( x0 + glyph->advance_x ); | |||
| float y1 = (int)( y0 + (int)font->underline_thickness ); | |||
| float s0 = black->s0; | |||
| float t0 = black->t0; | |||
| float s1 = black->s1; | |||
| float t1 = black->t1; | |||
| SET_GLYPH_VERTEX(vertices[vcount+0], | |||
| (int)x0,y0,0, s0,t0, r,g,b,a, x0-((int)x0), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+1], | |||
| (int)x0,y1,0, s0,t1, r,g,b,a, x0-((int)x0), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+2], | |||
| (int)x1,y1,0, s1,t1, r,g,b,a, x1-((int)x1), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+3], | |||
| (int)x1,y0,0, s1,t0, r,g,b,a, x1-((int)x1), gamma ); | |||
| indices[icount + 0] = vcount+0; | |||
| indices[icount + 1] = vcount+1; | |||
| indices[icount + 2] = vcount+2; | |||
| indices[icount + 3] = vcount+0; | |||
| indices[icount + 4] = vcount+2; | |||
| indices[icount + 5] = vcount+3; | |||
| vcount += 4; | |||
| icount += 6; | |||
| } | |||
| /* Strikethrough */ | |||
| if( markup->strikethrough ) | |||
| { | |||
| float r = markup->strikethrough_color.r; | |||
| float g = markup->strikethrough_color.g; | |||
| float b = markup->strikethrough_color.b; | |||
| float a = markup->strikethrough_color.a; | |||
| float x0 = ( pen->x -kerning ); | |||
| float y0 = (int)( pen->y + (int)font->ascender*.33); | |||
| float x1 = ( x0 + glyph->advance_x ); | |||
| float y1 = (int)( y0 + (int)font->underline_thickness ); | |||
| float s0 = black->s0; | |||
| float t0 = black->t0; | |||
| float s1 = black->s1; | |||
| float t1 = black->t1; | |||
| SET_GLYPH_VERTEX(vertices[vcount+0], | |||
| (int)x0,y0,0, s0,t0, r,g,b,a, x0-((int)x0), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+1], | |||
| (int)x0,y1,0, s0,t1, r,g,b,a, x0-((int)x0), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+2], | |||
| (int)x1,y1,0, s1,t1, r,g,b,a, x1-((int)x1), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+3], | |||
| (int)x1,y0,0, s1,t0, r,g,b,a, x1-((int)x1), gamma ); | |||
| indices[icount + 0] = vcount+0; | |||
| indices[icount + 1] = vcount+1; | |||
| indices[icount + 2] = vcount+2; | |||
| indices[icount + 3] = vcount+0; | |||
| indices[icount + 4] = vcount+2; | |||
| indices[icount + 5] = vcount+3; | |||
| vcount += 4; | |||
| icount += 6; | |||
| } | |||
| { | |||
| // Actual glyph | |||
| float r = markup->foreground_color.red; | |||
| float g = markup->foreground_color.green; | |||
| float b = markup->foreground_color.blue; | |||
| float a = markup->foreground_color.alpha; | |||
| float x0 = ( pen->x + glyph->offset_x ); | |||
| float y0 = (int)( pen->y + glyph->offset_y ); | |||
| float x1 = ( x0 + glyph->width ); | |||
| float y1 = (int)( y0 - glyph->height ); | |||
| float s0 = glyph->s0; | |||
| float t0 = glyph->t0; | |||
| float s1 = glyph->s1; | |||
| float t1 = glyph->t1; | |||
| SET_GLYPH_VERTEX(vertices[vcount+0], | |||
| (int)x0,y0,0, s0,t0, r,g,b,a, x0-((int)x0), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+1], | |||
| (int)x0,y1,0, s0,t1, r,g,b,a, x0-((int)x0), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+2], | |||
| (int)x1,y1,0, s1,t1, r,g,b,a, x1-((int)x1), gamma ); | |||
| SET_GLYPH_VERTEX(vertices[vcount+3], | |||
| (int)x1,y0,0, s1,t0, r,g,b,a, x1-((int)x1), gamma ); | |||
| indices[icount + 0] = vcount+0; | |||
| indices[icount + 1] = vcount+1; | |||
| indices[icount + 2] = vcount+2; | |||
| indices[icount + 3] = vcount+0; | |||
| indices[icount + 4] = vcount+2; | |||
| indices[icount + 5] = vcount+3; | |||
| vcount += 4; | |||
| icount += 6; | |||
| vertex_buffer_push_back( buffer, vertices, vcount, indices, icount ); | |||
| pen->x += glyph->advance_x * (1.0 + markup->spacing); | |||
| } | |||
| } | |||
| @@ -1,285 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #ifndef __TEXT_BUFFER_H__ | |||
| #define __TEXT_BUFFER_H__ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| #include "vertex-buffer.h" | |||
| #include "font-manager.h" | |||
| #include "markup.h" | |||
| #include "shader.h" | |||
| /** | |||
| * Use LCD filtering | |||
| */ | |||
| #define LCD_FILTERING_ON 3 | |||
| /** | |||
| * Do not use LCD filtering | |||
| */ | |||
| #define LCD_FILTERING_OFF 1 | |||
| /** | |||
| * @file text-buffer.h | |||
| * @author Nicolas Rougier (Nicolas.Rougier@inria.fr) | |||
| * | |||
| * @defgroup text-buffer Text buffer | |||
| * | |||
| * | |||
| * <b>Example Usage</b>: | |||
| * @code | |||
| * #include "shader.h" | |||
| * | |||
| * int main( int arrgc, char *argv[] ) | |||
| * { | |||
| * | |||
| * return 0; | |||
| * } | |||
| * @endcode | |||
| * | |||
| * @{ | |||
| */ | |||
| /** | |||
| * Text buffer structure | |||
| */ | |||
| typedef struct text_buffer_t { | |||
| /** | |||
| * Vertex buffer | |||
| */ | |||
| vertex_buffer_t *buffer; | |||
| /** | |||
| * Font manager | |||
| */ | |||
| font_manager_t *manager; | |||
| /** | |||
| * Base color for text | |||
| */ | |||
| vec4 base_color; | |||
| /** | |||
| * Pen origin | |||
| */ | |||
| vec2 origin; | |||
| /** | |||
| * Index (in the vertex buffer) of the line start | |||
| */ | |||
| size_t line_start; | |||
| /** | |||
| * Current line ascender | |||
| */ | |||
| float line_ascender; | |||
| /** | |||
| * Current line decender | |||
| */ | |||
| float line_descender; | |||
| /** | |||
| * Shader handler | |||
| */ | |||
| GLuint shader; | |||
| /** | |||
| * Shader "texture" location | |||
| */ | |||
| GLuint shader_texture; | |||
| /** | |||
| * Shader "pixel" location | |||
| */ | |||
| GLuint shader_pixel; | |||
| } text_buffer_t; | |||
| /** | |||
| * Glyph vertex structure | |||
| */ | |||
| typedef struct glyph_vertex_t { | |||
| /** | |||
| * Vertex x coordinates | |||
| */ | |||
| float x; | |||
| /** | |||
| * Vertex y coordinates | |||
| */ | |||
| float y; | |||
| /** | |||
| * Vertex z coordinates | |||
| */ | |||
| float z; | |||
| /** | |||
| * Texture first coordinate | |||
| */ | |||
| float u; | |||
| /** | |||
| * Texture second coordinate | |||
| */ | |||
| float v; | |||
| /** | |||
| * Color red component | |||
| */ | |||
| float r; | |||
| /** | |||
| * Color green component | |||
| */ | |||
| float g; | |||
| /** | |||
| * Color blue component | |||
| */ | |||
| float b; | |||
| /** | |||
| * Color alpha component | |||
| */ | |||
| float a; | |||
| /** | |||
| * Shift along x | |||
| */ | |||
| float shift; | |||
| /** | |||
| * Color gamma correction | |||
| */ | |||
| float gamma; | |||
| } glyph_vertex_t; | |||
| /** | |||
| * Creates a new empty text buffer. | |||
| * | |||
| * @param depth Underlying atlas bit depth (1 or 3) | |||
| * | |||
| * @return a new empty text buffer. | |||
| * | |||
| */ | |||
| text_buffer_t * | |||
| text_buffer_new( size_t depth ); | |||
| /** | |||
| * Deletes texture buffer and its associated shader and vertex buffer. | |||
| * | |||
| * @param self texture buffer to delete | |||
| * | |||
| */ | |||
| void | |||
| text_buffer_delete( text_buffer_t * self ); | |||
| /** | |||
| * Render a text buffer. | |||
| * | |||
| * @param self a text buffer | |||
| * | |||
| */ | |||
| void | |||
| text_buffer_render( text_buffer_t * self ); | |||
| /** | |||
| * Print some text to the text buffer | |||
| * | |||
| * @param self a text buffer | |||
| * @param pen position of text start | |||
| * @param ... a series of markup_t *, wchar_t * ended by NULL | |||
| * | |||
| */ | |||
| void | |||
| text_buffer_printf( text_buffer_t * self, vec2 * pen, ... ); | |||
| /** | |||
| * Add some text to the text buffer | |||
| * | |||
| * @param self a text buffer | |||
| * @param pen position of text start | |||
| * @param markup Markup to be used to add text | |||
| * @param text Text to be added | |||
| * @param length Length of text to be added | |||
| */ | |||
| void | |||
| text_buffer_add_text( text_buffer_t * self, | |||
| vec2 * pen, markup_t * markup, | |||
| wchar_t * text, size_t length ); | |||
| /** | |||
| * Add a char to the text buffer | |||
| * | |||
| * @param self a text buffer | |||
| * @param pen position of text start | |||
| * @param markup markup to be used to add text | |||
| * @param current charactr to be added | |||
| * @param previous previous character (if any) | |||
| */ | |||
| void | |||
| text_buffer_add_wchar( text_buffer_t * self, | |||
| vec2 * pen, markup_t * markup, | |||
| wchar_t current, wchar_t previous ); | |||
| /** | |||
| * Clear text buffer | |||
| * | |||
| * @param self a text buffer | |||
| */ | |||
| void | |||
| text_buffer_clear( text_buffer_t * self ); | |||
| /** @} */ | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif /* #define __TEXT_BUFFER_H__ */ | |||
| @@ -1,345 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #include <stdio.h> | |||
| #include <stdlib.h> | |||
| #include <string.h> | |||
| #include <assert.h> | |||
| #include <limits.h> | |||
| #include "opengl.h" | |||
| #include "texture-atlas.h" | |||
| // ------------------------------------------------------ texture_atlas_new --- | |||
| texture_atlas_t * | |||
| texture_atlas_new( const size_t width, | |||
| const size_t height, | |||
| const size_t depth ) | |||
| { | |||
| texture_atlas_t *self = (texture_atlas_t *) malloc( sizeof(texture_atlas_t) ); | |||
| // We want a one pixel border around the whole atlas to avoid any artefact when | |||
| // sampling texture | |||
| ivec3 node = {{1,1,width-2}}; | |||
| assert( (depth == 1) || (depth == 3) || (depth == 4) ); | |||
| if( self == NULL) | |||
| { | |||
| fprintf( stderr, | |||
| "line %d: No more memory for allocating data\n", __LINE__ ); | |||
| exit( EXIT_FAILURE ); | |||
| } | |||
| self->nodes = vector_new( sizeof(ivec3) ); | |||
| self->used = 0; | |||
| self->width = width; | |||
| self->height = height; | |||
| self->depth = depth; | |||
| self->id = 0; | |||
| vector_push_back( self->nodes, &node ); | |||
| self->data = (unsigned char *) | |||
| calloc( width*height*depth, sizeof(unsigned char) ); | |||
| if( self->data == NULL) | |||
| { | |||
| fprintf( stderr, | |||
| "line %d: No more memory for allocating data\n", __LINE__ ); | |||
| exit( EXIT_FAILURE ); | |||
| } | |||
| return self; | |||
| } | |||
| // --------------------------------------------------- texture_atlas_delete --- | |||
| void | |||
| texture_atlas_delete( texture_atlas_t *self ) | |||
| { | |||
| assert( self ); | |||
| vector_delete( self->nodes ); | |||
| if( self->data ) | |||
| { | |||
| free( self->data ); | |||
| } | |||
| if( self->id ) | |||
| { | |||
| glDeleteTextures( 1, &self->id ); | |||
| } | |||
| free( self ); | |||
| } | |||
| // ----------------------------------------------- texture_atlas_set_region --- | |||
| void | |||
| texture_atlas_set_region( texture_atlas_t * self, | |||
| const size_t x, | |||
| const size_t y, | |||
| const size_t width, | |||
| const size_t height, | |||
| const unsigned char * data, | |||
| const size_t stride ) | |||
| { | |||
| size_t i; | |||
| size_t depth; | |||
| size_t charsize; | |||
| assert( self ); | |||
| assert( x > 0); | |||
| assert( y > 0); | |||
| assert( x < (self->width-1)); | |||
| assert( (x + width) <= (self->width-1)); | |||
| assert( y < (self->height-1)); | |||
| assert( (y + height) <= (self->height-1)); | |||
| depth = self->depth; | |||
| charsize = sizeof(char); | |||
| for( i=0; i<height; ++i ) | |||
| { | |||
| memcpy( self->data+((y+i)*self->width + x ) * charsize * depth, | |||
| data + (i*stride) * charsize, width * charsize * depth ); | |||
| } | |||
| } | |||
| // ------------------------------------------------------ texture_atlas_fit --- | |||
| int | |||
| texture_atlas_fit( texture_atlas_t * self, | |||
| const size_t index, | |||
| const size_t width, | |||
| const size_t height ) | |||
| { | |||
| ivec3 *node; | |||
| int x, y, width_left; | |||
| size_t i; | |||
| assert( self ); | |||
| node = (ivec3 *) (vector_get( self->nodes, index )); | |||
| x = node->x; | |||
| y = node->y; | |||
| width_left = width; | |||
| i = index; | |||
| if ( (x + width) > (self->width-1) ) | |||
| { | |||
| return -1; | |||
| } | |||
| y = node->y; | |||
| while( width_left > 0 ) | |||
| { | |||
| node = (ivec3 *) (vector_get( self->nodes, i )); | |||
| if( node->y > y ) | |||
| { | |||
| y = node->y; | |||
| } | |||
| if( (y + height) > (self->height-1) ) | |||
| { | |||
| return -1; | |||
| } | |||
| width_left -= node->z; | |||
| ++i; | |||
| } | |||
| return y; | |||
| } | |||
| // ---------------------------------------------------- texture_atlas_merge --- | |||
| void | |||
| texture_atlas_merge( texture_atlas_t * self ) | |||
| { | |||
| ivec3 *node, *next; | |||
| size_t i; | |||
| assert( self ); | |||
| for( i=0; i< self->nodes->size-1; ++i ) | |||
| { | |||
| node = (ivec3 *) (vector_get( self->nodes, i )); | |||
| next = (ivec3 *) (vector_get( self->nodes, i+1 )); | |||
| if( node->y == next->y ) | |||
| { | |||
| node->z += next->z; | |||
| vector_erase( self->nodes, i+1 ); | |||
| --i; | |||
| } | |||
| } | |||
| } | |||
| // ----------------------------------------------- texture_atlas_get_region --- | |||
| ivec4 | |||
| texture_atlas_get_region( texture_atlas_t * self, | |||
| const size_t width, | |||
| const size_t height ) | |||
| { | |||
| int y, best_height, best_width, best_index; | |||
| ivec3 *node, *prev; | |||
| ivec4 region = {{0,0,width,height}}; | |||
| size_t i; | |||
| assert( self ); | |||
| best_height = INT_MAX; | |||
| best_index = -1; | |||
| best_width = INT_MAX; | |||
| for( i=0; i<self->nodes->size; ++i ) | |||
| { | |||
| y = texture_atlas_fit( self, i, width, height ); | |||
| if( y >= 0 ) | |||
| { | |||
| node = (ivec3 *) vector_get( self->nodes, i ); | |||
| if( ( (y + height) < best_height ) || | |||
| ( ((y + height) == best_height) && (node->z < best_width)) ) | |||
| { | |||
| best_height = y + height; | |||
| best_index = i; | |||
| best_width = node->z; | |||
| region.x = node->x; | |||
| region.y = y; | |||
| } | |||
| } | |||
| } | |||
| if( best_index == -1 ) | |||
| { | |||
| region.x = -1; | |||
| region.y = -1; | |||
| region.width = 0; | |||
| region.height = 0; | |||
| return region; | |||
| } | |||
| node = (ivec3 *) malloc( sizeof(ivec3) ); | |||
| if( node == NULL) | |||
| { | |||
| fprintf( stderr, | |||
| "line %d: No more memory for allocating data\n", __LINE__ ); | |||
| exit( EXIT_FAILURE ); | |||
| } | |||
| node->x = region.x; | |||
| node->y = region.y + height; | |||
| node->z = width; | |||
| vector_insert( self->nodes, best_index, node ); | |||
| free( node ); | |||
| for(i = best_index+1; i < self->nodes->size; ++i) | |||
| { | |||
| node = (ivec3 *) vector_get( self->nodes, i ); | |||
| prev = (ivec3 *) vector_get( self->nodes, i-1 ); | |||
| if (node->x < (prev->x + prev->z) ) | |||
| { | |||
| int shrink = prev->x + prev->z - node->x; | |||
| node->x += shrink; | |||
| node->z -= shrink; | |||
| if (node->z <= 0) | |||
| { | |||
| vector_erase( self->nodes, i ); | |||
| --i; | |||
| } | |||
| else | |||
| { | |||
| break; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| break; | |||
| } | |||
| } | |||
| texture_atlas_merge( self ); | |||
| self->used += width * height; | |||
| return region; | |||
| } | |||
| // ---------------------------------------------------- texture_atlas_clear --- | |||
| void | |||
| texture_atlas_clear( texture_atlas_t * self ) | |||
| { | |||
| ivec3 node = {{1,1,1}}; | |||
| assert( self ); | |||
| assert( self->data ); | |||
| vector_clear( self->nodes ); | |||
| self->used = 0; | |||
| // We want a one pixel border around the whole atlas to avoid any artefact when | |||
| // sampling texture | |||
| node.z = self->width-2; | |||
| vector_push_back( self->nodes, &node ); | |||
| memset( self->data, 0, self->width*self->height*self->depth ); | |||
| } | |||
| // --------------------------------------------------- texture_atlas_upload --- | |||
| void | |||
| texture_atlas_upload( texture_atlas_t * self ) | |||
| { | |||
| assert( self ); | |||
| assert( self->data ); | |||
| if( !self->id ) | |||
| { | |||
| glGenTextures( 1, &self->id ); | |||
| } | |||
| glBindTexture( GL_TEXTURE_2D, self->id ); | |||
| glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); | |||
| glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); | |||
| glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); | |||
| glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); | |||
| if( self->depth == 4 ) | |||
| { | |||
| #ifdef GL_UNSIGNED_INT_8_8_8_8_REV | |||
| glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, self->width, self->height, | |||
| 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, self->data ); | |||
| #else | |||
| glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, self->width, self->height, | |||
| 0, GL_RGBA, GL_UNSIGNED_BYTE, self->data ); | |||
| #endif | |||
| } | |||
| else if( self->depth == 3 ) | |||
| { | |||
| glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, self->width, self->height, | |||
| 0, GL_RGB, GL_UNSIGNED_BYTE, self->data ); | |||
| } | |||
| else | |||
| { | |||
| glTexImage2D( GL_TEXTURE_2D, 0, GL_RED, self->width, self->height, | |||
| 0, GL_RED, GL_UNSIGNED_BYTE, self->data ); | |||
| } | |||
| } | |||
| @@ -1,225 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| * | |||
| * This source is based on the article by Jukka Jylänki : | |||
| * "A Thousand Ways to Pack the Bin - A Practical Approach to | |||
| * Two-Dimensional Rectangle Bin Packing", February 27, 2010. | |||
| * | |||
| * More precisely, this is an implementation of the Skyline Bottom-Left | |||
| * algorithm based on C++ sources provided by Jukka Jylänki at: | |||
| * http://clb.demon.fi/files/RectangleBinPack/ | |||
| * | |||
| * ============================================================================ | |||
| */ | |||
| #ifndef __TEXTURE_ATLAS_H__ | |||
| #define __TEXTURE_ATLAS_H__ | |||
| #include <stdlib.h> | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| #include "vector.h" | |||
| #include "vec234.h" | |||
| /** | |||
| * @file texture-atlas.h | |||
| * @author Nicolas Rougier (Nicolas.Rougier@inria.fr) | |||
| * | |||
| * @defgroup texture-atlas Texture atlas | |||
| * | |||
| * A texture atlas is used to pack several small regions into a single texture. | |||
| * | |||
| * The actual implementation is based on the article by Jukka Jylänki : "A | |||
| * Thousand Ways to Pack the Bin - A Practical Approach to Two-Dimensional | |||
| * Rectangle Bin Packing", February 27, 2010. | |||
| * More precisely, this is an implementation of the Skyline Bottom-Left | |||
| * algorithm based on C++ sources provided by Jukka Jylänki at: | |||
| * http://clb.demon.fi/files/RectangleBinPack/ | |||
| * | |||
| * | |||
| * Example Usage: | |||
| * @code | |||
| * #include "texture-atlas.h" | |||
| * | |||
| * ... | |||
| * | |||
| * / Creates a new atlas of 512x512 with a depth of 1 | |||
| * texture_atlas_t * atlas = texture_atlas_new( 512, 512, 1 ); | |||
| * | |||
| * // Allocates a region of 20x20 | |||
| * ivec4 region = texture_atlas_get_region( atlas, 20, 20 ); | |||
| * | |||
| * // Fill region with some data | |||
| * texture_atlas_set_region( atlas, region.x, region.y, region.width, region.height, data, stride ) | |||
| * | |||
| * ... | |||
| * | |||
| * @endcode | |||
| * | |||
| * @{ | |||
| */ | |||
| /** | |||
| * A texture atlas is used to pack several small regions into a single texture. | |||
| */ | |||
| typedef struct texture_atlas_t | |||
| { | |||
| /** | |||
| * Allocated nodes | |||
| */ | |||
| vector_t * nodes; | |||
| /** | |||
| * Width (in pixels) of the underlying texture | |||
| */ | |||
| size_t width; | |||
| /** | |||
| * Height (in pixels) of the underlying texture | |||
| */ | |||
| size_t height; | |||
| /** | |||
| * Depth (in bytes) of the underlying texture | |||
| */ | |||
| size_t depth; | |||
| /** | |||
| * Allocated surface size | |||
| */ | |||
| size_t used; | |||
| /** | |||
| * Texture identity (OpenGL) | |||
| */ | |||
| unsigned int id; | |||
| /** | |||
| * Atlas data | |||
| */ | |||
| unsigned char * data; | |||
| } texture_atlas_t; | |||
| /** | |||
| * Creates a new empty texture atlas. | |||
| * | |||
| * @param width width of the atlas | |||
| * @param height height of the atlas | |||
| * @param depth bit depth of the atlas | |||
| * @return a new empty texture atlas. | |||
| * | |||
| */ | |||
| texture_atlas_t * | |||
| texture_atlas_new( const size_t width, | |||
| const size_t height, | |||
| const size_t depth ); | |||
| /** | |||
| * Deletes a texture atlas. | |||
| * | |||
| * @param self a texture atlas structure | |||
| * | |||
| */ | |||
| void | |||
| texture_atlas_delete( texture_atlas_t * self ); | |||
| /** | |||
| * Upload atlas to video memory. | |||
| * | |||
| * @param self a texture atlas structure | |||
| * | |||
| */ | |||
| void | |||
| texture_atlas_upload( texture_atlas_t * self ); | |||
| /** | |||
| * Allocate a new region in the atlas. | |||
| * | |||
| * @param self a texture atlas structure | |||
| * @param width width of the region to allocate | |||
| * @param height height of the region to allocate | |||
| * @return Coordinates of the allocated region | |||
| * | |||
| */ | |||
| ivec4 | |||
| texture_atlas_get_region( texture_atlas_t * self, | |||
| const size_t width, | |||
| const size_t height ); | |||
| /** | |||
| * Upload data to the specified atlas region. | |||
| * | |||
| * @param self a texture atlas structure | |||
| * @param x x coordinate the region | |||
| * @param y y coordinate the region | |||
| * @param width width of the region | |||
| * @param height height of the region | |||
| * @param data data to be uploaded into the specified region | |||
| * @param stride stride of the data | |||
| * | |||
| */ | |||
| void | |||
| texture_atlas_set_region( texture_atlas_t * self, | |||
| const size_t x, | |||
| const size_t y, | |||
| const size_t width, | |||
| const size_t height, | |||
| const unsigned char *data, | |||
| const size_t stride ); | |||
| /** | |||
| * Remove all allocated regions from the atlas. | |||
| * | |||
| * @param self a texture atlas structure | |||
| */ | |||
| void | |||
| texture_atlas_clear( texture_atlas_t * self ); | |||
| /** @} */ | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif /* __TEXTURE_ATLAS_H__ */ | |||
| @@ -1,713 +0,0 @@ | |||
| /* =========================================================================== | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #include "../freetype/FreeTypeAmalgam.h" | |||
| #include "../freetype/FreeTypeAmalgam.c" | |||
| #include <stdint.h> | |||
| #include <stdlib.h> | |||
| #include <stdio.h> | |||
| #include <assert.h> | |||
| #include <math.h> | |||
| #include <wchar.h> | |||
| #include "texture-font.h" | |||
| #include "platform.h" | |||
| #define HRES 64 | |||
| #define HRESf 64.f | |||
| #define DPI 72 | |||
| #undef __FTERRORS_H__ | |||
| #define FT_ERRORDEF( e, v, s ) { e, s }, | |||
| #define FT_ERROR_START_LIST { | |||
| #define FT_ERROR_END_LIST { 0, 0 } }; | |||
| const struct { | |||
| int code; | |||
| const char* message; | |||
| } FT_Errors[] = | |||
| #include "freetype-errors.h" | |||
| // ------------------------------------------------- texture_font_load_face --- | |||
| static int | |||
| texture_font_load_face(texture_font_t *self, float size, | |||
| FT_Library *library, FT_Face *face) | |||
| { | |||
| FT_Error error; | |||
| FT_Matrix matrix = { | |||
| (int)((1.0/HRES) * 0x10000L), | |||
| (int)((0.0) * 0x10000L), | |||
| (int)((0.0) * 0x10000L), | |||
| (int)((1.0) * 0x10000L)}; | |||
| assert(library); | |||
| assert(size); | |||
| /* Initialize library */ | |||
| error = FT_Init_FreeType(library); | |||
| if(error) { | |||
| fprintf(stderr, "FT_Error (0x%02x) : %s\n", | |||
| FT_Errors[error].code, FT_Errors[error].message); | |||
| return 0; | |||
| } | |||
| /* Load face */ | |||
| switch (self->location) { | |||
| case TEXTURE_FONT_FILE: | |||
| error = FT_New_Face(*library, self->filename, 0, face); | |||
| break; | |||
| case TEXTURE_FONT_MEMORY: | |||
| error = FT_New_Memory_Face(*library, | |||
| self->memory.base, self->memory.size, 0, face); | |||
| break; | |||
| } | |||
| if(error) { | |||
| fprintf(stderr, "FT_Error (line %d, code 0x%02x) : %s\n", | |||
| __LINE__, FT_Errors[error].code, FT_Errors[error].message); | |||
| FT_Done_FreeType(*library); | |||
| return 0; | |||
| } | |||
| /* Select charmap */ | |||
| error = FT_Select_Charmap(*face, FT_ENCODING_UNICODE); | |||
| if(error) { | |||
| fprintf(stderr, "FT_Error (line %d, code 0x%02x) : %s\n", | |||
| __LINE__, FT_Errors[error].code, FT_Errors[error].message); | |||
| FT_Done_Face(*face); | |||
| FT_Done_FreeType(*library); | |||
| return 0; | |||
| } | |||
| /* Set char size */ | |||
| error = FT_Set_Char_Size(*face, (int)(size * HRES), 0, DPI * HRES, DPI); | |||
| if(error) { | |||
| fprintf(stderr, "FT_Error (line %d, code 0x%02x) : %s\n", | |||
| __LINE__, FT_Errors[error].code, FT_Errors[error].message); | |||
| FT_Done_Face(*face); | |||
| FT_Done_FreeType(*library); | |||
| return 0; | |||
| } | |||
| /* Set transform matrix */ | |||
| FT_Set_Transform(*face, &matrix, NULL); | |||
| return 1; | |||
| } | |||
| static int | |||
| texture_font_get_face_with_size(texture_font_t *self, float size, | |||
| FT_Library *library, FT_Face *face) | |||
| { | |||
| return texture_font_load_face(self, size, library, face); | |||
| } | |||
| static int | |||
| texture_font_get_face(texture_font_t *self, | |||
| FT_Library *library, FT_Face *face) | |||
| { | |||
| return texture_font_get_face_with_size(self, self->size, library, face); | |||
| } | |||
| static int | |||
| texture_font_get_hires_face(texture_font_t *self, | |||
| FT_Library *library, FT_Face *face) | |||
| { | |||
| return texture_font_get_face_with_size(self, | |||
| self->size * 100.f, library, face); | |||
| } | |||
| // ------------------------------------------------------ texture_glyph_new --- | |||
| texture_glyph_t * | |||
| texture_glyph_new(void) | |||
| { | |||
| texture_glyph_t *self = (texture_glyph_t *) malloc( sizeof(texture_glyph_t) ); | |||
| if(self == NULL) { | |||
| fprintf( stderr, | |||
| "line %d: No more memory for allocating data\n", __LINE__); | |||
| return NULL; | |||
| } | |||
| self->id = 0; | |||
| self->width = 0; | |||
| self->height = 0; | |||
| self->outline_type = 0; | |||
| self->outline_thickness = 0.0; | |||
| self->offset_x = 0; | |||
| self->offset_y = 0; | |||
| self->advance_x = 0.0; | |||
| self->advance_y = 0.0; | |||
| self->s0 = 0.0; | |||
| self->t0 = 0.0; | |||
| self->s1 = 0.0; | |||
| self->t1 = 0.0; | |||
| self->kerning = vector_new( sizeof(kerning_t) ); | |||
| return self; | |||
| } | |||
| // --------------------------------------------------- texture_glyph_delete --- | |||
| void | |||
| texture_glyph_delete( texture_glyph_t *self ) | |||
| { | |||
| assert( self ); | |||
| vector_delete( self->kerning ); | |||
| free( self ); | |||
| } | |||
| // ---------------------------------------------- texture_glyph_get_kerning --- | |||
| float | |||
| texture_glyph_get_kerning( const texture_glyph_t * self, | |||
| const wchar_t charcode ) | |||
| { | |||
| size_t i; | |||
| assert( self ); | |||
| for( i=0; i<vector_size(self->kerning); ++i ) | |||
| { | |||
| kerning_t * kerning = (kerning_t *) vector_get( self->kerning, i ); | |||
| if( kerning->charcode == charcode ) | |||
| { | |||
| return kerning->kerning; | |||
| } | |||
| } | |||
| return 0; | |||
| } | |||
| // ------------------------------------------ texture_font_generate_kerning --- | |||
| void | |||
| texture_font_generate_kerning( texture_font_t *self ) | |||
| { | |||
| size_t i, j; | |||
| FT_Library library; | |||
| FT_Face face; | |||
| FT_UInt glyph_index, prev_index; | |||
| texture_glyph_t *glyph, *prev_glyph; | |||
| FT_Vector kerning; | |||
| assert( self ); | |||
| /* Load font */ | |||
| if(!texture_font_get_face(self, &library, &face)) | |||
| return; | |||
| /* For each glyph couple combination, check if kerning is necessary */ | |||
| /* Starts at index 1 since 0 is for the special backgroudn glyph */ | |||
| for( i=1; i<self->glyphs->size; ++i ) | |||
| { | |||
| glyph = *(texture_glyph_t **) vector_get( self->glyphs, i ); | |||
| glyph_index = FT_Get_Char_Index( face, glyph->charcode ); | |||
| vector_clear( glyph->kerning ); | |||
| for( j=1; j<self->glyphs->size; ++j ) | |||
| { | |||
| prev_glyph = *(texture_glyph_t **) vector_get( self->glyphs, j ); | |||
| prev_index = FT_Get_Char_Index( face, prev_glyph->charcode ); | |||
| FT_Get_Kerning( face, prev_index, glyph_index, FT_KERNING_UNFITTED, &kerning ); | |||
| // printf("%c(%d)-%c(%d): %ld\n", | |||
| // prev_glyph->charcode, prev_glyph->charcode, | |||
| // glyph_index, glyph_index, kerning.x); | |||
| if( kerning.x ) | |||
| { | |||
| kerning_t k = {prev_glyph->charcode, kerning.x / (float)(HRESf*HRESf)}; | |||
| vector_push_back( glyph->kerning, &k ); | |||
| } | |||
| } | |||
| } | |||
| FT_Done_Face( face ); | |||
| FT_Done_FreeType( library ); | |||
| } | |||
| // ------------------------------------------------------ texture_font_init --- | |||
| static int | |||
| texture_font_init(texture_font_t *self) | |||
| { | |||
| FT_Library library; | |||
| FT_Face face; | |||
| FT_Size_Metrics metrics; | |||
| assert(self->atlas); | |||
| assert(self->size > 0); | |||
| assert((self->location == TEXTURE_FONT_FILE && self->filename) | |||
| || (self->location == TEXTURE_FONT_MEMORY | |||
| && self->memory.base && self->memory.size)); | |||
| self->glyphs = vector_new(sizeof(texture_glyph_t *)); | |||
| self->height = 0; | |||
| self->ascender = 0; | |||
| self->descender = 0; | |||
| self->outline_type = 0; | |||
| self->outline_thickness = 0.0; | |||
| self->hinting = 1; | |||
| self->kerning = 1; | |||
| self->filtering = 1; | |||
| // FT_LCD_FILTER_LIGHT is (0x00, 0x55, 0x56, 0x55, 0x00) | |||
| // FT_LCD_FILTER_DEFAULT is (0x10, 0x40, 0x70, 0x40, 0x10) | |||
| self->lcd_weights[0] = 0x10; | |||
| self->lcd_weights[1] = 0x40; | |||
| self->lcd_weights[2] = 0x70; | |||
| self->lcd_weights[3] = 0x40; | |||
| self->lcd_weights[4] = 0x10; | |||
| /* Get font metrics at high resolution */ | |||
| if (!texture_font_get_hires_face(self, &library, &face)) | |||
| return -1; | |||
| self->underline_position = face->underline_position / (float)(HRESf*HRESf) * self->size; | |||
| self->underline_position = round( self->underline_position ); | |||
| if( self->underline_position > -2 ) | |||
| { | |||
| self->underline_position = -2.0; | |||
| } | |||
| self->underline_thickness = face->underline_thickness / (float)(HRESf*HRESf) * self->size; | |||
| self->underline_thickness = round( self->underline_thickness ); | |||
| if( self->underline_thickness < 1 ) | |||
| { | |||
| self->underline_thickness = 1.0; | |||
| } | |||
| metrics = face->size->metrics; | |||
| self->ascender = (metrics.ascender >> 6) / 100.0; | |||
| self->descender = (metrics.descender >> 6) / 100.0; | |||
| self->height = (metrics.height >> 6) / 100.0; | |||
| self->linegap = self->height - self->ascender + self->descender; | |||
| FT_Done_Face( face ); | |||
| FT_Done_FreeType( library ); | |||
| /* -1 is a special glyph */ | |||
| texture_font_get_glyph( self, -1 ); | |||
| return 0; | |||
| } | |||
| // --------------------------------------------- texture_font_new_from_file --- | |||
| texture_font_t * | |||
| texture_font_new_from_file(texture_atlas_t *atlas, const float pt_size, | |||
| const char *filename) | |||
| { | |||
| texture_font_t *self; | |||
| assert(filename); | |||
| self = calloc(1, sizeof(*self)); | |||
| if (!self) { | |||
| fprintf(stderr, | |||
| "line %d: No more memory for allocating data\n", __LINE__); | |||
| return NULL; | |||
| } | |||
| self->atlas = atlas; | |||
| self->size = pt_size; | |||
| self->location = TEXTURE_FONT_FILE; | |||
| self->filename = strdup(filename); | |||
| if (texture_font_init(self)) { | |||
| texture_font_delete(self); | |||
| return NULL; | |||
| } | |||
| return self; | |||
| } | |||
| // ------------------------------------------- texture_font_new_from_memory --- | |||
| texture_font_t * | |||
| texture_font_new_from_memory(texture_atlas_t *atlas, float pt_size, | |||
| const void *memory_base, size_t memory_size) | |||
| { | |||
| texture_font_t *self; | |||
| assert(memory_base); | |||
| assert(memory_size); | |||
| self = calloc(1, sizeof(*self)); | |||
| if (!self) { | |||
| fprintf(stderr, | |||
| "line %d: No more memory for allocating data\n", __LINE__); | |||
| return NULL; | |||
| } | |||
| self->atlas = atlas; | |||
| self->size = pt_size; | |||
| self->location = TEXTURE_FONT_MEMORY; | |||
| self->memory.base = memory_base; | |||
| self->memory.size = memory_size; | |||
| if (texture_font_init(self)) { | |||
| texture_font_delete(self); | |||
| return NULL; | |||
| } | |||
| return self; | |||
| } | |||
| // ---------------------------------------------------- texture_font_delete --- | |||
| void | |||
| texture_font_delete( texture_font_t *self ) | |||
| { | |||
| size_t i; | |||
| texture_glyph_t *glyph; | |||
| assert( self ); | |||
| if(self->location == TEXTURE_FONT_FILE && self->filename) | |||
| free( self->filename ); | |||
| for( i=0; i<vector_size( self->glyphs ); ++i) | |||
| { | |||
| glyph = *(texture_glyph_t **) vector_get( self->glyphs, i ); | |||
| texture_glyph_delete( glyph); | |||
| } | |||
| vector_delete( self->glyphs ); | |||
| free( self ); | |||
| } | |||
| // ----------------------------------------------- texture_font_load_glyphs --- | |||
| size_t | |||
| texture_font_load_glyphs( texture_font_t * self, | |||
| const wchar_t * charcodes ) | |||
| { | |||
| size_t i, j, x, y, width, height, depth, w, h; | |||
| FT_Library library; | |||
| FT_Error error; | |||
| FT_Face face; | |||
| FT_Glyph ft_glyph; | |||
| FT_GlyphSlot slot; | |||
| FT_Bitmap ft_bitmap; | |||
| FT_UInt glyph_index; | |||
| texture_glyph_t *glyph; | |||
| FT_Int32 flags = 0; | |||
| int ft_glyph_top = 0; | |||
| int ft_glyph_left = 0; | |||
| ivec4 region; | |||
| size_t missed = 0; | |||
| char pass; | |||
| assert( self ); | |||
| assert( charcodes ); | |||
| width = self->atlas->width; | |||
| height = self->atlas->height; | |||
| depth = self->atlas->depth; | |||
| if (!texture_font_get_face(self, &library, &face)) | |||
| return wcslen(charcodes); | |||
| /* Load each glyph */ | |||
| for( i=0; i<wcslen(charcodes); ++i ) { | |||
| pass = 0; | |||
| /* Check if charcode has been already loaded */ | |||
| for(j = 0; j < self->glyphs->size; ++j ) { | |||
| glyph = *(texture_glyph_t **) vector_get( self->glyphs, j ); | |||
| // If charcode is -1, we don't care about outline type or thickness | |||
| // if( (glyph->charcode == charcodes[i])) { | |||
| if( (glyph->charcode == charcodes[i]) && | |||
| ((charcodes[i] == (wchar_t)(-1) ) || | |||
| ((glyph->outline_type == self->outline_type) && | |||
| (glyph->outline_thickness == self->outline_thickness)) )) | |||
| { | |||
| pass = 1; | |||
| break; | |||
| } | |||
| } | |||
| if(pass) | |||
| continue; // don't add the item | |||
| flags = 0; | |||
| ft_glyph_top = 0; | |||
| ft_glyph_left = 0; | |||
| glyph_index = FT_Get_Char_Index( face, charcodes[i] ); | |||
| // WARNING: We use texture-atlas depth to guess if user wants | |||
| // LCD subpixel rendering | |||
| if( self->outline_type > 0 ) | |||
| { | |||
| flags |= FT_LOAD_NO_BITMAP; | |||
| } | |||
| else | |||
| { | |||
| flags |= FT_LOAD_RENDER; | |||
| } | |||
| if( !self->hinting ) | |||
| { | |||
| flags |= FT_LOAD_NO_HINTING | FT_LOAD_NO_AUTOHINT; | |||
| } | |||
| else | |||
| { | |||
| flags |= FT_LOAD_FORCE_AUTOHINT; | |||
| } | |||
| #if 0 | |||
| if( depth == 3 ) | |||
| { | |||
| FT_Library_SetLcdFilter( library, FT_LCD_FILTER_LIGHT ); | |||
| flags |= FT_LOAD_TARGET_LCD; | |||
| if( self->filtering ) | |||
| { | |||
| FT_Library_SetLcdFilterWeights( library, self->lcd_weights ); | |||
| } | |||
| } | |||
| #endif | |||
| error = FT_Load_Glyph( face, glyph_index, flags ); | |||
| if( error ) | |||
| { | |||
| fprintf( stderr, "FT_Error (line %d, code 0x%02x) : %s\n", | |||
| __LINE__, FT_Errors[error].code, FT_Errors[error].message ); | |||
| FT_Done_Face( face ); | |||
| FT_Done_FreeType( library ); | |||
| return wcslen(charcodes)-i; | |||
| } | |||
| if( self->outline_type == 0 ) | |||
| { | |||
| slot = face->glyph; | |||
| ft_bitmap = slot->bitmap; | |||
| ft_glyph_top = slot->bitmap_top; | |||
| ft_glyph_left = slot->bitmap_left; | |||
| } | |||
| else | |||
| { | |||
| FT_Stroker stroker; | |||
| FT_BitmapGlyph ft_bitmap_glyph; | |||
| error = FT_Stroker_New( library, &stroker ); | |||
| if( error ) | |||
| { | |||
| fprintf(stderr, "FT_Error (0x%02x) : %s\n", | |||
| FT_Errors[error].code, FT_Errors[error].message); | |||
| FT_Done_Face( face ); | |||
| FT_Stroker_Done( stroker ); | |||
| FT_Done_FreeType( library ); | |||
| return 0; | |||
| } | |||
| FT_Stroker_Set(stroker, | |||
| (int)(self->outline_thickness * HRES), | |||
| FT_STROKER_LINECAP_ROUND, | |||
| FT_STROKER_LINEJOIN_ROUND, | |||
| 0); | |||
| error = FT_Get_Glyph( face->glyph, &ft_glyph); | |||
| if( error ) | |||
| { | |||
| fprintf(stderr, "FT_Error (0x%02x) : %s\n", | |||
| FT_Errors[error].code, FT_Errors[error].message); | |||
| FT_Done_Face( face ); | |||
| FT_Stroker_Done( stroker ); | |||
| FT_Done_FreeType( library ); | |||
| return 0; | |||
| } | |||
| if( self->outline_type == 1 ) | |||
| { | |||
| error = FT_Glyph_Stroke( &ft_glyph, stroker, 1 ); | |||
| } | |||
| else if ( self->outline_type == 2 ) | |||
| { | |||
| error = FT_Glyph_StrokeBorder( &ft_glyph, stroker, 0, 1 ); | |||
| } | |||
| else if ( self->outline_type == 3 ) | |||
| { | |||
| error = FT_Glyph_StrokeBorder( &ft_glyph, stroker, 1, 1 ); | |||
| } | |||
| if( error ) | |||
| { | |||
| fprintf(stderr, "FT_Error (0x%02x) : %s\n", | |||
| FT_Errors[error].code, FT_Errors[error].message); | |||
| FT_Done_Face( face ); | |||
| FT_Stroker_Done( stroker ); | |||
| FT_Done_FreeType( library ); | |||
| return 0; | |||
| } | |||
| if( depth == 1) | |||
| { | |||
| error = FT_Glyph_To_Bitmap( &ft_glyph, FT_RENDER_MODE_NORMAL, 0, 1); | |||
| if( error ) | |||
| { | |||
| fprintf(stderr, "FT_Error (0x%02x) : %s\n", | |||
| FT_Errors[error].code, FT_Errors[error].message); | |||
| FT_Done_Face( face ); | |||
| FT_Stroker_Done( stroker ); | |||
| FT_Done_FreeType( library ); | |||
| return 0; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| error = FT_Glyph_To_Bitmap( &ft_glyph, FT_RENDER_MODE_LCD, 0, 1); | |||
| if( error ) | |||
| { | |||
| fprintf(stderr, "FT_Error (0x%02x) : %s\n", | |||
| FT_Errors[error].code, FT_Errors[error].message); | |||
| FT_Done_Face( face ); | |||
| FT_Stroker_Done( stroker ); | |||
| FT_Done_FreeType( library ); | |||
| return 0; | |||
| } | |||
| } | |||
| ft_bitmap_glyph = (FT_BitmapGlyph) ft_glyph; | |||
| ft_bitmap = ft_bitmap_glyph->bitmap; | |||
| ft_glyph_top = ft_bitmap_glyph->top; | |||
| ft_glyph_left = ft_bitmap_glyph->left; | |||
| FT_Stroker_Done(stroker); | |||
| } | |||
| // We want each glyph to be separated by at least one black pixel | |||
| // (for example for shader used in demo-subpixel.c) | |||
| w = ft_bitmap.width/depth + 1; | |||
| h = ft_bitmap.rows + 1; | |||
| region = texture_atlas_get_region( self->atlas, w, h ); | |||
| if ( region.x < 0 ) | |||
| { | |||
| missed++; | |||
| fprintf( stderr, "Texture atlas is full (line %d)\n", __LINE__ ); | |||
| continue; | |||
| } | |||
| w = w - 1; | |||
| h = h - 1; | |||
| x = region.x; | |||
| y = region.y; | |||
| texture_atlas_set_region( self->atlas, x, y, w, h, | |||
| ft_bitmap.buffer, ft_bitmap.pitch ); | |||
| glyph = texture_glyph_new( ); | |||
| glyph->charcode = charcodes[i]; | |||
| glyph->width = w; | |||
| glyph->height = h; | |||
| glyph->outline_type = self->outline_type; | |||
| glyph->outline_thickness = self->outline_thickness; | |||
| glyph->offset_x = ft_glyph_left; | |||
| glyph->offset_y = ft_glyph_top; | |||
| glyph->s0 = x/(float)width; | |||
| glyph->t0 = y/(float)height; | |||
| glyph->s1 = (x + glyph->width)/(float)width; | |||
| glyph->t1 = (y + glyph->height)/(float)height; | |||
| // Discard hinting to get advance | |||
| FT_Load_Glyph( face, glyph_index, FT_LOAD_RENDER | FT_LOAD_NO_HINTING); | |||
| slot = face->glyph; | |||
| glyph->advance_x = slot->advance.x / HRESf; | |||
| glyph->advance_y = slot->advance.y / HRESf; | |||
| vector_push_back( self->glyphs, &glyph ); | |||
| if( self->outline_type > 0 ) | |||
| { | |||
| FT_Done_Glyph( ft_glyph ); | |||
| } | |||
| } | |||
| FT_Done_Face( face ); | |||
| FT_Done_FreeType( library ); | |||
| texture_atlas_upload( self->atlas ); | |||
| texture_font_generate_kerning( self ); | |||
| return missed; | |||
| } | |||
| // ------------------------------------------------- texture_font_get_glyph --- | |||
| texture_glyph_t * | |||
| texture_font_get_glyph( texture_font_t * self, | |||
| wchar_t charcode ) | |||
| { | |||
| size_t i; | |||
| wchar_t buffer[2] = {0,0}; | |||
| texture_glyph_t *glyph; | |||
| assert( self ); | |||
| assert( self ); | |||
| assert( self->filename ); | |||
| assert( self->atlas ); | |||
| /* Check if charcode has been already loaded */ | |||
| for( i=0; i<self->glyphs->size; ++i ) | |||
| { | |||
| glyph = *(texture_glyph_t **) vector_get( self->glyphs, i ); | |||
| // If charcode is -1, we don't care about outline type or thickness | |||
| if( (glyph->charcode == charcode) && | |||
| ((charcode == (wchar_t)(-1) ) || | |||
| ((glyph->outline_type == self->outline_type) && | |||
| (glyph->outline_thickness == self->outline_thickness)) )) | |||
| { | |||
| return glyph; | |||
| } | |||
| } | |||
| /* charcode -1 is special : it is used for line drawing (overline, | |||
| * underline, strikethrough) and background. | |||
| */ | |||
| if( charcode == (wchar_t)(-1) ) | |||
| { | |||
| size_t width = self->atlas->width; | |||
| size_t height = self->atlas->height; | |||
| ivec4 region = texture_atlas_get_region( self->atlas, 5, 5 ); | |||
| texture_glyph_t * glyph = texture_glyph_new( ); | |||
| static unsigned char data[4*4*3] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |||
| -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |||
| -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, | |||
| -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; | |||
| if ( region.x < 0 ) | |||
| { | |||
| fprintf( stderr, "Texture atlas is full (line %d)\n", __LINE__ ); | |||
| return NULL; | |||
| } | |||
| texture_atlas_set_region( self->atlas, region.x, region.y, 4, 4, data, 0 ); | |||
| glyph->charcode = (wchar_t)(-1); | |||
| glyph->s0 = (region.x+2)/(float)width; | |||
| glyph->t0 = (region.y+2)/(float)height; | |||
| glyph->s1 = (region.x+3)/(float)width; | |||
| glyph->t1 = (region.y+3)/(float)height; | |||
| vector_push_back( self->glyphs, &glyph ); | |||
| return glyph; //*(texture_glyph_t **) vector_back( self->glyphs ); | |||
| } | |||
| /* Glyph has not been already loaded */ | |||
| buffer[0] = charcode; | |||
| if( texture_font_load_glyphs( self, buffer ) == 0 ) | |||
| { | |||
| return *(texture_glyph_t **) vector_back( self->glyphs ); | |||
| } | |||
| return NULL; | |||
| } | |||
| @@ -1,451 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #ifndef __TEXTURE_FONT_H__ | |||
| #define __TEXTURE_FONT_H__ | |||
| #include <stdlib.h> | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| #include "vector.h" | |||
| #include "texture-atlas.h" | |||
| /** | |||
| * @file texture-font.h | |||
| * @author Nicolas Rougier (Nicolas.Rougier@inria.fr) | |||
| * | |||
| * @defgroup texture-font Texture font | |||
| * | |||
| * Texture font. | |||
| * | |||
| * Example Usage: | |||
| * @code | |||
| * #include "texture-font.h" | |||
| * | |||
| * int main( int arrgc, char *argv[] ) | |||
| * { | |||
| * return 0; | |||
| * } | |||
| * @endcode | |||
| * | |||
| * @{ | |||
| */ | |||
| /** | |||
| * A structure that hold a kerning value relatively to a charcode. | |||
| * | |||
| * This structure cannot be used alone since the (necessary) right charcode is | |||
| * implicitely held by the owner of this structure. | |||
| */ | |||
| typedef struct kerning_t | |||
| { | |||
| /** | |||
| * Left character code in the kern pair. | |||
| */ | |||
| wchar_t charcode; | |||
| /** | |||
| * Kerning value (in fractional pixels). | |||
| */ | |||
| float kerning; | |||
| } kerning_t; | |||
| /* | |||
| * Glyph metrics: | |||
| * -------------- | |||
| * | |||
| * xmin xmax | |||
| * | | | |||
| * |<-------- width -------->| | |||
| * | | | |||
| * | +-------------------------+----------------- ymax | |||
| * | | ggggggggg ggggg | ^ ^ | |||
| * | | g:::::::::ggg::::g | | | | |||
| * | | g:::::::::::::::::g | | | | |||
| * | | g::::::ggggg::::::gg | | | | |||
| * | | g:::::g g:::::g | | | | |||
| * offset_x -|-------->| g:::::g g:::::g | offset_y | | |||
| * | | g:::::g g:::::g | | | | |||
| * | | g::::::g g:::::g | | | | |||
| * | | g:::::::ggggg:::::g | | | | |||
| * | | g::::::::::::::::g | | height | |||
| * | | gg::::::::::::::g | | | | |||
| * baseline ---*---------|---- gggggggg::::::g-----*-------- | | |||
| * / | | g:::::g | | | |||
| * origin | | gggggg g:::::g | | | |||
| * | | g:::::gg gg:::::g | | | |||
| * | | g::::::ggg:::::::g | | | |||
| * | | gg:::::::::::::g | | | |||
| * | | ggg::::::ggg | | | |||
| * | | gggggg | v | |||
| * | +-------------------------+----------------- ymin | |||
| * | | | |||
| * |------------- advance_x ---------->| | |||
| */ | |||
| /** | |||
| * A structure that describe a glyph. | |||
| */ | |||
| typedef struct texture_glyph_t | |||
| { | |||
| /** | |||
| * Wide character this glyph represents | |||
| */ | |||
| wchar_t charcode; | |||
| /** | |||
| * Glyph id (used for display lists) | |||
| */ | |||
| unsigned int id; | |||
| /** | |||
| * Glyph's width in pixels. | |||
| */ | |||
| size_t width; | |||
| /** | |||
| * Glyph's height in pixels. | |||
| */ | |||
| size_t height; | |||
| /** | |||
| * Glyph's left bearing expressed in integer pixels. | |||
| */ | |||
| int offset_x; | |||
| /** | |||
| * Glyphs's top bearing expressed in integer pixels. | |||
| * | |||
| * Remember that this is the distance from the baseline to the top-most | |||
| * glyph scanline, upwards y coordinates being positive. | |||
| */ | |||
| int offset_y; | |||
| /** | |||
| * For horizontal text layouts, this is the horizontal distance (in | |||
| * fractional pixels) used to increment the pen position when the glyph is | |||
| * drawn as part of a string of text. | |||
| */ | |||
| float advance_x; | |||
| /** | |||
| * For vertical text layouts, this is the vertical distance (in fractional | |||
| * pixels) used to increment the pen position when the glyph is drawn as | |||
| * part of a string of text. | |||
| */ | |||
| float advance_y; | |||
| /** | |||
| * First normalized texture coordinate (x) of top-left corner | |||
| */ | |||
| float s0; | |||
| /** | |||
| * Second normalized texture coordinate (y) of top-left corner | |||
| */ | |||
| float t0; | |||
| /** | |||
| * First normalized texture coordinate (x) of bottom-right corner | |||
| */ | |||
| float s1; | |||
| /** | |||
| * Second normalized texture coordinate (y) of bottom-right corner | |||
| */ | |||
| float t1; | |||
| /** | |||
| * A vector of kerning pairs relative to this glyph. | |||
| */ | |||
| vector_t * kerning; | |||
| /** | |||
| * Glyph outline type (0 = None, 1 = line, 2 = inner, 3 = outer) | |||
| */ | |||
| int outline_type; | |||
| /** | |||
| * Glyph outline thickness | |||
| */ | |||
| float outline_thickness; | |||
| } texture_glyph_t; | |||
| /** | |||
| * Texture font structure. | |||
| */ | |||
| typedef struct texture_font_t | |||
| { | |||
| /** | |||
| * Vector of glyphs contained in this font. | |||
| */ | |||
| vector_t * glyphs; | |||
| /** | |||
| * Atlas structure to store glyphs data. | |||
| */ | |||
| texture_atlas_t * atlas; | |||
| /** | |||
| * font location | |||
| */ | |||
| enum { | |||
| TEXTURE_FONT_FILE = 0, | |||
| TEXTURE_FONT_MEMORY, | |||
| } location; | |||
| union { | |||
| /** | |||
| * Font filename, for when location == TEXTURE_FONT_FILE | |||
| */ | |||
| char *filename; | |||
| /** | |||
| * Font memory address, for when location == TEXTURE_FONT_MEMORY | |||
| */ | |||
| struct { | |||
| const void *base; | |||
| size_t size; | |||
| } memory; | |||
| }; | |||
| /** | |||
| * Font size | |||
| */ | |||
| float size; | |||
| /** | |||
| * Whether to use autohint when rendering font | |||
| */ | |||
| int hinting; | |||
| /** | |||
| * Outline type (0 = None, 1 = line, 2 = inner, 3 = outer) | |||
| */ | |||
| int outline_type; | |||
| /** | |||
| * Outline thickness | |||
| */ | |||
| float outline_thickness; | |||
| /** | |||
| * Whether to use our own lcd filter. | |||
| */ | |||
| int filtering; | |||
| /** | |||
| * Whether to use kerning if available | |||
| */ | |||
| int kerning; | |||
| /** | |||
| * LCD filter weights | |||
| */ | |||
| unsigned char lcd_weights[5]; | |||
| /** | |||
| * This field is simply used to compute a default line spacing (i.e., the | |||
| * baseline-to-baseline distance) when writing text with this font. Note | |||
| * that it usually is larger than the sum of the ascender and descender | |||
| * taken as absolute values. There is also no guarantee that no glyphs | |||
| * extend above or below subsequent baselines when using this distance. | |||
| */ | |||
| float height; | |||
| /** | |||
| * This field is the distance that must be placed between two lines of | |||
| * text. The baseline-to-baseline distance should be computed as: | |||
| * ascender - descender + linegap | |||
| */ | |||
| float linegap; | |||
| /** | |||
| * The ascender is the vertical distance from the horizontal baseline to | |||
| * the highest 'character' coordinate in a font face. Unfortunately, font | |||
| * formats define the ascender differently. For some, it represents the | |||
| * ascent of all capital latin characters (without accents), for others it | |||
| * is the ascent of the highest accented character, and finally, other | |||
| * formats define it as being equal to bbox.yMax. | |||
| */ | |||
| float ascender; | |||
| /** | |||
| * The descender is the vertical distance from the horizontal baseline to | |||
| * the lowest 'character' coordinate in a font face. Unfortunately, font | |||
| * formats define the descender differently. For some, it represents the | |||
| * descent of all capital latin characters (without accents), for others it | |||
| * is the ascent of the lowest accented character, and finally, other | |||
| * formats define it as being equal to bbox.yMin. This field is negative | |||
| * for values below the baseline. | |||
| */ | |||
| float descender; | |||
| /** | |||
| * The position of the underline line for this face. It is the center of | |||
| * the underlining stem. Only relevant for scalable formats. | |||
| */ | |||
| float underline_position; | |||
| /** | |||
| * The thickness of the underline for this face. Only relevant for scalable | |||
| * formats. | |||
| */ | |||
| float underline_thickness; | |||
| } texture_font_t; | |||
| /** | |||
| * This function creates a new texture font from given filename and size. The | |||
| * texture atlas is used to store glyph on demand. Note the depth of the atlas | |||
| * will determine if the font is rendered as alpha channel only (depth = 1) or | |||
| * RGB (depth = 3) that correspond to subpixel rendering (if available on your | |||
| * freetype implementation). | |||
| * | |||
| * @param atlas A texture atlas | |||
| * @param pt_size Size of font to be created (in points) | |||
| * @param filename A font filename | |||
| * | |||
| * @return A new empty font (no glyph inside yet) | |||
| * | |||
| */ | |||
| texture_font_t * | |||
| texture_font_new_from_file( texture_atlas_t * atlas, | |||
| const float pt_size, | |||
| const char * filename ); | |||
| /** | |||
| * This function creates a new texture font from a memory location and size. | |||
| * The texture atlas is used to store glyph on demand. Note the depth of the | |||
| * atlas will determine if the font is rendered as alpha channel only | |||
| * (depth = 1) or RGB (depth = 3) that correspond to subpixel rendering (if | |||
| * available on your freetype implementation). | |||
| * | |||
| * @param atlas A texture atlas | |||
| * @param pt_size Size of font to be created (in points) | |||
| * @param memory_base Start of the font file in memory | |||
| * @param memory_size Size of the font file memory region, in bytes | |||
| * | |||
| * @return A new empty font (no glyph inside yet) | |||
| * | |||
| */ | |||
| texture_font_t * | |||
| texture_font_new_from_memory( texture_atlas_t *atlas, | |||
| float pt_size, | |||
| const void *memory_base, | |||
| size_t memory_size ); | |||
| /** | |||
| * Delete a texture font. Note that this does not delete the glyph from the | |||
| * texture atlas. | |||
| * | |||
| * @param self a valid texture font | |||
| */ | |||
| void | |||
| texture_font_delete( texture_font_t * self ); | |||
| /** | |||
| * Request a new glyph from the font. If it has not been created yet, it will | |||
| * be. | |||
| * | |||
| * @param self A valid texture font | |||
| * @param charcode Character codepoint to be loaded. | |||
| * | |||
| * @return A pointer on the new glyph or 0 if the texture atlas is not big | |||
| * enough | |||
| * | |||
| */ | |||
| texture_glyph_t * | |||
| texture_font_get_glyph( texture_font_t * self, | |||
| wchar_t charcode ); | |||
| /** | |||
| * Request the loading of several glyphs at once. | |||
| * | |||
| * @param self a valid texture font | |||
| * @param charcodes character codepoints to be loaded. | |||
| * | |||
| * @return Number of missed glyph if the texture is not big enough to hold | |||
| * every glyphs. | |||
| */ | |||
| size_t | |||
| texture_font_load_glyphs( texture_font_t * self, | |||
| const wchar_t * charcodes ); | |||
| /** | |||
| * Get the kerning between two horizontal glyphs. | |||
| * | |||
| * @param self a valid texture glyph | |||
| * @param charcode codepoint of the peceding glyph | |||
| * | |||
| * @return x kerning value | |||
| */ | |||
| float | |||
| texture_glyph_get_kerning( const texture_glyph_t * self, | |||
| const wchar_t charcode ); | |||
| /** | |||
| * Creates a new empty glyph | |||
| * | |||
| * @return a new empty glyph (not valid) | |||
| */ | |||
| texture_glyph_t * | |||
| texture_glyph_new( void ); | |||
| /** @} */ | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif /* __TEXTURE_FONT_H__ */ | |||
| @@ -1,237 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012,2013 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #ifndef __VEC234_H__ | |||
| #define __VEC234_H__ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| /** | |||
| * Tuple of 4 ints. | |||
| * | |||
| * Each field can be addressed using several aliases: | |||
| * - First component: <b>x</b>, <b>r</b>, <b>red</b> or <b>vstart</b> | |||
| * - Second component: <b>y</b>, <b>g</b>, <b>green</b> or <b>vcount</b> | |||
| * - Third component: <b>z</b>, <b>b</b>, <b>blue</b>, <b>width</b> or <b>istart</b> | |||
| * - Fourth component: <b>w</b>, <b>a</b>, <b>alpha</b>, <b>height</b> or <b>icount</b> | |||
| * | |||
| */ | |||
| typedef union | |||
| { | |||
| int data[4]; /**< All compoments at once */ | |||
| struct { | |||
| int x; /**< Alias for first component */ | |||
| int y; /**< Alias for second component */ | |||
| int z; /**< Alias for third component */ | |||
| int w; /**< Alias for fourht component */ | |||
| }; | |||
| struct { | |||
| int x_; /**< Alias for first component */ | |||
| int y_; /**< Alias for second component */ | |||
| int width; /**< Alias for third component */ | |||
| int height; /**< Alias for fourth component */ | |||
| }; | |||
| struct { | |||
| int r; /**< Alias for first component */ | |||
| int g; /**< Alias for second component */ | |||
| int b; /**< Alias for third component */ | |||
| int a; /**< Alias for fourth component */ | |||
| }; | |||
| struct { | |||
| int red; /**< Alias for first component */ | |||
| int green; /**< Alias for second component */ | |||
| int blue; /**< Alias for third component */ | |||
| int alpha; /**< Alias for fourth component */ | |||
| }; | |||
| struct { | |||
| int vstart; /**< Alias for first component */ | |||
| int vcount; /**< Alias for second component */ | |||
| int istart; /**< Alias for third component */ | |||
| int icount; /**< Alias for fourth component */ | |||
| }; | |||
| } ivec4; | |||
| /** | |||
| * Tuple of 3 ints. | |||
| * | |||
| * Each field can be addressed using several aliases: | |||
| * - First component: <b>x</b>, <b>r</b> or <b>red</b> | |||
| * - Second component: <b>y</b>, <b>g</b> or <b>green</b> | |||
| * - Third component: <b>z</b>, <b>b</b> or <b>blue</b> | |||
| * | |||
| */ | |||
| typedef union | |||
| { | |||
| int data[3]; /**< All compoments at once */ | |||
| struct { | |||
| int x; /**< Alias for first component */ | |||
| int y; /**< Alias for second component */ | |||
| int z; /**< Alias for third component */ | |||
| }; | |||
| struct { | |||
| int r; /**< Alias for first component */ | |||
| int g; /**< Alias for second component */ | |||
| int b; /**< Alias for third component */ | |||
| }; | |||
| struct { | |||
| int red; /**< Alias for first component */ | |||
| int green; /**< Alias for second component */ | |||
| int blue; /**< Alias for third component */ | |||
| }; | |||
| } ivec3; | |||
| /** | |||
| * Tuple of 2 ints. | |||
| * | |||
| * Each field can be addressed using several aliases: | |||
| * - First component: <b>x</b>, <b>s</b> or <b>start</b> | |||
| * - Second component: <b>y</b>, <b>t</b> or <b>end</b> | |||
| * | |||
| */ | |||
| typedef union | |||
| { | |||
| int data[2]; /**< All compoments at once */ | |||
| struct { | |||
| int x; /**< Alias for first component */ | |||
| int y; /**< Alias for second component */ | |||
| }; | |||
| struct { | |||
| int s; /**< Alias for first component */ | |||
| int t; /**< Alias for second component */ | |||
| }; | |||
| struct { | |||
| int start; /**< Alias for first component */ | |||
| int end; /**< Alias for second component */ | |||
| }; | |||
| } ivec2; | |||
| /** | |||
| * Tuple of 4 floats. | |||
| * | |||
| * Each field can be addressed using several aliases: | |||
| * - First component: <b>x</b>, <b>r</b> or <b>red</b> | |||
| * - Second component: <b>y</b>, <b>g</b> or <b>green</b> | |||
| * - Third component: <b>z</b>, <b>b</b>, <b>blue</b> or <b>width</b> | |||
| * - Fourth component: <b>w</b>, <b>a</b>, <b>alpha</b> or <b>height</b> | |||
| */ | |||
| typedef union | |||
| { | |||
| float data[4]; /**< All compoments at once */ | |||
| struct { | |||
| float x; /**< Alias for first component */ | |||
| float y; /**< Alias fo second component */ | |||
| float z; /**< Alias fo third component */ | |||
| float w; /**< Alias fo fourth component */ | |||
| }; | |||
| struct { | |||
| float x_; /**< Alias for first component */ | |||
| float y_; /**< Alias fo second component */ | |||
| float width; /**< Alias fo third component */ | |||
| float height; /**< Alias fo fourth component */ | |||
| }; | |||
| struct { | |||
| float r; /**< Alias for first component */ | |||
| float g; /**< Alias fo second component */ | |||
| float b; /**< Alias fo third component */ | |||
| float a; /**< Alias fo fourth component */ | |||
| }; | |||
| struct { | |||
| float red; /**< Alias for first component */ | |||
| float green; /**< Alias fo second component */ | |||
| float blue; /**< Alias fo third component */ | |||
| float alpha; /**< Alias fo fourth component */ | |||
| }; | |||
| } vec4; | |||
| /** | |||
| * Tuple of 3 floats | |||
| * | |||
| * Each field can be addressed using several aliases: | |||
| * - First component: <b>x</b>, <b>r</b> or <b>red</b> | |||
| * - Second component: <b>y</b>, <b>g</b> or <b>green</b> | |||
| * - Third component: <b>z</b>, <b>b</b> or <b>blue</b> | |||
| */ | |||
| typedef union | |||
| { | |||
| float data[3]; /**< All compoments at once */ | |||
| struct { | |||
| float x; /**< Alias for first component */ | |||
| float y; /**< Alias fo second component */ | |||
| float z; /**< Alias fo third component */ | |||
| }; | |||
| struct { | |||
| float r; /**< Alias for first component */ | |||
| float g; /**< Alias fo second component */ | |||
| float b; /**< Alias fo third component */ | |||
| }; | |||
| struct { | |||
| float red; /**< Alias for first component */ | |||
| float green; /**< Alias fo second component */ | |||
| float blue; /**< Alias fo third component */ | |||
| }; | |||
| } vec3; | |||
| /** | |||
| * Tuple of 2 floats | |||
| * | |||
| * Each field can be addressed using several aliases: | |||
| * - First component: <b>x</b> or <b>s</b> | |||
| * - Second component: <b>y</b> or <b>t</b> | |||
| */ | |||
| typedef union | |||
| { | |||
| float data[2]; /**< All components at once */ | |||
| struct { | |||
| float x; /**< Alias for first component */ | |||
| float y; /**< Alias for second component */ | |||
| }; | |||
| struct { | |||
| float s; /**< Alias for first component */ | |||
| float t; /**< Alias for second component */ | |||
| }; | |||
| } vec2; | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif /* __VEC234_H__ */ | |||
| @@ -1,362 +0,0 @@ | |||
| /* ========================================================================= | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ========================================================================= */ | |||
| #include <assert.h> | |||
| #include <stdlib.h> | |||
| #include <string.h> | |||
| #include <stdio.h> | |||
| #include "vector.h" | |||
| // ------------------------------------------------------------- vector_new --- | |||
| vector_t * | |||
| vector_new( size_t item_size ) | |||
| { | |||
| vector_t *self = (vector_t *) malloc( sizeof(vector_t) ); | |||
| assert( item_size ); | |||
| if( !self ) | |||
| { | |||
| fprintf( stderr, | |||
| "line %d: No more memory for allocating data\n", __LINE__ ); | |||
| exit( EXIT_FAILURE ); | |||
| } | |||
| self->item_size = item_size; | |||
| self->size = 0; | |||
| self->capacity = 1; | |||
| self->items = malloc( self->item_size * self->capacity ); | |||
| return self; | |||
| } | |||
| // ---------------------------------------------------------- vector_delete --- | |||
| void | |||
| vector_delete( vector_t *self ) | |||
| { | |||
| assert( self ); | |||
| free( self->items ); | |||
| free( self ); | |||
| } | |||
| // ------------------------------------------------------------- vector_get --- | |||
| const void * | |||
| vector_get( const vector_t *self, | |||
| size_t index ) | |||
| { | |||
| assert( self ); | |||
| assert( self->size ); | |||
| assert( index < self->size ); | |||
| return (char*)(self->items) + index * self->item_size; | |||
| } | |||
| // ----------------------------------------------------------- vector_front --- | |||
| const void * | |||
| vector_front( const vector_t *self ) | |||
| { | |||
| assert( self ); | |||
| assert( self->size ); | |||
| return vector_get( self, 0 ); | |||
| } | |||
| // ------------------------------------------------------------ vector_back --- | |||
| const void * | |||
| vector_back( const vector_t *self ) | |||
| { | |||
| assert( self ); | |||
| assert( self->size ); | |||
| return vector_get( self, self->size-1 ); | |||
| } | |||
| // -------------------------------------------------------- vector_contains --- | |||
| int | |||
| vector_contains( const vector_t *self, | |||
| const void *item, | |||
| int (*cmp)(const void *, const void *) ) | |||
| { | |||
| size_t i; | |||
| assert( self ); | |||
| for( i=0; i<self->size; ++i ) | |||
| { | |||
| if( (*cmp)(item, vector_get(self,i) ) == 0 ) | |||
| { | |||
| return 1; | |||
| } | |||
| } | |||
| return 0; | |||
| } | |||
| // ----------------------------------------------------------- vector_empty --- | |||
| int | |||
| vector_empty( const vector_t *self ) | |||
| { | |||
| assert( self ); | |||
| return self->size == 0; | |||
| } | |||
| // ------------------------------------------------------------ vector_size --- | |||
| size_t | |||
| vector_size( const vector_t *self ) | |||
| { | |||
| assert( self ); | |||
| return self->size; | |||
| } | |||
| // --------------------------------------------------------- vector_reserve --- | |||
| void | |||
| vector_reserve( vector_t *self, | |||
| const size_t size ) | |||
| { | |||
| assert( self ); | |||
| if( self->capacity < size) | |||
| { | |||
| self->items = realloc( self->items, size * self->item_size ); | |||
| self->capacity = size; | |||
| } | |||
| } | |||
| // -------------------------------------------------------- vector_capacity --- | |||
| size_t | |||
| vector_capacity( const vector_t *self ) | |||
| { | |||
| assert( self ); | |||
| return self->capacity; | |||
| } | |||
| // ---------------------------------------------------------- vector_shrink --- | |||
| void | |||
| vector_shrink( vector_t *self ) | |||
| { | |||
| assert( self ); | |||
| if( self->capacity > self->size ) | |||
| { | |||
| self->items = realloc( self->items, self->size * self->item_size ); | |||
| } | |||
| self->capacity = self->size; | |||
| } | |||
| // ----------------------------------------------------------- vector_clear --- | |||
| void | |||
| vector_clear( vector_t *self ) | |||
| { | |||
| assert( self ); | |||
| self->size = 0; | |||
| } | |||
| // ------------------------------------------------------------- vector_set --- | |||
| void | |||
| vector_set( vector_t *self, | |||
| const size_t index, | |||
| const void *item ) | |||
| { | |||
| assert( self ); | |||
| assert( self->size ); | |||
| assert( index < self->size ); | |||
| memcpy( (char *)(self->items) + index * self->item_size, | |||
| item, self->item_size ); | |||
| } | |||
| // ---------------------------------------------------------- vector_insert --- | |||
| void | |||
| vector_insert( vector_t *self, | |||
| const size_t index, | |||
| const void *item ) | |||
| { | |||
| assert( self ); | |||
| assert( index <= self->size); | |||
| if( self->capacity <= self->size ) | |||
| { | |||
| vector_reserve(self, 2 * self->capacity ); | |||
| } | |||
| if( index < self->size ) | |||
| { | |||
| memmove( (char *)(self->items) + (index + 1) * self->item_size, | |||
| (char *)(self->items) + (index + 0) * self->item_size, | |||
| (self->size - index) * self->item_size); | |||
| } | |||
| self->size++; | |||
| vector_set( self, index, item ); | |||
| } | |||
| // ----------------------------------------------------- vector_erase_range --- | |||
| void | |||
| vector_erase_range( vector_t *self, | |||
| const size_t first, | |||
| const size_t last ) | |||
| { | |||
| assert( self ); | |||
| assert( first < self->size ); | |||
| assert( last < self->size+1 ); | |||
| assert( first < last ); | |||
| memmove( (char *)(self->items) + first * self->item_size, | |||
| (char *)(self->items) + last * self->item_size, | |||
| (self->size - last) * self->item_size); | |||
| self->size -= (last-first); | |||
| } | |||
| // ----------------------------------------------------------- vector_erase --- | |||
| void | |||
| vector_erase( vector_t *self, | |||
| const size_t index ) | |||
| { | |||
| assert( self ); | |||
| assert( index < self->size ); | |||
| vector_erase_range( self, index, index+1 ); | |||
| } | |||
| // ------------------------------------------------------- vector_push_back --- | |||
| void | |||
| vector_push_back( vector_t *self, | |||
| const void *item ) | |||
| { | |||
| vector_insert( self, self->size, item ); | |||
| } | |||
| // -------------------------------------------------------- vector_pop_back --- | |||
| void | |||
| vector_pop_back( vector_t *self ) | |||
| { | |||
| assert( self ); | |||
| assert( self->size ); | |||
| self->size--; | |||
| } | |||
| // ---------------------------------------------------------- vector_resize --- | |||
| void | |||
| vector_resize( vector_t *self, | |||
| const size_t size ) | |||
| { | |||
| assert( self ); | |||
| if( size > self->capacity) | |||
| { | |||
| vector_reserve( self, size ); | |||
| self->size = self->capacity; | |||
| } | |||
| else | |||
| { | |||
| self->size = size; | |||
| } | |||
| } | |||
| // -------------------------------------------------- vector_push_back_data --- | |||
| void | |||
| vector_push_back_data( vector_t *self, | |||
| const void * data, | |||
| const size_t count ) | |||
| { | |||
| assert( self ); | |||
| assert( data ); | |||
| assert( count ); | |||
| if( self->capacity < (self->size+count) ) | |||
| { | |||
| vector_reserve(self, self->size+count); | |||
| } | |||
| memmove( (char *)(self->items) + self->size * self->item_size, data, | |||
| count*self->item_size ); | |||
| self->size += count; | |||
| } | |||
| // ----------------------------------------------------- vector_insert_data --- | |||
| void | |||
| vector_insert_data( vector_t *self, | |||
| const size_t index, | |||
| const void * data, | |||
| const size_t count ) | |||
| { | |||
| assert( self ); | |||
| assert( index < self->size ); | |||
| assert( data ); | |||
| assert( count ); | |||
| if( self->capacity < (self->size+count) ) | |||
| { | |||
| vector_reserve(self, self->size+count); | |||
| } | |||
| memmove( (char *)(self->items) + (index + count ) * self->item_size, | |||
| (char *)(self->items) + (index ) * self->item_size, | |||
| count*self->item_size ); | |||
| memmove( (char *)(self->items) + index * self->item_size, data, | |||
| count*self->item_size ); | |||
| self->size += count; | |||
| } | |||
| // ------------------------------------------------------------ vector_sort --- | |||
| void | |||
| vector_sort( vector_t *self, | |||
| int (*cmp)(const void *, const void *) ) | |||
| { | |||
| assert( self ); | |||
| assert( self->size ); | |||
| qsort(self->items, self->size, self->item_size, cmp); | |||
| } | |||
| @@ -1,353 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #ifndef __VECTOR_H__ | |||
| #define __VECTOR_H__ | |||
| #include <stdlib.h> | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| #include <stddef.h> | |||
| /** | |||
| * @file vector.h | |||
| * @author Nicolas Rougier (Nicolas.Rougier@inria.fr) | |||
| * | |||
| * @defgroup vector Vector | |||
| * | |||
| * The vector structure and accompanying functions loosely mimic the STL C++ | |||
| * vector class. It is used by @ref texture-atlas (for storing nodes), @ref | |||
| * texture-font (for storing glyphs) and @ref font-manager (for storing fonts). | |||
| * More information at http://www.cppreference.com/wiki/container/vector/start | |||
| * | |||
| * <b>Example Usage</b>: | |||
| * @code | |||
| * #include "vector.h" | |||
| * | |||
| * int main( int arrgc, char *argv[] ) | |||
| * { | |||
| * int i,j = 1; | |||
| * vector_t * vector = vector_new( sizeof(int) ); | |||
| * vector_push_back( &i ); | |||
| * | |||
| * j = * (int *) vector_get( vector, 0 ); | |||
| * vector_delete( vector); | |||
| * | |||
| * return 0; | |||
| * } | |||
| * @endcode | |||
| * | |||
| * @{ | |||
| */ | |||
| /** | |||
| * Generic vector structure. | |||
| * | |||
| * @memberof vector | |||
| */ | |||
| typedef struct vector_t | |||
| { | |||
| /** Pointer to dynamically allocated items. */ | |||
| void * items; | |||
| /** Number of items that can be held in currently allocated storage. */ | |||
| size_t capacity; | |||
| /** Number of items. */ | |||
| size_t size; | |||
| /** Size (in bytes) of a single item. */ | |||
| size_t item_size; | |||
| } vector_t; | |||
| /** | |||
| * Creates a new empty vector. | |||
| * | |||
| * @param item_size item size in bytes | |||
| * @return a new empty vector | |||
| * | |||
| */ | |||
| vector_t * | |||
| vector_new( size_t item_size ); | |||
| /** | |||
| * Deletes a vector. | |||
| * | |||
| * @param self a vector structure | |||
| * | |||
| */ | |||
| void | |||
| vector_delete( vector_t *self ); | |||
| /** | |||
| * Returns a pointer to the item located at specified index. | |||
| * | |||
| * @param self a vector structure | |||
| * @param index the index of the item to be returned | |||
| * @return pointer on the specified item | |||
| */ | |||
| const void * | |||
| vector_get( const vector_t *self, | |||
| size_t index ); | |||
| /** | |||
| * Returns a pointer to the first item. | |||
| * | |||
| * @param self a vector structure | |||
| * @return pointer on the first item | |||
| */ | |||
| const void * | |||
| vector_front( const vector_t *self ); | |||
| /** | |||
| * Returns a pointer to the last item | |||
| * | |||
| * @param self a vector structure | |||
| * @return pointer on the last item | |||
| */ | |||
| const void * | |||
| vector_back( const vector_t *self ); | |||
| /** | |||
| * Check if an item is contained within the vector. | |||
| * | |||
| * @param self a vector structure | |||
| * @param item item to be searched in the vector | |||
| * @param cmp a pointer a comparison function | |||
| * @return 1 if item is contained within the vector, 0 otherwise | |||
| */ | |||
| int | |||
| vector_contains( const vector_t *self, | |||
| const void *item, | |||
| int (*cmp)(const void *, const void *) ); | |||
| /** | |||
| * Checks whether the vector is empty. | |||
| * | |||
| * @param self a vector structure | |||
| * @return 1 if the vector is empty, 0 otherwise | |||
| */ | |||
| int | |||
| vector_empty( const vector_t *self ); | |||
| /** | |||
| * Returns the number of items | |||
| * | |||
| * @param self a vector structure | |||
| * @return number of items | |||
| */ | |||
| size_t | |||
| vector_size( const vector_t *self ); | |||
| /** | |||
| * Reserve storage such that it can hold at last size items. | |||
| * | |||
| * @param self a vector structure | |||
| * @param size the new storage capacity | |||
| */ | |||
| void | |||
| vector_reserve( vector_t *self, | |||
| const size_t size ); | |||
| /** | |||
| * Returns current storage capacity | |||
| * | |||
| * @param self a vector structure | |||
| * @return storage capacity | |||
| */ | |||
| size_t | |||
| vector_capacity( const vector_t *self ); | |||
| /** | |||
| * Decrease capacity to fit actual size. | |||
| * | |||
| * @param self a vector structure | |||
| */ | |||
| void | |||
| vector_shrink( vector_t *self ); | |||
| /** | |||
| * Removes all items. | |||
| * | |||
| * @param self a vector structure | |||
| */ | |||
| void | |||
| vector_clear( vector_t *self ); | |||
| /** | |||
| * Replace an item. | |||
| * | |||
| * @param self a vector structure | |||
| * @param index the index of the item to be replaced | |||
| * @param item the new item | |||
| */ | |||
| void | |||
| vector_set( vector_t *self, | |||
| const size_t index, | |||
| const void *item ); | |||
| /** | |||
| * Erase an item. | |||
| * | |||
| * @param self a vector structure | |||
| * @param index the index of the item to be erased | |||
| */ | |||
| void | |||
| vector_erase( vector_t *self, | |||
| const size_t index ); | |||
| /** | |||
| * Erase a range of items. | |||
| * | |||
| * @param self a vector structure | |||
| * @param first the index of the first item to be erased | |||
| * @param last the index of the last item to be erased | |||
| */ | |||
| void | |||
| vector_erase_range( vector_t *self, | |||
| const size_t first, | |||
| const size_t last ); | |||
| /** | |||
| * Appends given item to the end of the vector. | |||
| * | |||
| * @param self a vector structure | |||
| * @param item the item to be inserted | |||
| */ | |||
| void | |||
| vector_push_back( vector_t *self, | |||
| const void *item ); | |||
| /** | |||
| * Removes the last item of the vector. | |||
| * | |||
| * @param self a vector structure | |||
| */ | |||
| void | |||
| vector_pop_back( vector_t *self ); | |||
| /** | |||
| * Resizes the vector to contain size items | |||
| * | |||
| * If the current size is less than size, additional items are appended and | |||
| * initialized with value. If the current size is greater than size, the | |||
| * vector is reduced to its first size elements. | |||
| * | |||
| * @param self a vector structure | |||
| * @param size the new size | |||
| */ | |||
| void | |||
| vector_resize( vector_t *self, | |||
| const size_t size ); | |||
| /** | |||
| * Insert a single item at specified index. | |||
| * | |||
| * @param self a vector structure | |||
| * @param index location before which to insert item | |||
| * @param item the item to be inserted | |||
| */ | |||
| void | |||
| vector_insert( vector_t *self, | |||
| const size_t index, | |||
| const void *item ); | |||
| /** | |||
| * Insert raw data at specified index. | |||
| * | |||
| * @param self a vector structure | |||
| * @param index location before which to insert item | |||
| * @param data a pointer to the items to be inserted | |||
| * @param count the number of items to be inserted | |||
| */ | |||
| void | |||
| vector_insert_data( vector_t *self, | |||
| const size_t index, | |||
| const void * data, | |||
| const size_t count ); | |||
| /** | |||
| * Append raw data to the end of the vector. | |||
| * | |||
| * @param self a vector structure | |||
| * @param data a pointer to the items to be inserted | |||
| * @param count the number of items to be inserted | |||
| */ | |||
| void | |||
| vector_push_back_data( vector_t *self, | |||
| const void * data, | |||
| const size_t count ); | |||
| /** | |||
| * Sort vector items according to cmp function. | |||
| * | |||
| * @param self a vector structure | |||
| * @param cmp a pointer a comparison function | |||
| */ | |||
| void | |||
| vector_sort( vector_t *self, | |||
| int (*cmp)(const void *, const void *) ); | |||
| /** @} */ | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif /* __VECTOR_H__ */ | |||
| @@ -1,168 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #include <assert.h> | |||
| #include <string.h> | |||
| #include <stdlib.h> | |||
| #include <stdio.h> | |||
| #include "vec234.h" | |||
| #include "platform.h" | |||
| #include "vertex-attribute.h" | |||
| // ---------------------------------------------------------------------------- | |||
| vertex_attribute_t * | |||
| vertex_attribute_new( GLchar * name, | |||
| GLint size, | |||
| GLenum type, | |||
| GLboolean normalized, | |||
| GLsizei stride, | |||
| GLvoid *pointer ) | |||
| { | |||
| vertex_attribute_t *attribute = | |||
| (vertex_attribute_t *) malloc (sizeof(vertex_attribute_t)); | |||
| assert( size > 0 ); | |||
| attribute->name = (GLchar *) strdup( name ); | |||
| attribute->index = -1; | |||
| attribute->size = size; | |||
| attribute->type = type; | |||
| attribute->normalized = normalized; | |||
| attribute->stride = stride; | |||
| attribute->pointer = pointer; | |||
| return attribute; | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_attribute_delete( vertex_attribute_t * self ) | |||
| { | |||
| assert( self ); | |||
| free( self->name ); | |||
| free( self ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| vertex_attribute_t * | |||
| vertex_attribute_parse( char *format ) | |||
| { | |||
| GLenum type = 0; | |||
| int size; | |||
| int normalized = 0; | |||
| char ctype; | |||
| char *name; | |||
| vertex_attribute_t *attr; | |||
| char *p = strchr(format, ':'); | |||
| if( p != NULL) | |||
| { | |||
| name = strndup(format, p-format); | |||
| if( *(++p) == '\0' ) | |||
| { | |||
| fprintf( stderr, "No size specified for '%s' attribute\n", name ); | |||
| free( name ); | |||
| return 0; | |||
| } | |||
| size = *p - '0'; | |||
| if( *(++p) == '\0' ) | |||
| { | |||
| fprintf( stderr, "No format specified for '%s' attribute\n", name ); | |||
| free( name ); | |||
| return 0; | |||
| } | |||
| ctype = *p; | |||
| if( *(++p) != '\0' ) | |||
| { | |||
| if( *p == 'n' ) | |||
| { | |||
| normalized = 1; | |||
| } | |||
| } | |||
| } | |||
| else | |||
| { | |||
| fprintf(stderr, "Vertex attribute format not understood ('%s')\n", format ); | |||
| return 0; | |||
| } | |||
| switch( ctype ) | |||
| { | |||
| case 'b': type = GL_BYTE; break; | |||
| case 'B': type = GL_UNSIGNED_BYTE; break; | |||
| case 's': type = GL_SHORT; break; | |||
| case 'S': type = GL_UNSIGNED_SHORT; break; | |||
| case 'i': type = GL_INT; break; | |||
| case 'I': type = GL_UNSIGNED_INT; break; | |||
| case 'f': type = GL_FLOAT; break; | |||
| default: type = 0; break; | |||
| } | |||
| attr = vertex_attribute_new( name, size, type, normalized, 0, 0 ); | |||
| free( name ); | |||
| return attr; | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_attribute_enable( vertex_attribute_t *attr ) | |||
| { | |||
| if( attr->index == -1 ) | |||
| { | |||
| GLint program; | |||
| glGetIntegerv( GL_CURRENT_PROGRAM, &program ); | |||
| if( program == 0) | |||
| { | |||
| return; | |||
| } | |||
| attr->index = glGetAttribLocation( program, attr->name ); | |||
| if( attr->index == -1 ) | |||
| { | |||
| return; | |||
| } | |||
| } | |||
| glEnableVertexAttribArray( attr->index ); | |||
| glVertexAttribPointer( attr->index, attr->size, attr->type, | |||
| attr->normalized, attr->stride, attr->pointer ); | |||
| } | |||
| @@ -1,320 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #ifndef __VERTEX_ATTRIBUTE_H__ | |||
| #define __VERTEX_ATTRIBUTE_H__ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| #include "opengl.h" | |||
| #include "vector.h" | |||
| /** | |||
| * @file vertex-attribute.h | |||
| * @author Nicolas Rougier (Nicolas.Rougier@inria.fr) | |||
| * | |||
| * @defgroup vertex-attribut Vertex attribute | |||
| * | |||
| * Besides the required vertex position, vertices can have several other | |||
| * numeric attributes. Each is specified in the format string with a letter, | |||
| * the number of components and the data type. | |||
| * | |||
| * Each of the attributes is described in the table below with the set of valid | |||
| * format strings written as a regular expression (for example, "v[234][if]" | |||
| * means "v2f", "v3i", "v4f", etc. are all valid formats). | |||
| * | |||
| * Some attributes have a "recommended" format string, which is the most | |||
| * efficient form for the video driver as it requires less conversion. | |||
| * | |||
| * <table> | |||
| * <tr> | |||
| * <th>Attribute</th> | |||
| * <th>Formats</th> | |||
| * <th>Recommended</th> | |||
| * </tr> | |||
| * <tr> | |||
| * <td>Vertex position</td> | |||
| * <td>"v[234][sifd]"</td> | |||
| * <td>"v[234]f"</td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> Color </td> | |||
| * <td> "c[34][bBsSiIfd]" </td> | |||
| * <td> "c[34]B" </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> Edge flag </td> | |||
| * <td> "e1[bB]" </td> | |||
| * <td> </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> Fog coordinate </td> | |||
| * <td> "f[1234][bBsSiIfd]"</td> | |||
| * <td> </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> Normal </td> | |||
| * <td> "n3[bsifd]" </td> | |||
| * <td> "n3f" </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> Secondary color </td> | |||
| * <td> "s[34][bBsSiIfd]" </td> | |||
| * <td> "s[34]B" </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> Texture coordinate </td> | |||
| * <td> "t[234][sifd]" </td> | |||
| * <td> "t[234]f" </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> Generic attribute </td> | |||
| * <td> "[0-15]g(n)?[1234][bBsSiIfd]" </td> | |||
| * <td> </td> | |||
| * </tr> | |||
| * </table> | |||
| * | |||
| * The possible data types that can be specified in the format string are described below. | |||
| * | |||
| * <table> | |||
| * <tr> | |||
| * <th> Format </th> | |||
| * <th> Type </th> | |||
| * <th> GL Type </th> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> "b" </td> | |||
| * <td> Signed byte </td> | |||
| * <td> GL_BYTE </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> "B" </td> | |||
| * <td> Unsigned byte </td> | |||
| * <td> GL_UNSIGNED_BYTE </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> "s" </td> | |||
| * <td> Signed short </td> | |||
| * <td> GL_SHORT </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> "S" </td> | |||
| * <td> Unsigned short </td> | |||
| * <td> GL_UNSIGNED_SHORT </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> "i" </td> | |||
| * <td> Signed int </td> | |||
| * <td> GL_INT </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> "I" </td> | |||
| * <td> Unsigned int </td> | |||
| * <td> GL_UNSIGNED_INT </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> "f" </td> | |||
| * <td> Float </td> | |||
| * <td> GL_FLOAT </td> | |||
| * </tr> | |||
| * <tr> | |||
| * <td> "d" </td> | |||
| * <td> Double </td> | |||
| * <td> GL_DOUBLE T </td> | |||
| * </tr> | |||
| * </table> | |||
| * | |||
| * The following attributes are normalised to the range [0, 1]. The value is | |||
| * used as-is if the data type is floating-point. If the data type is byte, | |||
| * short or int, the value is divided by the maximum value representable by | |||
| * that type. For example, unsigned bytes are divided by 255 to get the | |||
| * normalised value. | |||
| * | |||
| * - Color | |||
| * - Secondary color | |||
| * - Generic attributes with the "n" format given. | |||
| * | |||
| * Up to 16 generic attributes can be specified per vertex, and can be used by | |||
| * shader programs for any purpose (they are ignored in the fixed-function | |||
| * pipeline). For the other attributes, consult the OpenGL programming guide | |||
| * for details on their effects. | |||
| * | |||
| * When using the draw and related functions, attribute data is specified | |||
| * alongside the vertex position data. The following example reproduces the two | |||
| * points from the previous page, except that the first point is blue and the | |||
| * second green: | |||
| * | |||
| * It is an error to provide more than one set of data for any attribute, or to | |||
| * mismatch the size of the initial data with the number of vertices specified | |||
| * in the first argument. | |||
| * | |||
| * @{ | |||
| */ | |||
| /** | |||
| * Maximum number of attributes per vertex | |||
| * | |||
| * @private | |||
| */ | |||
| #define MAX_VERTEX_ATTRIBUTE 16 | |||
| /** | |||
| * Generic vertex attribute. | |||
| */ | |||
| typedef struct vertex_attribute_t | |||
| { | |||
| /** | |||
| * atribute name | |||
| */ | |||
| GLchar * name; | |||
| /** | |||
| * index of the generic vertex attribute to be modified. | |||
| */ | |||
| GLuint index; | |||
| /** | |||
| * Number of components per generic vertex attribute. | |||
| * | |||
| * Must be 1, 2, 3, or 4. The initial value is 4. | |||
| */ | |||
| GLint size; | |||
| /** | |||
| * data type of each component in the array. | |||
| * | |||
| * Symbolic constants GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, | |||
| * GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT, GL_FLOAT, or GL_DOUBLE are | |||
| * accepted. The initial value is GL_FLOAT. | |||
| */ | |||
| GLenum type; | |||
| /** | |||
| * whether fixed-point data values should be normalized (GL_TRUE) or | |||
| * converted directly as fixed-point values (GL_FALSE) when they are | |||
| * accessed. | |||
| */ | |||
| GLboolean normalized; | |||
| /** | |||
| * byte offset between consecutive generic vertex attributes. | |||
| * | |||
| * If stride is 0, the generic vertex attributes are understood to be | |||
| * tightly packed in the array. The initial value is 0. | |||
| */ | |||
| GLsizei stride; | |||
| /** | |||
| * pointer to the first component of the first attribute element in the | |||
| * array. | |||
| */ | |||
| GLvoid * pointer; | |||
| /** | |||
| * pointer to the function that enable this attribute. | |||
| */ | |||
| void ( * enable )(void *); | |||
| } vertex_attribute_t; | |||
| /** | |||
| * Create an attribute from the given parameters. | |||
| * | |||
| * @param size number of component | |||
| * @param type data type | |||
| * @param normalized Whether fixed-point data values should be normalized | |||
| (GL_TRUE) or converted directly as fixed-point values | |||
| (GL_FALSE) when they are accessed. | |||
| * @param stride byte offset between consecutive attributes. | |||
| * @param pointer pointer to the first component of the first attribute | |||
| * element in the array. | |||
| * @return a new initialized vertex attribute. | |||
| * | |||
| * @private | |||
| */ | |||
| vertex_attribute_t * | |||
| vertex_attribute_new( GLchar * name, | |||
| GLint size, | |||
| GLenum type, | |||
| GLboolean normalized, | |||
| GLsizei stride, | |||
| GLvoid *pointer ); | |||
| /** | |||
| * Delete a vertex attribute. | |||
| * | |||
| * @param self a vertex attribute | |||
| * | |||
| */ | |||
| void | |||
| vertex_attribute_delete( vertex_attribute_t * self ); | |||
| /** | |||
| * Create an attribute from the given description. | |||
| * | |||
| * @param format Format string specifies the format of a vertex attribute. | |||
| * @return an initialized vertex attribute | |||
| * | |||
| * @private | |||
| */ | |||
| vertex_attribute_t * | |||
| vertex_attribute_parse( char *format ); | |||
| /** | |||
| * Enable a vertex attribute. | |||
| * | |||
| * @param attr a vertex attribute | |||
| * | |||
| * @private | |||
| */ | |||
| void | |||
| vertex_attribute_enable( vertex_attribute_t *attr ); | |||
| /** @} */ | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif /* __VERTEX_ATTRIBUTE_H__ */ | |||
| @@ -1,662 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #include <assert.h> | |||
| #include <string.h> | |||
| #include <stdlib.h> | |||
| #include <stdio.h> | |||
| #include "vec234.h" | |||
| #include "platform.h" | |||
| #include "vertex-buffer.h" | |||
| /** | |||
| * Buffer status | |||
| */ | |||
| #define CLEAN (0) | |||
| #define DIRTY (1) | |||
| #define FROZEN (2) | |||
| // ---------------------------------------------------------------------------- | |||
| vertex_buffer_t * | |||
| vertex_buffer_new( const char *format ) | |||
| { | |||
| size_t i, index = 0, stride = 0; | |||
| const char *start = 0, *end = 0; | |||
| GLchar *pointer = 0; | |||
| vertex_buffer_t *self = (vertex_buffer_t *) malloc (sizeof(vertex_buffer_t)); | |||
| if( !self ) | |||
| { | |||
| return NULL; | |||
| } | |||
| self->format = strdup( format ); | |||
| for( i=0; i<MAX_VERTEX_ATTRIBUTE; ++i ) | |||
| { | |||
| self->attributes[i] = 0; | |||
| } | |||
| start = format; | |||
| do | |||
| { | |||
| char *desc = 0; | |||
| vertex_attribute_t *attribute; | |||
| GLuint attribute_size = 0; | |||
| end = (char *) (strchr(start+1, ',')); | |||
| if (end == NULL) | |||
| { | |||
| desc = strdup( start ); | |||
| } | |||
| else | |||
| { | |||
| desc = strndup( start, end-start ); | |||
| } | |||
| attribute = vertex_attribute_parse( desc ); | |||
| start = end+1; | |||
| free(desc); | |||
| attribute->pointer = pointer; | |||
| switch( attribute->type ) | |||
| { | |||
| case GL_BOOL: attribute_size = sizeof(GLboolean); break; | |||
| case GL_BYTE: attribute_size = sizeof(GLbyte); break; | |||
| case GL_UNSIGNED_BYTE: attribute_size = sizeof(GLubyte); break; | |||
| case GL_SHORT: attribute_size = sizeof(GLshort); break; | |||
| case GL_UNSIGNED_SHORT: attribute_size = sizeof(GLushort); break; | |||
| case GL_INT: attribute_size = sizeof(GLint); break; | |||
| case GL_UNSIGNED_INT: attribute_size = sizeof(GLuint); break; | |||
| case GL_FLOAT: attribute_size = sizeof(GLfloat); break; | |||
| default: attribute_size = 0; | |||
| } | |||
| stride += attribute->size*attribute_size; | |||
| pointer += attribute->size*attribute_size; | |||
| self->attributes[index] = attribute; | |||
| index++; | |||
| } while ( end && (index < MAX_VERTEX_ATTRIBUTE) ); | |||
| for( i=0; i<index; ++i ) | |||
| { | |||
| self->attributes[i]->stride = stride; | |||
| } | |||
| #ifdef FREETYPE_GL_USE_VAO | |||
| self->VAO_id = 0; | |||
| #endif | |||
| self->vertices = vector_new( stride ); | |||
| self->vertices_id = 0; | |||
| self->GPU_vsize = 0; | |||
| self->indices = vector_new( sizeof(GLuint) ); | |||
| self->indices_id = 0; | |||
| self->GPU_isize = 0; | |||
| self->items = vector_new( sizeof(ivec4) ); | |||
| self->state = DIRTY; | |||
| self->mode = GL_TRIANGLES; | |||
| return self; | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_delete( vertex_buffer_t *self ) | |||
| { | |||
| size_t i; | |||
| assert( self ); | |||
| for( i=0; i<MAX_VERTEX_ATTRIBUTE; ++i ) | |||
| { | |||
| if( self->attributes[i] ) | |||
| { | |||
| vertex_attribute_delete( self->attributes[i] ); | |||
| } | |||
| } | |||
| #ifdef FREETYPE_GL_USE_VAO | |||
| if( self->VAO_id ) | |||
| { | |||
| glDeleteVertexArrays( 1, &self->VAO_id ); | |||
| } | |||
| self->VAO_id = 0; | |||
| #endif | |||
| vector_delete( self->vertices ); | |||
| self->vertices = 0; | |||
| if( self->vertices_id ) | |||
| { | |||
| glDeleteBuffers( 1, &self->vertices_id ); | |||
| } | |||
| self->vertices_id = 0; | |||
| vector_delete( self->indices ); | |||
| self->indices = 0; | |||
| if( self->indices_id ) | |||
| { | |||
| glDeleteBuffers( 1, &self->indices_id ); | |||
| } | |||
| self->indices_id = 0; | |||
| vector_delete( self->items ); | |||
| if( self->format ) | |||
| { | |||
| free( self->format ); | |||
| } | |||
| self->format = 0; | |||
| self->state = 0; | |||
| free( self ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| const char * | |||
| vertex_buffer_format( const vertex_buffer_t *self ) | |||
| { | |||
| assert( self ); | |||
| return self->format; | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| size_t | |||
| vertex_buffer_size( const vertex_buffer_t *self ) | |||
| { | |||
| assert( self ); | |||
| return vector_size( self->items ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_print( vertex_buffer_t * self ) | |||
| { | |||
| int i = 0; | |||
| static char *gltypes[9] = { | |||
| "GL_BOOL", | |||
| "GL_BYTE", | |||
| "GL_UNSIGNED_BYTE", | |||
| "GL_SHORT", | |||
| "GL_UNSIGNED_SHORT", | |||
| "GL_INT", | |||
| "GL_UNSIGNED_INT", | |||
| "GL_FLOAT", | |||
| "GL_VOID" | |||
| }; | |||
| assert(self); | |||
| fprintf( stderr, "%ld vertices, %ld indices\n", | |||
| vector_size( self->vertices ), vector_size( self->indices ) ); | |||
| while( self->attributes[i] ) | |||
| { | |||
| int j = 8; | |||
| switch( self->attributes[i]->type ) | |||
| { | |||
| case GL_BOOL: j=0; break; | |||
| case GL_BYTE: j=1; break; | |||
| case GL_UNSIGNED_BYTE: j=2; break; | |||
| case GL_SHORT: j=3; break; | |||
| case GL_UNSIGNED_SHORT: j=4; break; | |||
| case GL_INT: j=5; break; | |||
| case GL_UNSIGNED_INT: j=6; break; | |||
| case GL_FLOAT: j=7; break; | |||
| default: j=8; break; | |||
| } | |||
| fprintf(stderr, "%s : %dx%s (+%p)\n", | |||
| self->attributes[i]->name, | |||
| self->attributes[i]->size, | |||
| gltypes[j], | |||
| self->attributes[i]->pointer); | |||
| i += 1; | |||
| } | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_upload ( vertex_buffer_t *self ) | |||
| { | |||
| size_t vsize, isize; | |||
| if( self->state == FROZEN ) | |||
| { | |||
| return; | |||
| } | |||
| if( !self->vertices_id ) | |||
| { | |||
| glGenBuffers( 1, &self->vertices_id ); | |||
| } | |||
| if( !self->indices_id ) | |||
| { | |||
| glGenBuffers( 1, &self->indices_id ); | |||
| } | |||
| vsize = self->vertices->size*self->vertices->item_size; | |||
| isize = self->indices->size*self->indices->item_size; | |||
| // Always upload vertices first such that indices do not point to non | |||
| // existing data (if we get interrupted in between for example). | |||
| // Upload vertices | |||
| glBindBuffer( GL_ARRAY_BUFFER, self->vertices_id ); | |||
| if( vsize != self->GPU_vsize ) | |||
| { | |||
| glBufferData( GL_ARRAY_BUFFER, | |||
| vsize, self->vertices->items, GL_DYNAMIC_DRAW ); | |||
| self->GPU_vsize = vsize; | |||
| } | |||
| else | |||
| { | |||
| glBufferSubData( GL_ARRAY_BUFFER, | |||
| 0, vsize, self->vertices->items ); | |||
| } | |||
| glBindBuffer( GL_ARRAY_BUFFER, 0 ); | |||
| // Upload indices | |||
| glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, self->indices_id ); | |||
| if( isize != self->GPU_isize ) | |||
| { | |||
| glBufferData( GL_ELEMENT_ARRAY_BUFFER, | |||
| isize, self->indices->items, GL_DYNAMIC_DRAW ); | |||
| self->GPU_isize = isize; | |||
| } | |||
| else | |||
| { | |||
| glBufferSubData( GL_ELEMENT_ARRAY_BUFFER, | |||
| 0, isize, self->indices->items ); | |||
| } | |||
| glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_clear( vertex_buffer_t *self ) | |||
| { | |||
| assert( self ); | |||
| self->state = FROZEN; | |||
| vector_clear( self->indices ); | |||
| vector_clear( self->vertices ); | |||
| vector_clear( self->items ); | |||
| self->state = DIRTY; | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_render_setup ( vertex_buffer_t *self, GLenum mode ) | |||
| { | |||
| size_t i; | |||
| #ifdef FREETYPE_GL_USE_VAO | |||
| // Unbind so no existing VAO-state is overwritten, | |||
| // (e.g. the GL_ELEMENT_ARRAY_BUFFER-binding). | |||
| glBindVertexArray( 0 ); | |||
| #endif | |||
| if( self->state != CLEAN ) | |||
| { | |||
| vertex_buffer_upload( self ); | |||
| self->state = CLEAN; | |||
| } | |||
| #ifdef FREETYPE_GL_USE_VAO | |||
| if( self->VAO_id == 0 ) | |||
| { | |||
| // Generate and set up VAO | |||
| glGenVertexArrays( 1, &self->VAO_id ); | |||
| glBindVertexArray( self->VAO_id ); | |||
| glBindBuffer( GL_ARRAY_BUFFER, self->vertices_id ); | |||
| for( i=0; i<MAX_VERTEX_ATTRIBUTE; ++i ) | |||
| { | |||
| vertex_attribute_t *attribute = self->attributes[i]; | |||
| if( attribute == 0 ) | |||
| { | |||
| continue; | |||
| } | |||
| else | |||
| { | |||
| vertex_attribute_enable( attribute ); | |||
| } | |||
| } | |||
| glBindBuffer( GL_ARRAY_BUFFER, 0 ); | |||
| if( self->indices->size ) | |||
| { | |||
| glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, self->indices_id ); | |||
| } | |||
| } | |||
| // Bind VAO for drawing | |||
| glBindVertexArray( self->VAO_id ); | |||
| #else | |||
| glBindBuffer( GL_ARRAY_BUFFER, self->vertices_id ); | |||
| for( i=0; i<MAX_VERTEX_ATTRIBUTE; ++i ) | |||
| { | |||
| vertex_attribute_t *attribute = self->attributes[i]; | |||
| if ( attribute == 0 ) | |||
| { | |||
| continue; | |||
| } | |||
| else | |||
| { | |||
| vertex_attribute_enable( attribute ); | |||
| } | |||
| } | |||
| if( self->indices->size ) | |||
| { | |||
| glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, self->indices_id ); | |||
| } | |||
| #endif | |||
| self->mode = mode; | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_render_finish ( vertex_buffer_t *self ) | |||
| { | |||
| #ifdef FREETYPE_GL_USE_VAO | |||
| glBindVertexArray( 0 ); | |||
| #else | |||
| glBindBuffer( GL_ARRAY_BUFFER, 0 ); | |||
| glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 ); | |||
| #endif | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_render_item ( vertex_buffer_t *self, | |||
| size_t index ) | |||
| { | |||
| ivec4 * item = (ivec4 *) vector_get( self->items, index ); | |||
| assert( self ); | |||
| assert( index < vector_size( self->items ) ); | |||
| if( self->indices->size ) | |||
| { | |||
| size_t start = item->istart; | |||
| size_t count = item->icount; | |||
| glDrawElements( self->mode, count, GL_UNSIGNED_INT, (void *)(start*sizeof(GLuint)) ); | |||
| } | |||
| else if( self->vertices->size ) | |||
| { | |||
| size_t start = item->vstart; | |||
| size_t count = item->vcount; | |||
| glDrawArrays( self->mode, start*self->vertices->item_size, count); | |||
| } | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_render ( vertex_buffer_t *self, GLenum mode ) | |||
| { | |||
| size_t vcount = self->vertices->size; | |||
| size_t icount = self->indices->size; | |||
| vertex_buffer_render_setup( self, mode ); | |||
| if( icount ) | |||
| { | |||
| glDrawElements( mode, icount, GL_UNSIGNED_INT, 0 ); | |||
| } | |||
| else | |||
| { | |||
| glDrawArrays( mode, 0, vcount ); | |||
| } | |||
| vertex_buffer_render_finish( self ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_push_back_indices ( vertex_buffer_t * self, | |||
| const GLuint * indices, | |||
| const size_t icount ) | |||
| { | |||
| assert( self ); | |||
| self->state |= DIRTY; | |||
| vector_push_back_data( self->indices, indices, icount ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_push_back_vertices ( vertex_buffer_t * self, | |||
| const void * vertices, | |||
| const size_t vcount ) | |||
| { | |||
| assert( self ); | |||
| self->state |= DIRTY; | |||
| vector_push_back_data( self->vertices, vertices, vcount ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_insert_indices ( vertex_buffer_t *self, | |||
| const size_t index, | |||
| const GLuint *indices, | |||
| const size_t count ) | |||
| { | |||
| assert( self ); | |||
| assert( self->indices ); | |||
| assert( index < self->indices->size+1 ); | |||
| self->state |= DIRTY; | |||
| vector_insert_data( self->indices, index, indices, count ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_insert_vertices( vertex_buffer_t *self, | |||
| const size_t index, | |||
| const void *vertices, | |||
| const size_t vcount ) | |||
| { | |||
| size_t i; | |||
| assert( self ); | |||
| assert( self->vertices ); | |||
| assert( index < self->vertices->size+1 ); | |||
| self->state |= DIRTY; | |||
| for( i=0; i<self->indices->size; ++i ) | |||
| { | |||
| if( *(GLuint *)(vector_get( self->indices, i )) > index ) | |||
| { | |||
| *(GLuint *)(vector_get( self->indices, i )) += index; | |||
| } | |||
| } | |||
| vector_insert_data( self->vertices, index, vertices, vcount ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_erase_indices( vertex_buffer_t *self, | |||
| const size_t first, | |||
| const size_t last ) | |||
| { | |||
| assert( self ); | |||
| assert( self->indices ); | |||
| assert( first < self->indices->size ); | |||
| assert( (last) <= self->indices->size ); | |||
| self->state |= DIRTY; | |||
| vector_erase_range( self->indices, first, last ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_erase_vertices( vertex_buffer_t *self, | |||
| const size_t first, | |||
| const size_t last ) | |||
| { | |||
| size_t i; | |||
| assert( self ); | |||
| assert( self->vertices ); | |||
| assert( first < self->vertices->size ); | |||
| assert( (first+last) <= self->vertices->size ); | |||
| assert( last > first ); | |||
| self->state |= DIRTY; | |||
| for( i=0; i<self->indices->size; ++i ) | |||
| { | |||
| if( *(GLuint *)(vector_get( self->indices, i )) > first ) | |||
| { | |||
| *(GLuint *)(vector_get( self->indices, i )) -= (last-first); | |||
| } | |||
| } | |||
| vector_erase_range( self->vertices, first, last ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| size_t | |||
| vertex_buffer_push_back( vertex_buffer_t * self, | |||
| const void * vertices, const size_t vcount, | |||
| const GLuint * indices, const size_t icount ) | |||
| { | |||
| return vertex_buffer_insert( self, vector_size( self->items ), | |||
| vertices, vcount, indices, icount ); | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| size_t | |||
| vertex_buffer_insert( vertex_buffer_t * self, const size_t index, | |||
| const void * vertices, const size_t vcount, | |||
| const GLuint * indices, const size_t icount ) | |||
| { | |||
| size_t vstart, istart, i; | |||
| ivec4 item; | |||
| assert( self ); | |||
| assert( vertices ); | |||
| assert( indices ); | |||
| self->state = FROZEN; | |||
| // Push back vertices | |||
| vstart = vector_size( self->vertices ); | |||
| vertex_buffer_push_back_vertices( self, vertices, vcount ); | |||
| // Push back indices | |||
| istart = vector_size( self->indices ); | |||
| vertex_buffer_push_back_indices( self, indices, icount ); | |||
| // Update indices within the vertex buffer | |||
| for( i=0; i<icount; ++i ) | |||
| { | |||
| *(GLuint *)(vector_get( self->indices, istart+i )) += vstart; | |||
| } | |||
| // Insert item | |||
| item.x = vstart; | |||
| item.y = vcount; | |||
| item.z = istart; | |||
| item.w = icount; | |||
| vector_insert( self->items, index, &item ); | |||
| self->state = DIRTY; | |||
| return index; | |||
| } | |||
| // ---------------------------------------------------------------------------- | |||
| void | |||
| vertex_buffer_erase( vertex_buffer_t * self, | |||
| const size_t index ) | |||
| { | |||
| ivec4 * item; | |||
| size_t vstart, vcount, istart, icount, i; | |||
| assert( self ); | |||
| assert( index < vector_size( self->items ) ); | |||
| item = (ivec4 *) vector_get( self->items, index ); | |||
| vstart = item->vstart; | |||
| vcount = item->vcount; | |||
| istart = item->istart; | |||
| icount = item->icount; | |||
| // Update items | |||
| for( i=0; i<vector_size(self->items); ++i ) | |||
| { | |||
| ivec4 * item = (ivec4 *) vector_get( self->items, i ); | |||
| if( item->vstart > vstart) | |||
| { | |||
| item->vstart -= vcount; | |||
| item->istart -= icount; | |||
| } | |||
| } | |||
| self->state = FROZEN; | |||
| vertex_buffer_erase_indices( self, istart, istart+icount ); | |||
| vertex_buffer_erase_vertices( self, vstart, vstart+vcount ); | |||
| vector_erase( self->items, index ); | |||
| self->state = DIRTY; | |||
| } | |||
| @@ -1,350 +0,0 @@ | |||
| /* ============================================================================ | |||
| * Freetype GL - A C OpenGL Freetype engine | |||
| * Platform: Any | |||
| * WWW: http://code.google.com/p/freetype-gl/ | |||
| * ---------------------------------------------------------------------------- | |||
| * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright notice, | |||
| * this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in the | |||
| * documentation and/or other materials provided with the distribution. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR | |||
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |||
| * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
| * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |||
| * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
| * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |||
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| * | |||
| * The views and conclusions contained in the software and documentation are | |||
| * those of the authors and should not be interpreted as representing official | |||
| * policies, either expressed or implied, of Nicolas P. Rougier. | |||
| * ============================================================================ | |||
| */ | |||
| #ifndef __VERTEX_BUFFER_H__ | |||
| #define __VERTEX_BUFFER_H__ | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| #endif | |||
| #include "opengl.h" | |||
| #include "vector.h" | |||
| #include "vertex-attribute.h" | |||
| /** | |||
| * @file vertex-buffer.h | |||
| * @author Nicolas Rougier (Nicolas.Rougier@inria.fr) | |||
| * @date April, 2012 | |||
| * | |||
| * @defgroup vertex-buffer Vertex buffer | |||
| * | |||
| * @{ | |||
| */ | |||
| /** | |||
| * Generic vertex buffer. | |||
| */ | |||
| typedef struct vertex_buffer_t | |||
| { | |||
| /** Format of the vertex buffer. */ | |||
| char * format; | |||
| /** Vector of vertices. */ | |||
| vector_t * vertices; | |||
| #ifdef FREETYPE_GL_USE_VAO | |||
| /** GL identity of the Vertex Array Object */ | |||
| GLuint VAO_id; | |||
| #endif | |||
| /** GL identity of the vertices buffer. */ | |||
| GLuint vertices_id; | |||
| /** Vector of indices. */ | |||
| vector_t * indices; | |||
| /** GL identity of the indices buffer. */ | |||
| GLuint indices_id; | |||
| /** Current size of the vertices buffer in GPU */ | |||
| size_t GPU_vsize; | |||
| /** Current size of the indices buffer in GPU*/ | |||
| size_t GPU_isize; | |||
| /** GL primitives to render. */ | |||
| GLenum mode; | |||
| /** Whether the vertex buffer needs to be uploaded to GPU memory. */ | |||
| char state; | |||
| /** Individual items */ | |||
| vector_t * items; | |||
| /** Array of attributes. */ | |||
| vertex_attribute_t *attributes[MAX_VERTEX_ATTRIBUTE]; | |||
| } vertex_buffer_t; | |||
| /** | |||
| * Creates an empty vertex buffer. | |||
| * | |||
| * @param format a string describing vertex format. | |||
| * @return an empty vertex buffer. | |||
| */ | |||
| vertex_buffer_t * | |||
| vertex_buffer_new( const char *format ); | |||
| /** | |||
| * Deletes vertex buffer and releases GPU memory. | |||
| * | |||
| * @param self a vertex buffer | |||
| */ | |||
| void | |||
| vertex_buffer_delete( vertex_buffer_t * self ); | |||
| /** | |||
| * Returns the number of items in the vertex buffer | |||
| * | |||
| * @param self a vertex buffer | |||
| * @return number of items | |||
| */ | |||
| size_t | |||
| vertex_buffer_size( const vertex_buffer_t *self ); | |||
| /** | |||
| * Returns vertex format | |||
| * | |||
| * @param self a vertex buffer | |||
| * @return vertex format | |||
| */ | |||
| const char * | |||
| vertex_buffer_format( const vertex_buffer_t *self ); | |||
| /** | |||
| * Print information about a vertex buffer | |||
| * | |||
| * @param self a vertex buffer | |||
| */ | |||
| void | |||
| vertex_buffer_print( vertex_buffer_t * self ); | |||
| /** | |||
| * Prepare vertex buffer for render. | |||
| * | |||
| * @param self a vertex buffer | |||
| * @param mode render mode | |||
| */ | |||
| void | |||
| vertex_buffer_render_setup ( vertex_buffer_t *self, | |||
| GLenum mode ); | |||
| /** | |||
| * Finish rendering by setting back modified states | |||
| * | |||
| * @param self a vertex buffer | |||
| */ | |||
| void | |||
| vertex_buffer_render_finish ( vertex_buffer_t *self ); | |||
| /** | |||
| * Render vertex buffer. | |||
| * | |||
| * @param self a vertex buffer | |||
| * @param mode render mode | |||
| */ | |||
| void | |||
| vertex_buffer_render ( vertex_buffer_t *self, | |||
| GLenum mode ); | |||
| /** | |||
| * Render a specified item from the vertex buffer. | |||
| * | |||
| * @param self a vertex buffer | |||
| * @param index index of the item to be rendered | |||
| */ | |||
| void | |||
| vertex_buffer_render_item ( vertex_buffer_t *self, | |||
| size_t index ); | |||
| /** | |||
| * Upload buffer to GPU memory. | |||
| * | |||
| * @param self a vertex buffer | |||
| */ | |||
| void | |||
| vertex_buffer_upload( vertex_buffer_t *self ); | |||
| /** | |||
| * Clear all items. | |||
| * | |||
| * @param self a vertex buffer | |||
| */ | |||
| void | |||
| vertex_buffer_clear( vertex_buffer_t *self ); | |||
| /** | |||
| * Appends indices at the end of the buffer. | |||
| * | |||
| * @param self a vertex buffer | |||
| * @param indices indices to be appended | |||
| * @param icount number of indices to be appended | |||
| * | |||
| * @private | |||
| */ | |||
| void | |||
| vertex_buffer_push_back_indices ( vertex_buffer_t *self, | |||
| const GLuint * indices, | |||
| const size_t icount ); | |||
| /** | |||
| * Appends vertices at the end of the buffer. | |||
| * | |||
| * @note Internal use | |||
| * | |||
| * @param self a vertex buffer | |||
| * @param vertices vertices to be appended | |||
| * @param vcount number of vertices to be appended | |||
| * | |||
| * @private | |||
| */ | |||
| void | |||
| vertex_buffer_push_back_vertices ( vertex_buffer_t *self, | |||
| const void * vertices, | |||
| const size_t vcount ); | |||
| /** | |||
| * Insert indices in the buffer. | |||
| * | |||
| * @param self a vertex buffer | |||
| * @param index location before which to insert indices | |||
| * @param indices indices to be appended | |||
| * @param icount number of indices to be appended | |||
| * | |||
| * @private | |||
| */ | |||
| void | |||
| vertex_buffer_insert_indices ( vertex_buffer_t *self, | |||
| const size_t index, | |||
| const GLuint *indices, | |||
| const size_t icount ); | |||
| /** | |||
| * Insert vertices in the buffer. | |||
| * | |||
| * @param self a vertex buffer | |||
| * @param index location before which to insert vertices | |||
| * @param vertices vertices to be appended | |||
| * @param vcount number of vertices to be appended | |||
| * | |||
| * @private | |||
| */ | |||
| void | |||
| vertex_buffer_insert_vertices ( vertex_buffer_t *self, | |||
| const size_t index, | |||
| const void *vertices, | |||
| const size_t vcount ); | |||
| /** | |||
| * Erase indices in the buffer. | |||
| * | |||
| * @param self a vertex buffer | |||
| * @param first the index of the first index to be erased | |||
| * @param last the index of the last index to be erased | |||
| * | |||
| * @private | |||
| */ | |||
| void | |||
| vertex_buffer_erase_indices ( vertex_buffer_t *self, | |||
| const size_t first, | |||
| const size_t last ); | |||
| /** | |||
| * Erase vertices in the buffer. | |||
| * | |||
| * @param self a vertex buffer | |||
| * @param first the index of the first vertex to be erased | |||
| * @param last the index of the last vertex to be erased | |||
| * | |||
| * @private | |||
| */ | |||
| void | |||
| vertex_buffer_erase_vertices ( vertex_buffer_t *self, | |||
| const size_t first, | |||
| const size_t last ); | |||
| /** | |||
| * Append a new item to the collection. | |||
| * | |||
| * @param self a vertex buffer | |||
| * @param vcount number of vertices | |||
| * @param vertices raw vertices data | |||
| * @param icount number of indices | |||
| * @param indices raw indices data | |||
| */ | |||
| size_t | |||
| vertex_buffer_push_back( vertex_buffer_t * self, | |||
| const void * vertices, const size_t vcount, | |||
| const GLuint * indices, const size_t icount ); | |||
| /** | |||
| * Insert a new item into the vertex buffer. | |||
| * | |||
| * @param self a vertex buffer | |||
| * @param index location before which to insert item | |||
| * @param vertices raw vertices data | |||
| * @param vcount number of vertices | |||
| * @param indices raw indices data | |||
| * @param icount number of indices | |||
| */ | |||
| size_t | |||
| vertex_buffer_insert( vertex_buffer_t * self, | |||
| const size_t index, | |||
| const void * vertices, const size_t vcount, | |||
| const GLuint * indices, const size_t icount ); | |||
| /** | |||
| * Erase an item from the vertex buffer. | |||
| * | |||
| * @param self a vertex buffer | |||
| * @param index index of the item to be deleted | |||
| */ | |||
| void | |||
| vertex_buffer_erase( vertex_buffer_t * self, | |||
| const size_t index ); | |||
| /** @} */ | |||
| #ifdef __cplusplus | |||
| } | |||
| #endif | |||
| #endif /* __VERTEX_BUFFER_H__ */ | |||
| @@ -1,169 +0,0 @@ | |||
| The FreeType Project LICENSE | |||
| ---------------------------- | |||
| 2006-Jan-27 | |||
| Copyright 1996-2002, 2006 by | |||
| David Turner, Robert Wilhelm, and Werner Lemberg | |||
| Introduction | |||
| ============ | |||
| The FreeType Project is distributed in several archive packages; | |||
| some of them may contain, in addition to the FreeType font engine, | |||
| various tools and contributions which rely on, or relate to, the | |||
| FreeType Project. | |||
| This license applies to all files found in such packages, and | |||
| which do not fall under their own explicit license. The license | |||
| affects thus the FreeType font engine, the test programs, | |||
| documentation and makefiles, at the very least. | |||
| This license was inspired by the BSD, Artistic, and IJG | |||
| (Independent JPEG Group) licenses, which all encourage inclusion | |||
| and use of free software in commercial and freeware products | |||
| alike. As a consequence, its main points are that: | |||
| o We don't promise that this software works. However, we will be | |||
| interested in any kind of bug reports. (`as is' distribution) | |||
| o You can use this software for whatever you want, in parts or | |||
| full form, without having to pay us. (`royalty-free' usage) | |||
| o You may not pretend that you wrote this software. If you use | |||
| it, or only parts of it, in a program, you must acknowledge | |||
| somewhere in your documentation that you have used the | |||
| FreeType code. (`credits') | |||
| We specifically permit and encourage the inclusion of this | |||
| software, with or without modifications, in commercial products. | |||
| We disclaim all warranties covering The FreeType Project and | |||
| assume no liability related to The FreeType Project. | |||
| Finally, many people asked us for a preferred form for a | |||
| credit/disclaimer to use in compliance with this license. We thus | |||
| encourage you to use the following text: | |||
| """ | |||
| Portions of this software are copyright © <year> The FreeType | |||
| Project (www.freetype.org). All rights reserved. | |||
| """ | |||
| Please replace <year> with the value from the FreeType version you | |||
| actually use. | |||
| Legal Terms | |||
| =========== | |||
| 0. Definitions | |||
| -------------- | |||
| Throughout this license, the terms `package', `FreeType Project', | |||
| and `FreeType archive' refer to the set of files originally | |||
| distributed by the authors (David Turner, Robert Wilhelm, and | |||
| Werner Lemberg) as the `FreeType Project', be they named as alpha, | |||
| beta or final release. | |||
| `You' refers to the licensee, or person using the project, where | |||
| `using' is a generic term including compiling the project's source | |||
| code as well as linking it to form a `program' or `executable'. | |||
| This program is referred to as `a program using the FreeType | |||
| engine'. | |||
| This license applies to all files distributed in the original | |||
| FreeType Project, including all source code, binaries and | |||
| documentation, unless otherwise stated in the file in its | |||
| original, unmodified form as distributed in the original archive. | |||
| If you are unsure whether or not a particular file is covered by | |||
| this license, you must contact us to verify this. | |||
| The FreeType Project is copyright (C) 1996-2000 by David Turner, | |||
| Robert Wilhelm, and Werner Lemberg. All rights reserved except as | |||
| specified below. | |||
| 1. No Warranty | |||
| -------------- | |||
| THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY | |||
| KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | |||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |||
| PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS | |||
| BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO | |||
| USE, OF THE FREETYPE PROJECT. | |||
| 2. Redistribution | |||
| ----------------- | |||
| This license grants a worldwide, royalty-free, perpetual and | |||
| irrevocable right and license to use, execute, perform, compile, | |||
| display, copy, create derivative works of, distribute and | |||
| sublicense the FreeType Project (in both source and object code | |||
| forms) and derivative works thereof for any purpose; and to | |||
| authorize others to exercise some or all of the rights granted | |||
| herein, subject to the following conditions: | |||
| o Redistribution of source code must retain this license file | |||
| (`FTL.TXT') unaltered; any additions, deletions or changes to | |||
| the original files must be clearly indicated in accompanying | |||
| documentation. The copyright notices of the unaltered, | |||
| original files must be preserved in all copies of source | |||
| files. | |||
| o Redistribution in binary form must provide a disclaimer that | |||
| states that the software is based in part of the work of the | |||
| FreeType Team, in the distribution documentation. We also | |||
| encourage you to put an URL to the FreeType web page in your | |||
| documentation, though this isn't mandatory. | |||
| These conditions apply to any software derived from or based on | |||
| the FreeType Project, not just the unmodified files. If you use | |||
| our work, you must acknowledge us. However, no fee need be paid | |||
| to us. | |||
| 3. Advertising | |||
| -------------- | |||
| Neither the FreeType authors and contributors nor you shall use | |||
| the name of the other for commercial, advertising, or promotional | |||
| purposes without specific prior written permission. | |||
| We suggest, but do not require, that you use one or more of the | |||
| following phrases to refer to this software in your documentation | |||
| or advertising materials: `FreeType Project', `FreeType Engine', | |||
| `FreeType library', or `FreeType Distribution'. | |||
| As you have not signed this license, you are not required to | |||
| accept it. However, as the FreeType Project is copyrighted | |||
| material, only this license, or another one contracted with the | |||
| authors, grants you the right to use, distribute, and modify it. | |||
| Therefore, by using, distributing, or modifying the FreeType | |||
| Project, you indicate that you understand and accept all the terms | |||
| of this license. | |||
| 4. Contacts | |||
| ----------- | |||
| There are two mailing lists related to FreeType: | |||
| o freetype@nongnu.org | |||
| Discusses general use and applications of FreeType, as well as | |||
| future and wanted additions to the library and distribution. | |||
| If you are looking for support, start in this list if you | |||
| haven't found anything to help you in the documentation. | |||
| o freetype-devel@nongnu.org | |||
| Discusses bugs, as well as engine internals, design issues, | |||
| specific licenses, porting, etc. | |||
| Our home page can be found at | |||
| http://www.freetype.org | |||
| --- end of FTL.TXT --- | |||
| @@ -1,340 +0,0 @@ | |||
| GNU GENERAL PUBLIC LICENSE | |||
| Version 2, June 1991 | |||
| Copyright (C) 1989, 1991 Free Software Foundation, Inc. | |||
| 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |||
| Everyone is permitted to copy and distribute verbatim copies | |||
| of this license document, but changing it is not allowed. | |||
| Preamble | |||
| The licenses for most software are designed to take away your | |||
| freedom to share and change it. By contrast, the GNU General Public | |||
| License is intended to guarantee your freedom to share and change free | |||
| software--to make sure the software is free for all its users. This | |||
| General Public License applies to most of the Free Software | |||
| Foundation's software and to any other program whose authors commit to | |||
| using it. (Some other Free Software Foundation software is covered by | |||
| the GNU Library General Public License instead.) You can apply it to | |||
| your programs, too. | |||
| When we speak of free software, we are referring to freedom, not | |||
| price. Our General Public Licenses are designed to make sure that you | |||
| have the freedom to distribute copies of free software (and charge for | |||
| this service if you wish), that you receive source code or can get it | |||
| if you want it, that you can change the software or use pieces of it | |||
| in new free programs; and that you know you can do these things. | |||
| To protect your rights, we need to make restrictions that forbid | |||
| anyone to deny you these rights or to ask you to surrender the rights. | |||
| These restrictions translate to certain responsibilities for you if you | |||
| distribute copies of the software, or if you modify it. | |||
| For example, if you distribute copies of such a program, whether | |||
| gratis or for a fee, you must give the recipients all the rights that | |||
| you have. You must make sure that they, too, receive or can get the | |||
| source code. And you must show them these terms so they know their | |||
| rights. | |||
| We protect your rights with two steps: (1) copyright the software, and | |||
| (2) offer you this license which gives you legal permission to copy, | |||
| distribute and/or modify the software. | |||
| Also, for each author's protection and ours, we want to make certain | |||
| that everyone understands that there is no warranty for this free | |||
| software. If the software is modified by someone else and passed on, we | |||
| want its recipients to know that what they have is not the original, so | |||
| that any problems introduced by others will not reflect on the original | |||
| authors' reputations. | |||
| Finally, any free program is threatened constantly by software | |||
| patents. We wish to avoid the danger that redistributors of a free | |||
| program will individually obtain patent licenses, in effect making the | |||
| program proprietary. To prevent this, we have made it clear that any | |||
| patent must be licensed for everyone's free use or not licensed at all. | |||
| The precise terms and conditions for copying, distribution and | |||
| modification follow. | |||
| GNU GENERAL PUBLIC LICENSE | |||
| TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |||
| 0. This License applies to any program or other work which contains | |||
| a notice placed by the copyright holder saying it may be distributed | |||
| under the terms of this General Public License. The "Program", below, | |||
| refers to any such program or work, and a "work based on the Program" | |||
| means either the Program or any derivative work under copyright law: | |||
| that is to say, a work containing the Program or a portion of it, | |||
| either verbatim or with modifications and/or translated into another | |||
| language. (Hereinafter, translation is included without limitation in | |||
| the term "modification".) Each licensee is addressed as "you". | |||
| Activities other than copying, distribution and modification are not | |||
| covered by this License; they are outside its scope. The act of | |||
| running the Program is not restricted, and the output from the Program | |||
| is covered only if its contents constitute a work based on the | |||
| Program (independent of having been made by running the Program). | |||
| Whether that is true depends on what the Program does. | |||
| 1. You may copy and distribute verbatim copies of the Program's | |||
| source code as you receive it, in any medium, provided that you | |||
| conspicuously and appropriately publish on each copy an appropriate | |||
| copyright notice and disclaimer of warranty; keep intact all the | |||
| notices that refer to this License and to the absence of any warranty; | |||
| and give any other recipients of the Program a copy of this License | |||
| along with the Program. | |||
| You may charge a fee for the physical act of transferring a copy, and | |||
| you may at your option offer warranty protection in exchange for a fee. | |||
| 2. You may modify your copy or copies of the Program or any portion | |||
| of it, thus forming a work based on the Program, and copy and | |||
| distribute such modifications or work under the terms of Section 1 | |||
| above, provided that you also meet all of these conditions: | |||
| a) You must cause the modified files to carry prominent notices | |||
| stating that you changed the files and the date of any change. | |||
| b) You must cause any work that you distribute or publish, that in | |||
| whole or in part contains or is derived from the Program or any | |||
| part thereof, to be licensed as a whole at no charge to all third | |||
| parties under the terms of this License. | |||
| c) If the modified program normally reads commands interactively | |||
| when run, you must cause it, when started running for such | |||
| interactive use in the most ordinary way, to print or display an | |||
| announcement including an appropriate copyright notice and a | |||
| notice that there is no warranty (or else, saying that you provide | |||
| a warranty) and that users may redistribute the program under | |||
| these conditions, and telling the user how to view a copy of this | |||
| License. (Exception: if the Program itself is interactive but | |||
| does not normally print such an announcement, your work based on | |||
| the Program is not required to print an announcement.) | |||
| These requirements apply to the modified work as a whole. If | |||
| identifiable sections of that work are not derived from the Program, | |||
| and can be reasonably considered independent and separate works in | |||
| themselves, then this License, and its terms, do not apply to those | |||
| sections when you distribute them as separate works. But when you | |||
| distribute the same sections as part of a whole which is a work based | |||
| on the Program, the distribution of the whole must be on the terms of | |||
| this License, whose permissions for other licensees extend to the | |||
| entire whole, and thus to each and every part regardless of who wrote it. | |||
| Thus, it is not the intent of this section to claim rights or contest | |||
| your rights to work written entirely by you; rather, the intent is to | |||
| exercise the right to control the distribution of derivative or | |||
| collective works based on the Program. | |||
| In addition, mere aggregation of another work not based on the Program | |||
| with the Program (or with a work based on the Program) on a volume of | |||
| a storage or distribution medium does not bring the other work under | |||
| the scope of this License. | |||
| 3. You may copy and distribute the Program (or a work based on it, | |||
| under Section 2) in object code or executable form under the terms of | |||
| Sections 1 and 2 above provided that you also do one of the following: | |||
| a) Accompany it with the complete corresponding machine-readable | |||
| source code, which must be distributed under the terms of Sections | |||
| 1 and 2 above on a medium customarily used for software interchange; or, | |||
| b) Accompany it with a written offer, valid for at least three | |||
| years, to give any third party, for a charge no more than your | |||
| cost of physically performing source distribution, a complete | |||
| machine-readable copy of the corresponding source code, to be | |||
| distributed under the terms of Sections 1 and 2 above on a medium | |||
| customarily used for software interchange; or, | |||
| c) Accompany it with the information you received as to the offer | |||
| to distribute corresponding source code. (This alternative is | |||
| allowed only for noncommercial distribution and only if you | |||
| received the program in object code or executable form with such | |||
| an offer, in accord with Subsection b above.) | |||
| The source code for a work means the preferred form of the work for | |||
| making modifications to it. For an executable work, complete source | |||
| code means all the source code for all modules it contains, plus any | |||
| associated interface definition files, plus the scripts used to | |||
| control compilation and installation of the executable. However, as a | |||
| special exception, the source code distributed need not include | |||
| anything that is normally distributed (in either source or binary | |||
| form) with the major components (compiler, kernel, and so on) of the | |||
| operating system on which the executable runs, unless that component | |||
| itself accompanies the executable. | |||
| If distribution of executable or object code is made by offering | |||
| access to copy from a designated place, then offering equivalent | |||
| access to copy the source code from the same place counts as | |||
| distribution of the source code, even though third parties are not | |||
| compelled to copy the source along with the object code. | |||
| 4. You may not copy, modify, sublicense, or distribute the Program | |||
| except as expressly provided under this License. Any attempt | |||
| otherwise to copy, modify, sublicense or distribute the Program is | |||
| void, and will automatically terminate your rights under this License. | |||
| However, parties who have received copies, or rights, from you under | |||
| this License will not have their licenses terminated so long as such | |||
| parties remain in full compliance. | |||
| 5. You are not required to accept this License, since you have not | |||
| signed it. However, nothing else grants you permission to modify or | |||
| distribute the Program or its derivative works. These actions are | |||
| prohibited by law if you do not accept this License. Therefore, by | |||
| modifying or distributing the Program (or any work based on the | |||
| Program), you indicate your acceptance of this License to do so, and | |||
| all its terms and conditions for copying, distributing or modifying | |||
| the Program or works based on it. | |||
| 6. Each time you redistribute the Program (or any work based on the | |||
| Program), the recipient automatically receives a license from the | |||
| original licensor to copy, distribute or modify the Program subject to | |||
| these terms and conditions. You may not impose any further | |||
| restrictions on the recipients' exercise of the rights granted herein. | |||
| You are not responsible for enforcing compliance by third parties to | |||
| this License. | |||
| 7. If, as a consequence of a court judgment or allegation of patent | |||
| infringement or for any other reason (not limited to patent issues), | |||
| conditions are imposed on you (whether by court order, agreement or | |||
| otherwise) that contradict the conditions of this License, they do not | |||
| excuse you from the conditions of this License. If you cannot | |||
| distribute so as to satisfy simultaneously your obligations under this | |||
| License and any other pertinent obligations, then as a consequence you | |||
| may not distribute the Program at all. For example, if a patent | |||
| license would not permit royalty-free redistribution of the Program by | |||
| all those who receive copies directly or indirectly through you, then | |||
| the only way you could satisfy both it and this License would be to | |||
| refrain entirely from distribution of the Program. | |||
| If any portion of this section is held invalid or unenforceable under | |||
| any particular circumstance, the balance of the section is intended to | |||
| apply and the section as a whole is intended to apply in other | |||
| circumstances. | |||
| It is not the purpose of this section to induce you to infringe any | |||
| patents or other property right claims or to contest validity of any | |||
| such claims; this section has the sole purpose of protecting the | |||
| integrity of the free software distribution system, which is | |||
| implemented by public license practices. Many people have made | |||
| generous contributions to the wide range of software distributed | |||
| through that system in reliance on consistent application of that | |||
| system; it is up to the author/donor to decide if he or she is willing | |||
| to distribute software through any other system and a licensee cannot | |||
| impose that choice. | |||
| This section is intended to make thoroughly clear what is believed to | |||
| be a consequence of the rest of this License. | |||
| 8. If the distribution and/or use of the Program is restricted in | |||
| certain countries either by patents or by copyrighted interfaces, the | |||
| original copyright holder who places the Program under this License | |||
| may add an explicit geographical distribution limitation excluding | |||
| those countries, so that distribution is permitted only in or among | |||
| countries not thus excluded. In such case, this License incorporates | |||
| the limitation as if written in the body of this License. | |||
| 9. The Free Software Foundation may publish revised and/or new versions | |||
| of the General Public License from time to time. Such new versions will | |||
| be similar in spirit to the present version, but may differ in detail to | |||
| address new problems or concerns. | |||
| Each version is given a distinguishing version number. If the Program | |||
| specifies a version number of this License which applies to it and "any | |||
| later version", you have the option of following the terms and conditions | |||
| either of that version or of any later version published by the Free | |||
| Software Foundation. If the Program does not specify a version number of | |||
| this License, you may choose any version ever published by the Free Software | |||
| Foundation. | |||
| 10. If you wish to incorporate parts of the Program into other free | |||
| programs whose distribution conditions are different, write to the author | |||
| to ask for permission. For software which is copyrighted by the Free | |||
| Software Foundation, write to the Free Software Foundation; we sometimes | |||
| make exceptions for this. Our decision will be guided by the two goals | |||
| of preserving the free status of all derivatives of our free software and | |||
| of promoting the sharing and reuse of software generally. | |||
| NO WARRANTY | |||
| 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | |||
| FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | |||
| OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | |||
| PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | |||
| OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |||
| MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | |||
| TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | |||
| PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | |||
| REPAIR OR CORRECTION. | |||
| 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | |||
| REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | |||
| INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | |||
| OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | |||
| TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | |||
| YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | |||
| PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | |||
| POSSIBILITY OF SUCH DAMAGES. | |||
| END OF TERMS AND CONDITIONS | |||
| How to Apply These Terms to Your New Programs | |||
| If you develop a new program, and you want it to be of the greatest | |||
| possible use to the public, the best way to achieve this is to make it | |||
| free software which everyone can redistribute and change under these terms. | |||
| To do so, attach the following notices to the program. It is safest | |||
| to attach them to the start of each source file to most effectively | |||
| convey the exclusion of warranty; and each file should have at least | |||
| the "copyright" line and a pointer to where the full notice is found. | |||
| <one line to give the program's name and a brief idea of what it does.> | |||
| Copyright (C) <year> <name of author> | |||
| This program is free software; you can redistribute it and/or modify | |||
| it under the terms of the GNU General Public License as published by | |||
| the Free Software Foundation; either version 2 of the License, or | |||
| (at your option) any later version. | |||
| This program 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 General Public License for more details. | |||
| You should have received a copy of the GNU General Public License | |||
| along with this program; if not, write to the Free Software | |||
| Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |||
| Also add information on how to contact you by electronic and paper mail. | |||
| If the program is interactive, make it output a short notice like this | |||
| when it starts in an interactive mode: | |||
| Gnomovision version 69, Copyright (C) year name of author | |||
| Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | |||
| This is free software, and you are welcome to redistribute it | |||
| under certain conditions; type `show c' for details. | |||
| The hypothetical commands `show w' and `show c' should show the appropriate | |||
| parts of the General Public License. Of course, the commands you use may | |||
| be called something other than `show w' and `show c'; they could even be | |||
| mouse-clicks or menu items--whatever suits your program. | |||
| You should also get your employer (if you work as a programmer) or your | |||
| school, if any, to sign a "copyright disclaimer" for the program, if | |||
| necessary. Here is a sample; alter the names: | |||
| Yoyodyne, Inc., hereby disclaims all copyright interest in the program | |||
| `Gnomovision' (which makes passes at compilers) written by James Hacker. | |||
| <signature of Ty Coon>, 1 April 1989 | |||
| Ty Coon, President of Vice | |||
| This General Public License does not permit incorporating your program into | |||
| proprietary programs. If your program is a subroutine library, you may | |||
| consider it more useful to permit linking proprietary applications with the | |||
| library. If this is what you want to do, use the GNU Library General | |||
| Public License instead of this License. | |||
| @@ -1,34 +0,0 @@ | |||
| The FreeType 2 font engine is copyrighted work and cannot be used | |||
| legally without a software license. In order to make this project | |||
| usable to a vast majority of developers, we distribute it under two | |||
| mutually exclusive open-source licenses. | |||
| This means that *you* must choose *one* of the two licenses described | |||
| below, then obey all its terms and conditions when using FreeType 2 in | |||
| any of your projects or products. | |||
| - The FreeType License, found in the file `FTL.TXT', which is similar | |||
| to the original BSD license *with* an advertising clause that forces | |||
| you to explicitly cite the FreeType project in your product's | |||
| documentation. All details are in the license file. This license | |||
| is suited to products which don't use the GNU General Public | |||
| License. | |||
| Note that this license is compatible to the GNU General Public | |||
| License version 3, but not version 2. | |||
| - The GNU General Public License version 2, found in `GPLv2.TXT' (any | |||
| later version can be used also), for programs which already use the | |||
| GPL. Note that the FTL is incompatible with GPLv2 due to its | |||
| advertisement clause. | |||
| The contributed BDF and PCF drivers come with a license similar to that | |||
| of the X Window System. It is compatible to the above two licenses (see | |||
| file src/bdf/README and src/pcf/README). | |||
| The gzip module uses the zlib license (see src/gzip/zlib.h) which too is | |||
| compatible to the above two licenses. | |||
| --- end of LICENSE.TXT --- | |||
| @@ -1,36 +0,0 @@ | |||
| # FreeType 2.4.12 Amalgamation | |||
| A distribution of the [FreeType][1] library in amalgamated source code form. | |||
| ## What's an amalgamation? | |||
| An amalgamation is simply a collection of header and source files that have been | |||
| concatenated together to form one or more very large files. In this form, they | |||
| are easy to add to your existing project as source files (rather than linking | |||
| as a library). They are also easier to redistribute if you are making an open | |||
| source application and don't want to have any external dependencies. | |||
| ## What is FreeType? | |||
| FreeType 2 is a software font engine that is designed to be small, | |||
| efficient, highly customizable, and portable while capable of producing | |||
| high-quality output (glyph images). It can be used in graphics libraries, | |||
| display servers, font conversion tools, text image generation tools, and | |||
| many other products as well. | |||
| ## How do I use this? | |||
| Add FreeTypeAmalgam.c to your existing project, include FreeTypeAmalgam.h | |||
| in the source files where you want to use FreeType, and that's it! | |||
| The [FreeType Amalgmation][4] was built using the [Amalgamate Templates][3]. | |||
| ## License | |||
| Copyright 2003-2007, 2011 by David Turner, Robert Wilhelm, and Werner Lemberg.<br> | |||
| FreeType is distributed under a dual license, see the file LICENSE.txt for details. | |||
| [1]: http://www.freetype.org "The FreeType Library" | |||
| [2]: http://rawmaterialsoftware.com/jucelicense.php "JUCE Commercial Licensing" | |||
| [3]: https://github.com/vinniefalco/Amalgams/ "Amalgamate Templates" | |||
| [4]: https://github.com/vinniefalco/FreeTypeAmalgam/ "FreeType Amalgamation" | |||