Mercurial > hg > forks > bilotrip-mj12
diff src/texture-font.h @ 0:785057719d9b
Import.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 05 Aug 2013 12:25:43 +0300 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/texture-font.h Mon Aug 05 12:25:43 2013 +0300 @@ -0,0 +1,412 @@ +/* ============================================================================ + * 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 +{ + /** + * 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 +{ + /** + * 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 +{ + /** + * Vector of glyphs contained in this font. + */ + vector_t * glyphs; + + /** + * Atlas structure to store glyphs data. + */ + texture_atlas_t * atlas; + + /** + * Font filename + */ + char * filename; + + /** + * 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 filename A font filename + * @param size Size of font to be created (in points) + * + * @return A new empty font (no glyph inside yet) + * + */ + texture_font_t * + texture_font_new( texture_atlas_t * atlas, + const char * filename, + const float 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__ */ +