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__ */
+