summaryrefslogtreecommitdiff
path: root/font.c
diff options
context:
space:
mode:
Diffstat (limited to 'font.c')
-rw-r--r--font.c223
1 files changed, 18 insertions, 205 deletions
diff --git a/font.c b/font.c
index 1401b86..25d8e66 100644
--- a/font.c
+++ b/font.c
@@ -8,222 +8,43 @@
#include "common.h"
-#if VDRVERSNUM != 10503
#include "font.h"
#include <iconv.h>
#include <stdio.h>
cGraphtftFont::cGraphtftFont()
{
-#if VDRVERSNUM < 10503
- _library = 0;
- _face = 0;
-
- // init freetype2 lib
- int error = FT_Init_FreeType(&_library);
- if (error)
- {
- error("ERROR: Could not init freetype library");
- }
-#endif
}
cGraphtftFont::~cGraphtftFont()
{
Clear();
-
-#if VDRVERSNUM < 10503
- if (_face)
- {
- FT_Done_Face(_face);
- }
-
- if (_library)
- {
- FT_Done_FreeType(_library);
- }
-#endif
}
-bool cGraphtftFont::Load(string Filename, string CacheName, int Size, int Language, int Width, int format)
+const cFont* cGraphtftFont::GetFont(const char *Filename, int Size, int Width)
{
- if ( _cache.find(CacheName) != _cache.end() )
- return true;
-
-#if VDRVERSNUM >= 10504
- //TODO: "Width" not yet in VDR
-# if VDRVERSNUM >= 10505
- cFont *newFont = cFont::CreateFont(Filename.c_str(), Size, Width > 0 ? (Size * Width / 100) : 0);
-# else
- cFont *newFont = cFont::CreateFont(Filename.c_str(), Size);
-# endif
- if (newFont) {
- _cache[CacheName] = newFont;
- return true;
- }
-#elif VDRVERSNUM < 10503
- int error = FT_New_Face(_library, Filename.c_str(), format, &_face);
-
- // every thing ok?
- if (error == FT_Err_Unknown_File_Format)
- {
- error("ERROR: Font file (%s) could be opened and read, but it appears that its font format is unsupported", Filename.c_str());
- return false;
- }
- else if (error)
- {
- error("ERROR: Font file (%s) could be opened or read, or simply it is broken", Filename.c_str());
- return false;
- }
-
- // set slot
- _slot = _face->glyph;
-
- if (Width > 0)
- Width = Size * Width / 100;
-
- // set Size
- FT_Set_Char_Size
- (
- _face, // handle to face object
- Width*64, // char_width in 1/64th of points
- Size*64, // char_height in 1/64th of points
- 0, // horizontal device resolution (dpi)
- 0 // vertical device resolution (dpi)
- );
-
- iconv_t cd;
- char from_code[255];
- wchar_t utf_buff[256];
-
- // XXX: Get this values from i18n
- switch(Language) {
- case 11:
- strcpy(from_code,"ISO8859-7");
- break;
- case 13:
- case 17:
- strcpy(from_code,"ISO8859-2");
- break;
- case 16:
- strcpy(from_code,"ISO8859-5");
- break;
- default :
- strcpy(from_code,"ISO8859-15");
- break;
- }
-
- if ((cd = iconv_open("WCHAR_T",from_code)) == (iconv_t)-1) {
- esyslog("ERROR: Iconv encoding not supported: %m");
- return false; //encoding no supportet
- }
-
- for (int c = 0; c < 256; c++) {
-
- char char_buff = c;
- wchar_t wchar_buff;
+ if (Filename == NULL)
+ return NULL;
- char *in_buff,*out_buff;
- size_t in_len, out_len, count;
+ char *cachename = NULL;
+ asprintf(&cachename, "%s_%d_%d", Filename, Size, Width);
+ string CacheName = cachename;
+ free(cachename);
+ cachename = NULL;
- in_len=1; out_len=4;
- in_buff=(char*)&char_buff;
- out_buff=(char *)&wchar_buff;
- count = iconv(cd,&in_buff,&in_len,&out_buff,&out_len);
- if ( (size_t)-1 == count ){
- //printf("ERROR - PREPARING TABLE CHAR %d \n", c);
- utf_buff[c] = 0;
- }
- utf_buff[c] = wchar_buff;
- }
- iconv_close(cd);
+ if (_cache.find(CacheName) != _cache.end())
+ return _cache[CacheName];
- cFont::tPixelData value;
- int num_rows_global = (_face->size->metrics.height / 64 )+1;
- int num_rows = num_rows_global + 2;
-
- cFont::tPixelData * font_data = new cFont::tPixelData[225 * num_rows];
-
- for (int i = 0; i < 225; i++)
- for (int j = 0; j < num_rows; j++)
- font_data[(i*num_rows)+j]=0x0000000000000000;
-
- // Time to put char 32..255 in font_data
- FT_UInt glyph_index;
- for ( int num_char = 32, num_char_array = 0; num_char < 256; num_char++, num_char_array++ )
- {
+ debug("cGraphtftFont::Load() CREATING FONT %s size=%d width=%d", Filename, Size, Width);
+ cFont *newFont = cFont::CreateFont(Filename, Size, Width > 0 ? (Size * Width / 100) : 0);
+ if (newFont) {
+ _cache[CacheName] = newFont;
+ return newFont;
+ }
- //Get FT char index
- glyph_index = FT_Get_Char_Index( _face, utf_buff[num_char] );
-
- //Load the char
- error = FT_Load_Glyph( _face, glyph_index, FT_LOAD_DEFAULT );
- if ( error ) continue; /* ignore errors */
-
- // now, convert to vdr font data
- int width = (_slot->metrics.horiAdvance / 64) + 1;
- int bearingX = (_slot->metrics.horiBearingX / 64) +1;
- width = (width > (int)sizeof(cFont::tPixelData) * 8) ? (((int)sizeof(cFont::tPixelData) * 8)-2) :width ;
+ error("ERROR: EnigmaNG: Couldn't load font %s:%d", Filename, Size);
- font_data[(num_char_array*num_rows)+0]=width;
- font_data[(num_char_array*num_rows)+1]=num_rows_global;
-
- // convert to a mono bitmap
- error = FT_Render_Glyph( _face->glyph, ft_render_mode_mono );
- if ( error ) continue;
-
- int top = _slot->bitmap_top;
- int y_off = Size - top;
-
- unsigned char *bmp = _slot->bitmap.buffer;
-
- for (int y = 0; y < _slot->bitmap.rows; ++y , y_off++) {
- int pos = 0;
- int bit = 0x80;
- value = 0x00;
-
- for (int x = 0; x < _slot->bitmap.width; ++x) {
- if (bmp[pos] & bit && x < width + 1 )
- value = value | (cFont::tPixelData)1 << width - bearingX - x ;
-
- bit >>= 1;
- if (bit == 0) {
- bit = 0x80;
- ++pos;
- }
- }
- bmp += _slot->bitmap.pitch;
- font_data[(num_char_array*num_rows)+y_off+2] = value;
- }
-
- }
- // If all was ok, put the vdr font into the cache and return true
- cFont* newFont = NULL;
- newFont = new cFont(font_data);
- if (newFont) {
- _cache[CacheName] = newFont;
- _del[CacheName] = font_data;
- return true;
- }
- delete(font_data);
-#endif //VDRVERSNUM >= 10504
-
- // Something went wrong!
- return false;
-}
-
-const cFont* cGraphtftFont::GetFont(string CacheName){
- if (CacheName == "Sml") return cFont::GetFont(fontSml);
- else if (CacheName == "Fix") return cFont::GetFont(fontFix);
- else if ( _cache.find(CacheName) != _cache.end() ){
- return _cache[CacheName];
- }
- return cFont::GetFont(fontOsd);
-}
-
-void cGraphtftFont::Clear(string CacheName)
-{
- Clear();
+ return NULL;
}
void cGraphtftFont::Clear()
@@ -232,12 +53,4 @@ void cGraphtftFont::Clear()
for (; it != _cache.end(); ++it)
delete((*it).second);
_cache.clear();
-
-#if VDRVERSNUM < 10503
- del_map::iterator del_it = _del.begin();
- for (; del_it != _del.end(); ++del_it)
- delete[]((*del_it).second);
- _del.clear();
-#endif
}
-#endif //VDRVERSNUM < 10503