mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * font.c: Font handling for the DVB On Screen Display
 | |
|  *
 | |
|  * See the main source file 'vdr.c' for copyright information and
 | |
|  * how to reach the author.
 | |
|  *
 | |
|  * $Id: font.c 1.4 2003/10/24 12:59:35 kls Exp $
 | |
|  */
 | |
| 
 | |
| #include "font.h"
 | |
| #include "tools.h"
 | |
| 
 | |
| #include "fontfix.c"
 | |
| #include "fontosd.c"
 | |
| #include "fontsml.c"
 | |
| 
 | |
| #include "fontfix-iso8859-7.c"
 | |
| #include "fontosd-iso8859-7.c"
 | |
| #include "fontsml-iso8859-7.c"
 | |
| 
 | |
| static void *FontData[eDvbCodeSize][eDvbFontSize] = {
 | |
|   { FontOsd_iso8859_1, FontFix_iso8859_1, FontSml_iso8859_1 },
 | |
|   { FontOsd_iso8859_7, FontFix_iso8859_7, FontSml_iso8859_7 }
 | |
|   };
 | |
| 
 | |
| static const char *FontCode[eDvbCodeSize] = {
 | |
|   "iso8859-1",
 | |
|   "iso8859-7"
 | |
|   };
 | |
| 
 | |
| eDvbCode cFont::code = code_iso8859_1;
 | |
| cFont *cFont::fonts[eDvbFontSize] = { NULL };
 | |
| 
 | |
| cFont::cFont(void *Data)
 | |
| {
 | |
|   SetData(Data);
 | |
| }
 | |
| 
 | |
| void cFont::SetData(void *Data)
 | |
| {
 | |
|   int h = ((tCharData *)Data)->height;
 | |
|   for (int i = 0; i < NUMCHARS; i++)
 | |
|       data[i] = (tCharData *)&((tPixelData *)Data)[(i < 32 ? 0 : i - 32) * (h + 2)];
 | |
| }
 | |
| 
 | |
| int cFont::Width(const char *s) const
 | |
| {
 | |
|   int w = 0;
 | |
|   while (s && *s)
 | |
|         w += Width(*s++);
 | |
|   return w;
 | |
| }
 | |
| 
 | |
| int cFont::Height(const char *s) const
 | |
| {
 | |
|   int h = 0;
 | |
|   if (s && *s)
 | |
|      h = Height(*s); // all characters have the same height!
 | |
|   return h;
 | |
| }
 | |
| 
 | |
| bool cFont::SetCode(const char *Code)
 | |
| {
 | |
|   for (int i = 0; i < eDvbCodeSize; i++) {
 | |
|       if (strcmp(Code, FontCode[i]) == 0) {
 | |
|          SetCode(eDvbCode(i));
 | |
|          return true;
 | |
|          }
 | |
|       }
 | |
|   return false;
 | |
| }
 | |
| 
 | |
| void cFont::SetCode(eDvbCode Code)
 | |
| {
 | |
|   if (code != Code) {
 | |
|      code = Code;
 | |
|      for (int i = 0; i < eDvbFontSize; i++) {
 | |
|          if (fonts[i])
 | |
|             fonts[i]->SetData(FontData[code][i]);
 | |
|          }
 | |
|      }
 | |
| }
 | |
| 
 | |
| void cFont::SetFont(eDvbFont Font, void *Data)
 | |
| {
 | |
|   delete fonts[Font];
 | |
|   fonts[Font] = new cFont(Data ? Data : FontData[code][Font]);
 | |
| }
 | |
| 
 | |
| const cFont *cFont::GetFont(eDvbFont Font)
 | |
| {
 | |
|   if (!fonts[Font])
 | |
|      SetFont(Font);
 | |
|   return fonts[Font];
 | |
| }
 |