2000-10-03 10:34:48 +02:00
/*
* font . h : Font handling for the DVB On Screen Display
*
* See the main source file ' vdr . c ' for copyright information and
* how to reach the author .
*
2016-12-13 15:01:24 +01:00
* $ Id : font . h 4.1 2016 / 12 / 13 14 : 58 : 53 kls Exp $
2000-10-03 10:34:48 +02:00
*/
# ifndef __FONT_H
# define __FONT_H
2006-12-03 16:52:19 +01:00
# include <stdint.h>
2003-10-24 12:53:12 +02:00
# include <stdlib.h>
2007-06-17 11:12:46 +02:00
# include "tools.h"
2003-10-24 12:53:12 +02:00
2007-06-10 13:02:43 +02:00
# define MAXFONTNAME 64
2009-05-03 14:15:21 +02:00
# define MINFONTSIZE 10
2007-06-10 13:02:43 +02:00
# define MAXFONTSIZE 64
2000-10-03 10:34:48 +02:00
enum eDvbFont {
fontOsd ,
2000-11-18 15:46:00 +01:00
fontFix ,
2003-10-24 12:53:12 +02:00
fontSml
# define eDvbFontSize (fontSml + 1)
} ;
2007-06-10 13:02:43 +02:00
class cBitmap ;
2011-02-20 15:12:56 +01:00
class cPixmap ;
2007-06-10 13:02:43 +02:00
typedef uint32_t tColor ; // see also osd.h
typedef uint8_t tIndex ;
2000-10-03 10:34:48 +02:00
2007-06-17 11:54:54 +02:00
extern const char * DefaultFontOsd ;
extern const char * DefaultFontSml ;
extern const char * DefaultFontFix ;
2000-10-03 10:34:48 +02:00
class cFont {
private :
2003-10-24 12:53:12 +02:00
static cFont * fonts [ ] ;
2000-10-03 10:34:48 +02:00
public :
2005-03-20 10:10:38 +01:00
virtual ~ cFont ( ) { }
2009-12-31 15:21:51 +01:00
virtual const char * FontName ( void ) const { return " " ; }
///< Returns the font name.
virtual int Size ( void ) const { return Height ( ) ; }
///< Returns the original size as requested when the font was created.
2016-12-13 15:01:24 +01:00
///< This may be smaller than the actual height, for instance if the
///< font contains descenders.
2007-06-10 13:02:43 +02:00
virtual int Width ( uint c ) const = 0 ;
///< Returns the width of the given character in pixel.
virtual int Width ( const char * s ) const = 0 ;
///< Returns the width of the given string in pixel.
virtual int Height ( void ) const = 0 ;
///< Returns the height of this font in pixel (all characters have the same height).
int Height ( const char * s ) const { return Height ( ) ; }
2011-12-04 13:40:52 +01:00
///< Returns the height of this font in pixel (obsolete, just for backwards compatibility).
2007-06-10 13:02:43 +02:00
virtual void DrawText ( cBitmap * Bitmap , int x , int y , const char * s , tColor ColorFg , tColor ColorBg , int Width ) const = 0 ;
///< Draws the given text into the Bitmap at position (x, y) with the given colors.
///< The text will not exceed the given Width (if > 0), and will end with a complete character.
2011-02-20 15:12:56 +01:00
virtual void DrawText ( cPixmap * Pixmap , int x , int y , const char * s , tColor ColorFg , tColor ColorBg , int Width ) const { } ; // not "pure", so that existing implementations still compile
///< Draws the given text into the Pixmap at position (x, y) with the given colors.
///< The text will not exceed the given Width (if > 0), and will end with a complete character.
2007-06-10 13:02:43 +02:00
static void SetFont ( eDvbFont Font , const char * Name , int CharHeight ) ;
2007-06-17 12:15:24 +02:00
///< Sets the given Font to use the font data according to Name (see CreateFont())
///< and make its characters CharHeight pixels high.
2003-10-24 12:53:12 +02:00
static const cFont * GetFont ( eDvbFont Font ) ;
2007-06-10 13:02:43 +02:00
///< Gets the given Font, which was previously set by a call to SetFont().
///< If no SetFont() call has been made, the font as defined in the setup is returned.
2009-05-23 10:12:04 +02:00
///< GetFont() is not thread-safe, and shall only be called from the main
///< thread! A font returned by GetFont() must only be used locally inside the
///< function it was retrieved from, and no long term pointer to it shall be kept,
///< because the cFont object may become invalid at any time after the
///< function that called GetFont() has returned.
2007-06-23 10:41:10 +02:00
static cFont * CreateFont ( const char * Name , int CharHeight , int CharWidth = 0 ) ;
2007-06-17 12:15:24 +02:00
///< Creates a new font object with the given Name and makes its characters
2007-06-23 10:41:10 +02:00
///< CharHeight pixels high. If CharWidth is given, it overwrites the font's
///< default width. Name is of the form "Family:Style", for instance
2007-06-17 12:15:24 +02:00
///< "Verdana:Bold Italic" or "Times New Roman". See GetAvailableFontNames()
///< for how to get a list of all available font names.
2014-01-07 12:42:37 +01:00
///< If the requested font can't be created, a dummy font is returned.
2007-06-17 12:15:24 +02:00
///< The caller must delete the font when it is no longer needed.
2007-06-17 11:12:46 +02:00
static bool GetAvailableFontNames ( cStringList * FontNames , bool Monospaced = false ) ;
///< Queries the font configuration for a list of available font names,
///< which is returned in FontNames. If Monospaced is true, only
///< monospaced fonts will be returned. The resulting font names are
///< in a format that can be used with GetFontFileName() to get the name
///< of the actual font file.
///< Returns true if any font names were found.
static cString GetFontFileName ( const char * FontName ) ;
2011-02-20 15:12:56 +01:00
///< Returns the actual font file name for the given FontName.
2010-09-19 12:36:07 +02:00
# ifdef BIDI
static cString Bidi ( const char * Ltr ) ;
///< Converts any "right-to-left" parts in the "left-to-right" string Ltr
///< to the proper language specific representation and returns the resulting string.
# endif
2000-10-03 10:34:48 +02:00
} ;
2004-05-16 10:35:36 +02:00
class cTextWrapper {
private :
char * text ;
char * eol ;
int lines ;
int lastLine ;
public :
cTextWrapper ( void ) ;
cTextWrapper ( const char * Text , const cFont * Font , int Width ) ;
~ cTextWrapper ( ) ;
void Set ( const char * Text , const cFont * Font , int Width ) ;
///< Wraps the Text to make it fit into the area defined by the given Width
///< when displayed with the given Font.
///< Wrapping is done by inserting the necessary number of newline
///< characters into the string.
const char * Text ( void ) ;
///< Returns the full wrapped text.
int Lines ( void ) { return lines ; }
///< Returns the actual number of lines needed to display the full wrapped text.
const char * GetLine ( int Line ) ;
///< Returns the given Line. The first line is numbered 0.
} ;
2000-10-03 10:34:48 +02:00
# endif //__FONT_H