Mercurial > hg > forks > bilotrip-mj12
view 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 source
/* ============================================================================ * 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__ */