@@ -31,18 +31,6 @@ else | |||||
OBJS += src/Window.cpp.o | OBJS += src/Window.cpp.o | ||||
endif | 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 | 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" |