From 7fe60435bce6595a9c58a9bfd8244d74b5320e96 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 15 Jan 2013 08:46:13 +0100 Subject: Import DirectFB141_2k11R3_beta5 --- Source/DirectFB/src/core/fonts.h | 250 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100755 Source/DirectFB/src/core/fonts.h (limited to 'Source/DirectFB/src/core/fonts.h') diff --git a/Source/DirectFB/src/core/fonts.h b/Source/DirectFB/src/core/fonts.h new file mode 100755 index 0000000..4dc04fa --- /dev/null +++ b/Source/DirectFB/src/core/fonts.h @@ -0,0 +1,250 @@ +/* + (c) Copyright 2001-2009 The world wide DirectFB Open Source Community (directfb.org) + (c) Copyright 2000-2004 Convergence (integrated media) GmbH + + All rights reserved. + + Written by Denis Oliver Kropp , + Andreas Hundt , + Sven Neumann , + Ville Syrjälä and + Claudio Ciccani . + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __FONTS_H__ +#define __FONTS_H__ + +#include + +#include + +#include + +#include + +#include + +/* + * glyph struct + */ +struct _CoreGlyphData { + DirectLink link; + + unsigned int index; + unsigned int layer; + unsigned int row; + + CoreSurface *surface; /* contains bitmap of glyph */ + int start; /* x offset of glyph in surface */ + int width; /* width of the glyphs bitmap */ + int height; /* height of the glyphs bitmap */ + int left; /* x offset of the glyph */ + int top; /* y offset of the glyph */ + int xadvance; /* placement of next glyph */ + int yadvance; + + bool inserted; + bool failed; + + int magic; +}; + +typedef struct { + DFBResult (* GetCharacterIndex) ( CoreFont *thiz, + unsigned int character, + unsigned int *ret_index ); + + DFBResult (* DecodeText) ( CoreFont *thiz, + const void *text, + int length, + unsigned int *ret_indices, + int *ret_num ); +} CoreFontEncodingFuncs; + +typedef struct { + DirectLink link; + + DFBTextEncodingID encoding; + char *name; + const CoreFontEncodingFuncs *funcs; + + int magic; +} CoreFontEncoding; + +typedef struct { + unsigned int stamp; + + CoreSurface *surface; + int next_x; + + DirectLink *glyphs; + + int magic; +} CoreFontCacheRow; + + +#define DFB_FONT_MAX_LAYERS 2 + +/* + * font struct + */ + +struct _CoreFont { + CoreDFB *core; + + DFBFontDescription description; /* original description used to create the font */ + char *url; + + DFBSurfaceBlittingFlags blittingflags; + DFBSurfacePixelFormat pixel_format; + DFBSurfaceCapabilities surface_caps; + int row_width; + int max_rows; + + DFBFontAttributes attributes; + + CoreFontCacheRow **rows; /* contain bitmaps of loaded glyphs */ + int num_rows; + int active_row; + unsigned int row_stamp; + + struct { + DirectHash *glyph_hash; /* infos about loaded glyphs */ + CoreGlyphData *glyph_data[128]; + } layers[DFB_FONT_MAX_LAYERS]; + + int height; /* font height */ + + int ascender; /* a positive value, the distance + from the baseline to the top */ + int descender; /* a negative value, the distance + from the baseline to the bottom */ + int maxadvance; /* width of largest character */ + + float up_unit_x; /* unit vector pointing 'up' in for */ + float up_unit_y; /* this font's rotation */ + + pthread_mutex_t lock; /* lock during access to the font */ + + const CoreFontEncodingFuncs *utf8; /* for default encoding, DTEID_UTF8 */ + CoreFontEncoding **encodings; /* for other encodings */ + DFBTextEncodingID last_encoding; /* dynamic allocation impl. helper */ + + void *impl_data; /* a pointer used by the impl. */ + + DFBResult (* GetGlyphData) ( CoreFont *thiz, + unsigned int index, + CoreGlyphData *data ); + + DFBResult (* RenderGlyph) ( CoreFont *thiz, + unsigned int index, + CoreGlyphData *data ); + + DFBResult (* GetKerning) ( CoreFont *thiz, + unsigned int prev, + unsigned int current, + int *ret_x, + int *ret_y ); + + + int magic; +}; + +/* + * allocates and initializes a new font structure + */ +DFBResult dfb_font_create( CoreDFB *core, + const DFBFontDescription *description, + const char *url, + CoreFont **ret_font ); + +/* + * destroy all data in the CoreFont struct + */ +void dfb_font_destroy( CoreFont *font ); + +/* + * lock the font before accessing it + */ +static inline void +dfb_font_lock( CoreFont *font ) +{ + D_MAGIC_ASSERT( font, CoreFont ); + + pthread_mutex_lock( &font->lock ); +} + +/* + * unlock the font after access + */ +static inline void +dfb_font_unlock( CoreFont *font ) +{ + D_MAGIC_ASSERT( font, CoreFont ); + + pthread_mutex_unlock( &font->lock ); +} + +/* + * loads glyph data from font + */ +DFBResult dfb_font_get_glyph_data( CoreFont *font, + unsigned int index, + unsigned int layer, + CoreGlyphData **glyph_data ); + + +/* + * Called by font module to register encoding implementations. + * + * The encoding can be DTEID_UTF8 or DTEID_OTHER, where in the + * latter case the actual id will be allocated dynamically. + * + * In the case of DTEID_UTF8 it's allowed to only provide + * GetCharacterIndex() and let the core do the DecodeText(), + * but that would cause a GetCharacterIndex() call per decoded + * unicode character. So implementing both is advisable. + * + * If nothing is registered for DTEID_UTF8 at all, the core will + * pass the raw unicode characters to GetGlyphInfo(), RenderGlyph() etc. + * That's the old behaviour, fully compatible with old modules. It's + * also a good choice if you want to avoid the character translation, + * having an efficient font module which is based natively on unicode + * characters. + * + * For registering an encoding as DTEID_OTHER both GetCharacterIndex() + * and DecodeText() must be provided. + */ +DFBResult dfb_font_register_encoding( CoreFont *font, + const char *name, + const CoreFontEncodingFuncs *funcs, + DFBTextEncodingID encoding ); + +DFBResult dfb_font_decode_text( CoreFont *font, + DFBTextEncodingID encoding, + const void *text, + int length, + unsigned int *ret_indices, + int *ret_num ); + +DFBResult dfb_font_decode_character( CoreFont *font, + DFBTextEncodingID encoding, + u32 character, + unsigned int *ret_index ); + +#endif -- cgit