osdteletext-0.9.7/0000755000175000017500000000000013244335425013424 5ustar tobiastobiasosdteletext-0.9.7/txtrender.c0000644000175000017500000004151013244332173015605 0ustar tobiastobias/*************************************************************** -*- c++ -*- * * * txtrender.c - Teletext display abstraction and teletext code * * renderer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * Changelog: * * 2005-03 initial version (c) Udo Richter * * * ***************************************************************************/ #include #include "txtrender.h" #include "menu.h" // Font tables // teletext uses 7-bit numbers to identify a font set. // There are three font sets involved: // Primary G0, Secondary G0, and G2 font set. // Font tables are organized in blocks of 8 fonts: enumCharsets FontBlockG0_0000[8] = { CHARSET_LATIN_G0_EN, CHARSET_LATIN_G0_DE, CHARSET_LATIN_G0_SV_FI, CHARSET_LATIN_G0_IT, CHARSET_LATIN_G0_FR, CHARSET_LATIN_G0_PT_ES, CHARSET_LATIN_G0_CZ_SK, CHARSET_LATIN_G0 }; enumCharsets FontBlockG2Latin[8]={ CHARSET_LATIN_G2, CHARSET_LATIN_G2, CHARSET_LATIN_G2, CHARSET_LATIN_G2, CHARSET_LATIN_G2, CHARSET_LATIN_G2, CHARSET_LATIN_G2, CHARSET_LATIN_G2 }; enumCharsets FontBlockG0_0001[8] = { CHARSET_LATIN_G0_PL, CHARSET_LATIN_G0_DE, CHARSET_LATIN_G0_SV_FI, CHARSET_LATIN_G0_IT, CHARSET_LATIN_G0_FR, CHARSET_LATIN_G0, CHARSET_LATIN_G0_CZ_SK, CHARSET_LATIN_G0 }; enumCharsets FontBlockG0_0010[8] = { CHARSET_LATIN_G0_EN, CHARSET_LATIN_G0_DE, CHARSET_LATIN_G0_SV_FI, CHARSET_LATIN_G0_IT, CHARSET_LATIN_G0_FR, CHARSET_LATIN_G0_PT_ES, CHARSET_LATIN_G0_TR, CHARSET_LATIN_G0 }; enumCharsets FontBlockG0_0011[8] = { CHARSET_LATIN_G0, CHARSET_LATIN_G0, CHARSET_LATIN_G0, CHARSET_LATIN_G0, CHARSET_LATIN_G0, CHARSET_LATIN_G0_SR_HR_SL, CHARSET_LATIN_G0, CHARSET_LATIN_G0_RO }; enumCharsets FontBlockG0_0100[8] = { CHARSET_CYRILLIC_G0_SR_HR, CHARSET_LATIN_G0_DE, CHARSET_LATIN_G0_EE, CHARSET_LATIN_G0_LV_LT, CHARSET_CYRILLIC_G0_RU_BG, CHARSET_CYRILLIC_G0_UK, CHARSET_LATIN_G0_CZ_SK, CHARSET_INVALID }; enumCharsets FontBlockG2_0100[8] = { CHARSET_CYRILLIC_G2, CHARSET_LATIN_G2, CHARSET_LATIN_G2, CHARSET_LATIN_G2, CHARSET_CYRILLIC_G2, CHARSET_CYRILLIC_G2, CHARSET_LATIN_G2, CHARSET_INVALID }; enumCharsets FontBlockG0_0110[8] = { CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_LATIN_G0_TR, CHARSET_GREEK_G0 }; enumCharsets FontBlockG2_0110[8] = { CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_LATIN_G2, CHARSET_GREEK_G2 }; enumCharsets FontBlockG0_1000[8] = { CHARSET_LATIN_G0_EN, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_LATIN_G0_FR, CHARSET_INVALID, CHARSET_INVALID, CHARSET_ARABIC_G0 }; enumCharsets FontBlockG2_1000[8] = { CHARSET_ARABIC_G2, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_ARABIC_G2, CHARSET_INVALID, CHARSET_INVALID, CHARSET_ARABIC_G2 }; enumCharsets FontBlockG0_1010[8] = { CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_HEBREW_G0, CHARSET_INVALID, CHARSET_ARABIC_G0, }; enumCharsets FontBlockG2_1010[8] = { CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_ARABIC_G2, CHARSET_INVALID, CHARSET_ARABIC_G2, }; enumCharsets FontBlockInvalid[8] = { CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID, CHARSET_INVALID }; // The actual font table definition: // Split the 7-bit number into upper 4 and lower 3 bits, // use upper 4 bits for outer array, // use lower 3 bits for inner array struct structFontBlock { enumCharsets *G0Block; enumCharsets *G2Block; }; structFontBlock FontTable[16] = { { FontBlockG0_0000, FontBlockG2Latin }, // 0000 block { FontBlockG0_0001, FontBlockG2Latin }, // 0001 block { FontBlockG0_0010, FontBlockG2Latin }, // 0010 block { FontBlockG0_0011, FontBlockG2Latin }, // 0011 block { FontBlockG0_0100, FontBlockG2_0100 }, // 0100 block { FontBlockInvalid, FontBlockInvalid }, // 0101 block { FontBlockG0_0110, FontBlockG2_0110 }, // 0110 block { FontBlockInvalid, FontBlockInvalid }, // 0111 block { FontBlockG0_1000, FontBlockG2_1000 }, // 1000 block { FontBlockInvalid, FontBlockInvalid }, // 1001 block { FontBlockG0_1010, FontBlockG2_1010 }, // 1010 block { FontBlockInvalid, FontBlockInvalid }, // 1011 block { FontBlockInvalid, FontBlockInvalid }, // 1100 block { FontBlockInvalid, FontBlockInvalid }, // 1101 block { FontBlockInvalid, FontBlockInvalid }, // 1110 block { FontBlockInvalid, FontBlockInvalid } // 1111 block }; inline enumCharsets GetG0Charset(int codepage) { return FontTable[codepage>>3].G0Block[codepage&7]; } inline enumCharsets GetG2Charset(int codepage) { return FontTable[codepage>>3].G2Block[codepage&7]; } cRenderPage::cRenderPage() : Dirty(false), DirtyAll(false), // Todo: make this configurable FirstG0CodePage(ttSetup.txtG0Block<<3), SecondG0CodePage(ttSetup.txtG2Block<<3) { } enum enumSizeMode { // Possible size modifications of characters sizeNormal, sizeDoubleWidth, sizeDoubleHeight, sizeDoubleSize }; /* // Debug only: List of teletext spacing code short names const char *(names[0x20])={ "AlBk","AlRd","AlGr","AlYl","AlBl","AlMg","AlCy","AlWh", "Flsh","Stdy","EnBx","StBx","SzNo","SzDh","SzDw","SzDs", "MoBk","MoRd","MoGr","MoYl","MoBl","MoMg","MoCy","MoWh", "Conc","GrCn","GrSp","ESC", "BkBl","StBk","HoMo","ReMo"}; */ void cRenderPage::ReadTeletextHeader(unsigned char *Header) { // Format of buffer: // 0 String "VTXV4" // 5 always 0x01 // 6 magazine number // 7 page number // 8 flags // 9 lang // 10 always 0x00 // 11 always 0x00 // 12 teletext data, 40x24 bytes // Format of flags: // 0x80 C4 - Erase page // 0x40 C5 - News flash // 0x20 C6 - Subtitle // 0x10 C7 - Suppress Header // 0x08 C8 - Update // 0x04 C9 - Interrupt Sequence // 0x02 C9 (Bug?) // 0x01 C11 - Magazine Serial mode Flags=Header[8]; Lang=Header[9]; } void cRenderPage::RenderTeletextCode(unsigned char *PageCode) { int x,y; bool EmptyNextLine=false; // Skip one line, in case double height chars were/will be used // Get code pages: int LocalG0CodePage=(FirstG0CodePage & 0x78) | ((Lang & 0x04)>>2) | (Lang & 0x02) | ((Lang & 0x01)<<2); enumCharsets FirstG0=GetG0Charset(LocalG0CodePage); enumCharsets SecondG0=GetG0Charset(SecondG0CodePage); // Reserved for later use: // enumCharsets FirstG2=GetG2Charset(LocalG0CodePage); for (y=0;y<24;(EmptyNextLine?y+=2:y++)) { // Start of line: Set start of line defaults // Hold Mosaics mode: Remember last mosaic char/charset // for next spacing code bool HoldMosaics=false; unsigned char HoldMosaicChar=' '; enumCharsets HoldMosaicCharset=FirstG0; enumSizeMode Size=sizeNormal; // Font size modification bool SecondCharset=false; // Use primary or secondary G0 charset bool GraphicCharset=false; // Graphics charset used? bool SeparateGraphics=false; // Use separated vs. contiguous graphics charset bool NoNextChar=false; // Skip display of next char, for double-width EmptyNextLine=false; // Skip next line, for double-height cTeletextChar c; // auto.initialized to everything off c.SetFGColor(ttcWhite); c.SetBGColor(ttcBlack); c.SetCharset(FirstG0); if (y==0 && (Flags&0x10)) { c.SetBoxedOut(true); } if (Flags&0x60) { c.SetBoxedOut(true); } // Pre-scan for double-height and double-size codes for (x=0;x<40;x++) { if (y==0 && x<8) x=8; if ((PageCode[x+40*y] & 0x7f)==0x0D || (PageCode[x+40*y] & 0x7f)==0x0F) EmptyNextLine=true; } // Move through line for (x=0;x<40;x++) { unsigned char ttc=PageCode[x+40*y] & 0x7f; // skip parity check if (y==0 && x<8) continue; // no displayable data here... /* // Debug only: Output line data and spacing codes if (y==6) { if (ttc<0x20) printf("%s ",names[ttc]); else printf("%02x ",ttc); if (x==39) printf("\n"); } */ // Handle all 'Set-At' spacing codes switch (ttc) { case 0x09: // Steady c.SetBlink(false); break; case 0x0C: // Normal Size if (Size!=sizeNormal) { Size=sizeNormal; HoldMosaicChar=' '; HoldMosaicCharset=FirstG0; } break; case 0x18: // Conceal c.SetConceal(true); break; case 0x19: // Contiguous Mosaic Graphics SeparateGraphics=false; if (GraphicCharset) c.SetCharset(CHARSET_GRAPHICS_G1); break; case 0x1A: // Separated Mosaic Graphics SeparateGraphics=true; if (GraphicCharset) c.SetCharset(CHARSET_GRAPHICS_G1_SEP); break; case 0x1C: // Black Background c.SetBGColor(ttcBlack); break; case 0x1D: // New Background c.SetBGColor(c.GetFGColor()); break; case 0x1E: // Hold Mosaic HoldMosaics=true; break; } // temporary copy of character data: cTeletextChar c2=c; // c2 will be text character or space character or hold mosaic // c2 may also have temporary flags or charsets if (ttc<0x20) { // Spacing code, display space or hold mosaic if (HoldMosaics) { c2.SetChar(HoldMosaicChar); c2.SetCharset(HoldMosaicCharset); } else { c2.SetChar(' '); } } else { // Character code c2.SetChar(ttc); if (GraphicCharset) { if (ttc&0x20) { // real graphics code, remember for HoldMosaics HoldMosaicChar=ttc; HoldMosaicCharset=c.GetCharset(); } else { // invalid code, pass-through to G0 c2.SetCharset(SecondCharset?SecondG0:FirstG0); } } } // Handle double-height and double-width extremes if (y>=23) { if (Size==sizeDoubleHeight) Size=sizeNormal; if (Size==sizeDoubleSize) Size=sizeDoubleWidth; } if (x>=38) { if (Size==sizeDoubleWidth) Size=sizeNormal; if (Size==sizeDoubleSize) Size=sizeDoubleHeight; } // Now set character code if (NoNextChar) { // Suppress this char due to double width last char NoNextChar=false; } else { switch (Size) { case sizeNormal: // Normal sized SetChar(x,y,c2); if (EmptyNextLine && y<23) { // Clean up next line SetChar(x,y+1,c2.ToChar(' ').ToCharset(FirstG0)); } break; case sizeDoubleWidth: // Double width SetChar(x,y,c2.ToDblWidth(dblw_Left)); SetChar(x+1,y,c2.ToDblWidth(dblw_Right)); if (EmptyNextLine && y<23) { // Clean up next line SetChar(x ,y+1,c2.ToChar(' ').ToCharset(FirstG0)); SetChar(x+1,y+1,c2.ToChar(' ').ToCharset(FirstG0)); } NoNextChar=true; break; case sizeDoubleHeight: // Double height SetChar(x,y,c2.ToDblHeight(dblh_Top)); SetChar(x,y+1,c2.ToDblHeight(dblh_Bottom)); break; case sizeDoubleSize: // Double Size SetChar(x , y,c2.ToDblHeight(dblh_Top ).ToDblWidth(dblw_Left )); SetChar(x+1, y,c2.ToDblHeight(dblh_Top ).ToDblWidth(dblw_Right)); SetChar(x ,y+1,c2.ToDblHeight(dblh_Bottom).ToDblWidth(dblw_Left )); SetChar(x+1,y+1,c2.ToDblHeight(dblh_Bottom).ToDblWidth(dblw_Right)); NoNextChar=true; break; } } // Handle all 'Set-After' spacing codes switch (ttc) { case 0x00 ... 0x07: // Set FG color if (GraphicCharset) { // Actual switch from graphics charset HoldMosaicChar=' '; HoldMosaicCharset=FirstG0; } c.SetFGColor((enumTeletextColor)ttc); c.SetCharset(SecondCharset?SecondG0:FirstG0); GraphicCharset=false; c.SetConceal(false); break; case 0x08: // Flash c.SetBlink(true); break; case 0x0A: // End Box c.SetBoxedOut(true); break; case 0x0B: // Start Box c.SetBoxedOut(false); break; case 0x0D: // Double Height if (Size!=sizeDoubleHeight) { Size=sizeDoubleHeight; HoldMosaicChar=' '; HoldMosaicCharset=FirstG0; } break; case 0x0E: // Double Width if (Size!=sizeDoubleWidth) { Size=sizeDoubleWidth; HoldMosaicChar=' '; HoldMosaicCharset=FirstG0; } break; case 0x0F: // Double Size if (Size!=sizeDoubleSize) { Size=sizeDoubleSize; HoldMosaicChar=' '; HoldMosaicCharset=FirstG0; } break; case 0x10 ... 0x17: // Mosaic FG Color if (!GraphicCharset) { // Actual switch to graphics charset HoldMosaicChar=' '; HoldMosaicCharset=FirstG0; } c.SetFGColor((enumTeletextColor)(ttc-0x10)); c.SetCharset(SeparateGraphics?CHARSET_GRAPHICS_G1_SEP:CHARSET_GRAPHICS_G1); GraphicCharset=true; c.SetConceal(false); break; case 0x1B: // ESC Switch SecondCharset=!SecondCharset; if (!GraphicCharset) c.SetCharset(SecondCharset?SecondG0:FirstG0); break; case 0x1F: // Release Mosaic HoldMosaics=false; break; } } // end for x } // end for y for (x=0;x<40;x++) { // Clean out last line cTeletextChar c; c.SetFGColor(ttcWhite); c.SetBGColor(ttcBlack); c.SetCharset(FirstG0); c.SetChar(' '); if (Flags&0x60) { c.SetBoxedOut(true); } SetChar(x,24,c); } } osdteletext-0.9.7/HISTORY0000644000175000017500000003023213244335367014515 0ustar tobiastobiasVDR Plugin 'osdteletext' Revision History ----------------------------------------- 2018-02-24: version 0.9.7 - Added teletext2.ttf - Cyrillic support added 2018-01-28: version 0.9.6 - Merged the changes from Rolf Ahrenbergs fork pon GitHub (https://github.com/rofafor/vdr-plugin-osdteletext): - VDR 2.3.1 compatibility (patch by 'kandakruemel') - Fixed character drawing - Fixed character conversion table for Finnish/Swedish 2015-02-13: version 0.9.5 - Avoid pkg-config warnings - Improved cleanup when closing OSDTeletext (Thx to Ville Skyttä and Rolf Ahrenberg) 2013-03-10: version 0.9.4 - Allow to override the CXXFLAGS - Fixed CZ font and added CZ-SK subset - patch provided Marek Hajduk (Closes #1134) - Dropped backwards compatibility for VDR 1.6.0 (Closes #944) - Using new standard plugin Makefile from VDR 1.7.39 2012-04-03: version 0.9.3 - VDR 1.7.27 compatibility (Closes #919), Credit goes to nox and gda fro vdrportal.de - Instead of doing mixed drawing to cOsd and cBitmap only draw to cBitmap (Closes #899, this should fixe the issues with the TT6400) 2012-03-25: version 0.9.2 - Some code refactorings (Thx to Ville Skyttä) - FF card transfer mode on channel switch with VDR >= 1.7.25 (Closes: #9) (Thx to Udo Richter) - VDR 1.7.26 compatibility (Thx to Ville Skyttä) - Better live view channel switch detection 2011-08-20: version 0.9.1 - Updated Italian translation provided by Diego Pierotto (Closes #450) - Added Slovak translation provided by Milan Hrala (Closes #558) 2010-11-06: version 0.9.0 - Updated Italian translation provided by Diego Pierotto (Closes #151) - Fix valid page number check in TeletextBrowser::ExecuteAction (Closes #154) - Fixed possible segfault (Closes #179) - (Thx to Manuel Reimer) - Added setup option to disable main menu entry (Closes #149) (Thx to Manuel Reimer!) - Added command line option to enable storing TopText pages, which is now disabled by default (References #177) (Thx to Andreas Brachold!) - Makefile adjustments for VDR 1.7.13. - Don't care if the current channel really changed, if we get a channel switch on the primary device (Thx to Sören Moch) 2009-06-02: version 0.8.3 - Updated Ukrainian translation provided by Yarema P. aka Knedlyk (Closes #133) 2009-05-25: version 0.8.2 - More refactoring of the TxtStatus class (Thx to Sören Moch!) - Install plug-in to lib dir with --remove-destination as suggested by Christian Wieninger (Closes #57) - If background is configured to completely black or transparent, toggle between black and transparent only. - Updated Italian translation provided by Diego Pierotto (Closes #60) - Fixed problems with VDR >= 1.7.3 (not all teletext pages accessible, 4 GByte VTX files) - Removed unnecessary DVBDIR from Makefile 2009-01-10: version 0.8.1 - Small bugfix in channel switching code 2009-01-10: version 0.8.0 - Added Portuguese translation provided by Chris Silva - Updated Italian translation by Davide Cavalca - Removed the "OSD" from the main menu entry as suggested by Davide Cavalca - Added Ukrainian translation provided by Yarema P. aka Knedlyk - Removed obsolete options -R and -r - Remove remnants of VDR < 1.6 support - Updated Russian translation provided by Oleg Roitburd (Closes #46) - Improved error handling - Background toggling now allows to switch between black, the configured background transparency and full transparency as suggested by Walter K. (Closes #41) - Removed the OSDTELETEXT_REINSERTION_PATCH (dead code) - Removed timingdebug code - Merged class ChannelStatus into cTxtStatus and changed the code that detects, if the current live channel has been changed and the OsdTeletext receiver needs to switch to the new channel as well - Updated French translation provided by Nival Michaël (Closes #56) 2008-12-19: version 0.7.0 - switched completely to VDR 1.6's I18N system and removed the old crap - no more support for older VDR versions! (thx to Rolf Ahrenberg) - proper translation of the key bindings (thx to Rolf Ahrenberg) - Partially updated Italian translation by Davide Cavalca 2008-12-02: version 0.6.0 - Moved installation of README and manpage from all to install target - Updated code for VDR 1.6.0 - Changed default location of vtx cache to /var/cache/vdr/vtx - Fixed problems with switching channels on FF+Budget systems See: http://www.vdr-portal.de/board/thread.php?postid=728192#post728192 2005-08-16: version 0.5.1 - show page if it was initially not found but is received later (suggested by Luca Olivetti) - added timeout for user inactivity after which the plugin is closed. Without timeout the plugin would prevent VDR's auto-shutdown mechanism if it remains open. The value is the same as VDR's min user inactivity setup option. (suggested by Peter Bieringer) - fixed gcc4 warnings (thanks to Ville Skyttä) - updated Finnish translation (thanks to Rolf Ahrenberg) - added command line parameter documentation to READMEs - added /var/cache/vdr/osdteletext to the list of recommended cache directories (suggested by Ville Skyttä) 2005-04-21: version 0.5 Udo Richter: - font subsystem now supports Teletext level 1. Fonts are provided for English, German, French, Italian, Spanish, Portuguese, Swedish and Finnish. The correct font is chosen automatically. - support for "boxed mode" (newstickers, subtitles): in 4Bpp mode the area not covered by the box will be completely transparent - OSD can now be aligned on screen: - in horizontal alignment mode, 0 means on the left, 50 in the center and 100 on the right - in vertical alignment mode, 0 means at the top, 50 in the center and 100 at the bottom - default is central alignment - changed palette system, no longer depending on order of indexing - fixed compilation failure with gcc 2.95 - changed OSD minimum size from 480x324 to 320x250 - some bugfixes and comments in txtrecv.c Marcel Wiesweg: - avoid crash and improve behavior when an invalid channel number is entered 2005-03-30: version 0.5-pre1 Udo Richter: - extensive rewrite of display code - removed display.*, txtbitmap.*, colormapping.h - added txtrender.*, displaybase.*, display.* - menu.c adapted to new display engine - speed improvements by incremental drawing - strict adherence to standard 2005-03-21: version 0.4.9-inofficial - rewrite of scaling and drawing code, better scaling algorithm, removed inefficient double painting. Increases speed by a factor of 4. (Udo Richter) - minor fixes for pagenumber, channel number and clock fields to minimize overdrawing (Rolf Ahrenberg) - fix for graphical errors if normal characters are introduced after double high ones (Rolf Ahrenberg) - fix in receiving code to make osdteletext work with some Swedish channels (thanks to Magnus Andersson) - pseudo target in Makefile allows a simple "make". Previously, this would fail and you needed "make all" 2005-03-03: version 0.4.2 - fixes for double-high characters, scaling and localization (thanks to Rolf Ahrenberg for his patch edition) - adapted to VDR API >= 1.3.18, reentrancy fixes - added Spanish and Catalan translation (thanks to Luca Olivetti) - create stored files with 644 permissions (suggested by Andreas Brachold) 2004-09-21: version 0.4.1 - fixed problem with undefined file permissions of created files (thanks to whoever created the patch) - fixed hexadecimal/decimal misinterpretation for "Jump to" key bindings (thanks to Peter Bieringer for pointing this out) - cosmetic change: key Left when entering channel number now resets the cursor by one position, other keys stop entering of page number 2004-06-18: version 0.4 - ported to VDR 1.3/1.4 series (>=1.3.8 now required) This mostly involved changes in the OSD graphics code, - now supports OSDs with color depth of 3 (thanks to Sascha Volkenandt) - rewrote the storage system: - cache directory is now configurable (option -d) Default value is still /vtx to allow seamless migration, but /tmp/vtx is recommended (conforms to LSB etc.) - changed the default file format: Now more than one page is stored in one file. On filesystems that depend on a blocksize the increases storage efficiency. For tmpfs the improvement factor is approx. 4. - The old system is still available via a command line option (though it now uses a slightly different naming) - when no more space is available on disk or a specified number of harddisk space is exceeded (option -n) the folder least recently modified will be deleted. On exit, all files will be deleted, i.e. (!) on exit, all files with suffix .vtx below the storage directory will be deleted - the option -r is now obsolete (will be ignored) option -R/--no-receive is deprecated - code cleanups, removed broken or unused code - fixed quite a few bugs - Added Russian translation (thanks to Vyacheslav Dikonov) 2003-12-2: version 0.3.2 - receiver now uses a ring buffer and a thread to reduce time spent in Receive() function, thus delaying VDR's receiver thread (several people reported problems with bitstreamout - thanks to Christian Jacobsen and Dr. Werner Fink) - fixed and improved the newly introduced receiver thread (thanks to Dr. Werner Fink) - fixed a bug that if there is a double high title on a page, the last line on that page will be missing (fixed by Rolf Ahrenberg) - fixed Finnish translation (thanks to Rolf Ahrenberg) - added Italian translation (thanks to "kikko77") - fixed bug that you could not enter 0 when switching channel (thanks to Dietmar Hilbrich) 2003-04-28: version 0.3.1 - added support for DXR3 systems. Patches contributed by Kai Moeller and Sascha Volkenandt, thanks to them. - the "0" if pressed as first digit now switches between current and last page (as VDR does it with channels) - fixed autosuspend thread 2003-04-03: version 0.3 - fixed two serious memory leaks, thanks to Martin Pley - added feature to automatically update the page if it changed. - moved color definitions to colormapping.h - made width and height configurable, independent from, but with the same mechanism as VDR - made setup menu items dynamic, i.e. the "Page Number" entries are hidden when "Jump to..." is not selected - Experimental: added option to suspend the receiving automatically for 5min after 30s. This may enable you to use your TV set's teletext decoder if you like to. (patch to VDR needed) - Experimental: added an action to immediately suspend receiving, respectively reenable it - added an action to switch the background color between the value you configured in the setup and black - improved color handling when foreground and background color are the same, thanks to Martin Pley - fixed small bug in ChangePageRelative, thanks to Martin Pley - improvements in page switching, thanks to Martin Pley - rewrote parts of the README - added a German README.DE - several fixes and code clean-ups 2003-02-26: version 0.2.1 - fixed two compiling problems with gcc versions other than 3.2 (asprintf, ) - included Finnish translations, thanks to Lauri Tischler - improved Makefile, now uses install instead of mkdir/cp 2003-02-15: version 0.2 - Copied code to receive and save teletext data from original teletext plugin. (appreciating Peter Seyringer's great work) - added command line option to enable the receiving code - added setup options to make key bindings fully configurable. For each key you can choose between the three actions "Zoom", "Half page" or "Switch channel" or use it to jump to a page - added setup option to make background transparency configurable (0...255, VDR's default value being 127) - included Emil Naepflein's patch to improve changing pages relatively - added feature to view saved pages of other channels than the current ("Switch Channel"). Last pages are remembered over channel switching. - fixed bug when the upper half of a page was not automatically shown when using the number keys - page and channel numbers now persist when returning to VDR - added clock which can regularly be updated. (the clock shows the system time, which may definitely be different from the time broadcast via teletext) - added setup option to enable clock - now copies README to ../../man, as Reinhard Walter Buchner suggested 2003-02-05: Version 0.1 - Initial revision. osdteletext-0.9.7/teletext2.ttf0000644000175000017500000030777413244324626016106 0ustar tobiastobias PFFTM[OS/2X`cmapj 6cvt !yPgaspglyfL0@Hheadch6hhea$hmtxn ^locagutT Xmaxp8 name_([postt]18_<ַZַZ8X  8ZXXx@.X1 *@:PfEd  8Z  X!XXd2222dddddddddddddddd2d22ddddddddddd22ddddd2d22d2ddd22ddddddddd2dddddddd222ddd2dddd2d2dd2dd2222d222ddddddd2ddddd2ddddddddddd2dd2222222ddddddddddddd2ddddd2d2d2d2dddddddddd2dddddddddddddddddddd22ddd22ddddddddddddddd2dddddddd22dddddddddddddd2d2d2ddddddddddddd22dddddddddddd2d2d22222222222222222222222ddd222d22d2d2222dd2ddd2d2222d22ddd2ddd22d2dd2ddd2d2d22d222dddddd2ddd2222d2dd2ddd2dddddd22dddddddddd222dd2dddddddd222ddddd22222d2222^22222d22222dd222222222ddd2dddd2dd2d222222d2d22d2d22d2d2,,,,,,,,,,,,,,2d^d,2,22dddd,,,,,,,,,,,,,,2ddd2d^d,2,2d22d2d222222222dddd22^d,2,^2,,,,2d^d,2,22ddd22^d,2,^2d22d2d222222222dddd2d22222222222222d2d22d2dd,2222dd2d22d22222dd222d2d2222dd222,2d22222,@@)Q_     0 !"!&!^!&j?_ )Qp     0 !"!&![!&j_wwE5A@?=+<9iJ   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`absefjyql^wkthxm}don~cUYZWX;z[HSrOPQ{TRI!y****<Z@Rp*FX~2Z*Z<Tj8`"V *Jh   6 T v  & @ ` ~  > \ | * T |  @ r 4Pb|b:f>l,Pr@l ,PrBp*Lt.Pp8f HnDl<l:f Bn<jHp . T z !!2!N!b!!!!","V"v"""""##,#F#f###$$($V$~$$$% %.%V%%%&&&&P&t&&&''D'n'''((L(z(((()):)b))))**B*n***++4+h+++,$,L,t,,,--6-f---...".4.D.R.b.v...........................///8/T/p/p////0$0P0v000011@1V111122:2V2t2t22233B3f33344F4n4445505X5t555566F6f6666777>7R7l77788(8L8r88889 909H9v9999: :0:N:|:::;;4;V;f;;;;<<@>0>R>j>>>??,?N?^?|???@@6@V@n@@@@@AA&APAzAAAAABB:BTBvBBBC C2CLCnCCCCDD(DJDtDDDEE0ELE^EtEEEEEEEFF$FJFZFlFFFFGG,GJGZGvGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGHHHHH(H6HJH^HpHHHII.ITIIJ JRJJJJKKxZxtxxxxxytyyyyyzzz(zBz\zvzzzzzz{{{H{{||(|B|\|||||}}0}H}r}}}~~6~p~~~~$J^r,BVrҀ$6H`xā*nډ0Dbʊڊ 2H`zʋދ,L\lŒތ$>Xr̍0NNNNf:z*8Djؐ&Jx֒,RfBdƓ6TȔ"HܕBnƖ"^Ι(Hn.Dhƛ2dddd2dddddddddddd&!##33#!5!5#53535!d22222p^22dddddddddd&3####3533##5!53535353,d2222d22d2222dddddddddddd&!!!3#!5#533!d,222dddddddd,d&3##33#!5#3535335d222222222dddddd,ddd&!######53535353535!d22222d22222dddddddddddd&!3#3#!5#535#5;3535^222222222dddddd&!3#####53535#5#5;35^22222d22222ddddddddd,3#3#ddddd, 3#3##53ddd2d2dddd&3###333#5#5#5#535353dddddddddddddddddddddddddd!!!!dppddd23333####5353535#5#5#2dddddddddddddddddddddddddd!3###53535##533#,22ddd2d2dddddddddd d2&!!3#5#53535##3!!5#5#35335^22222,2222dd ddddpddddd2&3333#5!#3535;##!5#5#5222dd222222,22dddpddddddddd& !3#3#!3535d2222pddddXd&!3#5##3353#!5#5#353,2d22d22222dddddddddd,dd& !33##!353#5d^2222d22ddddX d,dd& !!3#!!d^>dddd& !!3##ddddd&!3#5#35#53#!5#3^2dd222ddd dddd& 333###ddddd,D,d !#3!53#dpd ddd& 3#!5#533d22dddddd&33535353###333#5#5#5##dd22dd2dd2dd22ddddddddddddddd&3!!dd^>d2&3335353####5#5##22d2d22d22dddddDdddd 2&3333333#5#5#5#5#5##222222d22222ddddddDddddd d& !3#!5#;3^22222d dd d& !3#!#35d22ddddXd8&!3##3#5#5#5#;3533^222d2222dd2d dddddd ddd&!3##33#5#5#5##35d22222d22ddddddddddXd&!3#5#!3#!5#5335!5#53^2d,222d22ddddddddd2&!###2ddXd& 333#!5#ddd22Xdd2&3333535353#####5#5#5#5#2d22d22d2222d2222dddddddd2&335353333##5#5###5#2d22d22d2d2d2d2 dd ddddd+3335353###333#5#5###5353535#5#5#dd2d2d222222d2d2d222222ddddddddddddddddddddd2&3333535353######5#5#5#2d22d22d2222d2222dddddddddd,dddd!#####3!53535353535#d22222p22222ddddddddddddd 3#3#dd dDdd3333333#5#5#5#5#5#5#dd222222d222222ddddddddddddd^ 3#53#dd |dd333#5#5###5353Ȗ22d222d22ddddddddd2&3!!2 d 333#5#5#d22d22ddddd2&!33!5#535!5!35d^22>22,2ddddddddd& 33533#!#3dd222p2dddd,d&!3#5#!!5#3^2d^p22ddddd,d& 3!5#3533#35#5dp2222Dd,dddd& !3!!!5#;35^2,222dddd,ddd33#5#3###53532ddddddd2dddd,dd&3353#!5!5!5#5;35#52d2,2222dd ddddddd&33533####dd22d2dddpd 3#33!53#dd2dd2ddpdd,d&3#3#!5#533#ddd22dddd ddddd&335353##33#5#5##dd2dddd2dpddddddddd 33!53#ddddd2&33533#####222ddddddddpppd&33533####dd22d2ddddpdd& !3#!5#;3^22222ddd,,d&33533##5###33dd2222d22dddddddd,d&3353#5##5#;3535#52dd222222dddd,dddd&33533#5###dd22d2dddddddd&!!!3#!5!5!5#53^,22,22dddddddddd&33#353##5##53dd22ddddddd,dd&33533#5##5#dd2dd22pd, ddd2&3333535353#####5#5#5#5#2d22d22d2222d2222ddddddddddddddd2&33333533###5##5#5#2d22d22d22ddd22d,d,dddddd2&#3335353##33#5#5###53535#5#22d2d22d2d2d22ddddddddddddddddddd&!3333535353######535#5#5#dd22222d22222d222dddddddddddddddd&!###3!5353535#dd2d>d2dddddddddd 3##33#5##533,d22d2222 dddd,d,^3#ddD 333###5335##2222d22d dddd,d,d&3353##5##53dd2dd2ddddddd^3#3#dddddd 28&333#5#3##5#5#3533d2ddd22ddddddd,dd,d&%!3#5#33#3353##5##535#535#53,2d2dd2dd2ddddd22ddddddddddddddddddX3353#3#3#5##535#535#35ddd2222dd2222dXddddddddddddd3335353###3##5#535#5#5#dd2d2d222ddddd222ddddddddddddd^3#3#dddddd #'!3#5#33#3#!5#5335#5#535#5335,2d22222d22222 ddddddddddddddd 3#73#dddd ddd2X 3!33##!5#5#3531#3!53#533#5#353##5#3^2222222222^22222222 dd dddddd ddddddddddd,d&!33!5#53535#35!!,22p222>ddddddddd2dX'3##33#5#5#535373##33#5#5#5353d2222d2222d2222d2222Xdddddddddddddddddddd!#5!dddd,!!dpd2X -1!33##!5#5#3531#3!53#533#3#5##35^2222222222^22222d22 dd dddddd ddddddddd !!^ dd 33##5#5;3522222ddddddddd 33##5#53!!ddpddpd2^33##3!5353535#2222222ddddddddd2,33#3##535#535#22222Ȗddddddddddd3##53,d2d2ddd283333#5###2dd2d2dppddd28X!#####5#5;35d2ddd222dD d,^3#ddd8^;#53d2d^3##53dd22 ,d& !3#!5#;3!!,22222pddd,, dddX'333###53535#5#7333###53535#5#dd2222d2222d2222d2222Xddddddddddddddddddd2X%17335353535353########53535##3#5#5353531#3522222222222222222d2d2222d dddddddddddddddd dddddd2X5335353535353##33##3#5353535#####53535##222222222222d222222222d2 dddddddddddddddddddddddd2&+9=33#3535353##3#5#5###53535#535#535###35335#53#222d22222d22222dd,2222d2222ddddddddd dddddddddddddddddddd3#3##353#!5#5353dddd2d222ddddddddddd& 33333#5##353535##35#5d2d22dd2222222 ddddpdddddddd& 3#333#5##3535353#35#5^d2222dd22d2d22 ddddpdddddddd& 33#5##53!3#5##;352d2d2d^2dd22 ddddddpddd& 3353##5##53!3#5##;35dd2dd2^2dd22 ddddddddpddd& 3#73#333#5##35;#35#5dddd22dd22222 ddddddpdddddd& #33#33#5##3535#5;35#35#52222dd2222222 ddddpddddddddd2&!#3#3!##35;#35Ȗdd2222dddd,dddd8&#!3#5##3353####535#5#5#353,2d22d2d2d2d2222dddddddddddddd,dd& 333!3#!!35#d2^>2 ddddddXdd& 3#3!3#!!353^d2^>2 ddddddXdd& 333!3#!!35;352d^>d222 ddddddXdddd& 3#73#!!3#!!dddd^> dddddddd 333#3!53#535#d2dddddd2 dddpdddd 3#3#3!53#5353,d2dddddd2 dddpdddd 33#5##53!#3!53#2ddd22,dddd dddddddd, 3#73#!#3!53#dddd,dddd dddddpdd2&!33##!#5373#353#5d^222222ddd22dddd,ddd,dd& %3353#3#5#5#5#5##;33333#5dd222222d2222222 ddddddddpddddddd& 3333#!5#3535#3d22222d2 dddpddddpd& 3#33#!5#353533^d2d22222 dddpddddpd& 3333#!5#3535;3532222222222 dddpddddddpd& 3353#3#!5#35#5;353dd22222222dd dddpddddddpd& 3#73#!3#!5#;3dddd^22222 dddddpddp3353##33#5##53535#5#ddd2222ddd2222dddddddddddddd&#3#3#!#535#35!353535##3d222d222,222222ddpddddddddddddd,d& 33#5#333#!5#d2d2dd22 dddd  ddd& 3##53333#!5#,d2d2dd22 dddd  ddd& 333#!5#35;#3#52d22d22dd dd dddd dd& 3#73#333#!5#dddddd22 dddd  dd2& '3##53#3333535353######5#5#5#,d2d2d22d22d2222d2222 ddddddddddddd,dddd& 3#33##3#53#35d222222 dddddddXd&33#3##535#535###35322d2Ȗd22d22ddddddXd2& 33#5#!33!5#535!5!35d2d2d^22>22,2 ddddddddddd2& 3##53!33!5#535!5!35,d2d2^22>22,2 ddddddddddd2& 33#5##53!33!5#535!5!35Ȗ2d2d2d^22>22,2 ddddddddddddd2& #3353##5##53!33!5#535!5!35dd2dd22^22>22,2 ddddddddddddddd2& 3#73#!33!5#535!5!35dddd^22>22,2 ddddddddddd2& #33#333!5#535!5!535#5;353522222>22,d222d dddddddddddddd dd2&33533#3!5#53535#33535d22Ȗp22dddddddddddddddd8&!3#5#!###535#5#3^2d^2d2d22ddddddddd,d& 33#5#!3!!!5#;35d2d2d^2,222 ddddddd,ddd& 3##53!3!!!5#;35,d2d2^2,222 ddddddd,ddd& 33#5##53!3!!!5#;352d2d2d^2,222 ddddddddd,ddd& 3#73#!3!!!5#;35dddd^2,222 ddddddd,dd 33#5#33!53#d2d2dd2 dddpdd, 3##5333!53#,d2d2ddd2 dddpdd, 33#5##5333!53#2d2d22dd2 dddddpdd, 3#73#33!53#dddddd2 dddpdd,dX 33#3!5#3535#533^dd2p22d ddd d,ddd,d& 3353##5##5333533####dd2dd22d22d2d ddddddddddpdd& 33#5#!3#!5#;3d2d22^22222 dddddd,,d& 3##53!3#!5#;3^d2d2^22222 dddddd,,d& 33#5##53!3#!5#;32d2d2d^22222 dddddddd,,d& 3353##5##53!3#!5#;3dd2dd2^22222 dddddddddd,,d& 3#73#!3#!5#;3dddd^22222 dddddd,,d 3#!!3#ddpddddddd2&X#333###5#5#3533535353##3^d222d222222d22Xdddddd,dddddddd,d& 33#5#33533#5##5#d2d2d2dd22 dddpd, dddd& 3##5333533#5##5#,d2d2d2dd22 dddpd, dddd& 33#5##5333533#5##5#2d2d2d2dd22 dddddpd, dddd& 3#73#33533#5##5#ddddd2dd22 dddpd, dddd& )3##533333535353######535#5#5#^d2d2d22222d22222d222 dddddddddddddddddd8& 333###3d22ddddX,2 )3#73#3333535353######535#5#5#dddddd22222d22222d222 ddddddddddddddddddd& !!333#5##35;#35#5^222dd22222 ddddpddddd2& !!!33!5#535!5!35d^^22>22,2 dddddddddd& 3353##5#!3#5##;35dd22^2dd22 ddddddpdd2& 3353##5#!33!5#535!5!35ddd22^22>22,2 dddddddddddddd8&X333#3#535##35;#35#522222d22222Xddpddddddd28&!33#3#5#5#535!5!35d^22222,2ddddddddddd& #3#33#5##3353#!5#5#53535353^d2d2d22d22222d2 dddddddddddddddd& 3##53!3#5#!!5#3,d2d2^2d^p22 dddddddd,d& !%333#5##3353#!5#5#5353535;35,22d22d222222222 dddddddddddddddd& 33#5##53!3#5#!!5#32d2d2d^2d^p22 dddddddddd,d& 3#!3#5##3353#!5#5#5353,ddd,2d22d22222 dddddddddddddd& 3#!3#5#!!5#3ddd^2d^p22 dddddd,d& '3353#33#5##3353#!5#5#5353535#d2d2d2d22d2222222 dddddddddddddddddd& 3353##5#!3#5#!!5#3d2d222^2d^p22 dddddddddd,d& 3353#333##!35#3535#5d2d2d2222d2222 ddddddddXdpddd& 33533!5#3533##5#35#5d2ddp222222 dddDd,dd,ddd2&!33##!#5373#353#5d^222222ddd22dddd,ddd,ddX33#!5#535!5#5335d22p22,dddd dddd& !!3#7!!3#!!^22d^> ddddddddd& !!!3!!!5#;35^^2,222 ddddd,ddd& 3353#3!3#!!35#dd2d^>d2 ddddddddXdd& 3353##5#!3!!!5#;35dd22^2,222 ddddddddd,ddd& 3#!!3#!!dd^> ddddddd& 3#!3!!!5#;35ddd^2,222 ddddd,ddd8&X!!3#!#3#5#d^2Xddddddd8&!3!!#3#5#5#;35^2,2d222dddddd,ddd& 3353#3!3#!!35#d2d2^>2 ddddddddXdd& 3353##5#!3!!!5#;35d2d222^2,222 ddddddddd,ddd& !3333#5#35#53#!5#3535;35222dd2222222 dddddpddddddddd& #33#5##533353#!5!5!5#5;35#52d2d2d2d2,2222 ddddddd ddddddd& !3353#33#5#35#53#!5#3535#dd222dd22222 dddddddpddddddd& #3353##5#3353#!5!5!5#5;35#5dd222d2,2222 ddddddd ddddddd& 3#!3#5#35#53#!5#3ddd^2dd222 dddddpddddd& 3#3353#!5!5!5#5;35#5ddd2d2,2222 ddd ddddddd8&X!3#5#35#53####535#5#3^2dd22d2d22Xdddpddddddddd& 3##533353#!5!5!5#5;35#5,d2d22d2,2222 ddddd ddddddd& 333###35;#35#52dddd22dd dd,Xdddd& 33#5##3533####3532d2d22d2dd2 dddddd,dXd2X33533#####5335ddd22dd22ddddd ,dddd2&33#3533#####53dddd22d2d22dddd,ddd 3353##3!53#5#5;35dd2dddd222d dddpdddddd 3353##5##5333!53#d2d2d2d2dd2 dddddddpdd, !!!#3!53#,,dddd dddpdd  !!33!53#,2dd2 dpdd,d 3353#!5#!#3!53#ddd222,dddd dddddddd,d 3353#!5#33!53#ddd22ddd2 dddddpdd,8X!#3#3#5#53#,ddd2dddXdpdddd83#33#3#5#53#dd2dd2dd2ddpdddd, 3#!#3!53#ddd,dddd dddpdd 33!53#Ȗdd2pdd,2& 3#3#53#%3##5#53322222d22d2d ddddddd2&3#%3#333#53##5!53#dd,dddd22d2ddddpdd ddd,d& 333#!5#533#5##532d22dd2d2 dd dddddddd& 33#5##533#!5#533#2d2d2d22dd dddddpdddd,d8&'33535353###333###53535#5#5##dd22dd2dd2d2d2dd22ddddddddddddddddddd8&335353##33###53535#5##dd2dddd2d2d2dpdddddddddddddd&335353##33#5#5##ddd2dddd2dddddddddddd&  3##533!!^d2d2d^> dddd d 3#3!53#5353,d2dddd2 dddddd8& 3!###535#dd^2d2ddddd833###535#53#dd2d2dddddddddd& 3!!3##53dd^>d2d2dddd& 33!53#%3##53ddd,d2d2ddddddd& 3!!3#dd^>dddd 33!53#3#ddddd DddXdd&3353###!!5#5353dd2d222^>d22dddddddd3353###3!535#53535#2d222ddd22dddddddddddd& 3##53333333#5#5#5#5##^d2d22222d2222d ddddddddddddpd& 3##5333533####^d2d2d22d2d ddddddpdd8&X333333###53535#5#5#5##d2222d2d2d2222dXddddddddddddpd8&33533####;##53dd22d2dd2d2dddpddddd& #3353##33333#5#5#5#5##35#d2d22222d2222d2 ddddddddddddpXdd& 3353##5#33533####d2d22dd22d2d ddddddddpd2& 33#5#33533####2d2d22d22d2d ddddddpdd8&3333333##535#5#5#5#5##dd22222d2Ȗ22222dddddddddddddpd8&33533##53###dd222Ȗ2dddd dddd& !!!3#!5#;3^^22222 dddpddpd& !!!3#!5#;3^^22222 dddd,,d& 3353#33#!5#3535#3dd222222222 dddddpddddpd& 3353##5#!3#!5#;3dd22^22222 dddddddd,,d& 3#35353#3#!5#353533d2d2d22222222 dddddpddddpd& 3##5373##53!3#!5#;3d2d2d2d2^22222 dddddddddd,,2&!#3#3!5#5#35;#33ddp2222222dddddd,ddd2& !3#3!5#;3335d2Ȗp222ddddddd,,ddd& 3#33##3#5#5##35335,d2222d2d2d ddddddddXdd& 3##5333533#5###^d2d2d22d2d dddddddddd8&!!3##33#5#5#5##353##53d22222d22ddd2d2ddddddddXdddd8&33533#5###;##53dd22d2dd2d2dddddddddd& !3353#33##3#5#5##35#35d2d2222d2dd22 ddddddddddXdd& 3353##5#33533#5###d2d22dd22d2d dddddddddddd& 3#3!!3#!5#5335!5#535353,d2,222d22d2 dddddddddddddd& 3##53!!!3#!5!5!5#53,d2d2^,22,22 ddddddddddddd& #333!!3#!5#5335!5#53535;3522,222d222222 dddddddddddddddd& 33#5##53!!!3#!5!5!5#532d2d2d^,22,22 ddddddddddddddd8&!!3#5#!3###535#5#5335!5#53^2d,22d22d22dddddddddddd8&!!!3###535#5!5!5#53^,22d2,22dddddddddddd& #3353#3!!3#!5#5335!5#53535#d2d2d,222d22d2 dddddddddddddddd& 3353##5#!!!3#!5!5!5#53d2d222^,22,22 dddddddddddddd28& !#3#535##22d2dddXd8&33#353###535#5##53dd222d2ddddddddd,d2& 3353#3###535#ddd2dȖ2 ddddd ddd& 3353##3#353##5##535#ddd2dd22dd2 dddddddddd,d2&!#3###535#2ddddddd,dd&33#3#353##5#5#535#53dd22dddddddddddddddd& 3353#3#!5#35;#3#5Ȗ2d2d222222 dddd dddd dd& 3353##5##5333533#5##5#Ȗ2d22d2dd2dd22 dddddddpd, dddd& !!333#!5#^2dd22 dd  ddd& !!33533#5##5#^2d2dd22 dpd, dddd& 3353#3#!5#35#3dd2d22d22 dddd dddd d& 3353##5#33533#5##5#dd222d2dd22 dddddpd, dddd& 333#!5#35;353##52d22d2222 dd dddddd ddd& 33##5#5;3533533#5##5#222222d2dd22 dddddddpd, dddd& 3##3#5353#3#!5#353d2d22d2222d2 dd dddd dddd& 3##5373##5333533#5##5#d2d2d2d2d2dd22 dddddddpd, dddd8&333##3#5#5#ddd22d2Xddddd8&33533#5##3#5#5#dd2dd222d2pd, ddddd2& '333##5#5###5#35;#3535333#52d2d2d2d2d22d22d22d ddpddddddpddd2& '33#5##5333333533###5##5#5#2ddd2d22d22d22ddd22 dddddd,d,ddddddd #33#5##533335353####5#5#5#2ddd2dd2d2d222d222 ddddddddddddddd& -33#5##533333535353######535#5#5#2d2d2d22222d22222d222 ddddddddddddddddddddd 3#73#3335353#####5#5#ddddd2d2d222d222 ddddddddddd,ddd 3#3####3!535353535#5353,d2d222p2222Ȗ2 dddddddddddddddd& 3##53!###3!5353535#,d2d2d2d>d2d ddddddddddddd 3#!####3!535353535#ddd222p2222 dddddddddddddd& 3#!###3!5353535#ddd2d>d2d ddddddddddd #3353#3####3!535353535#535#d2d2dd222p2222Ȗ2 dddddddddddddddddd& 3353##5#!###3!5353535#d2d22dd2d>d2d ddddddddddddddd33#5#3#53#53532dd22222ddd dd,ddd!##3##3!53535#53535#d2222p2222dddddddddddddd& #3353#333#5##353535##35#5d2d2222dd2222222 ddddddpddddddd2& 3353##5#!33!5#535!5!35d2d222^22>22,2 dddddddddddddd8&!3!!###535#5#;35^2,d2d2222dddddddd,dd2&'3353##33#5##5#5#535;#33535#52d2222d2222222222dddddddddddddddddddX 33#5##532d2d2 dddddX 3353##5#d2d22 ddddd !!^ dX 3##53,d2d2 dddX^ 33#5#d2d2 ddd8!!^dd8^;##53d2d2dddX 3353##5#dd22 ddddd^ 3#dd d 33##5#5;3522222d ddddddd8;3#d2ddX 3353##5##53Ȗ2d22d2 dddddddX 3##5373##53d2d2d2d2 dddddddX3#ddX#3#73333#5!#3535;##!5#5#5dd222dd222222,22dddpdddddddd&3#7!#5#3#353!dd22pddd&3#7333###dddddd,D,&3#7!#3!53#ddpd dd&#33535333###5#5##7#3353#5d22222222d2222dddddddd,dddd,d&3#73335353###3#53#5#5#ddd2d2d22222222ddddddddd,ddX+33535!33##3#53535#5##33#535#5#5#d22,2222d222222d22dddddddddddddddd  3#'3#%3#33!53#dddd,ddȖdd2 dddddpdd,2&3333#5!#3535;##!5#5#5222dd222222,22dddpdddddddd2!3#3#!53#3353522222p22dddd2& !#5!#53#22Ԗ22dd2&3333!3535;##!#5#5222 222222,22dddpdddd,dd2!#5#3#353!53#222>22dddd2!#####353!53535353535##2222222>222222dddddddddddddd2&333#3###53#2Ȗ22Ȗ22,d d,d2& !3#!5#;!5!5d22p222,,d dd !#3!53#,ddddd dd2&'3#3535353###333#5#5#5#3#53#22d22d2222d22d222dddddddddddddddd2&3333##5#5####35353222d22d22d222dddpddddpdd2&3335353####5#5##22d2d22d22dddddDdddd 2&333333#3#5#5#5#5##53#2222222222222ddddd dddddpd2& !#5!#!!3!53!22p2d,d22 ddddddd2& !3#!5#;!d22p222,d dd 2&!#3###53#222Ȗ22d dXd2& !3#!3#5335d2222ddddd2&!#5#33##353!5353535#5#5#2222222 2d22d2ddddddddddddd2&!#5#3#53##22222d ddd2&#3333535353####3#535#5#5#5#2d22d22d2222222222ddddddddddddddd2&!3##3#535#5#;333d2222222dddddddddd,,,2&+3335353###333#5#5###5353535#5#5#22d22222222d2222222ddddddddddddddddd2&33333##3#535#5#2ddddd2222pppdddddd2& '!33##3#5353#5##33#535#5#353,2222d222222d2222 dddddd,dddddd,d 3#73#!#3!53#dddd,dddd dddddpddd #3#73#3335353###3#535#5#5#ddddd2d2d22222222 dddddddddddddddd& #3##533353##33#5##5#;3,d2d2dd2222dd222 ddddddddddddd,,d 3##53!!3#!!5#535#53^d2d2^,2222 dddddddddddd2 3##5333533####53#,d2d2d22d222 dddddd dd, 3##5333!53#,d2d2ddd2 dddpdd,2&  3#'3#%3#333#!5##dddd^ddpd222 dddddppdd,2&3353#33#5##5#;3535#5d2d222dd22222dddddddd,dddd33#3##535#5#535##322d2Ȗ2ddd2dddddddD2&%3333535353######53535#5#5##222222d22222222222dddddddddddddddddd2!!333#!5#53535#5#35222222222ddddddddddd!!3#!!5#3^,22dddddd,8&X33##333##535#5#5#53535#2222Ȗ2222dXddddddddddddddd233533####53#2d22d222ddd dd,d!3#!5#535#5;3535,2222222d ddd 33!53#Ȗdd2pdd,2&335353##33#5#5##53#2ddd2ddddd22dddddddddd,2&#3333333#5#5###535353535#5#22222222d222222ddddddddddddddd2&33333#5##5###22d2222d2d,dddd2&3335353#####5#5#5#5#22d22222d2222dddddddddddd33#3##33#5#5#53535#535#d22d222222dddddddddddddddd& !3#!5#;3^22222ddd,,2& !#####22dd2dpp& !3###;35,22d22ddd!#33#!535#5#53,2222dddddddddd& !#3#!5#;35#5d222222dddd,dd !#3##d2dd2& 333#!5##2d222ppdd,dX333###5#5#535335335dd22ddd22d22d2Xdddddd2&#3335353##33#5#5###53535#5#22d22dd22d22dd2ddddddddddddddddd2&335333###5#5#2ddddd2d2,dd2&3#3535333#533##5##5#3dd222d222d22d22ddddd,dddddd,3#73#33!53#dddddd2ddddpdd,2&3#73#333#!5##ddddd222ddddppdd,d& 3##53!3#!5#;3^d2d2^22222 dddddd,,2& 3##53333#!5##^d2d2Ԗd222 dddppdd,2& '3##533#3535333#533##5##5#3,d2d2d222d222d22d22 dddddddd,dddddd,d& 333!3#!!35#d2^>2 ddddddXdd& 3#73#!!3#!!dddd^> dddddddd&!#3533###5353####,d2222d222ddddddddd,dXd& 3#3!#353^d2d2 ddd Xd2&#!3#5##3#3353#!5#5#535#5353^2d22d2222222dddddddddddddddddd&!3#5#!3#!5#5335!5#53^2d,222d22dddddddddd !#3!53#dpd dd 3#73#!#3!53#dddd,dddd dddddpddd& 3#!5#533d22ddddd2X333####5333522d22dddXd2X33333####352dd22d^d,dd,,&!#3533#####,d22d2dddddpdXd& #3##53#33535353###33#5#5##,dd2d2d2d2ddddd dddpddddddddddd2& !333#######335353535#5#d2d22222d2222d2 dddddddXpdddddd #3353#!5#3335353####5#5#5#ddd22d2d2d222d222 ddddddddddddddd8 333##5#ddddXD2&3333#5!#3535;##!5#5#5222dd222222,22dddpddddddddd& !!!3#!35d,22pdddd,d& !3#3#!3535d2222pddddXd!!#ddd2& 33#5!#53;3dddd22ddd d& !!3#!!d^>ddd2&33333#3#####35#2dddddddddddddd,,d,,,dd&!3#3#!5#5335#535##53^22222dd2ddddddddd2&335353535353#######2d22222d22222 dddddDddddd2& %3353#3#######335353535#5#dd2dd22222d22222 dddddddddXpdddddd&33535353###333#5#5#5##dd2d2d2dd2d2d2dddddddddddddd2 3###533ddd2DXd2&3335353####5#5##22d2d22d22dddddDdddd 2& 3!3#!#2d,ddd,D,d& !3#!5#;3^22222d dd d!###dddDXd& !3#!#35d22ddddXd&!3#5##3353#!5#5#353,2d22d22222dddddddddd,dd!###dddXd& 333!5!5!5#ddd>^2,Ddd2&333###5#5#353333d22d22ddddddpddddddppd+3335353###333#5#5###5353535#5#5#dd2d2d222222d2d2d222222dddddddddddddddddddddd& 3333#5!dddddXdd& 333#!5#dddd2,D,d2& 33333!2ddddd XXD2&333333#5!2d2d2dddpXXd2& 3!3!#352,2>2dX2& 333#!3#352d22ddԖddD,d& 3!3!35dd,2>dd,2&#!33#3##!5#533535#535#5##53d^2222222d22d2dddddddddddddddddd&3353533##5#5##3dd222222dddd ddX d&!#####53535#5#5;35d222Ȗ2222D,ddddddd2&!33!5#535!5!35d^22>22,2ddddddddd&!#333#!5#53535#5#3522222d22dddddddddd& !3#3#!3535d2222pddddddddddd!##d^ddp2& 33#5!#53;3dddd22dpdd,,d& !3!!!5#;35^2,222dddd,ddd3353353#3#5##5##535#dd2d2dddd2d2dddddd&!3#3#!5#5335#535##53^22222dd2dddddddddddddd&3353535353######dd2222d2222pdddd ddddd&#3353#3######35#35353535dd2dd2222d222222dddd ddddddpddddd&335353##33#5#5##dd2dddd2dddddddddd2 !###533,dd2 pd,2&3335353####5#5##22d2d22d22ddddd ,ddddd& 3353#5##ddddd d& !3#!5#;3^22222ddd,,d!###ddd pd8&33533##5###33dd2222d22dddddXddd,d&!3#5#!!5#3^2d^p22ddddd,d!###dddpd&!3333535353######535#5#5#dd22222d22222d222ddddddddddddddddX333###5#5#353333dd22ddd22d22d2Xdddddd,dd,,3353##33#5##53535#5#ddd2222ddd2222dddddddddddddd& 3333#5!dddddppdd& 3353#5!5#dddd2 d2& 33333!2ddddd pp 2&333333#5!2d2d2dddppppd2& 3!3#!#352,22p2dddddd& 333##3#'35dd22^dddddd ddd& 3!3#!735dd,22pdddddd2!3#!5#5335#535##53d,dd2dd2ddddddddddd&3353533##5#5##3dd222222dddddddd,d&!#5###535#5#5;35d2d222 ddddddddd& 33#5#!3!!!5#;35d2d2d^2,222 ddddddd,ddd& 3#73#!3!!!5#;35dddd^2,222 ddddddd,dd33#3533##535####53dddd222d22dddddddddd&  3##53!!#^d2d2d ddddpd&!3#5#3#353#!5#3,2dd2dddddddddddd,d&!!!3#!5!5!5#53^,22,22ddddddddd 3#33!53#dd2dd2ddpdd, 3#73#33!53#dddddd2 dddpdd,d&3#3#!5#533#ddd22dddd dddd2X333####5333522d22ddddpd,dd2X335333##5##%352dd22d^dddddd2&33#3533#####53ddd22d2ddddddd,ddd& 3##53335353##33#5#5##,d2d2d2dddd2d ddddddddddddd& 33#5#3353535353######d2d2d2222d2222 dddpdddd ddddd& -3353##5#3333535353######535#5#5#dd222d22222d22222d222 ddddddddddddddddddddd 333##5#ddddp ddd!33333#53#3#5#5#5#5##35#dd2222222d2222d22dddd,dpdddddp2&X !3!5!!2d ,X dd!####5353535#,d22d22dD,ddd2&!##!2dddX2 !#!3#2dddDXp3##ddDX3###dd2dX2!###2ddDX2 33#5353!2dd2>ddD,3##ddp,d8!#!dd| 2 !#!5!!22p^dd2 3!###5353!2d^22d2 d dddd2!!32>dDX 2335333#53#5####35#2d2222d22d22dddd ddddpd^83##^d2| 3#53#dDd2!3###5#5#35#3#335322222222222dpdddd,dddd23353#53##!53#dd2222d2dd ddd28 !##3#2dd| d2 !!5!#3#2>^dDdd28333535#53####5#22d222d22ddpdpdd!33335#53##33!535#5#5#5#5#dd22d22222p22222dddddddddddddd28 !###5353!3#222d22dd dddddD2!#!2dDX2&33333#!5#2ddddd2p2XXdd2& !###53#ddd2DXd28X,3#!5#5353353&2dddd2,pddd8X!33#5#5#3#!5#5335#533#73#^222d222d22dddddddddddddpdddd8,d 73###5353d22d22ddddddX 3##533#,d2d22ddXdd!3#5#33#5#5#533#,2d2ddd22dddddddddd dX,!!X,d3#3#dddd  3#3#53,d222 ddd 3##535#2d22 ddd 3#3#5373#3#53d222d222 ddddddd 3##535#73##535#2d22Ȗ2d22 ddddddd2X #'+/333535353####3#5##535353535#7353#'353352222d222222d22222dȖ2d dddddddddddddddddpdddd2& !#35!#3#3!#2,d,Ȗ ddddd,X3###3#3322,22Xp, X2& !335353###5#####2,222222222d2d dddd,dd 2& '!33##3#5353#5##33#535#5#353,2222d222222d2222 dddddd,dddddd,d2&'+/335353535353##3######53535##35352222222222222222d2^ddd dddddddd ddddddddddd2X/3733#3535353##3#######53535#535#535#3535222d2222222222222dddddddddddddd dddddddddddddddd2&+/373#3353535353##3######53535#535#35335352Ȗ22222222222222dd2dddddddddddd dddddddddddddddd2&1593####53535#%3##3######5353535353535335352222d22d2222222222222222dddddddddddd ddddddddddddddd2dXX3#!!3#5#5#5353d2,2dddddXdddddddddd83333#5####535353d222d2d2d222dddddXddddd&X333###535!5!5#dddddd2,2Xdddddddddd 3353####5#5#5#533d2d222d222d2 ddddddddddd 333#5#5###5#5353,2d2222222 dddd dddd28X,3#!5#5353353&2dddd2,pddd8X!33#5#5#3#!5#5335#533#73#^222d222d22dddddddddddddpdddd8,d 73###5353d22d22ddddddX 3##533#,d2d22ddXdd!3#5#33#5#5#533#,2d2ddd22dddddddddd dddX#3#73#;33#5#!5#535353#3535dddddd22d2222Ȗ22dddddddddddddddddd^ 3#3#5353Ȗdd22dddddX333#5##53533#d2d2ddddddddddX 3!53#!5#3#dd2 2ddddddXX3#73#333#5##53532ddddd2d2XddddddddddddX3#73#!3!53#!5#dddddd2 2ddddddX33!5#d2 ddd^3#dd 33#!5!5#3#d22,2dddddddd2d&3#73#!33#!5#535;#!5#5dddd,22dd2222,2ddddddddddddddddX3#73#33#!5!5#2ddddd22,2Xdddddddddd 33#5##5333#!5!5#dddddddd22,2ddddddddddX!333!5!5#5##533#d,22d2d2ddddddddddddpddX!333!5!5#5##53d,22d2d2ddddddddddX3#!333!5!5#5##53ddd,22d2d2ddddddddddddX3333!535#5#^d222p22ddddddddX3#3333!535#5#,dd2d222p22dddddddddd8X,33###!5!535#2222,22,ddddddddd8XX3#33###!5!535#dd2222,22XddddddddddX,3353353##5##5#ddd222,ddddddddddX 33#5##533353353##5##5#ddddddddd222dddddddddddddddX33#!5#53353531#35^22 2dd2d2ddddddddddX3#33#!5#53353531#35dd222 2dd2d2ddddddddddddX33533#!53537#35d222d22dddddddddX33533#!53533##35d222d2dd22ddddddddd&33#5##!!53532d2^dddddddddd&3#33#5##!!5353dd22d2^ddddddddddddX 33#5##53333#5##5353dddddd2d2d2ddddddddddddX!3#3#5#!53535#3#d,d2dddddddddddddpddX!3#3#5#!53535#d,d2ddddddddddddX3#!3#3#5#!53535#ddd,d2ddddddddddddd2&33533#3##5##5#535#5335ddddddddddddddddddddddX5!!Xdd3#33#!535#5;35,dd22dp222ddddddddddd3#73#33#!535#5;35dddd2dp222dddddddddddddX3##333!5!5#5#5353^d2^dddddddddddddddd^3#!53d2 ddd 33!5##535;3522dd2ddddddddX3#33#!5!5#dddd22,2Xdddddddd&X#3333##5##535#5313535#35#5Ȗd2222d222222Xddddddddddddddddd8X33###!5!535#5#5;35,2222,2222ddddddddddd8X,33#5#33#!5#5353!5#5#53^2dd222p222,222,dddddddddddd 33#!5!5#3#73#d22,2dddddddddddddX 33#5##533!53#!5#dddddddd2 2ddddddd28XX#!33#5##!53#!5#353535##3#2^dd2^d2>22dddddXdddddddd,ddddd28XX!33#5##!53#!5#353535##2^dd2^d2>22dddXdddddddd,dddd28X #3#!33#5##!53#!5#353535##dd^dd2^d2>22ddd dddddddddd,ddddX333#5##53533#73#d2d2dddddddddddddd3#33#!5#535335#5#53Ȗ2d2222222dddddddddddX!##3!5##535#5#335d^222222ddddddddddddX3#!##3!5##535#5#335dd^222222ddddddddddddddX3#33#3#5##535#5;35dd222d222ddddddddddddddX3#33!3#!5#5#5;35dd22d2–222ddddp,ddddddddX3#73#33#3#5##535#5;35dddd22d222ddddddddddddddddX%)3#73#33##!5#5#53533!535#5#5;35,ddddd222p22222,2222ddddddddddddddddddddX3!53!3#3#5353d2Ԗdd22dddddddX 33#5#!53d2 dddd2X 3#!5#5353!d2pd22^ddddX!33#5##5##535;35,2d22d2ddddddddddddd8X 33###35;35^22dd22ddddddddXX3#333#5##5353dddd2d2Xddddddddd2X3#;3##!5#5#53533353^dd2222222222dddddddddd&!333333#3!53535#5#5#5#35d2222d222d2222dddddpdddddddpdd2&!!2 8&X3#3##!!5#53535#53Ȗ2,22222Xdddddddd!!3#d^dddd  3#3#53533#dd22dd dddddp8X !%3#3#535333###!53535#5#5;35dd22d22222222 dddddddddddddddd83#3#3#5353dddd22 ddddddd 3#3#535333#!5!5#Ȗdd222d22,2 ddddddddddX %3#3#535333#5#5#3#!5#5335#53dd222222d222d22 dddddddddddddd8333!5!5#5##533#%3+3#22 2d22dd,dddddddddddpdddd8X3333!5!5#5##533#%3+3#d2dd^2d2dd,dddddddddddddpdddd28XX+!33#5##!53#!5#353535##3353##5#2^dd2^d2>22ddd,222222Xdddddddd,ddddddddd8 33#!5!5#3#%3+3#d22,2dd,ddddddddddddd8X333#5##53533#%3+3#d2d2dd,ddddddddddddddd8X 3!53#!5#3#%3+3#dd2 2ddd,ddddddddddd8X 3+3#%3#33###!5!535#dddd,dd2222,22dddddddddddddX3##53%3##333!5!5#5#5353ddd,Ȗddd2ddddddddddddddddddd^3#Ȗ^3#ddD2!##333#5#5#5#3d^2222d2222dddddddd,2& 3353353!#2dddddpddddd d3#33##3!535#5#532d222222ddddddddd2&!33##!5#5#535;#33535#5,2222222222222dddddddddddddddd!#!ddDX2&3333535353#####5#5#5#5#2d22d22d2222d2222ddddddd2&33333#5#5#5####53535353d2222d22d22d2222dddddddd 33##5#5;352d222ddddd8X#3#!#33#5#5###!!5#53535#5#,dd^2d2dd222,22222ddddddddddddddd8& 3#3#3##!!5#53535#53,dd2Ȗ2,22222 ddddddddd2&'33335353533#5#5#####53535#5#5#2d22222d2d22222d2222dddddd dddddddddd8X#33#3#3##5#5#535;353535#52222222d22dddddddddddddddXX333#5#!5#535353#3535d22d2222Ȗ22Xddddddddddddd2d&!33#!5#535;#!5#5,222p22222,2ddddddddddd, !!, ,X !!,, X !!X d,!!,pd, !!, DdX !!!!,,, pdX !!!X p,dX!!,,pdX !!!!,, p,dX !!,, DdX !!!X DdX!!XpdX !!!,, pdX !!!,,, DdX !!X D8,d5!!,d8, !!!!,, p8X !!!!,,, p8X !!!!X, p8,!!,D8, !!, 8X !!!!,,, D8X !!!X D8X!!!!,,,p,8X !!!!!!,,, p,8X !!!!,,, D,8X !!!!!X, D,8X!!!Xp8X !!!!,, p8X !!!!,,, D8X !!!X DX 3# ,X& 3#, X& 3#%3#, 3# 3#3# d& 3#3#, d&  3#%3#3#, d,&3#,& 3#3#, d,& 3#3#, d&  3#%3#3#, d&3#3#,,&  3#3#3#, d,&  3#3#3#,, d,X  3#%!!3#3#,,, d,d53#d 3#3# & 3#3#, &  3#%3#3#, 3#3#d  3#3#3# dd&  3#3#3#, dd&  3#%3#3#3#, dd&3#3#,d&  3#3#3#, dd&  3#3#3#, dd&  3#%3#3#3#, dd& 3#3#3#,,d&  3#3#3#3#, d,d&  3#3#3#3#,, d,d&  3#%3#3#3#3#,, d,d,8Xd%!!,,d8X !!!!,,, p,8X !!!!,,, p8X !!!!X,, p8X!!!!,,p,8X !!!!,, D,8X !!!!!!,,,, p,8X !!!!!X, p,,8X!!,,D8X !!!!,, D,8X !!,, 8X !!!X 8X!!!XD,8X !!!!,, D,8X !!!!,,, ,8X !!!X ,8Xd5!!Xd8X !!!!,X p8X !!!!,,X p8X !!!!XX p8X!!!,,p8X !!!,, D8X !!!!!,,,, p8X !!!!X, p8X!!!,,,D,8X !!!!!,,, D,8X !!!,,, ,8X !!!!X, ,8X!!XD8X !!!,, D8X !!!,,, 8X !!X ,&d%3#,d& 3#3#, ,& 3#3#, &  3#%3#3#, &3#3#,d&  3#3#3#, dd&  3#3#3#,, dd&  3#%3#3#3#,, dd,&3#3#,d&  3#3#3#, dd,&  3#3#3#, dd&  3#%3#3#3#, dd& 3#3#3#,,d&  3#3#3#3#, d,d&  3#3#3#3#,, d,d&  3#%3#3#3#3#,, d,d&d53#%3#,d&  3#3#%3#, &  3#3#%3#,, &  3#%3#3#%3#,, & 3#3#%3#,d&  3#3#3#%3#, dd&  3#3#3#%3#,, dd&  3#%3#3#3#%3#,, dd& 3#3#%3#,,d&  3#3#3#%3#,, dd&  3#3#3#%3#,, dd&  3#%3#3#3#%3#,, dd& 3#3#3#%3#,,,d&  3#3#3#3#%3#,, d,d&  3#3#3#3#%3#,,, d,d&  3#%3#3#3#3#%3#,,, d,d8d5333#d2ddddd8d5333! dddd8, 333333!222222dddddd8& 333333!2ddddddddddd8, 333333!222222ddd8& 3333333333!22222d2222 dddddddddd8X !!35353^2dd dd8X 3!35353d dd8X !!35353535353,,222222 ddddd8X 3!35353535353&2ddd2dd ddddd8X !!535353535353,,222222 ddd8X 3!3535353&22ȖD,ddd28X !!535353535#5#5#5#2&22222222 ddddddd8X 3333335353535353!22222d22222 ddddddddddd8 3#ddd 8X 7_w33533533#3#3#3#3#5##5##5#535#535#535#535#3#3#3#3#3533535#535#535#535##533#3#3#5#535#535#dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd^8Xd%3#5353&2dddddd8Xd%3!5353– Ȗddd,8X 3!5353535353&222222ddddd28X 3!5353535353&2dddddddddd,8X 3!5353535353&222222|ddd28X 3!535353535353535353&22222d2222 ddddddddd8X !333!^dd2 dddD8X 3333!dȖ dddD8X !333333!,222222 ddddddp8X 3333333!2ddddd2 ddddddp8X !333333!,222222 dddd8X 33333!2Ȗ2dddd8& !####3333!&22222222 dddddddd8X !#5#5#5#5#5######X22222d22222 dddddddddd8 3#dd 8X !!X 2dX 33!3d p8X!###Xdp,8X 33##dd p8^ 3##3dd ,8^ #3####3333#5#5#5#5#53535353Ȗd222222d22222222 ddddddddddddddd8X #33333#####535353535#5#5#5#22222222d222222d ddddddddddddddd8X'3333335353535353#####5#5#5#5#22222d2222222222222ddddddddddddddddddX '33333#5#5#5#5#5######53535353222222222d222222222 ddddddddddddddddd^ 3######53535353Ȗd222222222 dddddddddX 33333#5#5#5#5#5#222222222d ddddddddd8^333333#5#5#5#5#22222d2222dddddddddd8X3#####5353535353&22222d2222ddddddddd8X 33###3dd p,d 33##5#532222dddX!33##!5#5#353,d22dd22dddpdddddX!33##!5#5#35;#3353#5,d22dd22d2ddddddpddddddpddd8^ 3#dd X!!X8X!##^dp8^!##^dX 33!d p^ 3!53d 8X 33##dd pp8^ 3##53dd 8X!###XdpX 33!53d p8X 33###53dd ppX333###5#53ddddddXdddddXX33##5#5#5353,ddddddXdddd83333###535353d222d222dddd dddd833####5#5#5#53d222d222 dddddddd8X!#33#5#5###!!5#53535#5#^2d2dd222,22222dddddddddddddd&X !###33#d,dddddXd ddX 3# ,X& 3#, X& 3#%3#, 3# 3#3# d& 3#3#, d&  3#%3#3#, d,&3#,& 3#3#, d,& 3#3#, d&  3#%3#3#, d&3#3#,,&  3#3#3#, d,&  3#3#3#,, d,X  3#%!!3#3#,,, d,d53#d 3#3# & 3#3#, &  3#%3#3#, 3#3#d  3#3#3# dd&  3#3#3#, dd&  3#%3#3#3#, dd&3#3#,d&  3#3#3#, dd&  3#3#3#, dd&  3#%3#3#3#, dd& 3#3#3#,,d&  3#3#3#3#, d,d&  3#3#3#3#,, d,d&  3#%3#3#3#3#,, d,d, !!, ,X !!,, X !!X d,!!,pd, !!, DdX !!!!,,, pdX !!!X p,dX!!,,pdX !!!!,, p,dX !!,, DdX !!!X DdX!!XpdX !!!,, pdX !!!,,, DdX !!X D8,d5!!,d8, !!!!,, p8X !!!!,,, p8X !!!!X, p8,!!,D8, !!, 8X !!!!,,, D8X !!!X D8X!!!!,,,p,8X !!!!!!,,, p,8X !!!!,,, D,8X !!!!!X, D,8X!!!Xp8X !!!!,, p8X !!!!,,, D8X !!!X D,&d%3#,d& 3#3#, ,& 3#3#, &  3#%3#3#, &3#3#,d&  3#3#3#, dd&  3#3#3#,, dd&  3#%3#3#3#,, dd,&3#3#,d&  3#3#3#, dd,&  3#3#3#, dd&  3#%3#3#3#, dd& 3#3#3#,,d&  3#3#3#3#, d,d&  3#3#3#3#,, d,d&  3#%3#3#3#3#,, d,d&d53#%3#,d&  3#3#%3#, &  3#3#%3#,, &  3#%3#3#%3#,, & 3#3#%3#,d&  3#3#3#%3#, dd&  3#3#3#%3#,, dd&  3#%3#3#3#%3#,, dd& 3#3#%3#,,d&  3#3#3#%3#,, dd&  3#3#3#%3#,, dd&  3#%3#3#3#%3#,, dd& 3#3#3#%3#,,,d&  3#3#3#3#%3#,, d,d&  3#3#3#3#%3#,,, d,d&  3#%3#3#3#3#%3#,,, d,d,8Xd%!!,,d8X !!!!,,, p,8X !!!!,,, p8X !!!!X,, p8X!!!!,,p,8X !!!!,, D,8X !!!!!!,,,, p,8X !!!!!X, p,,8X!!,,D8X !!!!,, D,8X !!,, 8X !!!X 8X!!!XD,8X !!!!,, D,8X !!!!,,, ,8X !!!X ,8Xd5!!Xd8X !!!!,X p8X !!!!,,X p8X !!!!XX p8X!!!,,p8X !!!,, D8X !!!!!,,,, p8X !!!!X, p8X!!!,,,D,8X !!!!!,,, D,8X !!!,,, ,8X !!!!X, ,8X!!XD8X !!!,, D8X !!!,,, 8X !!X 2dX 33!3d p8X!###Xdp,8X 33##dd p8^ 3##3dd ,8^ #3####3333#5#5#5#5#53535353Ȗd222222d22222222 ddddddddddddddd8X #33333#####535353535#5#5#5#22222222d222222d ddddddddddddddd8X'3333335353535353#####5#5#5#5#22222d2222222222222ddddddddddddddddddX '33333#5#5#5#5#5######53535353222222222d222222222 ddddddddddddddddd^ 3######53535353Ȗd222222222 dddddddddX 33333#5#5#5#5#5#222222222d ddddddddd8^333333#5#5#5#5#22222d2222dddddddddd8X3#####5353535353&22222d2222ddddddddd8X 33###3dd p,d 33##5#532222dddX!33##!5#5#353,d22dd22dddpdddddX!33##!5#5#35;#3353#5,d22dd22d2ddddddpddddddpddd8^ 3#dd X!!X8X!##^dp8^!##^dX 33!d p^ 3!53d 8X 33##dd pp8^ 3##53dd 8X!###XdpX 33!53d p8X 33###53dd ppX333###5#53ddddddXdddddXX33##5#5#5353,ddddddXdddd83333###535353d222d222dddd dddd833####5#5#5#53d222d222 dddddddd8d5333#d2ddddd8d5333! dddd8, 333333!222222dddddd8& 333333!2ddddddddddd8, 333333!222222ddd8& 3333333333!22222d2222 dddddddddd8X !!35353^2dd dd8X 3!35353d dd8X !!35353535353,,222222 ddddd8X 3!35353535353&2ddd2dd ddddd8X !!535353535353,,222222 ddd8X 3!3535353&22ȖD,ddd28X !!535353535#5#5#5#2&22222222 ddddddd8X 3333335353535353!22222d22222 ddddddddddd8 3#ddd 8X 7_w33533533#3#3#3#3#5##5##5#535#535#535#535#3#3#3#3#3533535#535#535#535##533#3#3#5#535#535#dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd^8Xd%3#5353&2dddddd8Xd%3!5353– Ȗddd,8X 3!5353535353&222222ddddd28X 3!5353535353&2dddddddddd,8X 3!5353535353&222222|ddd28X 3!535353535353535353&22222d2222 ddddddddd8X !333!^dd2 dddD8X 3333!dȖ dddD8X !333333!,222222 ddddddp8X 3333333!2ddddd2 ddddddp8X !333333!,222222 dddd8X 33333!2Ȗ2dddd8& !####3333!&22222222 dddddddd8X !#5#5#5#5#5######X22222d22222 dddddddddd8 3#dd 8X !!X  3##33#,d2d2ddd,pdd& 3##535#73##535#ddd2ddd2ddddddd2&33533#3##5##5#535#5335ddd2ddddd2dd2ddddddddddX +3;333#5##33####5#5#533535#5#535353#3535#3535,d2dd2222d2dd2222d2d222d2 dddddddddddddddddddddddddddddd2&/373335353####353##5#5###535353535##5;3535d2d2d2d22d22d2d2d22d2222dddddddddddddddddddddddpddX'-133##333#5#!5#53535#535;#3535#35;#22222ddd2d222222d2ddddddddddddddddddddddddd 3##535#,ddd2ddd3##3#5#353,ddd2d2ddpddd33###5353#2d2ddddpddddX#'+3353##3#5###5##53535#5335;3535,ddddddd22ddddddd22222ddddddddddddddddX3#3###535#5353,d22d22Xddddddddd2 73##535#22d22dddd,!!dpd273#2dd2&3#######535353535353d2d22d2d2d22d2ddddddddddddd2X!3###!5#5335;##35335^2222222222222dddddd,dddd,d 3###53#53^d22d22d,d2X!3####3!53535353535##53^222d>2dd2d2ddddddddddddddd2X!##33##!5!535#53535!2d2222p^22dddddddddddddd23####353##5!5353535353^d2d22d2d222d2dddddddddddd2X!!33##!5#533535!532222d22dddddddddd2&!3##33##!5#53535353#3535,d2d222222d2d22dddddddddddddddX!######53535353535!d22d2d2d22dddddddddddd2X#+!3##3##!5#53535#535;#3535#3535^22222222222222222ddddddddddddddddddddddX#!3######53535#5#535;#3535^2222d2d2d222222ddddddddddddddddd,3#3#dd2dddd, 3#3##53dd2d2d2ddddX3###333#5#5#5#535353–ddd2dd2ddddddddddddddddd!!!!dppddd3333####5353535#5#5#dd2dddddd2dddddddddddddd&!3####5353535##533#,222ddd22d2ddddddddddddd d8X !!5#5#5#Xd2d ddd8X !#5#5#5#XdȖ ddd8X !!5#5#5#5#5#5#X222222 dddddd8X !#5#5#5#5#5#5#X2ddddd2 dddddd8X !!5#5#5#5#5#5#X222222 ddd28X !#5#5#5#5#5#5#5#5#5#2&22222d2222 ddddddddd 3###dd2 ddd !###Ȗ ddd, !######,222222 dddddd& !######&dd2ddd dddddd, !######,222222 ddddX !####XȖ2 pddd8 33333#####2222222222 dddddddd2,& !#####5#5#5#5#22222d2222 ddddddddd8X !###!X2dd Dddd8X !####Xd Dddd8X !######!X222222 pdddddd8X !#######X2ddddd2 pdddddd8X !######!X222222 dddd8& !##########&2222d22222 dddddddddd^X 3#5#5#^2dd dddX !#5#5#d dd,X !#5#5#5#5#5#,,222222 ddddd2X !#5#5#5#5#5#2&2ddddd ddddd,X !#5#5#5#5#5#,,222222 |dddX !#5#5#5#5#X2Ȗ2 Ddddd^8X 3#5#5#5#5#53535353&2222222222 ddddddd28&,33333!53535353d2222 2222,ddddddddd,&d%3#,d& 3#3#, ,& 3#3#, &  3#%3#3#, &3#3#,d&  3#3#3#, dd&  3#3#3#,, dd&  3#%3#3#3#,, dd,&3#3#,d&  3#3#3#, dd,&  3#3#3#, dd&  3#%3#3#3#, dd& 3#3#3#,,d&  3#3#3#3#, d,d&  3#3#3#3#,, d,d&  3#%3#3#3#3#,, d,d&d53#%3#,d&  3#3#%3#, &  3#3#%3#,, &  3#%3#3#%3#,, & 3#3#%3#,d&  3#3#3#%3#, dd&  3#3#3#%3#,, dd&  3#%3#3#3#%3#,, dd& 3#3#%3#,,d&  3#3#3#%3#,, dd&  3#3#3#%3#,, dd&  3#%3#3#3#%3#,, dd& 3#3#3#%3#,,,d&  3#3#3#3#%3#,, d,d&  3#3#3#3#%3#,,, d,d&  3#%3#3#3#3#%3#,,, d,d8d5333#d2ddddd8d5333! dddd8, 333333!222222dddddd8& 333333!2ddddddddddd8, 333333!222222ddd8& 3333333333!22222d2222 dddddddddd8X !!35353^2dd dd8X 3!35353d dd8X !!35353535353,,222222 ddddd8X 3!35353535353&2ddd2dd ddddd8X !!535353535353,,222222 ddd8X 3!3535353&22ȖD,ddd28X !!535353535#5#5#5#2&22222222 ddddddd8X 3333335353535353!22222d22222 ddddddddddd8 3#ddd 8X 7_w33533533#3#3#3#3#5##5##5#535#535#535#535#3#3#3#3#3533535#535#535#535##533#3#3#5#535#535#dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd^8Xd%3#5353&2dddddd8Xd%3!5353– Ȗddd,8X 3!5353535353&222222ddddd28X 3!5353535353&2dddddddddd,8X 3!5353535353&222222|ddd28X 3!535353535353535353&22222d2222 ddddddddd8X !333!^dd2 dddD8X 3333!dȖ dddD8X !333333!,222222 ddddddp8X 3333333!2ddddd2 ddddddp8X !333333!,222222 dddd8X 33333!2Ȗ2dddd8& !####3333!&22222222 dddddddd8X !#5#5#5#5#5######X22222d22222 dddddddddd8 3#dd 8X !!X 2dX 33!3d p8X!###Xdp,8X 33##dd p8^ 3##3dd ,8^ #3####3333#5#5#5#5#53535353Ȗd222222d22222222 ddddddddddddddd8X #33333#####535353535#5#5#5#22222222d222222d ddddddddddddddd8X'3333335353535353#####5#5#5#5#22222d2222222222222ddddddddddddddddddX '33333#5#5#5#5#5######53535353222222222d222222222 ddddddddddddddddd^ 3######53535353Ȗd222222222 dddddddddX 33333#5#5#5#5#5#222222222d ddddddddd8^333333#5#5#5#5#22222d2222dddddddddd8X3#####5353535353&22222d2222ddddddddd8X 33###3dd p,d 33##5#532222dddX!33##!5#5#353,d22dd22dddpdddddX!33##!5#5#35;#3353#5,d22dd22d2ddddddpddddddpddd8^ 3#dd X!!X8X!##^dp8^!##^dX 33!d p^ 3!53d 8X 33##dd pp8^ 3##53dd 8X!###XdpX 33!53d p8X 33###53dd ppX333###5#53ddddddXdddddXX33##5#5#5353,ddddddXdddd83333###535353d222d222dddd dddd833####5#5#5#53d222d222 dddddddd8X !!5#5#5#Xd2d ddd8X !#5#5#5#XdȖ ddd8X !!5#5#5#5#5#5#X222222 dddddd8X !#5#5#5#5#5#5#X2ddddd2 dddddd8X !!5#5#5#5#5#5#X222222 ddd28X !#5#5#5#5#5#5#5#5#5#2&22222d2222 ddddddddd 3###dd2 ddd !###Ȗ ddd, !######,222222 dddddd& !######&dd2ddd dddddd, !######,222222 ddddX !####XȖ2 pddd8 33333#####2222222222 dddddddd2,& !#####5#5#5#5#22222d2222 ddddddddd8X !###!X2dd Dddd8X !####Xd Dddd8X !######!X222222 pdddddd8X !#######X2ddddd2 pdddddd8X !######!X222222 dddd8& !##########&2222d22222 dddddddddd^X 3#5#5#^2dd dddX !#5#5#d dd,X !#5#5#5#5#5#,,222222 ddddd2X !#5#5#5#5#5#2&2ddddd ddddd,X !#5#5#5#5#5#,,222222 |dddX !#5#5#5#5#X2Ȗ2 Ddddd^8X 3#5#5#5#5#53535353&2222222222 ddddddd28&,33333!53535353d2222 2222,ddddddddd 3##33#,d2d2ddd,pdd& 3##535#73##535#ddd2ddd2ddddddd2&33533#3##5##5#535#5335ddd2ddddd2dd2ddddddddddX +3;333#5##33####5#5#533535#5#535353#3535#3535,d2dd2222d2dd2222d2d222d2 dddddddddddddddddddddddddddddd2&/373335353####353##5#5###535353535##5;3535d2d2d2d22d22d2d2d22d2222dddddddddddddddddddddddpddX'-133##333#5#!5#53535#535;#3535#35;#22222ddd2d222222d2ddddddddddddddddddddddddd 3##535#,ddd2ddd3##3#5#353,ddd2d2ddpddd33###5353#2d2ddddpddddX#'+3353##3#5###5##53535#5335;3535,ddddddd22ddddddd22222ddddddddddddddddX3#3###535#5353,d22d22Xddddddddd2 73##535#22d22dddd,!!dpd273#2dd2&3#######535353535353d2d22d2d2d22d2ddddddddddddd2X!3###!5#5335;##35335^2222222222222dddddd,dddd,d 3###53#53^d22d22d,d2X!3####3!53535353535##53^222d>2dd2d2ddddddddddddddd2X!##33##!5!535#53535!2d2222p^22dddddddddddddd23####353##5!5353535353^d2d22d2d222d2dddddddddddd2X!!33##!5#533535!532222d22dddddddddd2&!3##33##!5#53535353#3535,d2d222222d2d22dddddddddddddddX!######53535353535!d22d2d2d22dddddddddddd2X#+!3##3##!5#53535#535;#3535#3535^22222222222222222ddddddddddddddddddddddX#!3######53535#5#535;#3535^2222d2d2d222222ddddddddddddddddd,3#3#dd2dddd, 3#3##53dd2d2d2ddddX3###333#5#5#5#535353–ddd2dd2ddddddddddddddddd!!!!dppddd3333####5353535#5#5#dd2dddddd2dddddddddddddd&!3####5353535##533#,222ddd22d2ddddddddddddd dX#'!3###3535###3!!5#5#5335335^2222d22,222d2dddd,ddddddddd,d&333##5!#5353535;##!5#5222dd22d22d2,2ddddddd2X#!3##3##!5337#3535#3535222222p22d2222ddddddd,ddddddddddX!3#5##353#!5#353,2ddd22d2ddddpddddd2& !3##!5337##353^2d222d22ddpdd,dddd2X!!#3##!!53322^>22ddddddd,2X!!#3###53322d22ddddd,2X!!3#5###3535#53##!5#53353^2d222d222222dddddddddddd,d2X3#35353###535###533d22d22d22d22dddd,2&!###3!535335#22p22dddddd,d2X3###!5#533533d2222d22dddddd,2X#335353###33#5#5###53;35ddddddddd22d2222ddddddddd,dd2 3##!!533d22^>22dd,X#3335353###53###5#5###533d2d222d222d222d22dddd,dddd,X#33333353###5#5#5#5###533d22222d2222222d22ddd,ddd,2X!3###!5#5335;##35335^2222222222222dddddd,dddd,d2X!3##!##5337#35352222d22d22ddddd,ddddd28X+!3####3#5#5#5#5335;##35335335^22222d22222222dd222dddddddddd,dddddd,d2X!!3###3#5#5###5337#353522222d22d22d22ddddddd,ddddd2X#!3#5##!3##!5#533535!5#5353^2d2,2222d2222ddddddddddddddddddX!####5335#d22d22dd,d2X3##353353###!5#533d2222d222222dd,dddd,dX333535353#####5#5#dd2d2ddd2d2d22pdddddd2X!3#3535333353###5#5###3dd222d222d2dd2d2d2dd,dddd2&'3335353###33#5#5###5353535#5#d2d2d2d222d2d2d2d222ddddddddddddddddddX333535353######535#5#5#dd2dd2d2d222d2222ddddddddddd2&!#####3!53535353535#2d22dp2d22dddddddddddddd 3###3#33,d22d22 dd,,33333#5#5#5#5#d2222d2222dddddd 3###535335#22d22d d,d33#5###53532d2ddd2ddddd1!! d,33#5#,d2d2d!3#3!5#535!5!35d^222>2d,ddddddddd2&333##!53;3##3535#5d222p2222222ddd,dddddd2&!3#5##!!5#5353^2d2^p222ddddddd2X3##!5#535353353#3535#5d22p22222222dddddddddd2&!3!!!5#535;35^2p,2222dddddddd&33#5##3###535#535353,2dd2dd2d2dd22dddddddddddd&3353##!5!5!;35#52d22,222ddddd,dd2&333##535####53;35d22d222d2222ddd,ddd3#3#3!53535#,ddd2dd22dddddd2X3#3##!5#533535#dd222d2ddddddd2&3#35353##33#5#5##533d22dd2d2d22ddddddddd,d3##3!535335#22dd22ddddd,d&33533##535###535###532222d2d2d2d2d2ddd2&33533##535####53dd222d222d2ddddd2&!3##!5#535;#3535^222222222ddddddd2&33533###5##37#3535dd22222d222dddddd,dd2&3353##5##5#535;#3535#52d2d222222d2ddddddddd2&33533#5####53dd22d22d2dddddddd!!!#!5!5#5#53^,2,22dddddddd33##353##5#535#53dd2d222ddddddddd2&3#3533##5##5#53dd2dd2d222dd,dddd2&3333535353#####5#5#5#2d22d22d22d2d222ddddddddddddd2&33535333###5##5#7352d22dddd2ddd22pd,dddddddd&!3335353##3#5#5###53535#5#22d2d2d2d2dd2ddddddddddddddddd&3333535353######53#5#dd22222d22d22d22ddddddddddddd,d2&!###3!5353535#dd2>dddddddddddd 3###3#3#5#535#535353^d2222d222222 ddddddddd 3###533,d22d22,d 33#3####5353535#535#Ȗ222222d2222d dddddddddX3353##5##53dd2dd2ddddddd 3#3##53,dd2d2d2dd8&#333#5##3##5#5#535353#3535,dd2dd2d222Ȗ2d2ddddddddddd2X!3#5#3#353##5##535#5353,2ddddd2dddd2ddddddddddd2&X3353#3#3#5##53;35ddd2d2dd222Xddddddddd,&3335353###3##5#535#5#d2d2d2d2dd2d22ddddddddddd3##533##53,d2d22d2d2ddd2& #!3#5#33##!5#5335#5#53335,2d2222d222 ddddddddddd,dd& 3#73#dddd dddX +17;!3#5!###3!53533###!5#5#53353533#5+33#73#^222222^222222222222d2dd2d22 ddddddddd,dddddd,dddddd&!3#3!5#535!5+3#35!!,222p22,22>dddddddddddd2dX3353##3#5#535##3#5#5353dddd22d22d22d22dXdddddddddddd!#5!dddd,!!dpdX =A!3#5!###3!5#535###53353#3533###!5#5#533535335^222222^d2222222222222222222 ddddddddddddd,dd,dddddd,dddd& !!3#^22 ddd 33##5;352d22dddddd2 33##5#53!!,dddpddpd2^33##3!5353535#d2d222dddddddddd2^33#3##535#535#d2d22Ȗdddddddddd,3##53^d2d2ddd83#3533#3#5###32d22d22d2d2dd,dddd28X%!###335####35#5#535;#353522d22d22d222222d2p,ddpdddddddd,^3#3#22dddd8,;#53d2d3##3,d2d2dX!3##!5#535;#3535!!,222222222ppddddddd d2dX33#3535#533###5##53535#d22d22d22ddddd22Xdddddddddddd2X9=3####53535#35#%3##533##335#5353##5#535#535335d22222222222222222d222d2222d2pddddd,ddddddddddddddddddddd2X73####53535#35#%3##53333##3#5353535##5353d222222222222222d2d22d222pddddd,ddddddddddddddddddd2&!)7;?3333##5#5###53535#535#535#%3##533#3535#5#53+35d222d22222dd2222d2d222222dddddddddddddddddddddddddddd23#3###353#!5#535353,dd2dd22d2222dddddddddddddd< n% % = : Z  x J   )Copyright (c) 2018, Tobias,,,Copyright (c) 2018, Tobias,,,teletext2teletext2MediumMediumFontForge 2.0 : teletext2 : 24-2-2018FontForge 2.0 : teletext2 : 24-2-2018teletext2teletext21.01.0teletext2teletext22  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjikmlnoqprsutvwxzy{}|~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~uni007Funi00A0uni00ADuni00B2uni00B3uni00B9AmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflex Cdotaccent cdotaccentDcarondcaronDcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflex Gdotaccent gdotaccentuni0122uni0123 Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonekIJij Jcircumflex jcircumflexuni0136uni0137 kgreenlandicLacutelacuteuni013Buni013CLcaronlcaronLdotldotNacutenacuteuni0145uni0146Ncaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracuteuni0156uni0157RcaronrcaronSacutesacute Scircumflex scircumflexuni0162uni0163TcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsuni01B5uni01CDuni01CEuni0229uni0251uni02C9uni02CAuni02CBuni02CDuni02CFuni0370uni0371uni0372uni0373uni0374uni0375uni0376uni0377uni0378uni0379uni037Auni037Buni037Cuni037Duni037Euni037Funi0380uni0381uni0382uni0383tonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonosuni038B Omicrontonosuni038D Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhouni03A2SigmaTauUpsilonPhiChiPsiuni03A9 IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03CFuni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi05D0uni05D1uni05D2uni05D3uni05D4uni05D5uni05D6uni05D7uni05D8uni05D9uni05DAuni05DBuni05DCuni05DDuni05DEuni05DFuni05E0uni05E1uni05E2uni05E3uni05E4uni05E5uni05E6uni05E7uni05E8uni05E9uni05EAuni05EBuni05ECuni05EDuni05EEuni05EFuni0600uni0601uni0602uni0603uni0604uni0605uni0606uni0607uni0608uni0609uni060Auni060Buni060Cuni060Duni060Euni060Funi0610uni0611uni0612uni0613uni0614uni0615uni0616uni0617uni0618uni0619uni061Auni061Buni061Cuni061Duni061Euni061Funi2016uni20A0uni20AA oneeighth threeeighths fiveeighths seveneighths arrowleftarrowup arrowright arrowdown musicalnoteuniE600uniE601uniE602uniE603uniE604uniE605uniE606uniE607uniE608uniE609uniE60AuniE60BuniE60CuniE60DuniE60EuniE60FuniE610uniE611uniE612uniE613uniE614uniE615uniE616uniE617uniE618uniE619uniE61AuniE61BuniE61CuniE61DuniE61EuniE61FuniE620uniE621uniE622uniE623uniE624uniE625uniE626uniE627uniE628uniE629uniE62AuniE62BuniE62CuniE62DuniE62EuniE62FuniE630uniE631uniE632uniE633uniE634uniE635uniE636uniE637uniE638uniE639uniE63AuniE63BuniE63CuniE63DuniE63EuniE63FuniE640uniE641uniE642uniE643uniE644uniE645uniE646uniE647uniE648uniE649uniE64AuniE64BuniE64CuniE64DuniE64EuniE64FuniE650uniE651uniE652uniE653uniE654uniE655uniE656uniE657uniE658uniE659uniE65AuniE65BuniE65CuniE65DuniE65EuniE65FuniE660uniE661uniE662uniE663uniE664uniE665uniE666uniE667uniE668uniE669uniE66AuniE66BuniE66CuniE66DuniE66EuniE66FuniE670uniE671uniE672uniE673uniE674uniE675uniE676uniE677uniE678uniE679uniE67AuniE67BuniE67CuniE67DuniE67EuniE67FuniE680uniE681uniE682uniE683uniE684uniE685uniE686uniE687uniE688uniE689uniE68AuniE68BuniE68CuniE68DuniE68EuniE68FuniE690uniE691uniE692uniE693uniE694uniE695uniE696uniE697uniE698uniE699uniE69AuniE69BuniE69CuniE69DuniE69EuniE69FuniE6A0uniE6A1uniE6A2uniE6A3uniE6A4uniE6A5uniE6A6uniE6A7uniE6A8uniE6A9uniE6AAuniE6ABuniE6ACuniE6ADuniE6AEuniE6AFuniE6B0uniE6B1uniE6B2uniE6B3uniE6B4uniE6B5uniE6B6uniE6B7uniE6B8uniE6B9uniE6BAuniE6BBuniE6BCuniE6BDuniE6BEuniE6BFuniE6C0uniE6C1uniE6C2uniE6C3uniE6C4uniE6C5uniE6C6uniE6C7uniE6C8uniE6C9uniE6CAuniE6CBuniE6CCuniE6CDuniE6CEuniE6CFuniE6D0uniE6D1uniE6D2uniE6D3uniE6D4uniE6D5uniE6D6uniE6D7uniE6D8uniE6D9uniE6DAuniE6DBuniE6DCuniE6DDuniE6DEuniE6DFuniE6E0uniE6E1uniE6E2uniE6E3uniE6E4uniE6E5uniE6E6uniE6E7uniE6E8uniE6E9uniE6EAuniE6EBuniE6ECuniE6EDuniE6EEuniE6EFuniE6F0uniE6F1uniE6F2uniE6F3uniE6F4uniE6F5uniE6F6uniE6F7uniE6F8uniE6F9uniE6FAuniE6FBuniE6FCuniE6FDuniE6FEuniE6FFuniE700uniE701uniE702uniE703uniE704uniE705uniE706uniE707uniE708uniE709uniE70AuniE70BuniE70CuniE70DuniE70EuniE70FuniE710uniE711uniE712uniE713uniE714uniE715uniE716uniE717uniE718uniE719uniE71AuniE71BuniE71CuniE71DuniE71EuniE71FuniE720uniE721uniE722uniE723uniE724uniE725uniE726uniE727uniE728uniE729uniE72AuniE72BuniE72CuniE72DuniE72EuniE72FuniE730uniE731uniE732uniE733uniE734uniE735uniE736uniE737uniE738uniE739uniE73AuniE73BuniE73CuniE73DuniE73EuniE73FuniE75FuniE800uniEE00uniEE01uniEE02uniEE03uniEE04uniEE05uniEE06uniEE07uniEE08uniEE09uniEE0AuniEE0BuniEE0CuniEE0DuniEE0EuniEE0FuniEE10uniEE11uniEE12uniEE13uniEE14uniEE15uniEE16uniEE17uniEE18uniEE19uniEE1AuniEE1BuniEE1CuniEE1DuniEE1EuniEE1FuniEE20uniEE21uniEE22uniEE23uniEE24uniEE25uniEE26uniEE27uniEE28uniEE29uniEE2AuniEE2BuniEE2CuniEE2DuniEE2EuniEE2FuniEE30uniEE31uniEE32uniEE33uniEE34uniEE35uniEE36uniEE37uniEE38uniEE39uniEE3AuniEE3BuniEE3CuniEE3DuniEE3EuniEE3FuniEE40uniEE41uniEE42uniEE43uniEE44uniEE45uniEE46uniEE47uniEE48uniEE49uniEE4AuniEE4BuniEE4CuniEE4DuniEE4EuniEE4FuniEE50uniEE51uniEE52uniEE53uniEE54uniEE55uniEE56uniEE57uniEE58uniEE59uniEE5AuniEE5BuniEE5CuniEE5DuniEE5EuniEE5FuniEE60uniEE61uniEE62uniEE63uniEE64uniEE65uniEE66uniEE67uniEE68uniEE69uniEE6AuniEE6BuniEE6CuniEE6DuniEE6EuniEE6FuniEE70uniEE71uniEE72uniEE73uniEE74uniEE75uniEE76uniEE77uniEE78uniEE79uniEE7AuniEE7BuniEE7CuniEE7DuniEE7EuniEE7FuniEE80uniEE81uniEE82uniEE83uniEE84uniEE85uniEE86uniEE87uniEE88uniEE89uniEE8AuniEE8BuniEE8CuniEE8DuniEE8EuniEE8FuniEE90uniEE91uniEE92uniEE93uniEE94uniEE95uniEE96uniEE97uniEE98uniEE99uniEE9AuniEE9BuniEE9CuniEE9DuniEE9EuniEE9FuniEEA0uniEEA1uniEEA2uniEEA3uniEEA4uniEEA5uniEEA6uniEEA7uniEEA8uniEEA9uniEEAAuniEEABuniEEACuniEEADuniEEAEuniEEAFuniEEB0uniEEB1uniEEB2uniEEB3uniEEB4uniEEB5uniEEB6uniEEB7uniEEB8uniEEB9uniEEBAuniEEBBuniEEBCuniEEBDuniEEBEuniEEBFuniEEC0uniEEC1uniEEC2uniEEC3uniEEC4uniEEC5uniEEC6uniEEC7uniEEC8uniEEC9uniEECAuniEECBuniEECCuniEECDuniEECEuniEECFuniEED0uniEED1uniEED2uniEED3uniEED4uniEED5uniEED6uniEED7uniEED8uniEED9uniEEDAuniEEDBuniEEDCuniEEDDuniEEDEuniEEDFuniEEE0uniEEE1uniEEE2uniEEE3uniEEE4uniEEE5uniEEE6uniEEE7uniEEE8uniEEE9uniEEEAuniEEEBuniEEECuniEEEDuniEEEEuniEEEFuniEEF0uniEEF1uniEEF2uniEEF3uniEEF4uniEEF5uniEEF6uniEEF7uniEEF8uniEEF9uniEEFAuniEEFBuniEEFCuniEEFDuniEEFEuniEEFFuniEF00uniEF01uniEF02uniEF03uniEF04uniEF05uniEF06uniEF07uniEF08uniEF09uniEF0AuniEF0BuniEF0CuniEF0DuniEF0EuniEF0FuniEF10uniEF11uniEF12uniEF13uniEF14uniEF15uniEF16uniEF17uniEF18uniEF19uniEF1AuniEF1BuniEF1CuniEF1DuniEF1EuniEF1FuniEF20uniEF21uniEF22uniEF23uniEF24uniEF25uniEF26uniEF27uniEF28uniEF29uniEF2AuniEF2BuniEF2CuniEF2DuniEF2EuniEF2FuniEF30uniEF31uniEF32uniEF33uniEF34uniEF35uniEF36uniEF37uniEF38uniEF39uniEF3AuniEF3BuniEF3CuniEF3DuniEF3EuniEF3FuniEF40uniEF41uniEF42uniEF43uniEF44uniEF45uniEF46uniEF47uniEF48uniEF49uniEF4AuniEF4BuniEF4CuniEF4DuniEF4EuniEF4FuniEF50uniEF51uniEF52uniEF53uniEF54uniEF55uniEF56uniEF57uniEF58uniEF59uniEF5AuniEF5BuniEF5CuniEF5DuniEF5EuniEF5FuniEF60uniEF61uniEF62uniEF63uniEF64uniEF65uniEF66uniEF67uniEF68uniEF69uniEF6AuniEF6BuniEF6CuniEF6DuniEF6EuniEF6FuniEF70uniEF71uniEF72uniEF73uniEF74uniEF75uniEF76uniEF77uniEF78uniEF79uniEF7AuniEF7BuniEF7CuniEF7DuniEF7EuniEF7FuniEF80uniEF81uniEF82uniEF83uniEF84uniEF85uniEF86uniEF87uniEF88uniEF89uniEF8AuniEF8BuniEF8CuniEF8DuniEF8EuniEF8FuniEF90uniEF91uniEF92uniEF93uniEF94uniEF95uniEF96uniEF97uniEF98uniEF99uniEF9AuniEF9BuniEF9CuniEF9DuniEF9EuniEF9FuniEFA0uniEFA1uniEFA2uniEFA3uniEFA4uniEFA5uniEFA6uniEFA7uniEFA8uniEFA9uniEFAAuniEFABuniEFACuniEFADuniEFAEuniEFAFuniEFB0uniEFB1uniEFB2uniEFB3uniEFB4uniEFB5uniEFB6uniEFB7uniEFB8uniEFB9uniEFBAuniEFBBuniEFBCuniEFBDuniEFBEuniEFBFuniEFC0uniEFC1uniEFC2uniEFC3uniEFC4uniEFC5uniEFC6uniEFC7uniEFC8uniEFC9uniEFCAuniEFCBuniEFCCuniEFCDuniEFCEuniEFCFuniEFD0uniEFD1uniEFD2uniEFD3uniEFD4uniEFD5uniEFD6uniEFD7uniEFD8uniEFD9uniEFDAuniEFDBuniEFDCuniEFDDuniEFDEuniEFDFuniEFE0uniEFE1uniEFE2uniEFE3uniEFE4uniEFE5uniEFE6uniEFE7uniEFE8uniEFE9uniEFEAuniEFEBuniEFECuniEFEDuniEFEEuniEFEFuniEFF0uniEFF1uniEFF2uniEFF3uniEFF4uniEFF5uniEFF6uniEFF7uniEFF8uniEFF9uniEFFAuniEFFBuniEFFCuniEFFDuniEFFEuniEFFFEַZַZosdteletext-0.9.7/storage.h0000644000175000017500000000451612117130631015235 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef __STORAGE_H #define __STORAGE_H #include "rootdir.h" #include "pageid.h" #define TELETEXT_PAGESIZE 972 struct StorageHandle { public: StorageHandle() { handle=-1; } StorageHandle(const StorageHandle &s) { handle=s.handle; } StorageHandle(int h) { handle=h; } StorageHandle &operator=(int h) { handle=h; return *this; } StorageHandle &operator=(const StorageHandle &s) { handle=s.handle; return *this; } operator bool() const { return handle!=-1; } operator int() const { return handle; } private: int handle; }; enum StorageSystem { StorageSystemLegacy, StorageSystemPacked }; class Storage : public RootDir { public: virtual ~Storage(); enum StorageSystem { StorageSystemLegacy, StorageSystemPacked }; //must be called before the first call to instance() //must be called before operation starts. Set all options (RootDir, maxStorage) before. virtual void cleanUp() = 0; virtual void getFilename(char *buffer, int bufLength, PageID page); virtual void prepareDirectory(tChannelID chan); virtual StorageHandle openForWriting(PageID page) = 0; virtual StorageHandle openForReading(PageID page, bool countAsAccess) = 0; virtual ssize_t write(const void *ptr, size_t size, StorageHandle stream) = 0; virtual ssize_t read(void *ptr, size_t size, StorageHandle stream) = 0; virtual void close(StorageHandle stream) = 0; protected: Storage(); int cleanSubDir(const char *dir); int doCleanUp(); virtual int actualFileSize(int netFileSize) { return netFileSize; } void freeSpace(); bool exists(const char* file); long byteCount; cString currentDir; private: bool failedFreeSpace; }; #endif osdteletext-0.9.7/storage.c0000644000175000017500000001132412117130631015223 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "storage.h" int Storage::doCleanUp() { DIR *top=opendir(root); int pagesDeleted=0; if (top) { struct dirent *chandir, path; struct stat chandirstat; char fullPath[PATH_MAX]; while ( (!readdir_r(top, &path, &chandir) && chandir != NULL) ) { if (strcmp(chandir->d_name, "..")==0 || strcmp(chandir->d_name, ".")==0) continue; snprintf(fullPath, PATH_MAX, "%s/%s", root, chandir->d_name); if (stat(fullPath, &chandirstat)==0) { if (S_ISDIR(chandirstat.st_mode)) { pagesDeleted+=cleanSubDir(fullPath); } } } closedir(top); } else { esyslog("OSD-Teletext: Error opening teletext storage directory \"%s\": %s", root, strerror(errno)); } return pagesDeleted; } int Storage::cleanSubDir(const char *dir) { static bool reportedError=false; //avoid filling up syslog DIR *d=opendir(dir); bool hadError=false; int bytesDeleted=0; if (d) { struct dirent *txtfile, path; struct stat txtfilestat; char fullPath[PATH_MAX]; int filesize; while ( (!readdir_r(d, &path, &txtfile) && txtfile != NULL) ) { int len=strlen(txtfile->d_name); //check that the file end with .vtx to avoid accidents and disasters if (strcmp(txtfile->d_name+len-4, ".vtx")==0) { snprintf(fullPath, PATH_MAX, "%s/%s", dir, txtfile->d_name); stat(fullPath, &txtfilestat); filesize=actualFileSize(txtfilestat.st_size); int ret=unlink(fullPath); if (ret==0) bytesDeleted+=filesize; else hadError=ret; } } closedir(d); rmdir(dir); } else { if (!reportedError) { esyslog("OSD-Teletext: Error opening teletext storage subdirectory \"%s\": %s", dir, strerror(errno)); reportedError=true; } } if (hadError && !reportedError) { esyslog("OSD-Teletext: Error removing teletext storage subdirectory \"%s\": %s", dir, strerror(hadError)); reportedError=true; } return bytesDeleted; } Storage::Storage() : byteCount(0), failedFreeSpace(false) { } Storage::~Storage() { } void Storage::freeSpace() { //there might be a situation where only the current directory is left and //occupies the whole space. We cannot delete anything. Don't waste time scanning. if (failedFreeSpace) return; //printf("freeSpace()\n"); time_t min=time(0); char minDir[PATH_MAX]; char fullPath[PATH_MAX]; DIR *top=opendir(getRootDir()); if (top) { int haveDir=0; struct dirent *chandir, path; struct stat chandirstat; while ( (!readdir_r(top, &path, &chandir) && chandir != NULL) ) { if (strcmp(chandir->d_name, "..")==0 || strcmp(chandir->d_name, ".")==0) continue; snprintf(fullPath, PATH_MAX, "%s/%s", getRootDir(), chandir->d_name); if (stat(fullPath, &chandirstat)==0) { if (S_ISDIR(chandirstat.st_mode)) { if (chandirstat.st_ctime < min && strcmp(fullPath, currentDir)) { min=chandirstat.st_ctime; strcpy(minDir, fullPath); haveDir++; } } } } closedir(top); //if haveDir, only current directory present, which must not be deleted if (haveDir>=2) byteCount-=cleanSubDir(minDir); else failedFreeSpace=true; } } bool Storage::exists(const char* file) { struct stat s; return (stat(file, &s)==0); } void Storage::getFilename(char *buffer, int bufLength, PageID page) { snprintf(buffer, bufLength, "%s/%s/%03x_%02x.vtx", getRootDir(), *page.channel.ToString(), page.page, page.subPage); } void Storage::prepareDirectory(tChannelID chan) { currentDir = cString::sprintf("%s/%s", root, *chan.ToString()); if (!MakeDirs(currentDir, 1)) { esyslog("OSD-Teletext: Error preparing directory for channel \"%s\"", *chan.ToString()); return; } failedFreeSpace=false; } osdteletext-0.9.7/txtrender.h0000644000175000017500000002732013244253751015621 0ustar tobiastobias/*************************************************************** -*- c++ -*- * * * txtrender.h - Teletext display abstraction and teletext code * * renderer * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * Changelog: * * 2005-03 initial version (c) Udo Richter * * * ***************************************************************************/ #ifndef OSDTELETEXT_TXTRENDER_H_ #define OSDTELETEXT_TXTRENDER_H_ #include // Teletext character sets enum enumCharsets { CHARSET_LATIN_G0 = 0x0000, // native latin (partially todo) CHARSET_LATIN_G0_CZ_SK = 0x0100, // Czech/Slovak (todo) CHARSET_LATIN_G0_EN = 0x0200, // English CHARSET_LATIN_G0_EE = 0x0300, // Estonian (todo) CHARSET_LATIN_G0_FR = 0x0400, // French CHARSET_LATIN_G0_DE = 0x0500, // German CHARSET_LATIN_G0_IT = 0x0600, // Italian CHARSET_LATIN_G0_LV_LT = 0x0700, // Lettish/Lithuanian (todo) CHARSET_LATIN_G0_PL = 0x0800, // Polish (todo) CHARSET_LATIN_G0_PT_ES = 0x0900, // Portuguese/Spanish CHARSET_LATIN_G0_RO = 0x0A00, // Romanian (todo) CHARSET_LATIN_G0_SR_HR_SL = 0x0B00, // Serbian/Croatian/Slovenian (todo) CHARSET_LATIN_G0_SV_FI = 0x0C00, // Swedish/Finnish CHARSET_LATIN_G0_TR = 0x0D00, // Turkish (todo) CHARSET_LATIN_G2 = 0x0E00, // Latin G2 supplementary set (todo) CHARSET_CYRILLIC_G0_SR_HR = 0x0F00, // Serbian/Croatian (todo) CHARSET_CYRILLIC_G0_RU_BG = 0x1000, // Russian/Bulgarian (todo) CHARSET_CYRILLIC_G0_UK = 0x1100, // Ukrainian (todo) CHARSET_CYRILLIC_G2 = 0x1200, // Cyrillic G2 Supplementary (todo) CHARSET_GREEK_G0 = 0x1300, // Greek G0 (todo) CHARSET_GREEK_G2 = 0x1400, // Greeek G2 (todo) CHARSET_ARABIC_G0 = 0x1500, // Arabic G0 (todo) CHARSET_ARABIC_G2 = 0x1600, // Arabic G2 (todo) CHARSET_HEBREW_G0 = 0x1700, // Hebrew G0 (todo) CHARSET_GRAPHICS_G1 = 0x1800, // G1 graphics set CHARSET_GRAPHICS_G1_SEP = 0x1900, // G1 graphics set, separated CHARSET_GRAPHICS_G3 = 0x1A00, // G3 graphics set (todo) CHARSET_INVALID = 0x1F00 // no charset defined }; // Macro to get the lowest non-0 bit position from a bit mask // Should evaluate to const on a const mask #define LowestSet2Bit(mask) ((mask)&0x0001?0:1) #define LowestSet4Bit(mask) ((mask)&0x0003?LowestSet2Bit(mask):LowestSet2Bit((mask)>>2)+2) #define LowestSet8Bit(mask) ((mask)&0x000f?LowestSet4Bit(mask):LowestSet4Bit((mask)>>4)+4) #define LowestSet16Bit(mask) ((mask)&0x00ff?LowestSet8Bit(mask):LowestSet8Bit((mask)>>8)+8) #define LowestSet32Bit(mask) ((mask)&0xffff?LowestSet16Bit(mask):LowestSet16Bit((mask)>>16)+16) // Character modifcation double height: enum enumDblHeight { dblh_Normal=0x00000000, // normal height dblh_Top =0x04000000, // upper half character dblh_Bottom=0x08000000 // lower half character }; // Character modifcation double width: enum enumDblWidth { dblw_Normal=0x00000000, // normal width dblw_Left =0x10000000, // left half character dblw_Right =0x20000000 // right half character }; // Teletext colors enum enumTeletextColor { // level 1: ttcBlack=0, ttcRed=1, ttcGreen=2, ttcYellow=3, ttcBlue=4, ttcMagenta=5, ttcCyan=6, ttcWhite=7, // level 2.5: ttcTransparent=8, ttcHalfRed=9, ttcHalfGreen=10, ttcHalfYellow=11, ttcHalfBlue=12, ttcHalfMagenta=13, ttcHalfCyan=14, ttcGrey=15, // unnamed, level 2.5: ttcColor16=16, ttcColor17=17, ttcColor18=18, ttcColor19=19, ttcColor20=20, ttcColor21=21, ttcColor22=22, ttcColor23=23, ttcColor24=24, ttcColor25=25, ttcColor26=26, ttcColor27=27, ttcColor28=28, ttcColor29=29, ttcColor30=30, ttcColor31=31, ttcFirst=0, ttcLast=31 }; inline enumTeletextColor& operator++(enumTeletextColor& c) { return c=enumTeletextColor(int(c)+1); } inline enumTeletextColor operator++(enumTeletextColor& c, int) { enumTeletextColor tmp(c); ++c; return tmp; } class cTeletextChar { // Wrapper class that represents a teletext character, // including colors and effects. Should optimize back // to 4 byte unsigned int on compile. protected: unsigned int c; static const unsigned int CHAR = 0x000000FF; // character code static const unsigned int CHARSET = 0x00001F00; // character set code, see below static const unsigned int BOXOUT = 0x00004000; // 'boxed' mode hidden area static const unsigned int DIRTY = 0x00008000; // 'dirty' bit - internal marker only static const unsigned int FGCOLOR = 0x001F0000; // 5-bit foreground color code, 3 bit used for now static const unsigned int BGCOLOR = 0x03E00000; // 5-bit background color code, 3 bit used for now static const unsigned int DBLHEIGHT = 0x0C000000; // show double height static const unsigned int DBLWIDTH = 0x30000000; // show double width (todo) static const unsigned int CONCEAL = 0x40000000; // character concealed static const unsigned int BLINK = 0x80000000; // blinking character cTeletextChar(unsigned int cc) { c=cc; } public: cTeletextChar() { c=0; } // inline helper functions: // For each parameter encoded into the 32-bit int, there is // a Get...() to read, a Set...() to write, and a To...() to // return a modified copy inline unsigned int GetC() { return c;}; inline unsigned char GetChar() { return c&CHAR; } inline void SetChar(unsigned char chr) { c=(c&~CHAR)|chr; } inline cTeletextChar ToChar(unsigned char chr) { return cTeletextChar((c&~CHAR)|chr); } inline enumCharsets GetCharset() { return (enumCharsets)(c&CHARSET); } inline void SetCharset(enumCharsets charset) { c=(c&~CHARSET)|charset; } inline cTeletextChar ToCharset(enumCharsets charset) { return cTeletextChar((c&~CHARSET)|charset); } inline enumTeletextColor GetFGColor() { return (enumTeletextColor)((c&FGCOLOR) >> LowestSet32Bit(FGCOLOR)); } inline void SetFGColor(enumTeletextColor fgc) { c=(c&~FGCOLOR) | (fgc << LowestSet32Bit(FGCOLOR)); } inline cTeletextChar ToFGColor(enumTeletextColor fgc) { return cTeletextChar((c&~FGCOLOR) | (fgc << LowestSet32Bit(FGCOLOR))); } inline enumTeletextColor GetBGColor() { return (enumTeletextColor)((c&BGCOLOR) >> LowestSet32Bit(BGCOLOR)); } inline void SetBGColor(enumTeletextColor bgc) { c=(c&~BGCOLOR) | (bgc << LowestSet32Bit(BGCOLOR)); } inline cTeletextChar ToBGColor(enumTeletextColor bgc) { return cTeletextChar((c&~BGCOLOR) | (bgc << LowestSet32Bit(BGCOLOR))); } inline bool GetBoxedOut() { return c&BOXOUT; } inline void SetBoxedOut(bool BoxedOut) { c=(BoxedOut)?(c|BOXOUT):(c&~BOXOUT); } inline cTeletextChar ToBoxedOut(bool BoxedOut) { return cTeletextChar((BoxedOut)?(c|BOXOUT):(c&~BOXOUT)); } inline bool GetDirty() { return c&DIRTY; } inline void SetDirty(bool Dirty) { c=(Dirty)?(c|DIRTY):(c&~DIRTY); } inline cTeletextChar ToDirty(bool Dirty) { return cTeletextChar((Dirty)?(c|DIRTY):(c&~DIRTY)); } inline enumDblHeight GetDblHeight() { return (enumDblHeight)(c&DBLHEIGHT); } inline void SetDblHeight(enumDblHeight dh) { c=(c&~(DBLHEIGHT)) | dh; } inline cTeletextChar ToDblHeight(enumDblHeight dh) { return cTeletextChar((c&~(DBLHEIGHT)) | dh); } inline enumDblWidth GetDblWidth() { return (enumDblWidth)(c&DBLWIDTH); } inline void SetDblWidth(enumDblWidth dw) { c=(c&~(DBLWIDTH)) | dw; } inline cTeletextChar ToDblWidth(enumDblWidth dw) { return cTeletextChar((c&~(DBLWIDTH)) | dw); } inline bool GetConceal() { return c&CONCEAL; } inline void SetConceal(bool Conceal) { c=(Conceal)?(c|CONCEAL):(c&~CONCEAL); } inline cTeletextChar ToConceal(bool Conceal) { return cTeletextChar((Conceal)?(c|CONCEAL):(c&~CONCEAL)); } inline bool GetBlink() { return c&BLINK; } inline void SetBlink(bool Blink) { c=(Blink)?(c|BLINK):(c&~BLINK); } inline cTeletextChar ToBlink(bool Blink) { return cTeletextChar((Blink)?(c|BLINK):(c&~BLINK)); } bool operator==(cTeletextChar &chr) { return c==chr.c; } bool operator!=(cTeletextChar &chr) { return c!=chr.c; } }; class cRenderPage { // Abstraction of a 40x25 teletext character page // with all special attributes and colors // Additionally tracks changes by maintaining a // 'dirty' flag on each character protected: cTeletextChar Page[40][25]; int Flags; // 0x80 C4 - Erase page // 0x40 C5 - News flash // 0x20 C6 - Subtitle // 0x10 C7 - Suppress Header // 0x08 C8 - Update // 0x04 C9 - Interrupt Sequence // 0x02 C10 - Inhibit Display // 0x01 C11 - Magazine Serial mode int Lang; // 3-bit language number from header bool Dirty; // At least one character is dirty bool DirtyAll; // Consider all characters dirty, regardless of flag // Font Code pages int FirstG0CodePage; // 7-bit number, lower 3 bits ignored int SecondG0CodePage; // 7-bit number public: cRenderPage(); cTeletextChar GetChar(int x, int y) { // Read character content from page if (x<0 || x>=40 || y<0 || y>=25) { printf("Warning: out of bounds read access to teletext page\n"); return cTeletextChar(); } return Page[x][y].ToDirty(false); } bool IsDirty() { // global dirty status return Dirty; } bool IsDirty(int x, int y) { // local dirty status if (x<0 || x>=40 || y<0 || y>=25) { printf("Warning: out of bounds read access to teletext page\n"); return false; } return Page[x][y].GetDirty() | DirtyAll; } void MakeDirty(int x, int y) { // force one character dirty if (x<0 || x>=40 || y<0 || y>=25) { printf("Warning: out of bounds write access to teletext page\n"); return; } Page[x][y].SetDirty(true); Dirty=true; } void SetChar(int x, int y, cTeletextChar c) { // Set character at given location if (x<0 || x>=40 || y<0 || y>=25) { printf("Warning: out of bounds write access to teletext page\n"); return; } if (GetChar(x,y) != c) { Page[x][y]=c.ToDirty(true); Dirty=true; } } void ReadTeletextHeader(unsigned char *Header); // Read header from teletext page // Header must be a 12 bytes buffer void RenderTeletextCode(unsigned char *PageCode); // Interprete teletext code referenced by PageCode // and draw the whole page content into this object // PageCode must be a 40*24 bytes buffer }; #endif osdteletext-0.9.7/Makefile0000644000175000017500000000641312467431732015074 0ustar tobiastobias# # Makefile for a Video Disk Recorder plugin # # The official name of this plugin. # This name will be used in the '-P...' option of VDR to load the plugin. # By default the main source file also carries this name. PLUGIN = osdteletext ### The version number of this plugin (taken from the main source file): VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g') ### The directory environment: # Use package data if installed...otherwise assume we're under the VDR source directory: PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr)) LIBDIR = $(call PKGCFG,libdir) LOCDIR = $(call PKGCFG,locdir) PLGCFG = $(call PKGCFG,plgcfg) # TMPDIR ?= /tmp ### The compiler options: export CFLAGS = $(call PKGCFG,cflags) export CXXFLAGS = $(call PKGCFG,cxxflags) ### The version number of VDR's plugin API: APIVERSION = $(call PKGCFG,apiversion) ### Allow user defined options to overwrite defaults: -include $(PLGCFG) ### The name of the distribution archive: ARCHIVE = $(PLUGIN)-$(VERSION) PACKAGE = vdr-$(ARCHIVE) ### The name of the shared object file: SOFILE = libvdr-$(PLUGIN).so ### Includes and Defines (add further entries here): INCLUDES += DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' ### The object files (add further files here): OBJS = $(PLUGIN).o menu.o txtfont.o txtrecv.o txtrender.o displaybase.o display.o storage.o legacystorage.o packedstorage.o rootdir.o ### The main target: all: $(SOFILE) i18n ### Implicit rules: %.o: %.c $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $< ### Dependencies: MAKEDEP = $(CXX) -MM -MG DEPFILE = .dependencies $(DEPFILE): Makefile @$(MAKEDEP) $(CPPFLAGS) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ -include $(DEPFILE) ### Internationalization (I18N): PODIR = po I18Npo = $(wildcard $(PODIR)/*.po) I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file)))) I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file)))))) I18Npot = $(PODIR)/$(PLUGIN).pot %.mo: %.po msgfmt -c -o $@ $< $(I18Npot): $(wildcard *.c) xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='' -o $@ `ls $^` %.po: $(I18Npot) msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $< @touch $@ $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo install -D -m644 $< $@ .PHONY: i18n i18n: $(I18Nmo) $(I18Npot) install-i18n: $(I18Nmsgs) ### Targets: $(SOFILE): $(OBJS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@ install-lib: $(SOFILE) install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION) install: install-lib install-i18n dist: $(I18Npo) clean @-rm -rf $(TMPDIR)/$(ARCHIVE) @mkdir $(TMPDIR)/$(ARCHIVE) @cp -a * $(TMPDIR)/$(ARCHIVE) @tar czf $(PACKAGE).tgz -C $(TMPDIR) --exclude debian --exclude CVS --exclude .svn $(ARCHIVE) @-rm -rf $(TMPDIR)/$(ARCHIVE) @echo Distribution package created as $(PACKAGE).tgz clean: @-rm -f $(PODIR)/*.mo $(PODIR)/*.pot @-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ osdteletext-0.9.7/tables.h0000644000175000017500000001021611737124466015055 0ustar tobiastobias/* This file is copied from Ralph Metzler's vbidecode package. -*- c++ -*- */ /* tables.h - some data conversion tables for vbidecode */ #ifndef _TABLES_H #define _TABLES_H unsigned char invtab[256] = { 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff, }; unsigned char unhamtab[256] = { 0x01, 0xff, 0x81, 0x01, 0xff, 0x00, 0x01, 0xff, 0xff, 0x02, 0x01, 0xff, 0x0a, 0xff, 0xff, 0x07, 0xff, 0x00, 0x01, 0xff, 0x00, 0x80, 0xff, 0x00, 0x06, 0xff, 0xff, 0x0b, 0xff, 0x00, 0x03, 0xff, 0xff, 0x0c, 0x01, 0xff, 0x04, 0xff, 0xff, 0x07, 0x06, 0xff, 0xff, 0x07, 0xff, 0x07, 0x07, 0x87, 0x06, 0xff, 0xff, 0x05, 0xff, 0x00, 0x0d, 0xff, 0x86, 0x06, 0x06, 0xff, 0x06, 0xff, 0xff, 0x07, 0xff, 0x02, 0x01, 0xff, 0x04, 0xff, 0xff, 0x09, 0x02, 0x82, 0xff, 0x02, 0xff, 0x02, 0x03, 0xff, 0x08, 0xff, 0xff, 0x05, 0xff, 0x00, 0x03, 0xff, 0xff, 0x02, 0x03, 0xff, 0x03, 0xff, 0x83, 0x03, 0x04, 0xff, 0xff, 0x05, 0x84, 0x04, 0x04, 0xff, 0xff, 0x02, 0x0f, 0xff, 0x04, 0xff, 0xff, 0x07, 0xff, 0x05, 0x05, 0x85, 0x04, 0xff, 0xff, 0x05, 0x06, 0xff, 0xff, 0x05, 0xff, 0x0e, 0x03, 0xff, 0xff, 0x0c, 0x01, 0xff, 0x0a, 0xff, 0xff, 0x09, 0x0a, 0xff, 0xff, 0x0b, 0x8a, 0x0a, 0x0a, 0xff, 0x08, 0xff, 0xff, 0x0b, 0xff, 0x00, 0x0d, 0xff, 0xff, 0x0b, 0x0b, 0x8b, 0x0a, 0xff, 0xff, 0x0b, 0x0c, 0x8c, 0xff, 0x0c, 0xff, 0x0c, 0x0d, 0xff, 0xff, 0x0c, 0x0f, 0xff, 0x0a, 0xff, 0xff, 0x07, 0xff, 0x0c, 0x0d, 0xff, 0x0d, 0xff, 0x8d, 0x0d, 0x06, 0xff, 0xff, 0x0b, 0xff, 0x0e, 0x0d, 0xff, 0x08, 0xff, 0xff, 0x09, 0xff, 0x09, 0x09, 0x89, 0xff, 0x02, 0x0f, 0xff, 0x0a, 0xff, 0xff, 0x09, 0x88, 0x08, 0x08, 0xff, 0x08, 0xff, 0xff, 0x09, 0x08, 0xff, 0xff, 0x0b, 0xff, 0x0e, 0x03, 0xff, 0xff, 0x0c, 0x0f, 0xff, 0x04, 0xff, 0xff, 0x09, 0x0f, 0xff, 0x8f, 0x0f, 0xff, 0x0e, 0x0f, 0xff, 0x08, 0xff, 0xff, 0x05, 0xff, 0x0e, 0x0d, 0xff, 0xff, 0x0e, 0x0f, 0xff, 0x0e, 0x8e, 0xff, 0x0e, }; unsigned char cct2vtx_table[] = { 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0xef, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f }; #endif osdteletext-0.9.7/display.h0000644000175000017500000001045713244253751015252 0ustar tobiastobias/*************************************************************** -*- c++ -*- * * * display.h - Actual implementation of OSD display variants and * * Display:: namespace that encapsulates a single cDisplay. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * Changelog: * * 2005-03 initial version (c) Udo Richter * * * ***************************************************************************/ #ifndef OSDTELETEXT_DISPLAY_H_ #define OSDTELETEXT_DISPLAY_H_ #include "displaybase.h" #include namespace Display { // The Display:: namespace mainly encapsulates a cDisplay *display variable // and allows NULL-safe access to display members. // Additionally, selects via mode the actually used instance for *display. enum Mode { Full, HalfUpper, HalfLower }; // Full mode: 2BPP or 4BPP full screen display, depending on memory constrains // HalfUpper: 4BPP display of upper half, drop lower half if out of memory // HalfLower: 4BPP display of lower half, drop upper half if out of memory extern Mode mode; extern cDisplay *display; // Access to display mode: void SetMode(Display::Mode mode); inline void Delete() { if (display) { DELETENULL(display); } } void ShowUpperHalf(); // Make sure the upper half of screen is visible // eg. for entering numbers etc. // Wrapper calls for various *display members: inline bool GetBlink() { if (display) return display->GetBlink(); else return false; } inline bool SetBlink(bool blink) { if (display) display->SetBlink(blink); else return false; } inline bool GetConceal() { if (display) return display->GetConceal(); else return false; } inline bool SetConceal(bool conceal) { if (display) display->SetConceal(conceal); else return false; } inline cDisplay::enumZoom GetZoom() { if (display) return display->GetZoom(); else return cDisplay::Zoom_Off; } inline void SetZoom(cDisplay::enumZoom zoom) { if (display) display->SetZoom(zoom); } inline void SetBackgroundColor(tColor c) { if (display) display->SetBackgroundColor(c); } inline tColor GetBackgroundColor() { if (display) return display->GetBackgroundColor(); else return 0; } inline void HoldFlush() { if (display) display->HoldFlush(); } inline void ReleaseFlush() { if (display) display->ReleaseFlush(); } inline void RenderTeletextCode(unsigned char *PageCode) { if (display) display->RenderTeletextCode(PageCode); } inline void DrawClock() { if (display) display->DrawClock(); } inline void DrawPageId(const char *text) { if (display) display->DrawPageId(text); } inline void DrawMessage(const char *txt) { if (display) display->DrawMessage(txt); } inline void ClearMessage() { if (display) display->ClearMessage(); } } class cDisplay32BPP : public cDisplay { // True Color OSD display // No need for color mapping // Uses cPixmap instead of cBitmap public: cDisplay32BPP(int x0, int y0, int width, int height); }; class cDisplay32BPPHalf : public cDisplay { // 32BPP (true color) OSD display with auto size reduction on memory constrains // Automatically tries to make visible area as big as possible // No need for color mapping bool Upper; // Prefer to show upper half or lower half? int OsdX0,OsdY0; // Needed to re-initialize osd public: cDisplay32BPPHalf(int x0, int y0, int width, int height, bool upper); bool GetUpper() { return Upper; } void SetUpper(bool upper) { if (Upper!=upper) { Upper=upper; InitOSD(); } } protected: void InitOSD(); }; #endif osdteletext-0.9.7/rootdir.h0000644000175000017500000000156712117130631015256 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef __ROOTDIR_H #define __ROOTDIR_H class RootDir { public: static void setRootDir(const char *); static const char *getRootDir(); protected: static const char *root; }; #endif osdteletext-0.9.7/README0000644000175000017500000001272713244332100014300 0ustar tobiastobiasThis is a "plugin" for the Video Disk Recorder (VDR). Written by: Marcel Wiesweg Project's homepage: http://www.wiesweg-online.de/linux/vdr Latest version available at: http://projects.vdr-developer.org/projects/show/plg-osdteletext See the file COPYING for license information. Alistair Buxtons bitmap2ttf (https://github.com/ali1234/bitmap2ttf) was used to create teletext2.ttf from tv-fonts 1.1 (c) 2002 Gerd Knorr (https://www.kraxel.org/releases/tv-fonts/). The original fonts are public domain. Description: Osd-Teletext displays the teletext directly on the OSD. Installation: You need to install the teletext2.ttf font in order to render special graphics characters properly. Usage: Keys: 1,...,9: insert page number Up: page+ Down: page- Right: sub page+ Left: sub page- Back: close teletext plugin All other user interaction ("Actions") is configurably assigned to the other available keys. You can e.g. configure that you jump to page 100 when you press Red. In this example, the Action "Jump to 100" is assigned to key "Red". Have a look at the plugin's setup page to learn the current assignment and adapt it to your needs. Available Keys: Blue, Red, Yellow, Green, Play, Stop, FastFwd, FastRwd Actions: "Zoom", "Half page", "Switch channel", "Switch background", "Jump to..." a specific page. Description of the actions: Zoom: Zoom to upper half/lower half/back to full page Half Page: Reduce OSD window to the lower half of the screen and display upper half/lower half/back to full size Switch channel:Show pages of a channel different from the one currently tuned to. This does _not_ include any tuning or channel switching with vdr's core. You must have tuned to the channel chosen some time before so that the pages have been stored on disk. When you press the key associated with that action, you are asked for the channel number. Press OK after you entered it with the number keys. Jump to...: Jumps to the page you configure. Switch background: Toggles background transparency between a value configured in setup, fully black, and fully transparent. How to configure the key bindings: In the plugins setup menu, you can assign one of actions to each key. You can choose freely which actions you need, you are not forced to assign an action to a key at all if you do not need it. If you select "Jump to...", specify the page number in the line immediately below. Other Setup options: Background transparency: number between 0 (transparent) and 255 (black). Default is 127 (also used by VDR) Show Clock: Toggles whether an additional clock is drawn approximately every second. The clock shows the current system time, not any time broadcast via teletext. Let VDR set the system time from a transponder to have the exact time. Auto-update pages: Continuously checks whether a page has changed and updates it if yes. OSD width, OSD height: Adjusts the width and height of the OSD independent from VDR's settings. The valid range is 40 to 56 for the width and 12 to 21 for the height. Minimum user inactivity: Sets a timeout (in minutes) for user inactivity. When this timespan has elapsed and the user did not press any keys, the plugin will be closed. Set to 0 to disable this. Note that disabling timeout will also effectively disable VDR's auto-shutdown feature as long as the plugin is active. Key bindings: See above. Command line options: A few settings are given on the command line rather than in the setup menu. Available options: -d --directory=DIR The directory where the temporary files will be stored. (default: /var/cache/vdr/vtx) Ensure that the directory exists and is writable. -n --max-cache=NUM Maximum size in megabytes of cache used to store the pages on the harddisk. (default: a calculated value below 50 MB) -s --cache-system=SYS Set the cache system to be used. Choose "legacy" for the traditional one-file-per-page system. Default is "packed" for the one-file-for-a-few-pages system. -t --toptext Store top text pages at cache. (unviewable pages) Colors: On all sorts of output devices which are not limited as to color depth the original teletext colors will be displayed. (Only difference: Cyan is used instead of white to make reading easier). On the classic full-featured DVB card and other limited devices, the colors will be reduced to four. The mapping is currently optimized for German ARD, ZDF and RTL. If you are for some reason really and definitely not satisfied with my choices, edit colormapping.h and recompile. osdteletext-0.9.7/legacystorage.h0000644000175000017500000000277112117130631016423 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef __LEGACYSTORAGE_H #define __LEGACYSTORAGE_H #include "storage.h" class LegacyStorage : public Storage { private: void initMaxStorage(int maxMB=-1); public: LegacyStorage(int maxMB); virtual ~LegacyStorage(); virtual void cleanUp(); virtual StorageHandle openForWriting(PageID page); virtual StorageHandle openForReading(PageID page, bool countAsAccess); virtual ssize_t write(const void *ptr, size_t size, StorageHandle stream); virtual ssize_t read(void *ptr, size_t size, StorageHandle stream) { return ::read((int)stream, ptr, size); } virtual void close(StorageHandle stream) { ::close((int)stream); } protected: void registerFile(PageID page); virtual int actualFileSize(int netFileSize); //int maxPages; long maxBytes; int fsBlockSize; int pageBytes; }; #endif osdteletext-0.9.7/txtfont.c0000644000175000017500000062410613244332173015304 0ustar tobiastobias// -*- c++ -*- #include "txtfont.h" unsigned int TXT_Mask[11]= { 0x0000, // ************ **** 0x39C0, // **###**###** **** 0x39C0, // **###**###** **** 0x0000, // ************ **** 0x39C0, // **###**###** **** 0x39C0, // **###**###** **** 0x0000, // ************ **** 0x39C0, // **###**###** **** 0x39C0, // **###**###** **** 0x0000 // ************ **** }; unsigned int TXT_Font[][11]= { { // 0x20 = Leerzeichen 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x21 = ! 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x22 = " 0x0000, // ************ **** 0x39C0, // **###**###** **** 0x18C0, // ***##***##** **** 0x3180, // **##***##*** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x23 = # = NC 0x0000, // ************ **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x0000 // ************ **** }, { // 0x24 = $ = NC 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x6660, // *##**##**##* **** 0x6600, // *##**##***** **** 0x3FC0, // **########** **** 0x0660, // *****##**##* **** 0x6660, // *##**##**##* **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0000, // ************ **** }, { // 0x25 = % 0x0000, // ************ **** 0x70C0, // *###****##** **** 0xD980, // ##*##**##*** **** 0x7300, // *###**##**** **** 0x0600, // *****##***** **** 0x0CE0, // ****##**###* **** 0x19B0, // ***##**##*## **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x26 = & 0x0000, // ************ **** 0x1E00, // ***####***** **** 0x3300, // **##**##**** **** 0x3300, // **##**##**** **** 0x1E00, // ***####***** **** 0x3330, // **##**##**## **** 0x61C0, // *##****###** **** 0x3F30, // **######**## **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x27 = ' 0x0000, // ************ **** 0x0700, // *****###**** **** 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x28 = ( 0x0000, // ************ **** 0x0700, // *****###**** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** 0x1800, // ***##******* **** 0x1800, // ***##******* **** 0x0C00, // ****##****** **** 0x0700, // *****###**** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x29 = ) 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0300, // ******##**** **** 0x0180, // *******##*** **** 0x0180, // *******##*** **** 0x0180, // *******##*** **** 0x0300, // ******##**** **** 0x0E00, // ****###***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2A = * 0x0000, // ************ **** 0x0600, // *****##***** **** 0x6660, // *##**##**##* **** 0x36C0, // **##*##*##** **** 0x0F00, // ****####**** **** 0x36C0, // **##*##*##** **** 0x6660, // *##**##**##* **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2B = + 0x0000, // ************ **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2C = , 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3800, // **###******* **** 0x1800, // ***##******* **** 0x3000, // **##******** **** }, { // 0x2D = - 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2E = . 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1800, // ***##******* **** 0x1800, // ***##******* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2F = / 0x0000, // ************ **** 0x00C0, // ********##** **** 0x0180, // *******##*** **** 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x30 = 0 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x31 = 1 0x0000, // ************ **** 0x0700, // *****###**** **** 0x1F00, // ***#####**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x32 = 2 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x30E0, // **##****###* **** 0x00E0, // ********###* **** 0x01C0, // *******###** **** 0x0780, // *****####*** **** 0x1E00, // ***####***** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x33 = 3 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x00C0, // ********##** **** 0x0080, // *******##*** **** 0x07E0, // *****######* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x34 = 4 0x0000, // ************ **** 0x00E0, // ********###* **** 0x03C0, // ******####** **** 0x0700, // *****###**** **** 0x1C00, // ***###****** **** 0x38E0, // **###***###* **** 0x3FE0, // **#########* **** 0x00E0, // ********###* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x35 = 5 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x00E0, // ********###* **** 0x30E0, // **##****###* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x36 = 6 0x0000, // ************ **** 0x0700, // *****###**** **** 0x0E00, // ****###***** **** 0x1C00, // ***###****** **** 0x3FC0, // **########** **** 0x3860, // **###****##* **** 0x3860, // **###****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x37 = 7 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x01C0, // *******###** **** 0x0380, // ******###*** **** 0x0700, // *****###**** **** 0x0E00, // ****###***** **** 0x1C00, // ***###****** **** 0x3800, // **###******* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x38 = 8 0x0000, // ************ **** 0x0F80, // ****#####*** **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x0F80, // ****#####*** **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x0F80, // ****#####*** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x39 = 9 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x30E0, // **##****###* **** 0x30E0, // **##****###* **** 0x1FC0, // ***#######** **** 0x0380, // ******###*** **** 0x0700, // *****###**** **** 0x0E00, // ****###***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3A = : 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3B = ; 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** }, { // 0x3C = < 0x0000, // ************ **** 0x00E0, // ********###* **** 0x0380, // ******###*** **** 0x0E00, // ****###***** **** 0x3800, // **###******* **** 0x0E00, // ****###***** **** 0x0380, // ******###*** **** 0x00E0, // ********###* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3D = = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3E = > 0x0000, // ************ **** 0x7000, // *###******** **** 0x1C00, // ***###****** **** 0x0700, // *****###**** **** 0x01C0, // *******###** **** 0x0700, // *****###**** **** 0x1C00, // ***###****** **** 0x7000, // *###******** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3F = ? 0x0000, // ************ **** 0x1F80, // ***######*** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x0180, // *******##*** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x40 = § = NC 0x0000, // ************ **** 0x1F80, // ***######*** **** 0x30C0, // **##****##** **** 0x3000, // **##******** **** 0x1F80, // ***######*** **** 0x30C0, // **##****##** **** 0x1F80, // ***######*** **** 0x00C0, // ********##** **** 0x30C0, // **##****##** **** 0x1F80 // ***######*** **** }, { // 0x41 = A 0x0000, // ************ **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x30C0, // **##****##** **** 0x6060, // *##******##* **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x42 = B 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x43 = C 0x0000, // ************ **** 0x0FC0, // ****######** **** 0x1860, // ***##****##* **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x1860, // ***##****##* **** 0x0FC0, // ****######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x44 = D 0x0000, // ************ **** 0x3F80, // **#######*** **** 0x30C0, // **##****##** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x30C0, // **##****##** **** 0x3F80, // **#######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x45 = E 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3F80, // **#######*** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x46 = F 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3F80, // **#######*** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x47 = G 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x33E0, // **##**#####* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x48 = H 0x0000, // ************ **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x49 = I 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4A = J 0x0000, // ************ **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4B = K 0x0000, // ************ **** 0x30E0, // **##****###* **** 0x3180, // **##***##*** **** 0x3700, // **##*###**** **** 0x3C00, // **####****** **** 0x3700, // **##*###**** **** 0x3180, // **##***##*** **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4C = L 0x0000, // ************ **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4D = M 0x0000, // ************ **** 0x70E0, // *###****###* **** 0x79E0, // *####**####* **** 0x6F60, // *##*####*##* **** 0x6660, // *##**##**##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4E = N 0x0000, // ************ **** 0x7060, // *###*****##* **** 0x7860, // *####****##* **** 0x6C60, // *##*##***##* **** 0x6660, // *##**##**##* **** 0x6360, // *##***##*##* **** 0x61E0, // *##****####* **** 0x60E0, // *##*****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4F = O 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x50 = P 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x51 = Q 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3360, // **##**##*##* **** 0x1FC0, // ***#######** **** 0x0180, // *******##*** **** 0x00E0 // ********###* **** }, { // 0x52 = R 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x3300, // **##**##**** **** 0x31C0, // **##***###** **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x53 = S 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x54 = T 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x55 = U 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x56 = V 0x0000, // ************ **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x1980, // ***##**##*** **** 0x0F00, // ****####**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x57 = W 0x0000, // ************ **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6F60, // *##*####*##* **** 0x39C0, // **###**###** **** 0x30C0, // **##****##** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x58 = X 0x0000, // ************ **** 0x30C0, // **##****##** **** 0x1980, // ***##**##*** **** 0x0F00, // ****####**** **** 0x0600, // *****##***** **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x30C0, // **##****##** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x59 = Y 0x0000, // ************ **** 0x6060, // *##******##* **** 0x30C0, // **##****##** **** 0x1980, // ***##**##*** **** 0x0F00, // ****####**** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5A = Z 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0180, // *******##*** **** 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5B = Ä = NC 0x18C0, // ***##***##** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5C = Ö = NC 0x18C0, // ***##***##** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5D = Ü = NC 0x18C0, // ***##***##** **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5E = ^ = NC 0x0600, // *****##***** **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x30C0, // **##****##** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5F = _ = NC 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x7FE0 // *##########* **** }, { // 0x60 = ° = NC 0x0000, // ************ **** 0x0000, // *****####*** **** 0x0000, // ****##**##** **** 0x0000, // *****####*** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x61 = a 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x7F80, // *########*** **** 0x00C0, // ********##** **** 0x3FC0, // **########** **** 0x60C0, // *##*****##** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x62 = b 0x0000, // ************ **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x37C0, // **##*#####** **** 0x3860, // **###****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x63 = c 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0FE0, // ****#######* **** 0x1800, // ***##******* **** 0x3000, // **##******** **** 0x1800, // ***##******* **** 0x0FE0, // ****#######* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x64 = d 0x0000, // ************ **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x1F60, // ***#####*##* **** 0x30E0, // **##****###* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FE0, // ***########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x65 = e 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x66 = f 0x0000, // ************ **** 0x07E0, // *****######* **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x3F80, // **#######*** **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x67 = g 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1F60, // ***#####*##* **** 0x30E0, // **##****###* **** 0x3060, // **##*****##* **** 0x30E0, // **##****###* **** 0x1F60, // ***#####*##* **** 0x0060, // *********##* **** 0x1FC0 // ***#######** **** }, { // 0x68 = h 0x0000, // ************ **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x37C0, // **##*#####** **** 0x3860, // **###****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x69 = i 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x1F80, // ***######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6A = j 0x0000, // ************ **** 0x00E0, // ********###* **** 0x0000, // ************ **** 0x01E0, // *******####* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x3060, // **##*****##* **** 0x1FC0 // ***#######** **** }, { // 0x6B = k 0x0000, // ************ **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x30E0, // **##****###* **** 0x3180, // **##***##*** **** 0x3E00, // **#####***** **** 0x3180, // **##***##*** **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6C = l 0x0000, // ************ **** 0x1E00, // ***####***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6D = m 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x6DC0, // *##*##*###** **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6E = n 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x37C0, // **##*#####** **** 0x3860, // **###****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6F = o 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x70 = p 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x37C0, // **##*#####** **** 0x3860, // **###****##* **** 0x3060, // **##*****##* **** 0x3860, // **###****##* **** 0x37C0, // **##*#####** **** 0x3000, // **##******** **** 0x3000 // **##******** **** }, { // 0x71 = q 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1EC0, // ***####*##** **** 0x31C0, // **##***###** **** 0x30C0, // **##****##** **** 0x31C0, // **##***###** **** 0x1EC0, // ***####*##** **** 0x00C0, // ********##** **** 0x01E0 // *******####* **** }, { // 0x72 = r 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x33E0, // **##**#####* **** 0x3C00, // **####****** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x73 = s 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0060, // *********##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x74 = t 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x3F80, // **#######*** **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x07E0, // *****######* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x75 = u 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x30E0, // **##****###* **** 0x1F60, // ***#####*##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x76 = v 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x6060, // *##******##* **** 0x30C0, // **##****##** **** 0x1980, // ***##**##*** **** 0x0F00, // ****####**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x77 = w 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x6060, // *##******##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x36C0, // **##*##*##** **** 0x2980, // ***##**##*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x78 = x 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x70E0, // *###****###* **** 0x1980, // ***##**##*** **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x70E0, // *###****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x79 = y 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x18C0, // ***##***##** **** 0x0D80, // ****##*##*** **** 0x0700, // *****###**** **** 0x0600, // *****##***** **** 0x0C00, // ****##****** **** 0x3800 // **###******* **** }, { // 0x7A = z 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x0180, // *******##*** **** 0x0700, // *****###**** **** 0x0C00, // ****##****** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7B = ä = NC 0x0000, // ************ **** 0x3180, // **##***##*** **** 0x0000, // ************ **** 0x7F80, // *########*** **** 0x00C0, // ********##** **** 0x3FC0, // **########** **** 0x60C0, // *##*****##** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7C = ö = NC 0x0000, // ************ **** 0x18C0, // ***##***##** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7D = ü = NC 0x0000, // ************ **** 0x10C0, // ***##***##** **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x30E0, // **##****###* **** 0x1F60, // ***#####*##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7E = ß = NC 0x0000, // ************ **** 0x0F80, // ****#####*** **** 0x18C0, // ***##***##** **** 0x30C0, // **##****##** **** 0x3380, // **##**###*** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x33C0, // **##**####** **** 0x3000, // **##******** **** 0x3000 // **##******** **** }, { // 0x7F = Block 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x80 = 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x63E0, // *##***#####* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x63E0, // *##***#####* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000 // ************ **** }, { // 0x81 = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFFF0, // ############ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x82 = 0x0000, // ************ **** 0x3000, // **##******** **** 0x7000, // *###******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3180, // **##***##*** **** 0x0300, // ******##**** **** 0x0660, // *****##**##* **** 0x07E0, // *****######* **** 0x0060 // *********##* **** }, { // 0x83 = 0x0000, // ************ **** 0x0FC0, // ****######** **** 0x1860, // ***##****##* **** 0x0C00, // ****##****** **** 0x3F00, // **######**** **** 0x0C00, // ****##****** **** 0x3E60, // **#####**##* **** 0x33C0, // **##**####** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x84 = 0x0700, // *****###**** **** 0x0D80, // ****##*##*** **** 0x0700, // *****###**** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x30E0, // **##****###* **** 0x1F60, // ***#####*##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x85 = 0x06C0, // *****##*##** **** 0x0380, // ******###*** **** 0x0000, // ************ **** 0x0FE0, // ****#######* **** 0x1800, // ***##******* **** 0x3000, // **##******** **** 0x1800, // ***##******* **** 0x0FE0, // ****#######* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x86 = 0x0D80, // ****##*##*** **** 0x0700, // *****###**** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0060, // *********##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x87 = 0x0D80, // ****##*##*** **** 0x0700, // *****###**** **** 0x0000, // ************ **** 0x33E0, // **##**#####* **** 0x3C00, // **####****** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x88 = 0x0000, // ************ **** 0x3980, // ***##**##*** **** 0x3980, // ***##**##*** **** 0x3980, // ***##**##*** **** 0x3980, // ***##**##*** **** 0x3980, // ***##**##*** **** 0x3980, // ***##**##*** **** 0x3980, // ***##**##*** **** 0x3980, // ***##**##*** **** 0x0000 // ************ **** }, { // 0x89 = 0x0000, // ************ **** 0x7C00, // *#####****** **** 0x0C00, // ****##****** **** 0x3800, // **###******* **** 0x0C00, // ****##****** **** 0x7980, // *####**##*** **** 0x0300, // ******##**** **** 0x0660, // *****##**##* **** 0x07E0, // *****######* **** 0x0060 // *********##* **** }, { // 0x8A = 0x0000, // ************ **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x8B = 0x0000, // ************ **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x1C00, // ***###****** **** 0x7FF0, // *########### **** 0x1C00, // ***###****** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x8C = 0x0000, // ************ **** 0x3000, // **##******** **** 0x7000, // *###******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x33C0, // **##**####** **** 0x0660, // *****##**##* **** 0x00C0, // ********##** **** 0x0300, // ******##**** **** 0x07E0 // *****######* **** }, { // 0x8D = 0x0000, // ************ **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0380, // ******###*** **** 0xFFE0, // ###########* **** 0x0380, // ******###*** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x8E = 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0F00, // ****####**** **** 0x1F80, // ***######*** **** 0x36C0, // **##*##*##** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600 // *****##***** **** }, { // 0x8F = 0x0D80, // ****##*##*** **** 0x0700, // *****###**** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x90 = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3F80, // **#######*** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x91 = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x92 = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x18C0, // ***##***##** **** 0x0D80, // ****##*##*** **** 0x0700, // *****###**** **** 0x0600, // *****##***** **** 0x0C00, // ****##****** **** 0x3800 // **###******* **** }, { // 0x93 = 0x0D80, // ****##*##*** **** 0x0700, // *****###**** **** 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x0180, // *******##*** **** 0x0700, // *****###**** **** 0x0C00, // ****##****** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x94 = 0x0000, // ************ **** 0x6060, // *##******##* **** 0x30C0, // **##****##** **** 0x1F80, // ***######*** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x1F80, // ***######*** **** 0x30C0, // **##****##** **** 0x6060, // *##******##* **** 0x0000 // ************ **** }, { // 0x95 = 0x001B, // *******##*## **** 0x0C0E, // ****##**###* **** 0x0C00, // ****##****** **** 0x3F80, // **#######*** **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x07E0, // *****######* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x96 = 0xFFC0, // ##########** **** 0x0060, // *********##* **** 0x3E30, // **#####***## **** 0x4730, // *#***###**## **** 0x4730, // *#***###**## **** 0x7F30, // *#######**## **** 0x3E30, // **#####***## **** 0x0060, // *********##* **** 0xFFC0, // ##########** **** 0x0000 // ************ **** }, { // 0x97 = 0xFFC0, // ##########** **** 0x0860, // ****#****##* **** 0x1C30, // ***###****## **** 0x0030, // **********## **** 0x7F30, // *#######**## **** 0x0030, // **********## **** 0x1C30, // ***###****## **** 0x0860, // ****#****##* **** 0xFFC0, // ##########** **** 0x0000 // ************ **** }, { // 0x98 = 0x0000, // ************ **** 0x18C0, // ***##***##** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x99 = 0x0E00, // ****###***** **** 0x1B00, // ***##*##**** **** 0x0E00, // ****###***** **** 0x7F80, // *########*** **** 0x00C0, // ********##** **** 0x3FC0, // **########** **** 0x60C0, // *##*****##** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x9A = 0x0000, // ************ **** 0x18C0, // ***##***##** **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x30E0, // **##****###* **** 0x1F60, // ***#####*##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x9B = 0x18C0, // ***##***##** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x9C = 0x18C0, // ***##***##** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x9D = 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x9E = 0x18C0, // ***##***##** **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x9F = _ 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x7FE0 // *##########* **** }, { // 0xA0 = 0x20a 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xA1 = 0x21a 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xA2 = 0x22a 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xA3 = 0x23a 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xA4 = 0x24a 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xA5 = 0x25a 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xA6 = 0x26a 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ ****11 }, { // 0xA7 = 0x27a 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xA8 = 0x28a 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xA9 = 0x29a 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xAA = 0x2Aa 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xAB = 0x2Ba 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xAC = 0x2Ca 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xAD = 0x2Da 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xAE = 0x2Ea 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xAF = 0x2Fa 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xB0 = 0x30a 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xB1 = 0x31a 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xB2 = 0x32a 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xB3 = 0x33a 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xB4 = 0x34a 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xB5 = 0x35a 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xB6 = 0x36a 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xB7 = 0x37a 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xB8 = 0x38a 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xB9 = 0x39a 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xBA = 0x3Aa 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xBB = 0x3Bb 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xBC = 0x3Ca 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xBD = 0x3Da 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xBE = 0x3Ea 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xBF = 0x3Fa 0xFFFF, // ############ **** 0xFFFF, // ############ **** 0xFFFF, // ############ **** 0xFFFF, // ############ **** 0xFFFF, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00 // ######****** **** }, { // 0xC0 = 0x0600, // *****##***** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x6060, // *##******##* **** 0x7FE0, // *##########* **** 0x6000, // *##********* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xC1 = 0x0600, // *****##***** **** 0x0300, // ******##**** **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x30E0, // **##****###* **** 0x1F60, // ***#####*##* **** 0x0000 // ************ **** }, { // 0xC2 = 0x0C00, // ****##****** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x7F80, // *########*** **** 0x00C0, // ********##** **** 0x3FC0, // **########** **** 0x60C0, // *##*****##** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xC3 = 0x0000, // ************ **** 0x0FC0, // ****######** **** 0x1860, // ***##****##* **** 0x0C00, // ****##****** **** 0x3F00, // **######**** **** 0x0C00, // ****##****** **** 0x3E60, // **#####**##* **** 0x33C0, // **##**####** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xC4 = 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x6660, // *##**##**##* **** 0x6600, // *##**##***** **** 0x3FC0, // **########** **** 0x0660, // *****##**##* **** 0x6660, // *##**##**##* **** 0x3F60, // **########** **** 0x06C0, // *****##***** **** 0x0000 // ************ **** }, { // 0xC5 = 0x3CC0, // **####**##** **** 0x6780, // *##**####*** **** 0x0000, // ************ **** 0x7F80, // *########*** **** 0x00C0, // ********##** **** 0x3FC0, // **########** **** 0x60C0, // *##*****##** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xC6 = 0x3C60, // **####***##* **** 0x67C0, // *##**#####** **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xC7 = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xC8 = 0x0600, // *****##***** **** 0x0300, // ******##**** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xC9 = 0x0600, // *****##***** **** 0x0300, // ******##**** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xCA = 0x0C00, // ****##****** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x1F80, // ***######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xCB = 0x0000, // ************ **** 0x0780, // *****####*** **** 0x0CC0, // ****##**##** **** 0x0780, // *****####*** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xCC = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0FE0, // ****#######* **** 0x1800, // ***##******* **** 0x3000, // **##******** **** 0x1800, // ***##******* **** 0x0FE0, // ****#######* **** 0x0300, // ******##**** **** 0x0E00 // ****###***** **** }, { // 0xCD = 0x0000, // ************ **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0310, // ******###*** **** 0xFFE0, // ###########* **** 0x0310, // ******###*** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xCE = 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0F00, // ****####**** **** 0x1F80, // ***######*** **** 0x36C0, // **##*##*##** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600 // *****##***** **** }, { // 0xCF = 0x0000, // ************ **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x0000 // ************ **** }, { // 0xD0 = 0x0C00, // ****##****** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x7F80, // *########*** **** 0x00C0, // ********##** **** 0x3FC0, // **########** **** 0x60C0, // *##*****##** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xD1 = 0x0600, // *****##***** **** 0x0300, // ******##**** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xD2 = 0x0E00, // ****###***** **** 0x1B00, // ***##*##**** **** 0x0000, // ************ **** 0x7F80, // *########*** **** 0x00C0, // ********##** **** 0x3FC0, // **########** **** 0x60C0, // *##*****##** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xD3 = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xD4 = 0x0000, // ************ **** 0x1980, // ***##**##*** **** 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x1F80, // ***######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xD5 = 0x1E60, // ***####**##* **** 0x33C0, // **##**####** **** 0x1F80, // ***######*** **** 0x30C0, // **##****##** **** 0x6060, // *##******##* **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xD6 = 0x1E60, // ***####**##* **** 0x33C0, // **##**####** **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xD7 = 0x0000, // ************ **** 0x0FC0, // ****######** **** 0x1860, // ***##****##* **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x1860, // ***##****##* **** 0x0FC0, // ****######** **** 0x0300, // ******##**** **** 0x0E00 // ****###***** **** }, { // 0xD8 = 0x0700, // *****###**** **** 0x0D80, // ****##*##*** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xD9 = 0x0700, // *****###**** **** 0x0D80, // ****##*##*** **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x30E0, // **##****###* **** 0x1F60, // ***#####*##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xDA = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0FE0, // ****#######* **** 0x1800, // ***##******* **** 0x3000, // **##******** **** 0x1800, // ***##******* **** 0x0FE0, // ****#######* **** 0x0300, // ******##**** **** 0x0E00 // ****###***** **** }, { // 0xDB = 0x0000, // ************ **** 0x18C0, // ***##***##** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xDC = 0x0700, // *****###**** **** 0x0D80, // ****##*##*** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xDD = 0x0600, // *****##***** **** 0x0300, // ******##**** **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x30E0, // **##****###* **** 0x1F60, // ***#####*##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xDE = 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x1F80, // ***######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xDF = 0x0000, // ************ **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x0000 // ************ **** }, { // 0xE0 = 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xE1 = 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x1800, // ***##******* **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x1F00, // ***######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xE2 = 0x0000, // ************ **** 0x18C0, // ***##***##** **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x30E0, // **##****###* **** 0x1F60, // ***#####*##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xE3 = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0FE0, // ****#######* **** 0x1800, // ***##******* **** 0x3000, // **##******** **** 0x1800, // ***##******* **** 0x0FE0, // ****#######* **** 0x0300, // ******##**** **** 0x0E00 // ****###***** **** }, { // 0xE4 = 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x6660, // *##**##**##* **** 0x6600, // *##**##***** **** 0x3FC0, // **########** **** 0x0660, // *****##**##* **** 0x6660, // *##**##**##* **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0000 // ************ **** }, { // 0xE5 = 0x0000, // ************ **** 0x3F80, // **#######*** **** 0x6180, // *##****##*** **** 0x6180, // *##****##*** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xE6 = 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xE7 = 0x1E60, // ***####**##* **** 0x33C0, // **##**####** **** 0x3860, // **###****##* **** 0x3C60, // **####***##* **** 0x3660, // **##*##**##* **** 0x3360, // **##**##*##* **** 0x31E0, // **##***####* **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xE8 = 0x1E60, // ***####**##* **** 0x33C0, // **##**####** **** 0x0000, // ************ **** 0x37C0, // **##*#####** **** 0x3860, // **###****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xE9 = 0x0600, // *****##***** **** 0x0300, // ******##**** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xEA = 0x0C00, // ****##****** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x7F80, // *########*** **** 0x00C0, // ********##** **** 0x3FC0, // **########** **** 0x60C0, // *##*****##** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xEB = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x7F80, // *########*** **** 0x00C0, // ********##** **** 0x3FC0, // **########** **** 0x60C0, // *##*****##** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xEC = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xED = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x1F80, // ***######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xEE = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xEF = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x30E0, // **##****###* **** 0x1F60, // ***#####*##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xF0 = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xF1 = 0x0C00, // ****##****** **** 0x0600, // *****##***** **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xF2 = 0x0C00, // ****##****** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3F00, // **######**** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xF3 = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xF4 = 0x19C0, // ***##**##*** **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xF5 = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xF6 = 0x0600, // *****##***** **** 0x0300, // ******##**** **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xF7 = 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xF8 = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3DC0, // **####*###** **** 0x0660, // *****##**##* **** 0x3FE0, // **#########* **** 0x6600, // *##**##***** **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xF9 = 0x0000, // ************ **** 0x0FE0, // ****#######* **** 0x1B00, // ***##*##**** **** 0x3300, // **##**##**** **** 0x7FC0, // *#########** **** 0x6300, // *##***##**** **** 0x6300, // *##***##**** **** 0x63E0, // *##***#####* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xFA = 0x0000, // ************ **** 0x0300, // ******##**** **** 0x0FC0, // ****######** **** 0x0180, // *******##*** **** 0x1FC0, // ***#######** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x1F80, // ***######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xFB = 0x0000, // ************ **** 0x3F80, // **#######*** **** 0x30C0, // **##****##** **** 0x3060, // **##*****##* **** 0x7C60, // *#####***##* **** 0x3060, // **##*****##* **** 0x30C0, // **##****##** **** 0x3F80, // **#######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0xFC = 0x0000, // ************ **** 0x0000, // ************ **** 0x0180, // *******##*** **** 0x3FC0, // **########** **** 0x6360, // *##***##*##* **** 0x6660, // *##**##**##* **** 0x6C60, // *##*##***##* **** 0x3FC0, // **########** **** 0x1800, // ***##******* **** 0x0000 // ************ **** }, { // 0xFD = 0x0060, // *********##* **** 0x3FC0, // **########** **** 0x61E0, // *##****####* **** 0x6360, // *##***##*##* **** 0x6660, // *##**##**##* **** 0x6C60, // *##*##***##* **** 0x7860, // *####****##* **** 0x3FC0, // **########** **** 0x6000, // *##********* **** 0x0000 // ************ **** }, { // 0xFE = 0x0000, // ************ **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3F80, // **#######*** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x3F80, // **#######*** **** 0x3000, // **##******** **** 0x3000 // **##******** **** }, { // 0xFF = 0x3C00, // **####****** **** 0x1800, // ***##******* **** 0x1F80, // ***######*** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x1F80, // ***######*** **** 0x1800, // ***##******* **** 0x3C00, // **####****** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x60a = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x61a = 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x62a = 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x63a = 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x64a = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x65a = 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x66a = 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x67a = 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x68a = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x69a = 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x6Aa = 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x6Ba = 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x6Ca = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x6Da = 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x6Ea = 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x6Fa = 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0 // ******###### **** }, { // 0x70a = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x71a = 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x72a = 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x73a = 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x74a = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x75a = 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x76a = 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x77a = 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x78a = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x79a = 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x7Aa = 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x7Ba = 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x7Ca = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x7Da = 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFC00, // ######****** **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x7Ea = 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0x03F0, // ******###### **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0 // ############ **** }, { // 0x7Fa = 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** 0xFFF0, // ############ **** } }; unsigned int TXT_Font_Cyrillic[][11]= { // Serbian/Croatian { // 0x20 = Leerzeichen 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x21 = ! 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x22 = " 0x0000, // ************ **** 0x39C0, // **###**###** **** 0x18C0, // ***##***##** **** 0x3180, // **##***##*** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x23 = # = NC 0x0000, // ************ **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x0000 // ************ **** }, { // 0x24 = $ = NC 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x6660, // *##**##**##* **** 0x6600, // *##**##***** **** 0x3FC0, // **########** **** 0x0660, // *****##**##* **** 0x6660, // *##**##**##* **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0000, // ************ **** }, { // 0x25 = % 0x0000, // ************ **** 0x70C0, // *###****##** **** 0xD980, // ##*##**##*** **** 0x7300, // *###**##**** **** 0x0600, // *****##***** **** 0x0CE0, // ****##**###* **** 0x19B0, // ***##**##*## **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x26 = & 0x0000, // ************ **** 0x1E00, // ***####***** **** 0x3300, // **##**##**** **** 0x3300, // **##**##**** **** 0x1E00, // ***####***** **** 0x3330, // **##**##**## **** 0x61C0, // *##****###** **** 0x3F30, // **######**## **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x27 = ' 0x0000, // ************ **** 0x0700, // *****###**** **** 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x28 = ( 0x0000, // ************ **** 0x0700, // *****###**** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** 0x1800, // ***##******* **** 0x1800, // ***##******* **** 0x0C00, // ****##****** **** 0x0700, // *****###**** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x29 = ) 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0300, // ******##**** **** 0x0180, // *******##*** **** 0x0180, // *******##*** **** 0x0180, // *******##*** **** 0x0300, // ******##**** **** 0x0E00, // ****###***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2A = * 0x0000, // ************ **** 0x0600, // *****##***** **** 0x6660, // *##**##**##* **** 0x36C0, // **##*##*##** **** 0x0F00, // ****####**** **** 0x36C0, // **##*##*##** **** 0x6660, // *##**##**##* **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2B = + 0x0000, // ************ **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2C = , 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3800, // **###******* **** 0x1800, // ***##******* **** 0x3000, // **##******** **** }, { // 0x2D = - 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2E = . 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1800, // ***##******* **** 0x1800, // ***##******* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2F = / 0x0000, // ************ **** 0x00C0, // ********##** **** 0x0180, // *******##*** **** 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x30 = 0 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x31 = 1 0x0000, // ************ **** 0x0700, // *****###**** **** 0x1F00, // ***#####**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x32 = 2 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x30E0, // **##****###* **** 0x00E0, // ********###* **** 0x01C0, // *******###** **** 0x0780, // *****####*** **** 0x1E00, // ***####***** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x33 = 3 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x00C0, // ********##** **** 0x0080, // *******##*** **** 0x07E0, // *****######* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x34 = 4 0x0000, // ************ **** 0x00E0, // ********###* **** 0x03C0, // ******####** **** 0x0700, // *****###**** **** 0x1C00, // ***###****** **** 0x38E0, // **###***###* **** 0x3FE0, // **#########* **** 0x00E0, // ********###* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x35 = 5 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x00E0, // ********###* **** 0x30E0, // **##****###* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x36 = 6 0x0000, // ************ **** 0x0700, // *****###**** **** 0x0E00, // ****###***** **** 0x1C00, // ***###****** **** 0x3FC0, // **########** **** 0x3860, // **###****##* **** 0x3860, // **###****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x37 = 7 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x01C0, // *******###** **** 0x0380, // ******###*** **** 0x0700, // *****###**** **** 0x0E00, // ****###***** **** 0x1C00, // ***###****** **** 0x3800, // **###******* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x38 = 8 0x0000, // ************ **** 0x0F80, // ****#####*** **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x0F80, // ****#####*** **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x0F80, // ****#####*** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x39 = 9 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x30E0, // **##****###* **** 0x30E0, // **##****###* **** 0x1FC0, // ***#######** **** 0x0380, // ******###*** **** 0x0700, // *****###**** **** 0x0E00, // ****###***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3A = : 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3B = ; 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** }, { // 0x3C = < 0x0000, // ************ **** 0x00E0, // ********###* **** 0x0380, // ******###*** **** 0x0E00, // ****###***** **** 0x3800, // **###******* **** 0x0E00, // ****###***** **** 0x0380, // ******###*** **** 0x00E0, // ********###* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3D = = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3E = > 0x0000, // ************ **** 0x7000, // *###******** **** 0x1C00, // ***###****** **** 0x0700, // *****###**** **** 0x01C0, // *******###** **** 0x0700, // *****###**** **** 0x1C00, // ***###****** **** 0x7000, // *###******** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3F = ? 0x0000, // ************ **** 0x1F80, // ***######*** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x0180, // *******##*** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x40 = 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FE0, // ***########* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x41 = A 0x0000, // ************ **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x30C0, // **##****##** **** 0x6060, // *##******##* **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x42 = Б 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x43 = Ц 0x0000, // ************ **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x3FE0, // **#########* **** 0x0060, // *********##* **** 0x0000 // ************ **** }, { // 0x44 = Д 0x0000, // ************ **** 0x0F80, // ****#####*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x0000 // ************ **** }, { // 0x45 = E 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3F80, // **#######*** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x46 = Ф 0x0000, // ************ **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0000 // ************ **** }, { // 0x47 = Г 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x48 = Х 0x0000, // ************ **** 0x30C0, // **##****##** **** 0x1980, // ***##**##*** **** 0x0F00, // ****####**** **** 0x0600, // *****##***** **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x30C0, // **##****##** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x49 = И 0x0000, // ************ **** 0x60E0, // *##*****###* **** 0x61E0, // *##****####* **** 0x6360, // *##***##*##* **** 0x6660, // *##**##**##* **** 0x6C60, // *##*##***##* **** 0x7860, // *####****##* **** 0x7060, // *###*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4A = J 0x0000, // ************ **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4B = К 0x0000, // ************ **** 0x30E0, // **##****###* **** 0x3180, // **##***##*** **** 0x3700, // **##*###**** **** 0x3C00, // **####****** **** 0x3700, // **##*###**** **** 0x3180, // **##***##*** **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4C = Л 0x0000, // ************ **** 0x0FC0, // ****######** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x78C0, // *####***##** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4D = М 0x0000, // ************ **** 0x70E0, // *###****###* **** 0x79E0, // *####**####* **** 0x6F60, // *##*####*##* **** 0x6660, // *##**##**##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4E = Н 0x0000, // ************ **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4F = О 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x50 = П 0x0000, // ************ **** 0x3FC0, // **########** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x51 = 0x0380, // ******###*** **** 0x3600, // **##*##***** **** 0x30E0, // **##****###* **** 0x3180, // **##***##*** **** 0x3700, // **##*###**** **** 0x3C00, // **####****** **** 0x3380, // **##**###*** **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x52 = Р 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x53 = С 0x0000, // ************ **** 0x0FC0, // ****######** **** 0x1860, // ***##****##* **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x1860, // ***##****##* **** 0x0FC0, // ****######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x54 = Т 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x55 = У 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1fE0, // ***########* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x56 = 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x57 = 0x0180, // *******##*** **** 0x0300, // ******##**** **** 0x33E0, // **##**#####* **** 0x3C00, // **####****** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x58 = 0x0000, // ************ **** 0x1F00, // ***#####**** **** 0x3300, // **##**##**** **** 0x3300, // **##**##**** **** 0x33E0, // **##**#####* **** 0x3330, // **##**##**## **** 0x3330, // **##**##**## **** 0x73E0, // *###**#####* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x59 = 0x0000, // ************ **** 0x6300, // *##***##**** **** 0x6300, // *##***##**** **** 0x6300, // *##***##**** **** 0x7FE0, // *##########* **** 0x6330, // *##***##**## **** 0x6330, // *##***##**## **** 0x63E0, // *##***#####* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5A = З 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x0060, // *********##* **** 0x07C0, // *****#####** **** 0x0060, // *********##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5B = 0x0000, // ************ **** 0xFC00, // ######****** **** 0x3000, // **##******** **** 0x37C0, // **##*#####** **** 0x3860, // **###****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5C = 0x0000, // ************ **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x3FC0, // **########** **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5D = 0x0000, // ************ **** 0xFC00, // ######****** **** 0x3000, // **##******** **** 0x37C0, // **##*#####** **** 0x3860, // **###****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x30C0, // **##****##** **** 0x0180, // *******##*** **** 0x0000 // ************ **** }, { // 0x5E = 0x0000, // ************ **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x7FE0, // *##########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5F = 0x0000, // ************ **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x7FE0, // *##########* **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000 // ************ **** }, { // 0x60 = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FE0, // ***########* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x61 = а 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x7F80, // *########*** **** 0x00C0, // ********##** **** 0x3FC0, // **########** **** 0x60C0, // *##*****##** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x62 = б 0x0000, // ************ **** 0x1FE0, // ***########* **** 0x0C00, // ****##****** **** 0x0380, // ******###*** **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x63 = ц 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3180, // **##***##*** **** 0x3180, // **##***##*** **** 0x3180, // **##***##*** **** 0x3180, // **##***##*** **** 0x3FE0, // **#########* **** 0x0060, // *********##* **** 0x0000, // ************ **** }, { // 0x64 = д 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0F80, // ****#####*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x0000, // ************ **** }, { // 0x65 = е 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x66 = ф 0x0000, // ************ **** 0x0000, // ************ **** 0x0300, // ******##**** **** 0x0FC0, // ****######** **** 0x1B60, // ***##*##*##* **** 0x1B60, // ***##*##*##* **** 0x1B60, // ***##*##*##* **** 0x0FC0, // ****######** **** 0x0300, // ******##**** **** 0x0000 // ************ **** }, { // 0x67 = г 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3F80, // **#######*** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x68 = х 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x70E0, // *###****###* **** 0x1980, // ***##**##*** **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x70E0, // *###****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x69 = и 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x30E0, // **##****###* **** 0x3160, // **##***#*##* **** 0x3260, // **##**#**##* **** 0x3460, // **##*#***##* **** 0x3860, // **###****##* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x6A = j 0x0000, // ************ **** 0x00E0, // ********###* **** 0x0000, // ************ **** 0x01E0, // *******####* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x3060, // **##*****##* **** 0x1FC0 // ***#######** **** }, { // 0x6B = к 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x30E0, // **##****###* **** 0x3180, // **##***##*** **** 0x3E00, // **#####***** **** 0x3180, // **##***##*** **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6C = л 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x07E0, // *****######* **** 0x1860, // ***##****##* **** 0x1869, // ***##****##* **** 0x1860, // ***##****##* **** 0x7860, // *####****##* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x6D = м 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x70E0, // *###****###* **** 0x79E0, // *####**####* **** 0x6F60, // *##*####*##* **** 0x6660, // *##**##**##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6E = н 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6F = о 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x70 = п 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x71 = 0x0000, // ************ **** 0x3380, // **##**###*** **** 0x3600, // **##*##***** **** 0x30E0, // **##****###* **** 0x3180, // **##***##*** **** 0x3E00, // **#####***** **** 0x3180, // **##***##*** **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x72 = р 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x37C0, // **##*#####** **** 0x3860, // **###****##* **** 0x3060, // **##*****##* **** 0x3860, // **###****##* **** 0x37C0, // **##*#####** **** 0x3000, // **##******** **** 0x3000 // **##******** **** }, { // 0x73 = с 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0FE0, // ****#######* **** 0x1800, // ***##******* **** 0x3000, // **##******** **** 0x1800, // ***##******* **** 0x0FE0, // ****#######* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x74 = т 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x75 = у 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x18C0, // ***##***##** **** 0x0D80, // ****##*##*** **** 0x0700, // *****###**** **** 0x0600, // *****##***** **** 0x0C00, // ****##****** **** 0x3800 // **###******* **** }, { // 0x76 = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x77 = 0x0180, // *******##*** **** 0x0300, // ******##**** **** 0x0000, // ************ **** 0x33E0, // **##**#####* **** 0x3C00, // **####****** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x78 = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1F00, // ***#####**** **** 0x3300, // **##**##**** **** 0x33E0, // **##**#####* **** 0x3330, // **##**##**## **** 0x73E0, // *###**#####* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x79 = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x6300, // *##***##**** **** 0x6300, // *##***##**** **** 0x7FE0, // *##########* **** 0x6330, // *##***##**## **** 0x63E0, // *##***#####* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7A = з 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x01E0, // ******####** **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7B = 0x0000, // ************ **** 0x0000, // ************ **** 0xFC00, // ######****** **** 0x3000, // **##******** **** 0x3780, // **##*####*** **** 0x38C0, // **###***##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7C = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x1F80, // ***######*** **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7D = 0x0000, // ************ **** 0x0000, // ************ **** 0xFC00, // ######****** **** 0x3000, // **##******** **** 0x3780, // **##*####*** **** 0x38C0, // **###***##** **** 0x30C0, // **##****##** **** 0x3180, // **##***##*** **** 0x0180, // *******##*** **** 0x0000 // ************ **** }, { // 0x7E = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x7FE0, // *##########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7F = Block 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, // Russian/Bulgarian { // 0x20 = Leerzeichen 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x21 = ! 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x22 = " 0x0000, // ************ **** 0x39C0, // **###**###** **** 0x18C0, // ***##***##** **** 0x3180, // **##***##*** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x23 = # = NC 0x0000, // ************ **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x0000 // ************ **** }, { // 0x24 = $ = NC 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x6660, // *##**##**##* **** 0x6600, // *##**##***** **** 0x3FC0, // **########** **** 0x0660, // *****##**##* **** 0x6660, // *##**##**##* **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0000, // ************ **** }, { // 0x25 = % 0x0000, // ************ **** 0x70C0, // *###****##** **** 0xD980, // ##*##**##*** **** 0x7300, // *###**##**** **** 0x0600, // *****##***** **** 0x0CE0, // ****##**###* **** 0x19B0, // ***##**##*## **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x26 = ы 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3E60, // **#####**##* **** 0x3760, // **##*###*##* **** 0x3E60, // **#####**##* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x27 = ' 0x0000, // ************ **** 0x0700, // *****###**** **** 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x28 = ( 0x0000, // ************ **** 0x0700, // *****###**** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** 0x1800, // ***##******* **** 0x1800, // ***##******* **** 0x0C00, // ****##****** **** 0x0700, // *****###**** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x29 = ) 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0300, // ******##**** **** 0x0180, // *******##*** **** 0x0180, // *******##*** **** 0x0180, // *******##*** **** 0x0300, // ******##**** **** 0x0E00, // ****###***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2A = * 0x0000, // ************ **** 0x0600, // *****##***** **** 0x6660, // *##**##**##* **** 0x36C0, // **##*##*##** **** 0x0F00, // ****####**** **** 0x36C0, // **##*##*##** **** 0x6660, // *##**##**##* **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2B = + 0x0000, // ************ **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2C = , 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3800, // **###******* **** 0x1800, // ***##******* **** 0x3000, // **##******** **** }, { // 0x2D = - 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2E = . 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1800, // ***##******* **** 0x1800, // ***##******* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2F = / 0x0000, // ************ **** 0x00C0, // ********##** **** 0x0180, // *******##*** **** 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x30 = 0 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x31 = 1 0x0000, // ************ **** 0x0700, // *****###**** **** 0x1F00, // ***#####**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x32 = 2 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x30E0, // **##****###* **** 0x00E0, // ********###* **** 0x01C0, // *******###** **** 0x0780, // *****####*** **** 0x1E00, // ***####***** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x33 = 3 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x00C0, // ********##** **** 0x0080, // *******##*** **** 0x07E0, // *****######* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x34 = 4 0x0000, // ************ **** 0x00E0, // ********###* **** 0x03C0, // ******####** **** 0x0700, // *****###**** **** 0x1C00, // ***###****** **** 0x38E0, // **###***###* **** 0x3FE0, // **#########* **** 0x00E0, // ********###* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x35 = 5 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x00E0, // ********###* **** 0x30E0, // **##****###* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x36 = 6 0x0000, // ************ **** 0x0700, // *****###**** **** 0x0E00, // ****###***** **** 0x1C00, // ***###****** **** 0x3FC0, // **########** **** 0x3860, // **###****##* **** 0x3860, // **###****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x37 = 7 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x01C0, // *******###** **** 0x0380, // ******###*** **** 0x0700, // *****###**** **** 0x0E00, // ****###***** **** 0x1C00, // ***###****** **** 0x3800, // **###******* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x38 = 8 0x0000, // ************ **** 0x0F80, // ****#####*** **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x0F80, // ****#####*** **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x0F80, // ****#####*** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x39 = 9 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x30E0, // **##****###* **** 0x30E0, // **##****###* **** 0x1FC0, // ***#######** **** 0x0380, // ******###*** **** 0x0700, // *****###**** **** 0x0E00, // ****###***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3A = : 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3B = ; 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** }, { // 0x3C = < 0x0000, // ************ **** 0x00E0, // ********###* **** 0x0380, // ******###*** **** 0x0E00, // ****###***** **** 0x3800, // **###******* **** 0x0E00, // ****###***** **** 0x0380, // ******###*** **** 0x00E0, // ********###* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3D = = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3E = > 0x0000, // ************ **** 0x7000, // *###******** **** 0x1C00, // ***###****** **** 0x0700, // *****###**** **** 0x01C0, // *******###** **** 0x0700, // *****###**** **** 0x1C00, // ***###****** **** 0x7000, // *###******** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3F = ? 0x0000, // ************ **** 0x1F80, // ***######*** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x0180, // *******##*** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x40 = Ю 0x0000, // ************ **** 0x33C0, // **##**####** **** 0x3660, // **##*##**##* **** 0x3660, // **##*##**##* **** 0x3E60, // **#####**##* **** 0x3660, // **##*##**##* **** 0x3660, // **##*##**##* **** 0x33C0, // **##**####** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x41 = A 0x0000, // ************ **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x30C0, // **##****##** **** 0x6060, // *##******##* **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x42 = Б 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x43 = Ц 0x0000, // ************ **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x3FE0, // **#########* **** 0x0060, // *********##* **** 0x0000 // ************ **** }, { // 0x44 = Д 0x0000, // ************ **** 0x0F80, // ****#####*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x0000 // ************ **** }, { // 0x45 = E 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3F80, // **#######*** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x46 = Ф 0x0000, // ************ **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0000 // ************ **** }, { // 0x47 = Г 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x48 = Х 0x0000, // ************ **** 0x30C0, // **##****##** **** 0x1980, // ***##**##*** **** 0x0F00, // ****####**** **** 0x0600, // *****##***** **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x30C0, // **##****##** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x49 = И 0x0000, // ************ **** 0x60E0, // *##*****###* **** 0x61E0, // *##****####* **** 0x6360, // *##***##*##* **** 0x6660, // *##**##**##* **** 0x6C60, // *##*##***##* **** 0x7860, // *####****##* **** 0x7060, // *###*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4A = Й 0x0600, // *****##***** **** 0x60E0, // *##*****###* **** 0x61E0, // *##****####* **** 0x6360, // *##***##*##* **** 0x6660, // *##**##**##* **** 0x6C60, // *##*##***##* **** 0x7860, // *####****##* **** 0x7060, // *###*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4B = К 0x0000, // ************ **** 0x30E0, // **##****###* **** 0x3180, // **##***##*** **** 0x3700, // **##*###**** **** 0x3C00, // **####****** **** 0x3700, // **##*###**** **** 0x3180, // **##***##*** **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4C = Л 0x0000, // ************ **** 0x0FC0, // ****######** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x78C0, // *####***##** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4D = М 0x0000, // ************ **** 0x70E0, // *###****###* **** 0x79E0, // *####**####* **** 0x6F60, // *##*####*##* **** 0x6660, // *##**##**##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4E = Н 0x0000, // ************ **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4F = О 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x50 = П 0x0000, // ************ **** 0x1F80, // ***######*** **** 0x3060, // **##****##** **** 0x3060, // **##****##** **** 0x3060, // **##****##** **** 0x3060, // **##****##** **** 0x3060, // **##****##** **** 0x3060, // **##****##** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x51 = Я 0x0000, // ************ **** 0x1FE0, // ***########* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FE0, // ***########* **** 0x0360, // ******##*##* **** 0x0660, // *****##**##* **** 0x3C60, // **####***##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x52 = Р 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x53 = С 0x0000, // ************ **** 0x0FC0, // ****######** **** 0x1860, // ***##****##* **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x1860, // ***##****##* **** 0x0FC0, // ****######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x54 = Т 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x55 = У 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1fE0, // ***########* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x56 = Ж 0x0000, // ************ **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x3FC0, // **########** **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x57 = В 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x58 = Ь 0x0000, // ************ **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x59 = Ъ 0x0000, // ************ **** 0x7000, // *###******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5A = З 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x0060, // *********##* **** 0x07C0, // *****#####** **** 0x0060, // *********##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5B = Ш 0x0000, // ************ **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x7FE0, // *##########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5C = Э 0x0000, // ************ **** 0x1F80, // ***######*** **** 0x30C0, // **##****##** **** 0x0060, // *********##* **** 0x07C0, // *****#####** **** 0x0060, // *********##* **** 0x30C0, // **##****##** **** 0x1F80, // ***######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5D = Щ 0x0000, // ************ **** 0x3D80, // *##*##*##*** **** 0x3D80, // *##*##*##*** **** 0x3D80, // *##*##*##*** **** 0x3D80, // *##*##*##*** **** 0x3D80, // *##*##*##*** **** 0x3D80, // *##*##*##*** **** 0x7FE0, // *##########* **** 0x0060, // *********##* **** 0x0000 // ************ **** }, { // 0x5E = Ч 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FE0, // ***########* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5F = Ы 0x0000, // ************ **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x7E60, // *######**##* **** 0x6360, // *##***##*##* **** 0x6360, // *##***##*##* **** 0x7E60, // *######**##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x60 = ю 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x33C0, // **##**####** **** 0x3660, // **##*##**##* **** 0x3E60, // **#####**##* **** 0x3660, // **##*##**##* **** 0x33C0, // **##**####** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x61 = а 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x7F80, // *########*** **** 0x00C0, // ********##** **** 0x3FC0, // **########** **** 0x60C0, // *##*****##** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x62 = б 0x0000, // ************ **** 0x1FE0, // ***########* **** 0x0C00, // ****##****** **** 0x0380, // ******###*** **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x63 = ц 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3180, // **##***##*** **** 0x3180, // **##***##*** **** 0x3180, // **##***##*** **** 0x3180, // **##***##*** **** 0x3FE0, // **#########* **** 0x0060, // *********##* **** 0x0000, // ************ **** }, { // 0x64 = д 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0F80, // ****#####*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x0000, // ************ **** }, { // 0x65 = е 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x66 = ф 0x0000, // ************ **** 0x0000, // ************ **** 0x0300, // ******##**** **** 0x0FC0, // ****######** **** 0x1B60, // ***##*##*##* **** 0x1B60, // ***##*##*##* **** 0x1B60, // ***##*##*##* **** 0x0FC0, // ****######** **** 0x0300, // ******##**** **** 0x0000 // ************ **** }, { // 0x67 = г 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3F80, // **#######*** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x68 = х 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x70E0, // *###****###* **** 0x1980, // ***##**##*** **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x70E0, // *###****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x69 = и 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x30E0, // **##****###* **** 0x3160, // **##***#*##* **** 0x3260, // **##**#**##* **** 0x3460, // **##*#***##* **** 0x3860, // **###****##* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x6A = й 0x0000, // ************ **** 0x0000, // ************ **** 0x0200, // ******#***** **** 0x30E0, // **##****###* **** 0x3160, // **##***#*##* **** 0x3260, // **##**#**##* **** 0x3460, // **##*#***##* **** 0x3860, // **###****##* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x6B = к 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x30E0, // **##****###* **** 0x3180, // **##***##*** **** 0x3E00, // **#####***** **** 0x3180, // **##***##*** **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6C = л 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x07E0, // *****######* **** 0x1860, // ***##****##* **** 0x1869, // ***##****##* **** 0x1860, // ***##****##* **** 0x7860, // *####****##* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x6D = м 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x70E0, // *###****###* **** 0x79E0, // *####**####* **** 0x6F60, // *##*####*##* **** 0x6660, // *##**##**##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6E = н 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6F = о 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x70 = п 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x37C0, // **##*#####** **** 0x3860, // **###****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x71 = я 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FE0, // ***########* **** 0x3860, // **###****##* **** 0x1FE0, // ***########* **** 0x0360, // ******##*##* **** 0x1C60, // ***###***##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x72 = р 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x37C0, // **##*#####** **** 0x3860, // **###****##* **** 0x3060, // **##*****##* **** 0x3860, // **###****##* **** 0x37C0, // **##*#####** **** 0x3000, // **##******** **** 0x3000 // **##******** **** }, { // 0x73 = с 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0FE0, // ****#######* **** 0x1800, // ***##******* **** 0x3000, // **##******** **** 0x1800, // ***##******* **** 0x0FE0, // ****#######* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x74 = т 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x75 = у 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x18C0, // ***##***##** **** 0x0D80, // ****##*##*** **** 0x0700, // *****###**** **** 0x0600, // *****##***** **** 0x0C00, // ****##****** **** 0x3800 // **###******* **** }, { // 0x76 = ж 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x1F80, // ***######*** **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x77 = в 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x78 = ь 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x79 = ъ 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x7000, // *###******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7A = з 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x01E0, // ******####** **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7B = ш 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x7FE0, // *##########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7C = э 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x03E0, // ******#####* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7D = щ 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x6D80, // *##*##*##*** **** 0x6D80, // *##*##*##*** **** 0x6D80, // *##*##*##*** **** 0x6D80, // *##*##*##*** **** 0x7FE0, // *##########* **** 0x0060, // *********##* **** 0x0000 // ************ **** }, { // 0x7E = ч 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FE0, // ***########* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7F = Block 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, // Ukrainian { // 0x20 = Leerzeichen 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x21 = ! 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x22 = " 0x0000, // ************ **** 0x39C0, // **###**###** **** 0x18C0, // ***##***##** **** 0x3180, // **##***##*** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x23 = # = NC 0x0000, // ************ **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x0000 // ************ **** }, { // 0x24 = $ = NC 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x6660, // *##**##**##* **** 0x6600, // *##**##***** **** 0x3FC0, // **########** **** 0x0660, // *****##**##* **** 0x6660, // *##**##**##* **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0000, // ************ **** }, { // 0x25 = % 0x0000, // ************ **** 0x70C0, // *###****##** **** 0xD980, // ##*##**##*** **** 0x7300, // *###**##**** **** 0x0600, // *****##***** **** 0x0CE0, // ****##**###* **** 0x19B0, // ***##**##*## **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x26 = 0x0F00, // ************ **** 0x1980, // ***##**##*** **** 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x1F80, // ***######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x27 = ' 0x0000, // ************ **** 0x0700, // *****###**** **** 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x28 = ( 0x0000, // ************ **** 0x0700, // *****###**** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** 0x1800, // ***##******* **** 0x1800, // ***##******* **** 0x0C00, // ****##****** **** 0x0700, // *****###**** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x29 = ) 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0300, // ******##**** **** 0x0180, // *******##*** **** 0x0180, // *******##*** **** 0x0180, // *******##*** **** 0x0300, // ******##**** **** 0x0E00, // ****###***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2A = * 0x0000, // ************ **** 0x0600, // *****##***** **** 0x6660, // *##**##**##* **** 0x36C0, // **##*##*##** **** 0x0F00, // ****####**** **** 0x36C0, // **##*##*##** **** 0x6660, // *##**##**##* **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2B = + 0x0000, // ************ **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2C = , 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3800, // **###******* **** 0x1800, // ***##******* **** 0x3000, // **##******** **** }, { // 0x2D = - 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2E = . 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1800, // ***##******* **** 0x1800, // ***##******* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x2F = / 0x0000, // ************ **** 0x00C0, // ********##** **** 0x0180, // *******##*** **** 0x0300, // ******##**** **** 0x0600, // *****##***** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x30 = 0 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x31 = 1 0x0000, // ************ **** 0x0700, // *****###**** **** 0x1F00, // ***#####**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0700, // *****###**** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x32 = 2 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x30E0, // **##****###* **** 0x00E0, // ********###* **** 0x01C0, // *******###** **** 0x0780, // *****####*** **** 0x1E00, // ***####***** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x33 = 3 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x00C0, // ********##** **** 0x0080, // *******##*** **** 0x07E0, // *****######* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x34 = 4 0x0000, // ************ **** 0x00E0, // ********###* **** 0x03C0, // ******####** **** 0x0700, // *****###**** **** 0x1C00, // ***###****** **** 0x38E0, // **###***###* **** 0x3FE0, // **#########* **** 0x00E0, // ********###* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x35 = 5 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x00E0, // ********###* **** 0x30E0, // **##****###* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x36 = 6 0x0000, // ************ **** 0x0700, // *****###**** **** 0x0E00, // ****###***** **** 0x1C00, // ***###****** **** 0x3FC0, // **########** **** 0x3860, // **###****##* **** 0x3860, // **###****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x37 = 7 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x01C0, // *******###** **** 0x0380, // ******###*** **** 0x0700, // *****###**** **** 0x0E00, // ****###***** **** 0x1C00, // ***###****** **** 0x3800, // **###******* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x38 = 8 0x0000, // ************ **** 0x0F80, // ****#####*** **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x0F80, // ****#####*** **** 0x38E0, // **###***###* **** 0x38E0, // **###***###* **** 0x0F80, // ****#####*** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x39 = 9 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x30E0, // **##****###* **** 0x30E0, // **##****###* **** 0x1FC0, // ***#######** **** 0x0380, // ******###*** **** 0x0700, // *****###**** **** 0x0E00, // ****###***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3A = : 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3B = ; 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0C00, // ****##****** **** 0x0C00, // ****##****** **** 0x1800, // ***##******* **** }, { // 0x3C = < 0x0000, // ************ **** 0x00E0, // ********###* **** 0x0380, // ******###*** **** 0x0E00, // ****###***** **** 0x3800, // **###******* **** 0x0E00, // ****###***** **** 0x0380, // ******###*** **** 0x00E0, // ********###* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3D = = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3E = > 0x0000, // ************ **** 0x7000, // *###******** **** 0x1C00, // ***###****** **** 0x0700, // *****###**** **** 0x01C0, // *******###** **** 0x0700, // *****###**** **** 0x1C00, // ***###****** **** 0x7000, // *###******** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x3F = ? 0x0000, // ************ **** 0x1F80, // ***######*** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x0180, // *******##*** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x40 = Ю 0x0000, // ************ **** 0x1F80, // **##**####** **** 0x30C0, // **##*##**##* **** 0x3000, // **##*##**##* **** 0x1F80, // **#####**##* **** 0x30C0, // **##*##**##* **** 0x1F80, // **##*##**##* **** 0x00C0, // **##**####** **** 0x30C0, // ************ **** 0x1F80 // ************ **** }, { // 0x41 = A 0x0000, // ************ **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x30C0, // **##****##** **** 0x6060, // *##******##* **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x42 = Б 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x43 = Ц 0x0000, // ************ **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x30C0, // **##****##** **** 0x3FE0, // **#########* **** 0x0060, // *********##* **** 0x0000 // ************ **** }, { // 0x44 = Д 0x0000, // ************ **** 0x0F80, // ****#####*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x0000 // ************ **** }, { // 0x45 = E 0x0000, // ************ **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3F80, // **#######*** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x46 = Ф 0x0000, // ************ **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0000 // ************ **** }, { // 0x47 = Г 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x48 = Х 0x0000, // ************ **** 0x30C0, // **##****##** **** 0x1980, // ***##**##*** **** 0x0F00, // ****####**** **** 0x0600, // *****##***** **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x30C0, // **##****##** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x49 = И 0x0000, // ************ **** 0x60E0, // *##*****###* **** 0x61E0, // *##****####* **** 0x6360, // *##***##*##* **** 0x6660, // *##**##**##* **** 0x6C60, // *##*##***##* **** 0x7860, // *####****##* **** 0x7060, // *###*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4A = Й 0x0600, // *****##***** **** 0x60E0, // *##*****###* **** 0x61E0, // *##****####* **** 0x6360, // *##***##*##* **** 0x6660, // *##**##**##* **** 0x6C60, // *##*##***##* **** 0x7860, // *####****##* **** 0x7060, // *###*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4B = К 0x0000, // ************ **** 0x30E0, // **##****###* **** 0x3180, // **##***##*** **** 0x3700, // **##*###**** **** 0x3C00, // **####****** **** 0x3700, // **##*###**** **** 0x3180, // **##***##*** **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4C = Л 0x0000, // ************ **** 0x0FC0, // ****######** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x18C0, // ***##***##** **** 0x78C0, // *####***##** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4D = М 0x0000, // ************ **** 0x70E0, // *###****###* **** 0x79E0, // *####**####* **** 0x6F60, // *##*####*##* **** 0x6660, // *##**##**##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4E = Н 0x0000, // ************ **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x4F = О 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x50 = П 0x0000, // ************ **** 0x1F80, // ***######*** **** 0x3060, // **##****##** **** 0x3060, // **##****##** **** 0x3060, // **##****##** **** 0x3060, // **##****##** **** 0x3060, // **##****##** **** 0x3060, // **##****##** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x51 = Я 0x0000, // ************ **** 0x1FE0, // ***########* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FE0, // ***########* **** 0x0360, // ******##*##* **** 0x0660, // *****##**##* **** 0x3C60, // **####***##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x52 = Р 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x53 = С 0x0000, // ************ **** 0x0FC0, // ****######** **** 0x1860, // ***##****##* **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x1860, // ***##****##* **** 0x0FC0, // ****######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x54 = Т 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x55 = У 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1fE0, // ***########* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x56 = Ж 0x0000, // ************ **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x3FC0, // **########** **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x57 = В 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x58 = Ь 0x0000, // ************ **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x59 = 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5A = З 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x0060, // *********##* **** 0x07C0, // *****#####** **** 0x0060, // *********##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5B = Ш 0x0000, // ************ **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x7FE0, // *##########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5C = 0x0000, // ************ **** 0x1F80, // ***######*** **** 0x30C0, // **##****##** **** 0x6000, // *##********* **** 0x3E00, // **#####***** **** 0x6000, // *##********* **** 0x30C0, // **##****##** **** 0x1F80, // ***######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5D = Щ 0x0000, // ************ **** 0x3D80, // *##*##*##*** **** 0x3D80, // *##*##*##*** **** 0x3D80, // *##*##*##*** **** 0x3D80, // *##*##*##*** **** 0x3D80, // *##*##*##*** **** 0x3D80, // *##*##*##*** **** 0x7FE0, // *##########* **** 0x0060, // *********##* **** 0x0000 // ************ **** }, { // 0x5E = Ч 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FE0, // ***########* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x5F = 0x19C0, // ***##**##*** **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x60 = ю 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x33C0, // **##**####** **** 0x3660, // **##*##**##* **** 0x3E60, // **#####**##* **** 0x3660, // **##*##**##* **** 0x33C0, // **##**####** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x61 = а 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x7F80, // *########*** **** 0x00C0, // ********##** **** 0x3FC0, // **########** **** 0x60C0, // *##*****##** **** 0x3FE0, // **#########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x62 = б 0x0000, // ************ **** 0x1FE0, // ***########* **** 0x0C00, // ****##****** **** 0x0380, // ******###*** **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x63 = ц 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3180, // **##***##*** **** 0x3180, // **##***##*** **** 0x3180, // **##***##*** **** 0x3180, // **##***##*** **** 0x3FE0, // **#########* **** 0x0060, // *********##* **** 0x0000, // ************ **** }, { // 0x64 = д 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0F80, // ****#####*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x1980, // ***##**##*** **** 0x7FE0, // *##########* **** 0x6060, // *##******##* **** 0x0000, // ************ **** }, { // 0x65 = е 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3000, // **##******** **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x66 = ф 0x0000, // ************ **** 0x0000, // ************ **** 0x0300, // ******##**** **** 0x0FC0, // ****######** **** 0x1B60, // ***##*##*##* **** 0x1B60, // ***##*##*##* **** 0x1B60, // ***##*##*##* **** 0x0FC0, // ****######** **** 0x0300, // ******##**** **** 0x0000 // ************ **** }, { // 0x67 = г 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3F80, // **#######*** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x68 = х 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x70E0, // *###****###* **** 0x1980, // ***##**##*** **** 0x0F00, // ****####**** **** 0x1980, // ***##**##*** **** 0x70E0, // *###****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x69 = и 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x30E0, // **##****###* **** 0x3160, // **##***#*##* **** 0x3260, // **##**#**##* **** 0x3460, // **##*#***##* **** 0x3860, // **###****##* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x6A = й 0x0000, // ************ **** 0x0000, // ************ **** 0x0200, // ******#***** **** 0x30E0, // **##****###* **** 0x3160, // **##***#*##* **** 0x3260, // **##**#**##* **** 0x3460, // **##*#***##* **** 0x3860, // **###****##* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x6B = к 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x30E0, // **##****###* **** 0x3180, // **##***##*** **** 0x3E00, // **#####***** **** 0x3180, // **##***##*** **** 0x30E0, // **##****###* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6C = л 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x07E0, // *****######* **** 0x1860, // ***##****##* **** 0x1869, // ***##****##* **** 0x1860, // ***##****##* **** 0x7860, // *####****##* **** 0x0000, // ************ **** 0x0000, // ************ **** }, { // 0x6D = м 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x70E0, // *###****###* **** 0x79E0, // *####**####* **** 0x6F60, // *##*####*##* **** 0x6660, // *##**##**##* **** 0x6060, // *##******##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6E = н 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3FE0, // **#########* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x6F = о 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x70 = п 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x37C0, // **##*#####** **** 0x3860, // **###****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x71 = я 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FE0, // ***########* **** 0x3860, // **###****##* **** 0x1FE0, // ***########* **** 0x0360, // ******##*##* **** 0x1C60, // ***###***##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x72 = р 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x37C0, // **##*#####** **** 0x3860, // **###****##* **** 0x3060, // **##*****##* **** 0x3860, // **###****##* **** 0x37C0, // **##*#####** **** 0x3000, // **##******** **** 0x3000 // **##******** **** }, { // 0x73 = с 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x0FE0, // ****#######* **** 0x1800, // ***##******* **** 0x3000, // **##******** **** 0x1800, // ***##******* **** 0x0FE0, // ****#######* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x74 = т 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x75 = у 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x18C0, // ***##***##** **** 0x0D80, // ****##*##*** **** 0x0700, // *****###**** **** 0x0600, // *****##***** **** 0x0C00, // ****##****** **** 0x3800 // **###******* **** }, { // 0x76 = ж 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x1F80, // ***######*** **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x77 = в 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x78 = ь 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3000, // **##******** **** 0x3000, // **##******** **** 0x3FC0, // **########** **** 0x3060, // **##*****##* **** 0x3FC0, // **########** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x79 = 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0000, // ************ **** 0x0E00, // ****###***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x0600, // *****##***** **** 0x1F80, // ***######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7A = з 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x1FC0, // ***#######** **** 0x3060, // **##*****##* **** 0x01E0, // ******####** **** 0x3060, // **##*****##* **** 0x1FC0, // ***#######** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7B = ш 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x6660, // *##**##**##* **** 0x7FE0, // *##########* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7C = 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3F80, // **#######*** **** 0x60C0, // *##*****##** **** 0x7C00, // *#####****** **** 0x60C0, // *##*****##** **** 0x3F80, // **#######*** **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7D = щ 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x6D80, // *##*##*##*** **** 0x6D80, // *##*##*##*** **** 0x6D80, // *##*##*##*** **** 0x6D80, // *##*##*##*** **** 0x7FE0, // *##########* **** 0x0060, // *********##* **** 0x0000 // ************ **** }, { // 0x7E = ч 0x0000, // ************ **** 0x0000, // ************ **** 0x0000, // ************ **** 0x3060, // **##*****##* **** 0x3060, // **##*****##* **** 0x1FE0, // ***########* **** 0x0060, // *********##* **** 0x0060, // *********##* **** 0x0000, // ************ **** 0x0000 // ************ **** }, { // 0x7F = Block 0x0000, // ************ **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x7FE0, // *##########* **** 0x0000, // ************ **** 0x0000 // ************ **** } }; #if 0 int NationalOptionSubsetG0Default[13]= {0x23,0x94,0x80,0 ,0 ,0 ,0x5e,0x5f,0 ,0 ,0 ,0 ,0 }; int NationalOptionSubsetCZ_SK[13]= {0x23,0x84,0x85,0x95,0x93,0x92,0xed,0x87,0x91,0xeb,0x8f,0xef,0x86}; int NationalOptionSubsetEN[13]= {0x83,0x24,0x80,0x8b,0x8c,0x8d,0x8e,0x23,0x81,0x82,0x88,0x89,0x8a}; int NationalOptionSubsetEE[13]= {0x23,0xc6,0 ,0x5b,0x5c,0 ,0x5d,0xd6,0 ,0x7b,0x7c,0 ,0x7d}; int NationalOptionSubsetFR[13]= {0xd3,0xd4,0xd0,0xdb,0xdc,0xc1,0xde,0x23,0xd1,0xd2,0xd8,0xd9,0xcc}; int NationalOptionSubsetDE[13]= {0x23,0x24,0x40,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x7b,0x7c,0x7d,0x7e}; int NationalOptionSubsetIT[13]= {0x83,0x24,0xd3,0x60,0xcc,0x8d,0x8e,0x23,0xdd,0xc1,0xc8,0xc9,0xca}; int NationalOptionSubsetLV_LT[13]= {0x23,0x24,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 }; int NationalOptionSubsetPL[13]= {0x23,0 ,0 ,0 ,0 ,0 ,0 ,0xee,0 ,0 ,0 ,0 ,0 }; int NationalOptionSubsetPT_ES[13]= {0xcc,0x24,0xe0,0xeb,0xec,0xed,0xee,0xef,0xe1,0x7d,0xe8,0xc9,0xc2}; int NationalOptionSubsetRO[13]= {0x23,0x94,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0xd2,0 ,0 ,0xde}; int NationalOptionSubsetSR_HR_SL[13]= {0x23,0 ,0 ,0 ,0 ,0xfb,0 ,0xdb,0 ,0 ,0 ,0 ,0 }; int NationalOptionSubsetSV_FI[13]= {0x23,0x94,0x90,0x5b,0x5c,0x9d,0x5d,0x5f,0x91,0x7b,0x7c,0x99,0x7d}; int NationalOptionSubsetTR[13]= {0 ,0 ,0 ,0 ,0x5c,0xd7,0x5d,0 ,0 ,0 ,0x7c,0xcc,0x7d}; #else int NationalOptionSubsetG0Default[13]= {0x23,0xa4,0x40,0 ,0 ,0 ,0x5e,0x5f,0 ,0 ,0 ,0 ,0 }; int NationalOptionSubsetCZ_SK[13]= {0x23,0x84,0x85,0x95,0x93,0x92,0xed,0x87,0x91,0xeb,0x8f,0xef,0x86}; int NationalOptionSubsetEN[13]= {0x83,0x24,0x80,0x8b,0x8c,0x8d,0x8e,0x23,0x81,0x82,0x88,0x89,0x8a}; int NationalOptionSubsetEE[13]= {0x23,0xc6,0 ,0x5b,0x5c,0 ,0x5d,0xd6,0 ,0x7b,0x7c,0 ,0x7d}; int NationalOptionSubsetFR[13]= {0xd3,0xd4,0xd0,0xdb,0xdc,0xc1,0xde,0x23,0xd1,0xd2,0xd8,0xd9,0xcc}; int NationalOptionSubsetDE[13]= {0x23,0x24,0xa7,0xc4,0xd6,0xdc,0x5e,0x5f,0x60,0xe4,0xf6,0xfc,0xdf}; int NationalOptionSubsetIT[13]= {0x83,0x24,0xd3,0x60,0xcc,0x8d,0x8e,0x23,0xdd,0xc1,0xc8,0xc9,0xca}; int NationalOptionSubsetLV_LT[13]= {0x23,0x24,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 }; int NationalOptionSubsetPL[13]= {0x23,0 ,0 ,0 ,0 ,0 ,0 ,0xee,0 ,0 ,0 ,0 ,0 }; int NationalOptionSubsetPT_ES[13]= {0xcc,0x24,0xe0,0xeb,0xec,0xed,0xee,0xef,0xe1,0x7d,0xe8,0xc9,0xc2}; int NationalOptionSubsetRO[13]= {0x23,0x94,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0xd2,0 ,0 ,0xde}; int NationalOptionSubsetSR_HR_SL[13]= {0x23,0 ,0 ,0 ,0 ,0xfb,0 ,0xdb,0 ,0 ,0 ,0 ,0 }; int NationalOptionSubsetSV_FI[13]= {0x23,0xa4,0xc9,0xc4,0xd6,0xc5,0xdc,0x5f,0xe9,0xe4,0xf6,0xe5,0xfc}; int NationalOptionSubsetTR[13]= {0 ,0 ,0 ,0 ,0x5c,0xd7,0x5d,0 ,0 ,0 ,0x7c,0xcc,0x7d}; #endif int CyrillicOptionRU_BG[96] = {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x44b,0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x42e,0x410,0x411,0x426,0x414,0x415,0x424,0x413,0x425,0x418,0x419,0x41a,0x41b,0x41c,0x41d,0x41e, 0x41f,0x42f,0x420,0x421,0x422,0x423,0x416,0x412,0x42c,0x42a,0x417,0x428,0x42d,0x429,0x427,0x42b, 0x44e,0x430,0x431,0x446,0x434,0x435,0x444,0x433,0x445,0x438,0x439,0x43a,0x43b,0x43c,0x43d,0x43e, 0x43f,0x44f,0x440,0x441,0x442,0x443,0x436,0x432,0x44c,0x44a,0x437,0x448,0x437,0x449,0x447,0x7f}; inline int NationalOptionSubset(int chr) { switch (chr) { case 0x23: return 0; case 0x24: return 1; case 0x40: return 2; case 0x5b: return 3; case 0x5c: return 4; case 0x5d: return 5; case 0x5e: return 6; case 0x5f: return 7; case 0x60: return 8; case 0x7b: return 9; case 0x7c: return 10; case 0x7d: return 11; case 0x7e: return 12; } return -1; } inline unsigned int LeftBits(unsigned int bits) { // Scale bit positions 0xfc00 to 0xfff0 positions unsigned int res=0; if (bits&0x8000) res|=0xC000; if (bits&0x4000) res|=0x3000; if (bits&0x2000) res|=0x0C00; if (bits&0x1000) res|=0x0300; if (bits&0x0800) res|=0x00C0; if (bits&0x0400) res|=0x0030; return res; } inline unsigned int RightBits(unsigned int bits) { // Scale bit positions 0x03f0 to 0xfff0 positions unsigned int res=0; if (bits&0x0200) res|=0xC000; if (bits&0x0100) res|=0x3000; if (bits&0x0080) res|=0x0C00; if (bits&0x0040) res|=0x0300; if (bits&0x0020) res|=0x00C0; if (bits&0x0010) res|=0x0030; return res; } unsigned int* GetFontChar(cTeletextChar c, unsigned int *buffer) { // Get character bitmap for character/charset enumCharsets font=c.GetCharset(); int chr=c.GetChar(); unsigned int *bitmap=NULL; int i; int NationalOption=NationalOptionSubset(chr); switch (font) { case CHARSET_LATIN_G0: if (NationalOption>=0) { if (NationalOptionSubsetG0Default[NationalOption]>0) bitmap=TXT_Font[NationalOptionSubsetG0Default[NationalOption]-0x20]; } else { if (chr>=0x20 && chr<0x80) { bitmap=TXT_Font[chr-0x20]; } } break; case CHARSET_LATIN_G0_EN: if (NationalOption>=0) { if (NationalOptionSubsetEN[NationalOption]>0) bitmap=TXT_Font[NationalOptionSubsetEN[NationalOption]-0x20]; } else { if (chr>=0x20 && chr<0x80) { bitmap=TXT_Font[chr-0x20]; } } break; case CHARSET_LATIN_G0_FR: if (NationalOption>=0) { if (NationalOptionSubsetFR[NationalOption]>0) bitmap=TXT_Font[NationalOptionSubsetFR[NationalOption]-0x20]; } else { if (chr>=0x20 && chr<0x80) { bitmap=TXT_Font[chr-0x20]; } } break; case CHARSET_LATIN_G0_IT: if (NationalOption>=0) { if (NationalOptionSubsetIT[NationalOption]>0) bitmap=TXT_Font[NationalOptionSubsetIT[NationalOption]-0x20]; } else { if (chr>=0x20 && chr<0x80) { bitmap=TXT_Font[chr-0x20]; } } break; case CHARSET_LATIN_G0_PT_ES: if (NationalOption>=0) { if (NationalOptionSubsetPT_ES[NationalOption]>0) bitmap=TXT_Font[NationalOptionSubsetPT_ES[NationalOption]-0x20]; } else { if (chr>=0x20 && chr<0x80) { bitmap=TXT_Font[chr-0x20]; } } break; case CHARSET_LATIN_G0_SV_FI: if (NationalOption>=0) { if (NationalOptionSubsetSV_FI[NationalOption]>0) bitmap=TXT_Font[NationalOptionSubsetSV_FI[NationalOption]-0x20]; } else { if (chr>=0x20 && chr<0x80) { bitmap=TXT_Font[chr-0x20]; } } break; case CHARSET_LATIN_G0_DE: if (chr>=0x20 && chr<0x80) { bitmap=TXT_Font[chr-0x20]; } break; case CHARSET_LATIN_G0_CZ_SK: if (NationalOption>=0) { if (NationalOptionSubsetCZ_SK[NationalOption]>0) bitmap=TXT_Font[NationalOptionSubsetCZ_SK[NationalOption]-0x20]; } else { if (chr>=0x20 && chr<0x80) { bitmap=TXT_Font[chr-0x20]; } } break; case CHARSET_LATIN_G0_EE: case CHARSET_LATIN_G0_LV_LT: case CHARSET_LATIN_G0_PL: case CHARSET_LATIN_G0_RO: case CHARSET_LATIN_G0_SR_HR_SL: case CHARSET_LATIN_G0_TR: // Partially supported latin charsets if (chr>=0x20 && chr<0x80 && NationalOption<0) { bitmap=TXT_Font[chr-0x20]; } break; case CHARSET_LATIN_G2: break; case CHARSET_CYRILLIC_G0_SR_HR: if (chr>=0x20 && chr<0x80) { bitmap=TXT_Font_Cyrillic[chr-0x20]; } break; case CHARSET_CYRILLIC_G0_RU_BG: if (chr>=0x20 && chr<0x80) { bitmap=TXT_Font_Cyrillic[chr-0x20+0x80]; } break; case CHARSET_CYRILLIC_G0_UK: if (chr>=0x20 && chr<0x80) { bitmap=TXT_Font_Cyrillic[chr-0x20+0x80+0x80]; } break; case CHARSET_CYRILLIC_G2: case CHARSET_GREEK_G0: case CHARSET_GREEK_G2: case CHARSET_ARABIC_G0: case CHARSET_ARABIC_G2: case CHARSET_HEBREW_G0: // totally unsupported break; case CHARSET_GRAPHICS_G1: if (chr>=0x20 && chr<0x40) { bitmap=TXT_Font[chr-0x20+0x80]; } else if (chr>=0x60 && chr<0x80) { bitmap=TXT_Font[chr-0x60+0xE0]; } break; case CHARSET_GRAPHICS_G1_SEP: if (chr>=0x20 && chr<0x40) { bitmap=TXT_Font[chr-0x20+0x80]; } else if (chr>=0x60 && chr<0x80) { bitmap=TXT_Font[chr-0x60+0xE0]; } if (bitmap) { for (i=0;i<10;i++) buffer[i]=bitmap[i]&TXT_Mask[i]; bitmap=buffer; } break; case CHARSET_GRAPHICS_G3: case CHARSET_INVALID: // Totally unsupported break; } if (!buffer) { printf("Warning: Undefined char: %x %x\n",font,chr); return NULL; } switch (c.GetDblHeight()) { case dblh_Top: // Scale top 5 lines to full height buffer[8]=buffer[9]=bitmap[4]; buffer[6]=buffer[7]=bitmap[3]; buffer[4]=buffer[5]=bitmap[2]; buffer[2]=buffer[3]=bitmap[1]; buffer[1]=buffer[0]=bitmap[0]; bitmap=buffer; break; case dblh_Bottom: // Scale bottom 5 lines to full height buffer[0]=buffer[1]=bitmap[5]; buffer[2]=buffer[3]=bitmap[6]; buffer[4]=buffer[5]=bitmap[7]; buffer[6]=buffer[7]=bitmap[8]; buffer[8]=buffer[9]=bitmap[9]; bitmap=buffer; default:; } switch (c.GetDblWidth()) { case dblw_Left: // Scale 6 left columns to full width buffer[0]=LeftBits(bitmap[0]); buffer[1]=LeftBits(bitmap[1]); buffer[2]=LeftBits(bitmap[2]); buffer[3]=LeftBits(bitmap[3]); buffer[4]=LeftBits(bitmap[4]); buffer[5]=LeftBits(bitmap[5]); buffer[6]=LeftBits(bitmap[6]); buffer[7]=LeftBits(bitmap[7]); buffer[8]=LeftBits(bitmap[8]); buffer[9]=LeftBits(bitmap[9]); bitmap=buffer; break; case dblw_Right: // Scale 6 right columns to full width buffer[0]=RightBits(bitmap[0]); buffer[1]=RightBits(bitmap[1]); buffer[2]=RightBits(bitmap[2]); buffer[3]=RightBits(bitmap[3]); buffer[4]=RightBits(bitmap[4]); buffer[5]=RightBits(bitmap[5]); buffer[6]=RightBits(bitmap[6]); buffer[7]=RightBits(bitmap[7]); buffer[8]=RightBits(bitmap[8]); buffer[9]=RightBits(bitmap[9]); bitmap=buffer; default:; } return bitmap; } unsigned int GetVTXChar(cTeletextChar c) { // convert character for character/charset to utf8 int convertedChar = 0; enumCharsets font = c.GetCharset(); int chr = c.GetChar(); int NationalOption = NationalOptionSubset(chr); switch (font) { case CHARSET_LATIN_G0: if (NationalOption>=0) { if (NationalOptionSubsetG0Default[NationalOption]>0) convertedChar = NationalOptionSubsetG0Default[NationalOption]; } else { if (chr>=0x20 && chr<0x80) { convertedChar = chr; } } break; case CHARSET_LATIN_G0_EN: if (NationalOption>=0) { if (NationalOptionSubsetEN[NationalOption]>0) convertedChar = NationalOptionSubsetEN[NationalOption]; } else { if (chr>=0x20 && chr<0x80) { convertedChar = chr; } } break; case CHARSET_LATIN_G0_FR: if (NationalOption>=0) { if (NationalOptionSubsetFR[NationalOption]>0) convertedChar = NationalOptionSubsetFR[NationalOption]; } else { if (chr>=0x20 && chr<0x80) { convertedChar = chr; } } break; case CHARSET_LATIN_G0_IT: if (NationalOption>=0) { if (NationalOptionSubsetIT[NationalOption]>0) convertedChar = NationalOptionSubsetIT[NationalOption]; } else { if (chr>=0x20 && chr<0x80) { convertedChar = chr; } } break; case CHARSET_LATIN_G0_PT_ES: if (NationalOption>=0) { if (NationalOptionSubsetPT_ES[NationalOption]>0) convertedChar = NationalOptionSubsetPT_ES[NationalOption]; } else { if (chr>=0x20 && chr<0x80) { convertedChar = chr; } } break; case CHARSET_LATIN_G0_SV_FI: if (NationalOption>=0) { if (NationalOptionSubsetSV_FI[NationalOption]>0) convertedChar = NationalOptionSubsetSV_FI[NationalOption]; } else { if (chr>=0x20 && chr<0x80) { convertedChar = chr; } } break; case CHARSET_LATIN_G0_DE: if (NationalOption>=0) { if (NationalOptionSubsetDE[NationalOption]>0) convertedChar = NationalOptionSubsetDE[NationalOption]; } else { if (chr>=0x20 && chr<0x80) { convertedChar = chr; } } break; case CHARSET_LATIN_G0_CZ_SK: if (NationalOption>=0) { if (NationalOptionSubsetCZ_SK[NationalOption]>0) convertedChar = NationalOptionSubsetCZ_SK[NationalOption]; } else { if (chr>=0x20 && chr<0x80) { convertedChar = chr; } } break; case CHARSET_LATIN_G0_EE: case CHARSET_LATIN_G0_LV_LT: case CHARSET_LATIN_G0_PL: case CHARSET_LATIN_G0_RO: case CHARSET_LATIN_G0_SR_HR_SL: case CHARSET_LATIN_G0_TR: // Partially supported latin charsets if (chr>=0x20 && chr<0x80 && NationalOption<0) { convertedChar = chr; } break; case CHARSET_LATIN_G2: case CHARSET_CYRILLIC_G0_SR_HR: break; case CHARSET_CYRILLIC_G0_RU_BG: if(chr >=20 && chr < 0x80){ convertedChar = CyrillicOptionRU_BG[chr-0x20]; } break; case CHARSET_CYRILLIC_G0_UK: case CHARSET_CYRILLIC_G2: case CHARSET_GREEK_G0: case CHARSET_GREEK_G2: case CHARSET_ARABIC_G0: case CHARSET_ARABIC_G2: case CHARSET_HEBREW_G0: // totally unsupported break; case CHARSET_GRAPHICS_G1: convertedChar = chr + 0xee00; break; case CHARSET_GRAPHICS_G1_SEP: convertedChar = chr + 0xee00 - 0x20; break; case CHARSET_GRAPHICS_G3: case CHARSET_INVALID: // Totally unsupported break; } return convertedChar; } osdteletext-0.9.7/osdteletext.c0000644000175000017500000004165013244332420016132 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * (autogenerated code (c) Klaus Schmidinger) * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include #include #include #include #include using namespace std; #include "menu.h" #include "txtrecv.h" #include "setup.h" #include "legacystorage.h" #include "packedstorage.h" #if defined(APIVERSNUM) && APIVERSNUM < 10739 #error "VDR-1.7.39 API version or greater is required!" #endif #define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0])) static const char *VERSION = "0.9.7"; static const char *DESCRIPTION = trNOOP("Displays teletext on the OSD"); static const char *MAINMENUENTRY = trNOOP("Teletext"); class cPluginTeletextosd : public cPlugin { private: // Add any member variables or functions you may need here. cTxtStatus *txtStatus; bool startReceiver; bool storeTopText; Storage *storage; int maxStorage; void initTexts(); Storage::StorageSystem storageSystem; public: cPluginTeletextosd(void); virtual ~cPluginTeletextosd(); virtual const char *Version(void) { return VERSION; } virtual const char *Description(void) { return tr(DESCRIPTION); } virtual const char *CommandLineHelp(void); virtual bool ProcessArgs(int argc, char *argv[]); virtual bool Start(void); virtual void Stop(void); virtual void Housekeeping(void); virtual const char *MainMenuEntry(void); virtual cOsdObject *MainMenuAction(void); virtual cMenuSetupPage *SetupMenu(void); virtual bool SetupParse(const char *Name, const char *Value); }; class cTeletextSetupPage; class ActionEdit { public: void Init(cTeletextSetupPage*, int, cMenuEditIntItem *, cMenuEditStraItem *); cMenuEditStraItem *action; cMenuEditIntItem *number; bool visible; }; struct ActionKeyName { const char *internalName; const char *userName; }; class cTeletextSetupPage : public cMenuSetupPage { friend class ActionEdit; private: TeletextSetup temp; int tempPageNumber[LastActionKey]; int tempConfiguredClrBackground; //must be a signed int protected: virtual void Store(void); ActionEdit ActionEdits[LastActionKey]; virtual eOSState ProcessKey(eKeys Key); public: cTeletextSetupPage(void); static const ActionKeyName *actionKeyNames; static const char **modes; //~cTeletextSetupPage(void); //void SetItemVisible(cOsdItem *Item, bool visible, bool callDisplay=false); }; const ActionKeyName *cTeletextSetupPage::actionKeyNames = 0; const char **cTeletextSetupPage::modes = 0; /*class MenuEditActionItem : public cMenuEditStraItem { public: MenuEditActionItem(cTeletextSetupPage *parentMenu, cMenuEditIntItem *pageNumberMenuItem, const char *Name, int *Value, int NumStrings, const char * const *Strings); protected: virtual eOSState ProcessKey(eKeys Key); cTeletextSetupPage *parent; cMenuEditIntItem *pageNumberItem; };*/ cPluginTeletextosd::cPluginTeletextosd(void) : txtStatus(0), startReceiver(true), storage(NULL), maxStorage(-1) { // Initialize any member variables here. // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT! } cPluginTeletextosd::~cPluginTeletextosd() { // Clean up after yourself! } const char *cPluginTeletextosd::CommandLineHelp(void) { // Return a string that describes all known command line options. return " -d --directory=DIR The directory where the temporary\n" " files will be stored.\n" " (default: /var/cache/vdr/vtx)\n" " Ensure that the directory exists and is writable.\n" " -n --max-cache=NUM Maximum size in megabytes of cache used\n" " to store the pages on the harddisk.\n" " (default: a calculated value below 50 MB)\n" " -s --cache-system=SYS Set the cache system to be used.\n" " Choose \"legacy\" for the traditional\n" " one-file-per-page system.\n" " Default is \"packed\" for the \n" " one-file-for-a-few-pages system.\n" " -t, --toptext Store top text pages at cache. (unviewable pages)\n"; } bool cPluginTeletextosd::ProcessArgs(int argc, char *argv[]) { // Implement command line argument processing here if applicable. static struct option long_options[] = { { "directory", required_argument, NULL, 'd' }, { "max-cache", required_argument, NULL, 'n' }, { "cache-system", required_argument, NULL, 's' }, { "toptext", no_argument, NULL, 't' }, { NULL } }; int c; while ((c = getopt_long(argc, argv, "s:d:n:t", long_options, NULL)) != -1) { switch (c) { case 's': if (!optarg) break; if (strcasecmp(optarg, "legacy")==0) storageSystem = Storage::StorageSystemLegacy; else if (strcasecmp(optarg, "packed")==0) storageSystem = Storage::StorageSystemPacked; break; case 'd': Storage::setRootDir(optarg); break; case 'n': if (isnumber(optarg)) { int n = atoi(optarg); maxStorage=n; } break; case 't': storeTopText=true; break; } } return true; } bool cPluginTeletextosd::Start(void) { // Start any background activities the plugin shall perform. //Clean any files which might be remaining from the last session, //perhaps due to a crash they have not been deleted. switch (storageSystem) { case Storage::StorageSystemLegacy: storage = new LegacyStorage(maxStorage); case Storage::StorageSystemPacked: default: storage = new PackedStorage(maxStorage); } initTexts(); if (startReceiver) txtStatus=new cTxtStatus(storeTopText, storage); if (ttSetup.OSDheight<=100) ttSetup.OSDheight=Setup.OSDHeight; if (ttSetup.OSDwidth<=100) ttSetup.OSDwidth=Setup.OSDWidth; return true; } void cPluginTeletextosd::Stop(void) { DELETENULL(txtStatus); if (storage) { storage->cleanUp(); DELETENULL(storage); } } void cPluginTeletextosd::initTexts() { if (cTeletextSetupPage::actionKeyNames) return; //TODO: rewrite this in the xy[0].cd="fg"; form static const ActionKeyName st_actionKeyNames[] = { { "Action_kRed", trVDR("Key$Red") }, { "Action_kGreen", trVDR("Key$Green") }, { "Action_kYellow", trVDR("Key$Yellow") }, { "Action_kBlue", trVDR("Key$Blue") }, { "Action_kPlay", trVDR("Key$Play") }, { "Action_kStop", trVDR("Key$Stop") }, { "Action_kFastFwd", trVDR("Key$FastFwd") }, { "Action_kFastRew", trVDR("Key$FastRew") } }; cTeletextSetupPage::actionKeyNames = st_actionKeyNames; static const char *st_modes[] = { tr("Zoom"), tr("Half page"), tr("Change channel"), tr("Switch background"), //tr("Suspend receiving"), tr("Jump to...") }; cTeletextSetupPage::modes = st_modes; } void cPluginTeletextosd::Housekeeping(void) { // Perform any cleanup or other regular tasks. } const char *cPluginTeletextosd::MainMenuEntry(void) { return ttSetup.HideMainMenu ? 0 : tr(MAINMENUENTRY); } cOsdObject *cPluginTeletextosd::MainMenuAction(void) { // Perform the action when selected from the main VDR menu. return new TeletextBrowser(txtStatus,storage); } cMenuSetupPage *cPluginTeletextosd::SetupMenu(void) { // Return a setup menu in case the plugin supports one. return new cTeletextSetupPage; } bool cPluginTeletextosd::SetupParse(const char *Name, const char *Value) { initTexts(); // Parse your own setup parameters and store their values. //Stretch=true; if (!strcasecmp(Name, "configuredClrBackground")) ttSetup.configuredClrBackground=( ((unsigned int)atoi(Value)) << 24); else if (!strcasecmp(Name, "showClock")) ttSetup.showClock=atoi(Value); //currently not used else if (!strcasecmp(Name, "suspendReceiving")) ttSetup.suspendReceiving=atoi(Value); else if (!strcasecmp(Name, "autoUpdatePage")) ttSetup.autoUpdatePage=atoi(Value); else if (!strcasecmp(Name, "OSDheight")) ttSetup.OSDheight=atoi(Value); else if (!strcasecmp(Name, "OSDwidth")) ttSetup.OSDwidth=atoi(Value); else if (!strcasecmp(Name, "OSDHAlign")) ttSetup.OSDHAlign=atoi(Value); else if (!strcasecmp(Name, "OSDVAlign")) ttSetup.OSDVAlign=atoi(Value); else if (!strcasecmp(Name, "inactivityTimeout")) /*ttSetup.inactivityTimeout=atoi(Value)*/; else if (!strcasecmp(Name, "HideMainMenu")) ttSetup.HideMainMenu=atoi(Value); else if (!strcasecmp(Name, "txtFontName")) ttSetup.txtFontName=strdup(Value); else if (!strcasecmp(Name, "txtG0Block")) ttSetup.txtG0Block=atoi(Value); else if (!strcasecmp(Name, "txtG2Block")) ttSetup.txtG2Block=atoi(Value); else { for (int i=0;i=LastAction) ttSetup.mapKeyToAction[i]=LastAction-1; return true; } } //for migration to 0.4 char act[7]; strncpy(act, Name, 7); if (!strcasecmp(act, "Action_")) return true; return false; } return true; } void cTeletextSetupPage::Store(void) { //copy table for (int i=0;i= LastAction) //jump to page selected ttSetup.mapKeyToAction[i]=(eTeletextAction)tempPageNumber[i]; else //one of the other modes selected ttSetup.mapKeyToAction[i]=temp.mapKeyToAction[i]; } ttSetup.configuredClrBackground=( ((unsigned int)tempConfiguredClrBackground) << 24); ttSetup.showClock=temp.showClock; ttSetup.suspendReceiving=temp.suspendReceiving; ttSetup.autoUpdatePage=temp.autoUpdatePage; ttSetup.OSDheight=temp.OSDheight; ttSetup.OSDwidth=temp.OSDwidth; ttSetup.OSDHAlign=temp.OSDHAlign; ttSetup.OSDVAlign=temp.OSDVAlign; ttSetup.HideMainMenu=temp.HideMainMenu; ttSetup.txtFontName=temp.txtFontNames[temp.txtFontIndex]; ttSetup.txtG0Block=temp.txtG0Block; ttSetup.txtG2Block=temp.txtG2Block; //ttSetup.inactivityTimeout=temp.inactivityTimeout; for (int i=0;i> 24)); SetupStore("showClock", ttSetup.showClock); //currently not used //SetupStore("suspendReceiving", ttSetup.suspendReceiving); SetupStore("autoUpdatePage", ttSetup.autoUpdatePage); SetupStore("OSDheight", ttSetup.OSDheight); SetupStore("OSDwidth", ttSetup.OSDwidth); SetupStore("OSDHAlign", ttSetup.OSDHAlign); SetupStore("OSDVAlign", ttSetup.OSDVAlign); SetupStore("HideMainMenu", ttSetup.HideMainMenu); SetupStore("txtFontName", ttSetup.txtFontName); SetupStore("txtG0Block", ttSetup.txtG0Block); SetupStore("txtG2Block", ttSetup.txtG2Block); //SetupStore("inactivityTimeout", ttSetup.inactivityTimeout); } cTeletextSetupPage::cTeletextSetupPage(void) { cString buf; cOsdItem *item; temp.txtBlock[0] = tr("Latin 1"); temp.txtBlock[1] = tr("Latin 2"); temp.txtBlock[2] = tr("Latin 3"); temp.txtBlock[3] = tr("Latin 4"); temp.txtBlock[4] = tr("Cyrillic"); temp.txtBlock[5] = tr("Reserved"); temp.txtBlock[6] = tr("Greek"); temp.txtBlock[7] = tr("Reserved"); temp.txtBlock[8] = tr("Arabic"); temp.txtBlock[9] = tr("Reserved"); temp.txtBlock[10] = tr("Hebrew"); //init tables for (int i=0;i= LastAction) {//jump to page selected temp.mapKeyToAction[i]=LastAction; //to display the last string tempPageNumber[i]=ttSetup.mapKeyToAction[i]; } else { //one of the other modes selected temp.mapKeyToAction[i]=ttSetup.mapKeyToAction[i]; tempPageNumber[i]=100; } } tempConfiguredClrBackground=(ttSetup.configuredClrBackground >> 24); temp.showClock=ttSetup.showClock; temp.suspendReceiving=ttSetup.suspendReceiving; temp.autoUpdatePage=ttSetup.autoUpdatePage; temp.OSDheight=ttSetup.OSDheight; temp.OSDwidth=ttSetup.OSDwidth; temp.OSDHAlign=ttSetup.OSDHAlign; temp.OSDVAlign=ttSetup.OSDVAlign; temp.HideMainMenu=ttSetup.HideMainMenu; temp.txtFontName=ttSetup.txtFontName; temp.txtG0Block=ttSetup.txtG0Block; temp.txtG2Block=ttSetup.txtG2Block; //temp.inactivityTimeout=ttSetup.inactivityTimeout; cFont::GetAvailableFontNames(&temp.txtFontNames, true); temp.txtFontIndex = temp.txtFontNames.Find(ttSetup.txtFontName); if (temp.txtFontIndex < 0) { temp.txtFontIndex = 0; } Add(new cMenuEditIntItem(tr("Background transparency"), &tempConfiguredClrBackground, 0, 255)); Add(new cMenuEditBoolItem(tr("Show clock"), &temp.showClock )); //Add(new cMenuEditBoolItem(tr("Setup$Suspend receiving"), &temp.suspendReceiving )); Add(new cMenuEditBoolItem(tr("Auto-update pages"), &temp.autoUpdatePage )); Add(new cMenuEditIntItem(tr("OSD height"), &temp.OSDheight, 250, MAXOSDHEIGHT)); Add(new cMenuEditIntItem(tr("OSD width"), &temp.OSDwidth, 320, MAXOSDWIDTH)); Add(new cMenuEditIntItem(tr("OSD horizontal align"), &temp.OSDHAlign, 0, 100)); Add(new cMenuEditIntItem(tr("OSD vertical align"), &temp.OSDVAlign, 0, 100)); Add(new cMenuEditBoolItem(tr("Hide mainmenu entry"), &temp.HideMainMenu)); Add(new cMenuEditStraItem(tr("Text Font"), &temp.txtFontIndex, temp.txtFontNames.Size(), &temp.txtFontNames[0])); Add(new cMenuEditStraItem(tr("G0 code block"), &temp.txtG0Block, NUMELEMENTS(temp.txtBlock), temp.txtBlock)); Add(new cMenuEditStraItem(tr("G2 code block"), &temp.txtG2Block, NUMELEMENTS(temp.txtBlock), temp.txtBlock)); //Using same string as VDR's setup menu //Add(new cMenuEditIntItem(tr("Setup.Miscellaneous$Min. user inactivity (min)"), &temp.inactivityTimeout)); buf = cString::sprintf("%s:", tr("Key bindings")); item = new cOsdItem(*buf); item->SetSelectable(false); Add(item); for (int i=0;iProcessKey(Key); //if (state != osUnknown) { //really should not return osUnknown I think if (temp.mapKeyToAction[i] == LastAction && !ActionEdits[i].visible) { //need to make it visible if (i+1::Del(ActionEdits[i].number, false); ActionEdits[i].visible=false; Display(); } break; //return state; //} } } return state; //return cMenuSetupPage::ProcessKey(Key); } void ActionEdit::Init(cTeletextSetupPage* s, int num, cMenuEditIntItem *p, cMenuEditStraItem * a) { action=a; number=p; s->Add(action); if (s->temp.mapKeyToAction[num] == LastAction) { s->Add(number); visible=true; } else visible=false; } VDRPLUGINCREATOR(cPluginTeletextosd); // Don't touch this! osdteletext-0.9.7/COPYING0000644000175000017500000004310311737124466014466 0ustar tobiastobias GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. osdteletext-0.9.7/legacystorage.c0000644000175000017500000001156712117130631016421 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include #include "legacystorage.h" LegacyStorage::LegacyStorage(int maxMB) : fsBlockSize(1), pageBytes(TELETEXT_PAGESIZE) { initMaxStorage(maxMB); } LegacyStorage::~LegacyStorage() { } /* static inline int FilesForMegabytes(double MB, int blocksize) { double pageBytes; if (TELETEXT_PAGESIZE<=blocksize) pageBytes=blocksize; else pageBytes=((TELETEXT_PAGESIZE/blocksize)+1)*blocksize; //reserve 10% for directories return (int)( (1024.0 * 1024.0 * (MB-MB*0.1)) / pageBytes ); }*/ int LegacyStorage::actualFileSize(int netFileSize) { if (netFileSize<=0) return 0; if (netFileSize<=fsBlockSize) return fsBlockSize; else return ((netFileSize/fsBlockSize)+1)*fsBlockSize; } //max==0 means unlimited, max==-1 means a reasonable default value shall be calculated void LegacyStorage::initMaxStorage(int maxMB) { struct statfs fs; if (statfs(getRootDir(), &fs)!=0) { esyslog("OSD-Teletext: Error statfs'ing root directory \"%s\": %s, cache size uncontrolled", getRootDir(), strerror(errno)); return; } fsBlockSize=fs.f_bsize; pageBytes=actualFileSize(TELETEXT_PAGESIZE); if (maxMB>=0) { if (maxMB<3) { esyslog("OSD-Teletext: Request to use at most %d MB for caching. This is not enough, using 3 MB", maxMB); maxMB=3; } maxBytes=MEGABYTE(maxMB); } else if (maxMB==-1) { //calculate a default value double blocksPerMeg = 1024.0 * 1024.0 / fs.f_bsize; double capacityMB=fs.f_blocks / blocksPerMeg; double freeMB=(fs.f_bavail / blocksPerMeg); if (capacityMB<=50 || freeMB<50) { //small (<=50MB) filesystems as root dir are assumed to be dedicated for use as a teletext cache //for others, the maximum default size is set to 50 MB maxBytes=MEGABYTE((int)freeMB); //maxPages= FilesForMegabytes(freeMB, fs.f_bsize); if (freeMB<3.0) { esyslog("OSD-Teletext: Less than %.1f MB free on filesystem of root directory \"%s\"!", freeMB, getRootDir()); maxBytes=MEGABYTE(3); } } else { //the maximum default size is set to 50 MB maxBytes=MEGABYTE(50); } //printf("Set maxBytes to %ld, %.2f %.2f\n", maxBytes, capacityMB, freeMB); } } void LegacyStorage::cleanUp() { byteCount -= Storage::doCleanUp(); } void LegacyStorage::registerFile(PageID page) { //pageBytes is already effective size if ( maxBytes && (byteCount+=pageBytes)>maxBytes ) freeSpace(); } StorageHandle LegacyStorage::openForReading(PageID page, bool countAsAccess) { //the countAsAccess argument was intended for use in a LRU cache, currently unused char filename[PATH_MAX]; getFilename(filename, sizeof(filename), page); StorageHandle ret=(StorageHandle)open(filename, O_RDONLY); return ret; } StorageHandle LegacyStorage::openForWriting(PageID page) { static bool wroteError=false; char filename[PATH_MAX]; getFilename(filename, sizeof(filename), page); bool existed=exists(filename); //first try StorageHandle fd=(StorageHandle)open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (fd) { if (!existed) registerFile(page); return fd; } //no space on disk? make some space available if (errno == ENOSPC) freeSpace(); //second try fd=(StorageHandle)open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (!fd && !wroteError) { //report error to syslog - once! wroteError=true; esyslog("OSD-Teletext: Error opening teletext file %s: %s", filename, strerror(errno)); } //make sure newly created files are counted if (fd && !existed) registerFile(page); return fd; } ssize_t LegacyStorage::write(const void *ptr, size_t size, StorageHandle stream) { ssize_t written; if (!(written=::write((int)stream, ptr, size)) ) { switch (errno) { case ENOSPC: freeSpace(); return ::write((int)stream, ptr, size); case EINTR: esyslog("OSD-Teletext: EINTR while writing. Please contact the author and tell him this happened."); break; default: break; } } return written; } osdteletext-0.9.7/po/0000755000175000017500000000000013244335425014042 5ustar tobiastobiasosdteletext-0.9.7/po/fr_FR.po0000644000175000017500000000403313244335425015400 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Jean-Claude Repetto , 2001 # Olivier Jacques , 2003 # Gregoire Favre , 2003 # Nicolas Huillard , 2005 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-31 22:27+0200\n" "PO-Revision-Date: 2009-01-10 19:32+0100\n" "Last-Translator: Nival Michaël\n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel (press OK): " msgstr "Chaine (Appuyer sur OK): " msgid "Page" msgstr "Page" msgid "not found" msgstr "pas trouvé" msgid "Displays teletext on the OSD" msgstr "Affiche le télétexte sur l'OSD" msgid "Teletext" msgstr "Teletexte" msgid "Zoom" msgstr "Zoom" msgid "Half page" msgstr "Demi-Page" msgid "Change channel" msgstr "Changer la chaîne" msgid "Switch background" msgstr "Change le fond d'écran" msgid "Jump to..." msgstr "Aller à..." msgid "Latin 1" msgstr "" msgid "Latin 2" msgstr "" msgid "Latin 3" msgstr "" msgid "Latin 4" msgstr "" msgid "Cyrillic" msgstr "" msgid "Reserved" msgstr "" msgid "Greek" msgstr "" msgid "Arabic" msgstr "" msgid "Hebrew" msgstr "" msgid "Background transparency" msgstr "Fond transparent" msgid "Show clock" msgstr "Afficher l'heure" msgid "Auto-update pages" msgstr "Mise à jour des pages" msgid "OSD height" msgstr "Hauteur OSD" msgid "OSD width" msgstr "Largeur OSD" msgid "OSD horizontal align" msgstr "Alignement horizontal de l'OSD" msgid "OSD vertical align" msgstr "Alignement vertical de l'OSD" msgid "Hide mainmenu entry" msgstr "" msgid "Text Font" msgstr "" msgid "G0 code block" msgstr "" msgid "G2 code block" msgstr "" msgid "Key bindings" msgstr "Attribution des touches" msgid " Page number" msgstr " Nombre de pages" osdteletext-0.9.7/po/uk_UA.po0000644000175000017500000000425513244335425015414 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Yarema P. aka Knedlyk , 2008 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-31 22:27+0200\n" "PO-Revision-Date: 2009-05-25 20:33+0200\n" "Last-Translator: Yarema P. aka Knedlyk \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel (press OK): " msgstr "Канал (натисніть ОК): " msgid "Page" msgstr "Сторінка" msgid "not found" msgstr "не знайдена" msgid "Displays teletext on the OSD" msgstr "Показувати телетекст в меню" msgid "Teletext" msgstr "Телетекст" msgid "Zoom" msgstr "Збільшити" msgid "Half page" msgstr "Пів сторінки" msgid "Change channel" msgstr "Змінити канал" msgid "Switch background" msgstr "Переключити фон" msgid "Jump to..." msgstr "Перейти до..." msgid "Latin 1" msgstr "" msgid "Latin 2" msgstr "" msgid "Latin 3" msgstr "" msgid "Latin 4" msgstr "" msgid "Cyrillic" msgstr "" msgid "Reserved" msgstr "" msgid "Greek" msgstr "" msgid "Arabic" msgstr "" msgid "Hebrew" msgstr "" msgid "Background transparency" msgstr "Ступінь прозорості фону" msgid "Show clock" msgstr "Показувати годинник" msgid "Auto-update pages" msgstr "Автооновлення сторінок" msgid "OSD height" msgstr "Висота OSD" msgid "OSD width" msgstr "Ширина OSD" msgid "OSD horizontal align" msgstr "Горизонтальне положення OSD" msgid "OSD vertical align" msgstr "Вертикальне положення OSD" msgid "Hide mainmenu entry" msgstr "" msgid "Text Font" msgstr "" msgid "G0 code block" msgstr "" msgid "G2 code block" msgstr "" msgid "Key bindings" msgstr "Призначення клавіш" msgid " Page number" msgstr " Номер сторінки" osdteletext-0.9.7/po/de_DE.po0000644000175000017500000000367313244335425015353 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Klaus Schmidinger , 2000 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-31 22:27+0200\n" "PO-Revision-Date: 2008-05-04 15:33+0200\n" "Last-Translator: Klaus Schmidinger \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel (press OK): " msgstr "Sender (OK drücken): " msgid "Page" msgstr "Seite" msgid "not found" msgstr "nicht gefunden" msgid "Displays teletext on the OSD" msgstr "Zeigt den Videotext auf dem OSD an" msgid "Teletext" msgstr "Videotext" msgid "Zoom" msgstr "Vergrößern" msgid "Half page" msgstr "Halbe Seite" msgid "Change channel" msgstr "Kanal wechseln" msgid "Switch background" msgstr "Hintergrund ändern" msgid "Jump to..." msgstr "Springe zu..." msgid "Latin 1" msgstr "" msgid "Latin 2" msgstr "" msgid "Latin 3" msgstr "" msgid "Latin 4" msgstr "" msgid "Cyrillic" msgstr "" msgid "Reserved" msgstr "" msgid "Greek" msgstr "" msgid "Arabic" msgstr "" msgid "Hebrew" msgstr "" msgid "Background transparency" msgstr "Hintergrund-Transparenz" msgid "Show clock" msgstr "Uhr anzeigen" msgid "Auto-update pages" msgstr "Seiten aktualisieren" msgid "OSD height" msgstr "OSD-Höhe" msgid "OSD width" msgstr "OSD-Breite" msgid "OSD horizontal align" msgstr "OSD horizontale Anordnung" msgid "OSD vertical align" msgstr "OSD vertikale Anordnung" msgid "Hide mainmenu entry" msgstr "Hauptmenüeintrag verstecken" msgid "Text Font" msgstr "" msgid "G0 code block" msgstr "" msgid "G2 code block" msgstr "" msgid "Key bindings" msgstr "Tastenzuweisung" msgid " Page number" msgstr " Seitenzahl" osdteletext-0.9.7/po/ca_ES.po0000644000175000017500000000364013244335425015357 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Marc Rovira Vall , 2003 # Ramon Roca , 2003 # Jordi Vilà , 2003 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-31 22:27+0200\n" "PO-Revision-Date: 2008-05-04 15:33+0200\n" "Last-Translator: Jordi Vilà \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel (press OK): " msgstr "Canal (premi OK):" msgid "Page" msgstr "Pàgina" msgid "not found" msgstr "no trobada" msgid "Displays teletext on the OSD" msgstr "Visualitza el teletext en l'OSD" msgid "Teletext" msgstr "Teletext" msgid "Zoom" msgstr "Zoom" msgid "Half page" msgstr "Mitja pàgina" msgid "Change channel" msgstr "Canvi cadena" msgid "Switch background" msgstr "Canvia el fons" msgid "Jump to..." msgstr "Salta a..." msgid "Latin 1" msgstr "" msgid "Latin 2" msgstr "" msgid "Latin 3" msgstr "" msgid "Latin 4" msgstr "" msgid "Cyrillic" msgstr "" msgid "Reserved" msgstr "" msgid "Greek" msgstr "" msgid "Arabic" msgstr "" msgid "Hebrew" msgstr "" msgid "Background transparency" msgstr "Transparència del fons" msgid "Show clock" msgstr "Visualitza l'hora" msgid "Auto-update pages" msgstr "Actualització pàgines automàtica" msgid "OSD height" msgstr "Altura OSD" msgid "OSD width" msgstr "Amplària OSD" msgid "OSD horizontal align" msgstr "" msgid "OSD vertical align" msgstr "" msgid "Hide mainmenu entry" msgstr "" msgid "Text Font" msgstr "" msgid "G0 code block" msgstr "" msgid "G2 code block" msgstr "" msgid "Key bindings" msgstr "" msgid " Page number" msgstr " Nombre de pàgina" osdteletext-0.9.7/po/sk_SK.po0000644000175000017500000000370613244335425015422 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Klaus Schmidinger , 2000 # msgid "" msgstr "" "Project-Id-Version: osdteletext-0.9.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-31 22:27+0200\n" "PO-Revision-Date: 2011-02-15 21:11+0100\n" "Last-Translator: Milan Hrala \n" "Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel (press OK): " msgstr "Kanál (stlačte OK): " msgid "Page" msgstr "Strana" msgid "not found" msgstr "nenájdená" msgid "Displays teletext on the OSD" msgstr "Zobrazí teletext na OSD" msgid "Teletext" msgstr "Teletext" msgid "Zoom" msgstr "Zväčšenie" msgid "Half page" msgstr "Polovica strany" msgid "Change channel" msgstr "Zmena kanálu" msgid "Switch background" msgstr "Prepnúť na pozadí" msgid "Jump to..." msgstr "Skoč na..." msgid "Latin 1" msgstr "" msgid "Latin 2" msgstr "" msgid "Latin 3" msgstr "" msgid "Latin 4" msgstr "" msgid "Cyrillic" msgstr "" msgid "Reserved" msgstr "" msgid "Greek" msgstr "" msgid "Arabic" msgstr "" msgid "Hebrew" msgstr "" msgid "Background transparency" msgstr "Priesvitnosť pozadia" msgid "Show clock" msgstr "Zobraziť hodiny" msgid "Auto-update pages" msgstr "Aktualizácia stránok" msgid "OSD height" msgstr "OSD výška" msgid "OSD width" msgstr "OSD šírka" msgid "OSD horizontal align" msgstr "OSD vodorovné zarovnanie" msgid "OSD vertical align" msgstr "OSD zvyslé zarovnanie" msgid "Hide mainmenu entry" msgstr "Schovať položku v hlavnom menu" msgid "Text Font" msgstr "" msgid "G0 code block" msgstr "" msgid "G2 code block" msgstr "" msgid "Key bindings" msgstr "Klávesové skratky" msgid " Page number" msgstr " Číslo strany" osdteletext-0.9.7/po/ru_RU.po0000644000175000017500000000457413244335425015450 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Vyacheslav Dikonov , 2004 # Oleg Roitburd , 2008 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-06-10 21:01+1000\n" "PO-Revision-Date: 2008-12-30 13:52+0100\n" "Last-Translator: Andrey Pridvorov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel (press OK): " msgstr "Канал (Нажмите ОК)" msgid "Page" msgstr "Страница" msgid "not found" msgstr "не найдена" msgid "Displays teletext on the OSD" msgstr "Показ телетекста в OSD" msgid "Teletext" msgstr "Телетекст" msgid "Zoom" msgstr "увеличить" msgid "Half page" msgstr "пол-страницы" msgid "Change channel" msgstr "переключить канал" msgid "Switch background" msgstr "Переключить фон" msgid "Jump to..." msgstr "перейти к..." msgid "Latin 1" msgstr "Латин. 1" msgid "Latin 2" msgstr "Латин. 2" msgid "Latin 3" msgstr "Латин. 3" msgid "Latin 4" msgstr "Латин. 4" msgid "Cyrillic" msgstr "Кириллич." msgid "Reserved" msgstr "Резерв" msgid "Greek" msgstr "Греческ." msgid "Arabic" msgstr "Арабск." msgid "Hebrew" msgstr "Иврит" msgid "Background transparency" msgstr "Прозрачность фона" msgid "Show clock" msgstr "Показывать часы" msgid "Auto-update pages" msgstr "Автообновление страниц" msgid "OSD height" msgstr "Высота меню" msgid "OSD width" msgstr "Ширина меню" msgid "OSD horizontal align" msgstr "Горизонтальное положение OSD" msgid "OSD vertical align" msgstr "Вертикальное положение OSD" msgid "Hide mainmenu entry" msgstr "Скрыть в главном меню" msgid "Text Font" msgstr "Шрифт" msgid "G0 code block" msgstr "G0 кодировка" msgid "G2 code block" msgstr "G2 кодировка" msgid "Key bindings" msgstr "Привязка кнопок" msgid " Page number" msgstr " Номер страницы" osdteletext-0.9.7/po/it_IT.po0000644000175000017500000000426513244335425015421 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Alberto Carraro , 2001 # Antonio Ospite , 2003 # Sean Carlos , 2005 # Davide Cavalca , 2008 # Diego Pierotto , 2008 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-31 22:27+0200\n" "PO-Revision-Date: 2010-11-06 19:59+0100\n" "Last-Translator: Diego Pierotto \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Italian\n" "X-Poedit-Country: ITALY\n" "X-Poedit-SourceCharset: utf-8\n" msgid "Channel (press OK): " msgstr "Canale (premi OK): " msgid "Page" msgstr "Pagina" msgid "not found" msgstr "non trovata" msgid "Displays teletext on the OSD" msgstr "Mostra il teletext in OSD" msgid "Teletext" msgstr "Teletext" msgid "Zoom" msgstr "Ingrandisci" msgid "Half page" msgstr "Metà pagina" msgid "Change channel" msgstr "Cambia canale" msgid "Switch background" msgstr "Cambia sfondo" msgid "Jump to..." msgstr "Vai a..." msgid "Latin 1" msgstr "" msgid "Latin 2" msgstr "" msgid "Latin 3" msgstr "" msgid "Latin 4" msgstr "" msgid "Cyrillic" msgstr "" msgid "Reserved" msgstr "" msgid "Greek" msgstr "" msgid "Arabic" msgstr "" msgid "Hebrew" msgstr "" msgid "Background transparency" msgstr "Trasparenza sfondo" msgid "Show clock" msgstr "Mostra orologio" msgid "Auto-update pages" msgstr "Aggiorn. automatico pagine" msgid "OSD height" msgstr "Altezza OSD" msgid "OSD width" msgstr "Larghezza OSD" msgid "OSD horizontal align" msgstr "Allineamento orizzontale OSD" msgid "OSD vertical align" msgstr "Allineamento verticale OSD" msgid "Hide mainmenu entry" msgstr "Nascondi voce menu principale" msgid "Text Font" msgstr "" msgid "G0 code block" msgstr "" msgid "G2 code block" msgstr "" msgid "Key bindings" msgstr "Tasti associati" msgid " Page number" msgstr " Numero pagina" osdteletext-0.9.7/po/pt_PT.po0000644000175000017500000000362313244335425015434 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Klaus Schmidinger , 2000 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-31 22:27+0200\n" "PO-Revision-Date: 2008-05-04 15:33+0200\n" "Last-Translator: Chris Silva \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel (press OK): " msgstr "Sender (Prima OK): " msgid "Page" msgstr "Página" msgid "not found" msgstr "Não encontrado" msgid "Displays teletext on the OSD" msgstr "Mostra o teletexto no OSD" msgid "Teletext" msgstr "Teletexto" msgid "Zoom" msgstr "Zoom" msgid "Half page" msgstr "Meia Página" msgid "Change channel" msgstr "Mudar canal" msgid "Switch background" msgstr "Mudar fundo" msgid "Jump to..." msgstr "Ir para" msgid "Latin 1" msgstr "" msgid "Latin 2" msgstr "" msgid "Latin 3" msgstr "" msgid "Latin 4" msgstr "" msgid "Cyrillic" msgstr "" msgid "Reserved" msgstr "" msgid "Greek" msgstr "" msgid "Arabic" msgstr "" msgid "Hebrew" msgstr "" msgid "Background transparency" msgstr "Transparência do Fundo" msgid "Show clock" msgstr "Mostrar Relógio" msgid "Auto-update pages" msgstr "Auto actualizar páginas" msgid "OSD height" msgstr "Altura do OSD" msgid "OSD width" msgstr "Largura do OSD" msgid "OSD horizontal align" msgstr "Alinhamento Horizontal do OSD" msgid "OSD vertical align" msgstr "Alinhamento Vertical do OSD" msgid "Hide mainmenu entry" msgstr "" msgid "Text Font" msgstr "" msgid "G0 code block" msgstr "" msgid "G2 code block" msgstr "" msgid "Key bindings" msgstr "Tecla alocada" msgid " Page number" msgstr " Número de Página" osdteletext-0.9.7/po/fi_FI.po0000644000175000017500000000374413244335425015366 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Rolf Ahrenberg , 2003 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-31 22:27+0200\n" "PO-Revision-Date: 2008-05-04 15:33+0200\n" "Last-Translator: Rolf Ahrenberg \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel (press OK): " msgstr "Kanava (paina OK):" msgid "Page" msgstr "Sivua" msgid "not found" msgstr "ei löydy" msgid "Displays teletext on the OSD" msgstr "Teksti-TV (OSD)" msgid "Teletext" msgstr "Teksti-TV" msgid "Zoom" msgstr "Suurenna" msgid "Half page" msgstr "Puolikas sivu" msgid "Change channel" msgstr "Vaihda kanavaa" msgid "Switch background" msgstr "Vaihda tausta" msgid "Jump to..." msgstr "Siirry sivulle..." msgid "Latin 1" msgstr "Latin 1" msgid "Latin 2" msgstr "Latin 2" msgid "Latin 3" msgstr "Latin 3" msgid "Latin 4" msgstr "Latin 4" msgid "Cyrillic" msgstr "kyrillinen" msgid "Reserved" msgstr "varattu" msgid "Greek" msgstr "kreikka" msgid "Arabic" msgstr "arabia" msgid "Hebrew" msgstr "hebrea" msgid "Background transparency" msgstr "Taustan läpinäkyvyys" msgid "Show clock" msgstr "Näytä kello" msgid "Auto-update pages" msgstr "Automaattinen sivupäivitys" msgid "OSD height" msgstr "Korkeus" msgid "OSD width" msgstr "Leveys" msgid "OSD horizontal align" msgstr "Pystykeskitys" msgid "OSD vertical align" msgstr "Vaakakeskitys" msgid "Hide mainmenu entry" msgstr "Piilota valinta päävalikosta" msgid "Text Font" msgstr "Käytä kirjasinta" msgid "G0 code block" msgstr "G0-koodilohko" msgid "G2 code block" msgstr "G2-koodilohko" msgid "Key bindings" msgstr "Näppäintoiminnot" msgid " Page number" msgstr " Sivunumero" osdteletext-0.9.7/po/es_ES.po0000644000175000017500000000351513244335425015404 0ustar tobiastobias# VDR plugin language source file. # Copyright (C) 2007 Klaus Schmidinger # This file is distributed under the same license as the VDR package. # Ruben Nunez Francisco , 2002 # msgid "" msgstr "" "Project-Id-Version: VDR 1.5.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-01-31 22:27+0200\n" "PO-Revision-Date: 2008-05-04 15:33+0200\n" "Last-Translator: Ruben Nunez Francisco \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Channel (press OK): " msgstr "Canal (pulse OK):" msgid "Page" msgstr "Página" msgid "not found" msgstr "no encontrada" msgid "Displays teletext on the OSD" msgstr "Visualiza el teletexto en el OSD" msgid "Teletext" msgstr "Teletexto" msgid "Zoom" msgstr "Zoom" msgid "Half page" msgstr "Media página" msgid "Change channel" msgstr "Cambio cadena" msgid "Switch background" msgstr "Cambia el fondo" msgid "Jump to..." msgstr "Salta a..." msgid "Latin 1" msgstr "" msgid "Latin 2" msgstr "" msgid "Latin 3" msgstr "" msgid "Latin 4" msgstr "" msgid "Cyrillic" msgstr "" msgid "Reserved" msgstr "" msgid "Greek" msgstr "" msgid "Arabic" msgstr "" msgid "Hebrew" msgstr "" msgid "Background transparency" msgstr "Transparencia del fondo" msgid "Show clock" msgstr "Visualiza el reloj" msgid "Auto-update pages" msgstr "" msgid "OSD height" msgstr "Altura OSD" msgid "OSD width" msgstr "Anchura OSD" msgid "OSD horizontal align" msgstr "" msgid "OSD vertical align" msgstr "" msgid "Hide mainmenu entry" msgstr "" msgid "Text Font" msgstr "" msgid "G0 code block" msgstr "" msgid "G2 code block" msgstr "" msgid "Key bindings" msgstr "" msgid " Page number" msgstr " Número de página" osdteletext-0.9.7/txtrecv.h0000644000175000017500000000451413244253751015301 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef __TXTRECV_H #define __TXTRECV_H #include #include #include #include #include #include #include "storage.h" class cTelePage { private: int mag; unsigned char flags; unsigned char lang; PageID page; unsigned char pagebuf[27*40]; Storage* storage; public: cTelePage(PageID page, uchar flags, uchar lang, int mag, Storage *s); ~cTelePage(); void SetLine(int, uchar*); void save(); bool IsTopTextPage(); }; class cRingTxtFrames : public cRingBufferFrame { public: cRingTxtFrames(int Size) : cRingBufferFrame(Size, true) {}; ~cRingTxtFrames() { Clear(); }; void Wait(void) { WaitForGet(); }; void Signal(void) { EnableGet(); }; }; class cTxtReceiver : public cReceiver, public cThread { private: void DecodeTXT(uchar*); uchar unham16 (uchar*); cTelePage *TxtPage; void SaveAndDeleteTxtPage(); bool storeTopText; cRingTxtFrames buffer; Storage *storage; protected: virtual void Activate(bool On); #if defined(APIVERSNUM) && APIVERSNUM >= 20301 virtual void Receive(const uchar *Data, int Length); #else virtual void Receive(uchar *Data, int Length); #endif virtual void Action(); public: cTxtReceiver(const cChannel* chan, bool storeTopText, Storage* storage); virtual ~cTxtReceiver(); virtual void Stop(); }; class cTxtStatus : public cStatus { private: cTxtReceiver *receiver; bool storeTopText; Storage* storage; protected: virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView); public: cTxtStatus(bool storeTopText, Storage* storage); ~cTxtStatus(); }; #endif osdteletext-0.9.7/README.DE0000644000175000017500000001167711737124466014615 0ustar tobiastobiasBeschreibung: OSD-Teletext zeigt Videotext direkt auf dem OSD an. Im Hintergrund gibt es weiterhin Bild und Ton. Tasten: 1,...,9: Seitenzahl eingeben Hoch: Seite weiter Herunter:Seite zurück Rechts: Unterseite weiter Links: Unterseite zurück Zurück: Videotext-Plugin schließen Die restliche Bedienung ("Aktionen") durch die anderen Tasten ist frei konfigurierbar. Man kann z.B. einstellen, das die man mit der Taste Rot auf die Seite 100 springt. Bei dieser Einstellung wäre die Aktion "Springe zu 100" der Taste Rot zugeordnet. Verfügbare Tasten: Blau, Rot, Gelb, Grün, Play, Stop, Schneller Vorlauf, Schn. Rücklauf Aktionen: "Vergrößern", "Halbe Seite", "Kanal wechseln", "Hintergrund wechseln", "Springe zu..." einer bestimmten Seite Beschreibung der Aktionen: Vergrößern: Obere / untere Hälfte vergrößern / zurück zur ganzen Seite Halbe Seite: OSD-Fenster nur noch in unterer Hälfte des Bildschirms zeigen und obere / untere Hälfte anzeigen bzw. zurück Kanal wechseln:Seiten eines anderen Senders als des gerade eingestellten anzeigen. Dabei wird keine Frequenz gewechselt oder mit VDR ein anderer Kanal eingestellt. Damit Seiten verfügbar sind, muss irgendwann vorher der gewählte Kanal eingestellt gewesen sein. Bei Aufruf der Aktion wird nach der Kanalnummer gefragt. Die Nummer mit den Zifferntasten eingeben und OK drücken. Springe zu...: Springt zu der entsprechenden Seite Hintergrund wechseln: Ändert die im Setup einstellbare Hintergrundfarbe sofort zu Schwarz und nach erneutem Aufruf wieder zurück. Wie man Tasten Aktionen zuordnet: Im Einstellungsmenü des Plugins kann jeder Taste eine Aktion zugeordnet werden. Dabei ist nichts vorgeschrieben - keine Aktion muss irgendeiner Taste zugewiesen werden, wenn sie nicht benötigt wird. Bei Auswahl von "Springe zu..." wird die Seitennummer in der Zeile direkt darunter angegeben. Andere Optionen: Hintergrund-Transparenz: Zahl zwischen 0 (transparent) und 255 (schwarz). Vorgegeben ist 127 (wie auch von VDR) Zeige Uhr: Diese Option bestimmt, ob etwa im Sekundenabstand zusätzlich eine Uhr angezeigt wird. Die Uhr zeigt die aktuelle Systemzeit, nicht die mit dem Videotext ausgestrahlte Zeit. Um genaue Werte zu haben, kann VDR die Systemzeit von einem Transponder einstellen. Automatisch aktualisieren: Überprüft ständig, ob sich die Seite geändert hat und aktualisiert sie wenn nötig OSD-Breite, OSD-Höhe: Hier kann die Breite des OSD unabhängig von den Einstellungen für VDR bestimmt werden. Für die Breite liegt die Zahl zwischen 40 und 56, für die Höhe zwischen 12 und 21. Mindest Benutzer-Inaktivität: Bestimmt die Zeit (in Minuten), nach der das Plugin automatisch geschlossen wird, wenn der Benutzer solange keine Taste betätigt hat. Das kann durch setzen des Wertes auf 0 verhindert werden. Dann wird jedoch auch das automatische Abschalten von VDR effektiv außer Kraft gesetzt, solange das Plugin geöffnet ist. Tasten einrichten: siehe oben Kommandozeilen-Optionen: Einige Einstellungen werden über die Kommandozeile anstatt über das Menü gesetzt. Verfügbare Optionen: -d --directory=DIR Das Verzeichnis für die temporären Dateien. (Voreinstellung: /var/cache/vdr/vtx) Stellen Sie sicher, dass das Verzeichnis existiert und beschreibbar ist. -n --max-cache=NUM Maximale Größe des Zwischenspeichers für Seiten auf der Festplatte. (Voreinstellung: ein berechneter Wert unter 50 MB) -s --cache-system=SYS Das zu benutzende Zwischenspeichersystem. Wählen Sie "legacy" für das althergebrachte System "Eine Datei - eine Seite". Voreinstellung ist "packed" für ein System, das in eine Datei mehrere Seiten speichert. -t --toptext Speichere TopText Seiten (nich anzeigbar) Farben: Auf allen Ausgabegeräten, die nicht in der Farbtiefe des OSD beschränkt sind, werden die unveränderten Farben des Videotexts dargestellt (einzig Weiß wurde zum Zwecke der besseren Lesbarkeit durch Cyan ersetzt). Für die klassische DVB-Karte mit Hardware-Dekoder und anderen so beschränkten Geräten werden nur vier Farben dargestellt. Die Zuordnung ist auf ARD, ZDF und RTL optimiert. Sollten Sie aus irgendeinem Grund absolut nicht meiner Meinung sein, passen Sie die Datei colormapping.h an und kompilieren Sie neu. osdteletext-0.9.7/txtrecv.c0000644000175000017500000001711113244253751015271 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include #include "txtrecv.h" #include "tables.h" #include "setup.h" #include "menu.h" #include #include #include #include #include #include #include #include #include #include cTelePage::cTelePage(PageID t_page, uchar t_flags, uchar t_lang,int t_mag, Storage *s) : mag(t_mag), flags(t_flags), lang(t_lang), page(t_page), storage(s) { memset(pagebuf,' ',26*40); } cTelePage::~cTelePage() { } void cTelePage::SetLine(int line, uchar *myptr) { memcpy(pagebuf+40*line,myptr,40); } void cTelePage::save() { unsigned char buf; StorageHandle fd; if ( (fd=storage->openForWriting(page)) ) { storage->write("VTXV4",5,fd); buf=0x01; storage->write(&buf,1,fd); buf=mag; storage->write(&buf,1,fd); buf=page.page; storage->write(&buf,1,fd); buf=flags; storage->write(&buf,1,fd); buf=lang; storage->write(&buf,1,fd); buf=0x00; storage->write(&buf,1,fd); buf=0x00; storage->write(&buf,1,fd); storage->write(pagebuf,24*40,fd); storage->close(fd); } } bool cTelePage::IsTopTextPage() { return (page.page & 0xFF) > 0x99 || (page.page & 0x0F) > 0x9; } cTxtStatus::cTxtStatus(bool storeTopText, Storage* storage) : receiver(NULL), storeTopText(storeTopText), storage(storage) { } cTxtStatus::~cTxtStatus() { delete receiver; } void cTxtStatus::ChannelSwitch(const cDevice *Device, int ChannelNumber, bool LiveView) { // Disconnect receiver if channel is 0, will reconnect to new // receiver after channel change. if (LiveView && ChannelNumber == 0) DELETENULL(receiver); // ignore if channel is 0 if (ChannelNumber == 0) return; // ignore if channel is invalid (highly unlikely, this will ever // be the case, but defensive coding rules!) #if defined(APIVERSNUM) && APIVERSNUM >= 20301 LOCK_CHANNELS_READ; const cChannel* newLiveChannel = Channels->GetByNumber(ChannelNumber); #else const cChannel* newLiveChannel = Channels.GetByNumber(ChannelNumber); #endif if (newLiveChannel == NULL) return; // ignore non-live-channel-switching if (!LiveView || ChannelNumber != cDevice::CurrentChannel()) return; // live channel was changed // now re-attach the receiver to the new live channel DELETENULL(receiver); int TPid = newLiveChannel->Tpid(); if (TPid) { receiver = new cTxtReceiver(newLiveChannel, storeTopText, storage); cDevice::ActualDevice()->AttachReceiver(receiver); } TeletextBrowser::ChannelSwitched(ChannelNumber); } cTxtReceiver::cTxtReceiver(const cChannel* chan, bool storeTopText, Storage* storage) : cReceiver(chan, -1), cThread("osdteletext-receiver"), TxtPage(0), storeTopText(storeTopText), buffer((188+60)*75), storage(storage) { SetPids(NULL); AddPid(chan->Tpid()); storage->prepareDirectory(ChannelID()); // 10 ms timeout on getting TS frames buffer.SetTimeouts(0, 10); } cTxtReceiver::~cTxtReceiver() { Detach(); Activate(false); buffer.Clear(); delete TxtPage; } void cTxtReceiver::Stop() { Activate(false); } void cTxtReceiver::Activate(bool On) { if (On) { if (!Running()) { Start(); } } else if (Running()) { buffer.Signal(); Cancel(2); } } #if defined(APIVERSNUM) && APIVERSNUM >= 20301 void cTxtReceiver::Receive(const uchar *Data, int Length) #else void cTxtReceiver::Receive(uchar *Data, int Length) #endif { cFrame *frame=new cFrame(Data, Length); if (!buffer.Put(frame)) { // Buffer overrun delete frame; buffer.Signal(); } } void cTxtReceiver::Action() { while (Running()) { cFrame *frame=buffer.Get(); if (frame) { uchar *Datai=frame->Data(); for (int i=0; i < 4; i++) { if (Datai[4+i*46]==2 || Datai[4+i*46]==3) { for (int j=(8+i*46);j<(50+i*46);j++) Datai[j]=invtab[Datai[j]]; DecodeTXT(&Datai[i*46]); } } buffer.Drop(frame); } else buffer.Wait(); } buffer.Clear(); } uchar cTxtReceiver::unham16 (uchar *p) { unsigned short c1,c2; c1=unhamtab[p[0]]; c2=unhamtab[p[1]]; return (c1 & 0x0F) | (c2 & 0x0F) *16; } void cTxtReceiver::SaveAndDeleteTxtPage() { if (TxtPage) { if (storeTopText || !TxtPage->IsTopTextPage()) { TxtPage->save(); DELETENULL(TxtPage); } } } void cTxtReceiver::DecodeTXT(uchar* TXT_buf) { // Format of buffer: // 0x00-0x04 ? // 0x05-0x06 Clock Run-In? // 0x07 Framing Code? // 0x08 Magazine number (100-digit of page number) // 0x09 Line number // 0x0A..0x31 Line data // Line 0 only: // 0x0A 10-digit of page number // 0x0B 1-digit of page number // 0x0C Sub-Code bits 0..3 // 0x0D Sub-Code bits 4..6 + C4 flag // 0x0E Sub-Code bits 8..11 // 0x0F Sub-Code bits 12..13 + C5,C6 flag // 0x10 C7-C10 flags // 0x11 C11-C14 flags // // Flags: // C4 - Erase last page, new page transmitted // C5 - News flash, boxed display // C6 - Subtitle, boxed display // C7 - Suppress Header, dont show line 0 // C8 - Update, page has changed // C9 - Interrupt Sequence, page number is out of order // C10 - Inhibit Display // C11 - Magazine Serial mode // C12-C14 - Language selection, lower 3 bits int hdr,mag,mag8,line; uchar *ptr; uchar flags,lang; hdr = unham16 (&TXT_buf[0x8]); mag = hdr & 0x07; mag8 = mag ?: 8; line = (hdr>>3) & 0x1f; ptr = &TXT_buf[10]; switch (line) { case 0: { unsigned char b1, b2, b3, b4; int pgno, subno; b1 = unham16 (ptr); // Page no, 10- and 1-digit if (b1 == 0xff) break; SaveAndDeleteTxtPage(); b2 = unham16 (ptr+2); // Sub-code 0..6 + C4 b3 = unham16 (ptr+4); // Sub-code 8..13 + C5,C6 b4 = unham16 (ptr+6); // C7..C14 // flags: // 0x80 C4 - Erase page // 0x40 C5 - News flash // 0x20 C6 - Subtitle // 0x10 C7 - Suppress Header // 0x08 C8 - Update // 0x04 C9 - Interrupt Sequence // 0x02 C9 (Bug?) // 0x01 C11 - Magazine Serial mode flags=b2 & 0x80; flags|=(b3&0x40)|((b3>>2)&0x20); //?????? flags|=((b4<<4)&0x10)|((b4<<2)&0x08)|(b4&0x04)|((b4>>1)&0x02)|((b4>>4)&0x01); lang=((b4>>5) & 0x07); pgno = mag8 * 256 + b1; subno = (b2 + b3 * 256) & 0x3f7f; // Sub Page Number TxtPage = new cTelePage(PageID(ChannelID(), pgno, subno), flags, lang, mag, storage); TxtPage->SetLine((int)line,(uchar *)ptr); break; } case 1 ... 25: { if (TxtPage) TxtPage->SetLine((int)line,(uchar *)ptr); break; } /*case 23: { SaveAndDeleteTxtPage(); break; }*/ default: break; } } osdteletext-0.9.7/packedstorage.c0000644000175000017500000001122212117130631016370 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "packedstorage.h" PackedStorage::PackedStorage(int maxMB) : LegacyStorage(maxMB) { } #define TOC_SIZE 8 //The file structure is simple: // TOC_SIZE*PageAddress contains the numbers of the following pages // TOC_SIZE*TELETEXT_PAGESIZE contains the page data //and the same again. bool PackedStorage::seekTo(PageID page, int desc, bool create) { lseek(desc, 0, SEEK_SET); PageAddress addr[TOC_SIZE]; while (::read(desc, addr, sizeof(addr)) == sizeof(addr)) { lseek(desc, 0, SEEK_CUR); for (int index=0; indexmaxBytes ) freeSpace(); return (StorageHandle)desc; } //no space on disk? make some space available if (errno == ENOSPC) freeSpace(); //second try desc=open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (desc==-1 && !wroteError) { //report error to syslog - once! wroteError=true; esyslog("OSD-Teletext: Error opening teletext file %s: %s", filename, strerror(errno)); } if (desc==-1) return StorageHandle(); else if (!seekTo(page, desc, true)) { ::close(desc); return StorageHandle(); } if ( maxBytes && byteCount>maxBytes ) freeSpace(); return (StorageHandle)desc; } StorageHandle PackedStorage::openForReading(PageID page, bool countAsAccess) { int desc; if ( (desc=(int)LegacyStorage::openForReading(page, false))!= -1 ) { if (!seekTo(page, desc, false)) { //this is not an error condition here, may and shall happen! ::close(desc); } else { return (StorageHandle)desc; } } return StorageHandle(); } osdteletext-0.9.7/setup.h0000644000175000017500000000331713244332173014736 0ustar tobiastobias/*************************************************************** -*- c++ -*- * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef __SETUP_H #define __SETUP_H //There are two places to be kept in sync with these enums: //TeletextBrowser::TranslateKey and //the constants in cPluginTeletextosd::initTexts enum eTeletextAction { Zoom, HalfPage, SwitchChannel, DarkScreen, /*SuspendReceiving,*/ LastAction }; //and 100-899 => jump to page enum ActionKeys { ActionKeyRed, ActionKeyGreen, ActionKeyYellow, ActionKeyBlue, ActionKeyPlay, ActionKeyStop, ActionKeyFastFwd, ActionKeyFastRew, LastActionKey }; //Default values are set in menu.c, setup menu, parsing and storing can be found in osdteletext.c class TeletextSetup { public: TeletextSetup(); int mapKeyToAction[10]; //4 color keys + kPlay, kPause etc. unsigned int configuredClrBackground; int showClock; int suspendReceiving; int autoUpdatePage; int OSDheight; int OSDwidth; int OSDHAlign; int OSDVAlign; int inactivityTimeout; int HideMainMenu; cString txtFontName; cStringList txtFontNames; int txtFontIndex; int txtG0Block; int txtG2Block; const char *txtBlock[11]; }; extern TeletextSetup ttSetup; #endif osdteletext-0.9.7/displaybase.c0000644000175000017500000003376413244253751016106 0ustar tobiastobias/*************************************************************** -*- c++ -*- * * * displaybase.c - Base class for rendering a teletext cRenderPage to * * an actual VDR OSD. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * Changelog: * * 2005-03 initial version (c) Udo Richter * * * ***************************************************************************/ #include #include #include #include "displaybase.h" #include "txtfont.h" #include std::string cDisplay::GFXFontFootprint = ""; std::string cDisplay::TXTFontFootprint = ""; int cDisplay::realFontWidths[8] = {0}; cDisplay::cDisplay(int width, int height) : Zoom(Zoom_Off), Concealed(false), Blinked(false), FlushLock(0), Boxed(false), Width(width), Height(height), Background(clrGray50), osd(NULL), outputWidth(0), outputScaleX(1.0), outputHeight(0), outputScaleY(1.0), ScaleX(1), ScaleY(1), OffsetX(0), OffsetY(0), MessageFont(cFont::GetFont(fontSml)), MessageX(0), MessageY(0), MessageW(0), MessageH(0), GFXFont(0), GFXDblWFont(0), GFXDblHFont(0), GFXDblHWFont(0), TXTFont(0), TXTDblWFont(0), TXTDblHFont(0), TXTDblHWFont(0) { } cDisplay::~cDisplay() { DELETENULL(osd); DELETENULL(GFXFont); DELETENULL(GFXDblWFont); DELETENULL(GFXDblHFont); DELETENULL(GFXDblHWFont); DELETENULL(TXTFont); DELETENULL(TXTDblWFont); DELETENULL(TXTDblHFont); DELETENULL(TXTDblHWFont); } // This is an ugly hack, any ideas on how to get font size with characters (glyphs) of specified width/height? cFont *cDisplay::GetFont(const char *name, int fontIndex, int height, int width) { cFont *font = cFont::CreateFont(name, height, width); if (font != NULL) { int realWidth = font->Width(' '); for (int i = width * width / realWidth; i < width * 4; i++) { DELETENULL(font); font = cFont::CreateFont(name, height, i); if (font != NULL) { realWidth = font->Width(' '); if (realWidth > width) { DELETENULL(font); width = i - 1; font = cFont::CreateFont(name, height, width); realFontWidths[fontIndex] = width; break; } } } } return font; } std::string cDisplay::GetFontFootprint(const char *name) { return std::string(cString::sprintf("%s_%d_%d_%d", name, fontWidth, fontHeight, Zoom)); } void cDisplay::InitScaler() { // Set up the scaling factors. Also do zoom mode by // scaling differently. outputScaleX = (double)outputWidth/480.0; outputScaleY = (double)outputHeight/250.0; int height=Height-6; int width=Width-6; OffsetX=3; OffsetY=3; switch (Zoom) { case Zoom_Upper: height=height*2; break; case Zoom_Lower: OffsetY=OffsetY-height; height=height*2; break; default:; } ScaleX=(480<<16)/width; ScaleY=(250<<16)/height; fontWidth = outputWidth * 2 / 40; if (Zoom == Zoom_Off) { fontHeight = outputHeight * 2 / 25; } else { fontHeight = outputHeight * 2 / 13; } int gfxFontWidth = fontWidth; int gfxFontHeight = fontHeight; const char *gfxFontName = "teletext2:Medium"; std::string footprint = GetFontFootprint(gfxFontName); if (footprint.compare(GFXFontFootprint) == 0) { GFXFont = cFont::CreateFont(gfxFontName, gfxFontHeight / 2, realFontWidths[0]); GFXDblWFont = cFont::CreateFont(gfxFontName, gfxFontHeight / 2, realFontWidths[1]); GFXDblHFont = cFont::CreateFont(gfxFontName, gfxFontHeight , realFontWidths[2]); GFXDblHWFont = cFont::CreateFont(gfxFontName, gfxFontHeight, realFontWidths[3]); } else { GFXFontFootprint = footprint; GFXFont = GetFont(gfxFontName, 0, gfxFontHeight / 2, gfxFontWidth / 2); GFXDblWFont = GetFont(gfxFontName, 1, gfxFontHeight / 2, gfxFontWidth); GFXDblHFont = GetFont(gfxFontName, 2, gfxFontHeight , gfxFontWidth / 2); GFXDblHWFont = GetFont(gfxFontName, 3, gfxFontHeight, gfxFontWidth); } int txtFontWidth = fontWidth; int txtFontHeight = fontHeight; const char *txtFontName = ttSetup.txtFontName; footprint = GetFontFootprint(txtFontName); if (footprint.compare(TXTFontFootprint) == 0) { TXTFont = cFont::CreateFont(txtFontName, txtFontHeight / 2, realFontWidths[4]); TXTDblWFont = cFont::CreateFont(txtFontName, txtFontHeight / 2, realFontWidths[5]); TXTDblHFont = cFont::CreateFont(txtFontName, txtFontHeight, realFontWidths[6]); TXTDblHWFont = cFont::CreateFont(txtFontName, txtFontHeight, realFontWidths[7]); } else { TXTFontFootprint = footprint; TXTFont = GetFont(txtFontName, 4, txtFontHeight / 2, txtFontWidth / 2); TXTDblWFont = GetFont(txtFontName, 5, txtFontHeight / 2, txtFontWidth); TXTDblHFont = GetFont(txtFontName, 6, txtFontHeight, txtFontWidth / 2); TXTDblHWFont = GetFont(txtFontName, 7, txtFontHeight, txtFontWidth); } } bool cDisplay::SetBlink(bool blink) { int x,y; bool Change=false; if (blink==Blinked) return false; // touch all blinking chars for (y=0;y<25;y++) { for (x=0;x<40;x++) { if (Page[x][y].GetBlink()) { Page[x][y].SetDirty(true); Change=true; } } } Blinked=blink; if (Change) Dirty=true; Flush(); return Change; } bool cDisplay::SetConceal(bool conceal) { int x,y; bool Change=false; if (conceal==Concealed) return false; // touch all concealed chars for (y=0;y<25;y++) { for (x=0;x<40;x++) { if (Page[x][y].GetConceal()) { Page[x][y].SetDirty(true); Change=true; } } } Concealed=conceal; if (Change) Dirty=true; Flush(); return Change; } void cDisplay::SetZoom(enumZoom zoom) { if (!osd) return; if (Zoom==zoom) return; Zoom=zoom; // Re-initialize scaler to let zoom take effect InitScaler(); // Clear screen - mainly clear border CleanDisplay(); Flush(); } void cDisplay::SetBackgroundColor(tColor c) { Background=c; CleanDisplay(); Flush(); } void cDisplay::CleanDisplay() { enumTeletextColor bgc=(Boxed)?(ttcTransparent):(ttcBlack); if (!osd) return; osd->DrawRectangle(0, 0, Width, Height, GetColorRGB(bgc,0)); // repaint all Dirty=true; DirtyAll=true; } tColor cDisplay::GetColorRGB(enumTeletextColor ttc, int Area) { switch (ttc) { case ttcBlack: return Background; case ttcRed: return clrRed; case ttcGreen: return clrGreen; case ttcYellow: return clrYellow; case ttcBlue: return clrBlue; case ttcMagenta: return clrMagenta; case ttcCyan: return clrCyan; case ttcWhite: return clrWhite; case ttcTransparent: return clrTransparent; default: return Background; } } tColor cDisplay::GetColorRGBAlternate(enumTeletextColor ttc, int Area) { return GetColorRGB(ttc,Area); } void cDisplay::RenderTeletextCode(unsigned char *PageCode) { // Interprete teletext code referenced by PageCode // and draw the whole page content into OSD. // PageCode must be a 40*24+12 bytes buffer HoldFlush(); cRenderPage::ReadTeletextHeader(PageCode); if (!Boxed && (Flags&0x60)!=0) { Boxed=true; CleanDisplay(); } else if (Boxed && (Flags&0x60)==0) { Boxed=false; CleanDisplay(); } cRenderPage::RenderTeletextCode(PageCode+12); ReleaseFlush(); } void cDisplay::DrawDisplay() { int x,y; int cnt=0; if (!IsDirty()) return; // nothing to do for (y=0;y<25;y++) { for (x=0;x<40;x++) { if (IsDirty(x,y)) { // Need to draw char to osd cnt++; cTeletextChar c=Page[x][y]; c.SetDirty(false); if ((Blinked && c.GetBlink()) || (Concealed && c.GetConceal())) { c.SetChar(0x20); c.SetCharset(CHARSET_LATIN_G0_DE); } DrawChar(x,y,c); Page[x][y]=c; } } } Dirty=false; DirtyAll=false; } inline bool IsPureChar(unsigned int *bitmap) { // Check if character is pure foreground or // pure background color int i; if (bitmap[0]==0x0000) { for (i=1;i<10;i++) { if (bitmap[i]!=0x0000) return false; } } else if (bitmap[0]==0xfff0) { for (i=1;i<10;i++) { if (bitmap[i]!=0xfff0) return false; } } else { return false; } return true; } void cDisplay::DrawChar(int x, int y, cTeletextChar c) { // Get colors enumTeletextColor ttfg=c.GetFGColor(); enumTeletextColor ttbg=c.GetBGColor(); if (c.GetBoxedOut()) { ttbg=ttcTransparent; ttfg=ttcTransparent; } if (!osd) return; tColor fg=GetColorRGB(ttfg, 0); tColor bg=GetColorRGB(ttbg, 0); char buf[5]; uint t = GetVTXChar(c); int tl = Utf8CharSet(t, buf); buf[tl] = 0; const cFont *font; int charset = c.GetCharset(); int fontType = 0; int w = fontWidth / 2; int h = fontHeight / 2; if (c.GetDblWidth() != dblw_Normal) { fontType |= 1; w = fontWidth; } if (c.GetDblHeight() != dblh_Normal) { fontType |= 2; h = fontHeight; } if (charset == CHARSET_GRAPHICS_G1 || charset == CHARSET_GRAPHICS_G1_SEP) { switch(fontType) { case 0: font = GFXFont; break; case 1: font = GFXDblWFont; break; case 2: font = GFXDblHFont; break; case 3: font = GFXDblHWFont; break; } } else { switch(fontType) { case 0: font = TXTFont; break; case 1: font = TXTDblWFont; break; case 2: font = TXTDblHFont; break; case 3: font = TXTDblHWFont; break; } } if (Zoom == Zoom_Lower) { y -= 11; } int vx = x * fontWidth / 2; int vy = y * fontHeight / 2; bool drawChar = true; if (c.GetDblWidth() == dblw_Right) { drawChar = false; } if (c.GetDblHeight() == dblh_Bottom) { drawChar = false; } if (drawChar) { osd->DrawRectangle(vx, vy, vx + w, vy + h, bg); osd->DrawText(vx, vy, buf, fg, bg, font); } } void cDisplay::DrawText(int x, int y, const char *text, int len) { // Copy text to teletext page cTeletextChar c; c.SetFGColor(ttcWhite); c.SetBGColor(ttcBlack); c.SetCharset(CHARSET_LATIN_G0); // Copy chars up to len or null char while (len>0 && *text!=0x00) { c.SetChar(*text); SetChar(x,y,c); text++; x++; len--; } // Fill remaining chars with spaces c.SetChar(' '); while (len>0) { SetChar(x,y,c); x++; len--; } // .. and display Flush(); } void cDisplay::DrawClock() { char text[9]; time_t t=time(0); struct tm loct; localtime_r(&t, &loct); sprintf(text, "%02d:%02d:%02d", loct.tm_hour, loct.tm_min, loct.tm_sec); DrawText(32,0,text,8); } void cDisplay::DrawMessage(const char *txt) { const int border=5; if (!osd) return; HoldFlush(); // Hold flush until done ClearMessage(); // Make sure old message is gone if (IsDirty()) DrawDisplay(); // Make sure all characters are out, so we can draw on top int w=MessageFont->Width(txt)+4*border; int h=MessageFont->Height(txt)+4*border; int x=(outputWidth-w)/2; int y=(outputHeight-h)/2; // Get local color mapping tColor fg=GetColorRGB(ttcWhite,0); tColor bg=GetColorRGB(ttcBlack,0); if (fg==bg) bg=GetColorRGBAlternate(ttcBlack,0); // Draw framed box osd->DrawRectangle(x ,y ,x+w-1 ,y+border-1 ,fg); osd->DrawRectangle(x ,y+h-border,x+w-1 ,y+h-1 ,fg); osd->DrawRectangle(x ,y ,x+border-1 ,y+h-1 ,fg); osd->DrawRectangle(x+w-border,y ,x+w-1 ,y+h-1 ,fg); osd->DrawRectangle(x+border ,y+border ,x+w-border-1,y+h-border-1,bg); // Draw text osd->DrawText(x+2*border,y+2*border,txt, fg, bg, MessageFont); // Remember box MessageW=w; MessageH=h; MessageX=x; MessageY=y; // And flush all changes ReleaseFlush(); } void cDisplay::ClearMessage() { if (!osd) return; if (MessageW==0 || MessageH==0) return; // map OSD pixel to virtual coordinate, use center of pixel int x0=(MessageX-OffsetX)*ScaleX+ScaleX/2; int y0=(MessageY-OffsetY)*ScaleY+ScaleY/2; int x1=(MessageX+MessageW-1-OffsetX)*ScaleX+ScaleX/2; int y1=(MessageY+MessageH-1-OffsetY)*ScaleY+ScaleY/2; // map to character x0=x0/(12<<16); y0=y0/(10<<16); x1=(x1+(12<<16)-1)/(12<<16); y1=(y1+(10<<16)-1)/(10<<16); for (int x=x0;x<=x1;x++) { for (int y=y0;y<=y1;y++) { MakeDirty(x,y); } } MessageW=0; MessageH=0; Flush(); } osdteletext-0.9.7/displaybase.h0000644000175000017500000002010113244253751016070 0ustar tobiastobias/*************************************************************** -*- c++ -*- * * * displaybase.h - Base class for rendering a teletext cRenderPage to * * an actual VDR OSD. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * Changelog: * * 2005-03 initial version (c) Udo Richter * * * ***************************************************************************/ #ifndef OSDTELETEXT_DISPLAYBASE_H_ #define OSDTELETEXT_DISPLAYBASE_H_ #include "txtrender.h" #include "setup.h" #include #include class cDisplay : public cRenderPage { // Class that extends the virtual cRenderPage with the capability // to render its contents to an OSD of variable size. // Renders incrementally - just changes // plus adds some more display features like message display. public: enum enumZoom { // Zoom up upper/lower half of page Zoom_Off, Zoom_Upper, Zoom_Lower } Zoom; protected: bool Concealed; // Hidden text internal state bool Blinked; // Blinking text internal state int FlushLock; // Lock counter for bundeling OSD flushes bool Boxed; // Page is 'boxed mode' transparent int Width; int Height; // OSD pixel dimension tColor Background; // Color to be used for black background // - allow transparency cOsd *osd; // The osd object. If creation fails, may be NULL int outputWidth; double outputScaleX; int outputHeight; double outputScaleY; // for 32bpp true color, If creation fails, may be NULL int ScaleX,ScaleY; int OffsetX,OffsetY; // Virtual coordinate system, see InitScaler const cFont *MessageFont; int MessageX,MessageY,MessageW,MessageH; // Message overlay window, position and font const cFont *GFXFont; const cFont *GFXDblWFont; const cFont *GFXDblHFont; const cFont *GFXDblHWFont; const cFont *TXTFont; const cFont *TXTDblWFont; const cFont *TXTDblHFont; const cFont *TXTDblHWFont; int fontHeight; int fontWidth; static int realFontWidths[8]; class cBox { // helper class. Represents a character's box in virtual coordinates public: int XMin,YMin,XMax,YMax; inline void SetToCharacter(int x, int y); }; friend class cBox; class cVirtualCoordinate { // helper class. Represents a coordinate in virtual display space // and in OSD pixel coordinates. public: int OsdX,OsdY; int VirtX,VirtY; inline void VirtualToPixel(cDisplay *Display, int x, int y); inline void IncPixelX(cDisplay *Display); inline void IncPixelY(cDisplay *Display); }; friend class cVirtualCoordinate; public: cDisplay(int width, int height); virtual ~cDisplay(); bool Valid() { return (osd!=NULL); } // After creation, check for Valid(). Destroy, if not valid. void setOutputWidth(int w) { outputWidth = w; }; void setOutputHeight(int h) { outputHeight = h; }; static std::string GFXFontFootprint; static std::string TXTFontFootprint; protected: void InitScaler(); // Initialize transformation for OSD->Virtual coordinates // Some words about scaling: // OSD display is variable width x height, with 3 pixels border // on all sides. There is a virtual coordinate system projected // on this, with (3,3) mapped to (0,0) and (width-3,height-3) // mapped to (480<<16,250<<16). // The idea is, that each font pixel uses a virtual rectangle // of (1<<16,1<<16) size. // ScaleX,ScaleY represent the (virtual) width and height of a // physical OSD pixel. // OffsetX,OffsetY default to 3,3 to represent the border offset, // but may be used differently. public: bool GetBlink() { return Blinked; } bool SetBlink(bool blink); // Switch blink frequently to get blinking chars // Returns true if there are blinking characters. bool GetConceal() { return Concealed; } bool SetConceal(bool conceal); // Hidden text. Set to true to see hidden text. // Returns true if there are concealed characters. enumZoom GetZoom() { return Zoom; } void SetZoom(enumZoom zoom); // Zoom to upper/lower half of page void SetBackgroundColor(tColor c); tColor GetBackgroundColor() { return Background; } // Set the background color for black. Allows transparent black. // Color mapping interface. virtual tColor GetColorRGB(enumTeletextColor ttc, int Area); // Map a teletext color to an OSD color in #Area. virtual tColor GetColorRGBAlternate(enumTeletextColor ttc, int Area); // For color collision: // Map this teletext color to an OSD color in #Area, but dont // return same as GetColorRGB(). Used to solve conflicts if // foreground and background are mapped to same color. // Defaults to 1:1 identity. Not needed if all colors actually // supported by OSD. protected: void DrawDisplay(); // Draw all dirty characters from cRenderPage buffer to OSD void CleanDisplay(); // Clean OSD completely virtual void DrawChar(int x, int y, cTeletextChar c); // Draw a single character to OSD public: void HoldFlush() { FlushLock++; } // Hold all OSD flush updates to bundle operations. void ReleaseFlush() { FlushLock--; Flush(); } // Release hold of flush updates. After last release, // the flush will be done protected: void Flush() { // Commit all changes from OSD internal bitmaps to device // All draw operations inside cDisplay should call it, // no one outside should need to call it. if (FlushLock>0) return; if (!osd) return; if (IsDirty()) DrawDisplay(); osd->Flush(); } public: void RenderTeletextCode(unsigned char *PageCode); // Interprete teletext code referenced by PageCode // and draw the whole page content into OSD. // PageCode must be a 40*24+12 bytes buffer void DrawText(int x, int y, const char *text, int len); // Draw some characters in teletext page. // Max len chars, fill up with spaces void DrawClock(); // Draw current time to OSD void DrawPageId(const char *text) { DrawText(0,0,text,8); } // Draw Page ID string to OSD void DrawMessage(const char *txt); // Draw a framed, centered message box to OSD void ClearMessage(); // Remove message box and redraw hidden content private: cFont *GetFont(const char *name, int index, int height, int width); std::string GetFontFootprint(const char *name); }; inline void cDisplay::cBox::SetToCharacter(int x, int y) { // Virtual box area of a character XMin=(x*12)<<16; YMin=(y*10)<<16; XMax=XMin+(12<<16)-1; YMax=YMin+(10<<16)-1; } inline void cDisplay::cVirtualCoordinate::VirtualToPixel(cDisplay *Display, int x, int y) { // Map virtual coordinate to OSD pixel OsdX=x/Display->ScaleX+Display->OffsetX; OsdY=y/Display->ScaleY+Display->OffsetY; // map OSD pixel back to virtual coordinate, use center of pixel VirtX=(OsdX-Display->OffsetX)*Display->ScaleX+Display->ScaleX/2; VirtY=(OsdY-Display->OffsetY)*Display->ScaleY+Display->ScaleY/2; } inline void cDisplay::cVirtualCoordinate::IncPixelX(cDisplay *Display) { // Move one OSD pixel OsdX++; VirtX+=Display->ScaleX; } inline void cDisplay::cVirtualCoordinate::IncPixelY(cDisplay *Display) { // Move one OSD pixel OsdY++; VirtY+=Display->ScaleY; } #endif osdteletext-0.9.7/rootdir.c0000644000175000017500000000157212117130631015245 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "rootdir.h" const char *RootDir::root = "/var/cache/vdr/vtx"; void RootDir::setRootDir(const char *newRoot) { root=newRoot; } const char *RootDir::getRootDir() { return root; } osdteletext-0.9.7/menu.h0000644000175000017500000000453211737124466014553 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef OSDTELETEXT_MENU__H #define OSDTELETEXT_MENU__H #include #include #include #include #include "txtrecv.h" #include "setup.h" extern int Stretch; class TeletextBrowser : public cOsdObject { public: TeletextBrowser(cTxtStatus *txtSt,Storage *s); ~TeletextBrowser(); void Show(void); static void ChannelSwitched(int ChannelNumber); virtual eOSState ProcessKey(eKeys Key); protected: enum Direction { DirectionForward, DirectionBackward }; void SetNumber(int i); void ShowPage(); void UpdateClock(); bool DecodePage(); void ChangePageRelative(Direction direction); void ChangeSubPageRelative(Direction direction); bool CheckPage(); void ShowAskForChannel(); bool CheckFirstSubPage(int startWith); void SetPreviousPage(int oldPage, int oldSubPage, int newPage); bool CheckIsValidChannel(int number); int PageCheckSum(); void ShowPageNumber(); void ExecuteAction(eTeletextAction e); int nextValidPageNumber(int start, Direction direction); char fileName[PATH_MAX]; char page[40][24]; int cursorPos; eTeletextAction TranslateKey(eKeys Key); bool pageFound; bool selectingChannel; bool needClearMessage; int selectingChannelNumber; int checkSum; cTxtStatus *txtStatus; bool suspendedReceiving; int previousPage; int previousSubPage; int pageBeforeNumberInput; time_t lastActivity; int inactivityTimeout; static int currentPage; static int currentSubPage; static tChannelID channel; static int currentChannelNumber; static TeletextBrowser* self; Storage *storage; private: void ChangeBackground(); }; #endif osdteletext-0.9.7/pageid.h0000644000175000017500000000214212117130631015013 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef __PAGEID_H #define __PAGEID_H #include #include #include #include #include #include struct PageID { PageID() { page=subPage=0; } PageID(tChannelID id, int p, int s) { set(id, p, s); } void set(tChannelID id, int p, int s) { channel=id; page=p; subPage=s; } tChannelID channel; int page; int subPage; }; #endif osdteletext-0.9.7/menu.c0000644000175000017500000005002713244253751014541 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include #include #include #include #include "menu.h" #include "display.h" #include "setup.h" #include "txtrecv.h" #define GET_HUNDREDS(x) ( ( (x) - ((x)%256) ) /256 ) #define GET_TENS(x) ( (( (x) - ((x)%16) )%256 ) /16 ) #define GET_ONES(x) ( (x)%16 ) #define GET_HUNDREDS_DECIMAL(x) ( ( (x) - ((x)%100) ) /100 ) #define GET_TENS_DECIMAL(x) ( (( (x) - ((x)%10) )%100 ) /10 ) #define GET_ONES_DECIMAL(x) ( (x)%10 ) #define PSEUDO_HEX_TO_DECIMAL(x) ( (GET_HUNDREDS_DECIMAL(x))*256 + (GET_TENS_DECIMAL(x))*16 + (GET_ONES_DECIMAL(x)) ) using namespace std; int Stretch = true; typedef map IntMap; IntMap channelPageMap; //static variables int TeletextBrowser::currentPage=0x100; //Believe it or not, the teletext numbers are somehow hexadecimal int TeletextBrowser::currentSubPage=0; tChannelID TeletextBrowser::channel; int TeletextBrowser::currentChannelNumber=0; TeletextBrowser* TeletextBrowser::self=0; TeletextBrowser::TeletextBrowser(cTxtStatus *txtSt,Storage *s) : cursorPos(0), pageFound(true), selectingChannel(false), needClearMessage(false), selectingChannelNumber(-1), txtStatus(txtSt), suspendedReceiving(false), previousPage(currentPage), previousSubPage(currentSubPage), pageBeforeNumberInput(currentPage), lastActivity(time(NULL)), inactivityTimeout(-1), storage(s) { self=this; //if (txtStatus) // txtStatus->ForceReceiving(true); } TeletextBrowser::~TeletextBrowser() { Display::Delete(); self=0; /*if (txtStatus) { if (suspendedReceiving) txtStatus->ForceSuspending(false); txtStatus->ForceReceiving(false); }*/ } void TeletextBrowser::Show(void) { Display::SetMode(Display::mode); ShowPage(); } bool TeletextBrowser::CheckIsValidChannel(int number) { #if defined(APIVERSNUM) && APIVERSNUM >= 20301 LOCK_CHANNELS_READ; return (Channels->GetByNumber(number) != 0); #else return (Channels.GetByNumber(number) != 0); #endif } void TeletextBrowser::ChannelSwitched(int ChannelNumber) { #if defined(APIVERSNUM) && APIVERSNUM >= 20301 LOCK_CHANNELS_READ; const cChannel *chan=Channels->GetByNumber(ChannelNumber); #else cChannel *chan=Channels.GetByNumber(ChannelNumber); #endif if (!chan) return; tChannelID chid=chan->GetChannelID(); if (chid==channel || chid==tChannelID::InvalidID) return; channel=chid; //store page number of current channel IntMap::iterator it; channelPageMap[currentChannelNumber] = currentPage; currentChannelNumber=ChannelNumber; currentPage=0x100; currentSubPage=0; //see if last page number on this channel was stored it=channelPageMap.find(ChannelNumber); if (it != channelPageMap.end()) { //found currentPage=(*it).second; } //on the one hand this must work in background mode, when the plugin is not active. //on the other hand, if active, the page should be shown. //so this self-Pointer. if (self) { self->ShowPage(); } } eOSState TeletextBrowser::ProcessKey(eKeys Key) { if (Key != kNone) lastActivity = time(NULL); switch (Key) { case k1: SetNumber(1);break; case k2: SetNumber(2);break; case k3: SetNumber(3);break; case k4: SetNumber(4);break; case k5: SetNumber(5);break; case k6: SetNumber(6);break; case k7: SetNumber(7);break; case k8: SetNumber(8);break; case k9: SetNumber(9);break; case k0: //same behavior for 0 as VDR does it with channels if ((cursorPos==0) && (!selectingChannel)) { //swap variables int tempPage=currentPage; int tempSubPage=currentSubPage; currentPage=previousPage; currentSubPage=previousSubPage; previousPage=tempPage; previousSubPage=tempSubPage; ShowPage(); } else SetNumber(0); break; case kOk: if (selectingChannel) { selectingChannel=false; Display::ClearMessage(); if (selectingChannelNumber>0) { if (CheckIsValidChannel(selectingChannelNumber)) ChannelSwitched(selectingChannelNumber); else { needClearMessage=true; Display::DrawMessage(trVDR("*** Invalid Channel ***")); } } else { ShowPage(); } } break; case kBack: return osEnd; case kNone: //approx. every second //checking if page changed if ( pageFound && ttSetup.autoUpdatePage && cursorPos==0 && !selectingChannel && (PageCheckSum() != checkSum) ) { ShowPage(); //check if page was previously not found and is available now } else if (!pageFound && CheckFirstSubPage(0)) { ShowPage(); } else { if (needClearMessage) { needClearMessage=false; Display::ClearMessage(); } //updating clock UpdateClock(); } //check for activity timeout if (ttSetup.inactivityTimeout && (time(NULL) - lastActivity > ttSetup.inactivityTimeout*60)) return osEnd; break; case kUp: if (selectingChannel) { selectingChannel=false; Display::ClearMessage(); } if (cursorPos != 0) { //fully revert cursor SetNumber(-3); } ChangePageRelative(DirectionForward); Display::ShowUpperHalf(); ShowPage(); break; case kDown: if (selectingChannel) { selectingChannel=false; Display::ClearMessage(); } if (cursorPos != 0) { //fully reset SetNumber(-3); } ChangePageRelative(DirectionBackward); Display::ShowUpperHalf(); ShowPage(); break; case kRight: if (selectingChannel) { selectingChannel=false; Display::ClearMessage(); } if (cursorPos != 0) { //fully reset SetNumber(-3); } ChangeSubPageRelative(DirectionForward); Display::ShowUpperHalf(); ShowPage(); break; case kLeft: if (selectingChannel) { selectingChannel=false; Display::ClearMessage(); } if (cursorPos != 0) { //revert cursor SetNumber(-1); break; } ChangeSubPageRelative(DirectionBackward); Display::ShowUpperHalf(); ShowPage(); break; case kRed: case kGreen: case kBlue: case kYellow: //case kUser1:case kUser2:case kUser3:case kUser4:case kUser5: //case kUser6:case kUser7:case kUser8:case kUser9: case kPlay:case kPause:case kStop: case kRecord:case kFastFwd:case kFastRew: if (cursorPos != 0) { //fully reset SetNumber(-3); } ExecuteAction(TranslateKey(Key)); break; default: break; } return osContinue; } void TeletextBrowser::ExecuteAction(eTeletextAction e) { switch (e) { case Zoom: if (selectingChannel) { selectingChannel=false; Display::ClearMessage(); } switch (Display::GetZoom()) { case cDisplay::Zoom_Off: Display::SetZoom(cDisplay::Zoom_Upper); break; case cDisplay::Zoom_Upper: Display::SetZoom(cDisplay::Zoom_Lower); break; case cDisplay::Zoom_Lower: Display::SetZoom(cDisplay::Zoom_Off); break; } break; case HalfPage: if (selectingChannel) { selectingChannel=false; Display::ClearMessage(); } switch (Display::mode) { case Display::HalfUpper: Display::SetMode(Display::HalfLower); break; case Display::HalfLower: Display::SetMode(Display::Full); break; case Display::Full: Display::SetMode(Display::HalfUpper); break; } ShowPage(); break; case SwitchChannel: selectingChannelNumber=0; selectingChannel=true; ShowAskForChannel(); break; /*case SuspendReceiving: if (!txtStatus) break; //if (suspendedReceiving) // txtStatus->ForceSuspending(false); //else // txtStatus->ForceSuspending(true); //suspendedReceiving=(!suspendedReceiving); break;*/ case DarkScreen: ChangeBackground(); break; default: //In osdteletext.c, numbers are thought to be decimal, the setup page //entries will display them in this way. It is a lot easier to do the //conversion to hexadecimal here. //This means, we convert the number to what it would be if the string //had been parsed with hexadecimal base. int pageNr=PSEUDO_HEX_TO_DECIMAL((int)e); if (0x100<=pageNr && pageNr<=0x899) { if (selectingChannel) { selectingChannel=false; Display::ClearMessage(); } SetPreviousPage(currentPage, currentSubPage, pageNr); currentPage=pageNr; cursorPos=0; currentSubPage=0; Display::ShowUpperHalf(); ShowPage(); } break; } } // 3-state toggling between configured->transparent->black. // If configured is black or transparent, do 2-state transparent->black only. void TeletextBrowser::ChangeBackground() { tColor clrConfig = (tColor)ttSetup.configuredClrBackground; tColor clrCurrent = Display::GetBackgroundColor(); if (clrCurrent == clrConfig) if (clrConfig == clrTransparent) Display::SetBackgroundColor(clrBlack); else Display::SetBackgroundColor(clrTransparent); else if (clrCurrent == clrBlack) if (clrConfig == clrBlack) Display::SetBackgroundColor(clrTransparent); else Display::SetBackgroundColor(clrConfig); else // clrCurrent == clrTransparent Display::SetBackgroundColor(clrBlack); } eTeletextAction TeletextBrowser::TranslateKey(eKeys Key) { switch(Key) { case kRed: return (eTeletextAction)ttSetup.mapKeyToAction[ActionKeyRed]; case kGreen: return (eTeletextAction)ttSetup.mapKeyToAction[ActionKeyGreen]; case kYellow: return (eTeletextAction)ttSetup.mapKeyToAction[ActionKeyYellow]; case kBlue: return (eTeletextAction)ttSetup.mapKeyToAction[ActionKeyBlue]; case kPlay: return (eTeletextAction)ttSetup.mapKeyToAction[ActionKeyPlay]; //case kPause: return (eTeletextAction)ttSetup.mapKeyToAction[ActionKeyPause]; case kStop: return (eTeletextAction)ttSetup.mapKeyToAction[ActionKeyStop]; //case kRecord: return (eTeletextAction)ttSetup.mapKeyToAction[ActionKeyRecord]; case kFastFwd: return (eTeletextAction)ttSetup.mapKeyToAction[ActionKeyFastFwd]; case kFastRew: return (eTeletextAction)ttSetup.mapKeyToAction[ActionKeyFastRew]; default: return (eTeletextAction)100; //just to keep gcc quiet } } void TeletextBrowser::SetNumber(int i) { //cursorPos means insertion after, 0<=cursorPos<=2 if (selectingChannel) { selectingChannelNumber = selectingChannelNumber*10+i; ShowAskForChannel(); return; } //i<0 means revert cursor position if (i<0) { for (;i<0;i++) { switch (cursorPos) { case 0: return; case 1: currentPage = currentPage-256*GET_HUNDREDS(currentPage)+256*GET_HUNDREDS(pageBeforeNumberInput); break; case 2: currentPage = currentPage-16*GET_TENS(currentPage)+16*GET_TENS(pageBeforeNumberInput); break; } cursorPos--; } ShowPageNumber(); return; } static int tempPage; switch (cursorPos) { case 0: if (i<1) i=1; //accept no 9 when cursorPos==0 if (i>8) i=8; tempPage= currentPage; pageBeforeNumberInput = currentPage; currentPage = currentPage-256*GET_HUNDREDS(currentPage)+256*i; break; case 1: if (i<0) i=0; if (i>9) i=9; currentPage = currentPage-16*GET_TENS(currentPage)+16*i; break; case 2: if (i<0) i=0; if (i>9) i=9; currentPage = currentPage-GET_ONES(currentPage)+i; pageBeforeNumberInput = currentPage; SetPreviousPage(tempPage, currentSubPage, currentPage); break; } pageFound=true; //so that "page ... not found" is not displayed, but e.g. 1**-00 if (++cursorPos>2) { cursorPos=0; CheckFirstSubPage(0); Display::ShowUpperHalf(); ShowPage(); } else { ShowPageNumber(); } } //returns whether x, when written in hexadecimal form, //will only contain the digits 0...9 and not A...F //in the first three digits. static inline bool onlyDecimalDigits(int x) { return (( x & 0xE) < 0xA) && (( (x>>4) & 0xE) < 0xA) && (( (x>>8) & 0xE) < 0xA); } //after 199 comes 1A0, but if these pages exist, they contain no useful data, so filter them out int TeletextBrowser::nextValidPageNumber(int start, Direction direction) { do { switch (direction) { case DirectionForward: start++; break; case DirectionBackward: start--; break; } } while (!onlyDecimalDigits(start)); return start; } void TeletextBrowser::ChangePageRelative(Direction direction) { int oldpage = currentPage; int oldSubPage = currentSubPage; do { /*if (back) currentPage--; else currentPage++;*/ currentPage=nextValidPageNumber(currentPage, direction); if (currentPage>0x899) currentPage=0x100; if (currentPage<0x100) currentPage=0x899; // sub page is always 0 if you change the page if (CheckFirstSubPage(0)) { SetPreviousPage(oldpage, oldSubPage, currentPage); return; } } while (currentPage != oldpage); return; } void TeletextBrowser::ChangeSubPageRelative(Direction direction) { int oldsubpage = currentSubPage; do { /*if (back) currentSubPage--; else currentSubPage++;*/ currentSubPage=nextValidPageNumber(currentSubPage, direction); if (currentSubPage > 0x99) currentSubPage=0; if (currentSubPage < 0) currentSubPage=0x99; if (CheckPage()) return; } while (currentSubPage != oldsubpage); return; } bool TeletextBrowser::CheckFirstSubPage(int startWith) { int oldsubpage = currentSubPage; do { if (CheckPage()) return true; //currentSubPage++; currentSubPage=nextValidPageNumber(currentSubPage, DirectionForward); if (currentSubPage > 0x99) currentSubPage=0; if (currentSubPage < 0) currentSubPage=0x99; } while (currentSubPage != oldsubpage); return false; } bool TeletextBrowser::CheckPage() { StorageHandle fd; if (!(fd=storage->openForReading(PageID(channel, currentPage, currentSubPage), false)) ) return false; storage->close(fd); return true; } //sets the previousPage variables if and only if new page is different from old page void TeletextBrowser::SetPreviousPage(int oldPage, int oldSubPage, int newPage) { if (oldPage != newPage) { previousPage=oldPage; previousSubPage=oldSubPage; } } void TeletextBrowser::ShowPage() { if ((pageFound=DecodePage())) { if (ttSetup.autoUpdatePage) checkSum=PageCheckSum(); } } void TeletextBrowser::ShowPageNumber() { char str[8]; sprintf(str, "%3x-%02x", currentPage, currentSubPage); if (cursorPos>0) { str[2]='*'; if (cursorPos==1) str[1]='*'; } Display::DrawPageId(str); } void TeletextBrowser::ShowAskForChannel() { if (selectingChannel) { cString str = cString::sprintf(selectingChannelNumber > 0 ? "%s%d" : "%s", tr("Channel (press OK): "), selectingChannelNumber); Display::DrawMessage(str); } } //this is taken and adapted from the teletext plugin since it uses its data bool TeletextBrowser::DecodePage() { // Load the page and decodes it unsigned char cache[40*24+12]; StorageHandle fd; // Take a look if there is a xxx-00 page if (currentSubPage==0) { if ( !(fd=storage->openForReading(PageID(channel, currentPage,currentSubPage), false)) ) { // There is no subpage 0 so look if there is subpage 1 currentSubPage++; // Generate file string } else { // yes file exists storage->close(fd); } } if ( (fd=storage->openForReading(PageID(channel, currentPage, currentSubPage), true)) ) { storage->read(cache,sizeof cache,fd); // Read full page data storage->close(fd); Display::HoldFlush(); Display::ClearMessage(); Display::RenderTeletextCode(cache); ShowPageNumber(); UpdateClock(); Display::ReleaseFlush(); } else { // page doesn't exist currentSubPage--; Display::HoldFlush(); ShowPageNumber(); char str[80]; snprintf(str,80, "%s %3x-%02x %s",tr("Page"),currentPage, currentSubPage,tr("not found")); Display::DrawMessage(str); Display::ReleaseFlush(); return false; } return true; } int TeletextBrowser::PageCheckSum() { int retSum=0; StorageHandle fd; CheckFirstSubPage(currentSubPage); if ((fd=storage->openForReading(PageID(channel, currentPage, currentSubPage), false)) ) { uchar cache[960]; storage->read(cache, 12, fd); //skip storage->read(cache, sizeof(cache), fd); storage->close(fd); memset(cache+12, 0, 8); //it seems that there the clock is transmitted, ignore changes for (uint i=0;i #include #include "setup.h" #include "display.h" #include "txtfont.h" // Static variables of Display:: namespace Display::Mode Display::mode=Display::Full; cDisplay *Display::display=NULL; void Display::SetMode(Display::Mode NewMode) { // (re-)set display mode. if (display!=NULL && NewMode==mode) return; // No change, nothing to do // OSD origin, centered on VDR OSD int x0=Setup.OSDLeft+(Setup.OSDWidth-ttSetup.OSDwidth)*ttSetup.OSDHAlign/100; int y0=Setup.OSDTop +(Setup.OSDHeight-ttSetup.OSDheight)*ttSetup.OSDVAlign/100; switch (NewMode) { case Display::Full: // Need to re-initialize *display: Delete(); // Try 32BPP display first: display=new cDisplay32BPP(x0,y0,ttSetup.OSDwidth,ttSetup.OSDheight); break; case Display::HalfUpper: // Shortcut to switch from HalfUpper to HalfLower: if (mode==Display::HalfLower) { // keep instance. ((cDisplay32BPPHalf*)display)->SetUpper(true); break; } // Need to re-initialize *display: Delete(); display=new cDisplay32BPPHalf(x0,y0,ttSetup.OSDwidth,ttSetup.OSDheight,true); break; case Display::HalfLower: // Shortcut to switch from HalfUpper to HalfLower: if (mode==Display::HalfUpper) { // keep instance. ((cDisplay32BPPHalf*)display)->SetUpper(false); break; } // Need to re-initialize *display: Delete(); display=new cDisplay32BPPHalf(x0,y0,ttSetup.OSDwidth,ttSetup.OSDheight,false); break; } mode=NewMode; // If display is invalid, clean up immediately: if (!display->Valid()) Delete(); // Pass through OSD black transparency SetBackgroundColor((tColor)ttSetup.configuredClrBackground); } void Display::ShowUpperHalf() { // Enforce upper half of screen to be visible if (GetZoom()==cDisplay::Zoom_Lower) SetZoom(cDisplay::Zoom_Upper); if (mode==HalfLower) SetMode(HalfUpper); } cDisplay32BPP::cDisplay32BPP(int x0, int y0, int width, int height) : cDisplay(width,height) { // 32BPP display for True Color OSD providers osd = cOsdProvider::NewOsd(x0, y0); if (!osd) return; width=(width+1)&~1; // Width has to end on byte boundary, so round up tArea Areas[] = { { 0, 0, width - 1, height - 1, 32 } }; if (osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)) != oeOk) { DELETENULL(osd); return; } osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); setOutputWidth(width); setOutputHeight(Height); #if defined(APIVERSNUM) && APIVERSNUM >= 20107 Width = 480; Height = 250; #endif esyslog("OSD-Teletext: 32BPP"); InitScaler(); CleanDisplay(); } cDisplay32BPPHalf::cDisplay32BPPHalf(int x0, int y0, int width, int height, bool upper) : cDisplay(width,height), Upper(upper), OsdX0(x0), OsdY0(y0) { osd=NULL; // Redirect all real init work to method InitOSD(); } void cDisplay32BPPHalf::InitOSD() { delete osd; osd = cOsdProvider::NewOsd(OsdX0, OsdY0); if (!osd) return; int width=(Width+1)&~1; // Width has to end on byte boundary, so round up tArea Areas[] = { { 0, 0, width - 1, Height - 1, 32 } }; // Try full-size area first while (osd->CanHandleAreas(Areas, sizeof(Areas) / sizeof(tArea)) != oeOk) { // Out of memory, so shrink if (Upper) { // Move up lower border Areas[0].y2=Areas[0].y2-1; } else { // Move down upper border Areas[0].y1=Areas[0].y1+1; } if (Areas[0].y1>Areas[0].y2) { // Area is empty, fail miserably DELETENULL(osd); return; } } // Add some backup // CanHandleAreas is not accurate enough if (Upper) { Areas[0].y2=Areas[0].y2-10; } else { Areas[0].y1=Areas[0].y1+10; } osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea)); setOutputWidth(width); setOutputHeight(Height); #if defined(APIVERSNUM) && APIVERSNUM >= 20107 Width = 480; Height = 250; #endif InitScaler(); CleanDisplay(); // In case we switched on the fly, do a full redraw Dirty=true; DirtyAll=true; Flush(); } osdteletext-0.9.7/packedstorage.h0000644000175000017500000000261212117130631016400 0ustar tobiastobias/*************************************************************** -*- c++ -*- * Copyright (c) 2003,2004 by Marcel Wiesweg * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #ifndef __PACKEDSTORAGE_H #define __PACKEDSTORAGE_H #include "legacystorage.h" class PackedStorage : public LegacyStorage { public: PackedStorage(int maxMB); virtual void getFilename(char *buffer, int bufLength, PageID page); virtual StorageHandle openForWriting(PageID page); virtual StorageHandle openForReading(PageID page, bool countAsAccess); protected: struct PageAddress { bool operator==(const PageID &id) const { return page==id.page && subPage==id.subPage; } void operator=(const PageID &id) { page=id.page; subPage=id.subPage; } int page; int subPage; }; bool seekTo(PageID page, int fd, bool create); void registerFile(PageID page); }; #endif osdteletext-0.9.7/txtfont.h0000644000175000017500000000020313244253751015277 0ustar tobiastobias// -*- c++ -*- #ifndef __TXTFONT_H #define __TXTFONT_H #include "txtrender.h" unsigned int GetVTXChar(cTeletextChar c); #endif